Блог им. Quantrum

Парный трейдинг: описание стратегии на Python

Стратегия парного трейдинга очень популярна на рынке. Она основана на чистой статистике, что делает ее привлекательной для алгоритмической торговли. Общий смысл сводится к нескольким шагам: найти пару, проверить ее поведение, определить границы входа в позицию и направление (лонг/шорт).

Пары ищут с помощью корреляции, но корреляция в чистом виде может сослужить плохую службу. Спред пар должен быть стационарным и обладать коинтегрированностью. Весь представленный код на Python.

В статье рассмотрены:

  • Введение в корреляцию/коинтеграцию на простом примере.
  • Корреляция без коинтеграции.
  • Коинтеграция без корреляции. 

Основные понятия

Времянной ряд — статистические данные исследуемого процесса собранные в разные моменты времени.

Корреляция — статистическая взаимосвязь двух и более случайных величин. В нашем случае времянных рядов.

Коинтеграция — свойство нескольких нестационарных временных рядов, заключающееся в существовании некоторой их стационарной линейной комбинации.

Стационарность — свойство процесса не менять свои характеристики со временем.

P-значение — величина используемая при тестировании статистических гипотез.

Простыми словами: две акции будут коинтегрированы, когда спред разницы их истории цен будет находиться в пределах фиксированных границ и не будет обладать трендом.

Предположение

Есть две акции, которые имеют глубокую экономическую связь и их цены всегда меняются в одном направлении со скоростью, характерной для каждой акции.

Если мы вычтем данные одного временного ряда из другого, то данный спред должен нарисовать кривую, двигающуюся вокруг среднего значения всех элементов спреда. При этом данные каждого времянного ряда должны быть нестационарны.

Парный трейдинг: описание стратегии на Python
Пример стационарного спреда пары

Сигналами являются минимальные и максимальные отклонения спреда от нуля. Когда спред на минимуме — необходимо купить акцию А и продать в шорт акцию Б. Когда спред на максимуме — покупаем акцию Б и продаем в шорт акцию А. В обоих случаях закрываем позицию около нуля.

Введение в корреляцию/коинтеграцию

Здесь будут рассмотрены два временных ряда сформированных из набора произвольных значений нормального распределения. Считаем, что произвольный набор — это данные о прибыли/убытке в определенный момент времени. Для получения графика изменений посчитаем кумулятивную сумму значений элементов — это первый времянной ряд.

Для получения второго ряда используем первый, добавив в него произвольного шума и сместив значение на фиксированную величину.

Нарисуем графики обоих рядов: Исходный код на Quantrum.me.

Нарисуем график спреда: Исходный код на Quantrum.me.

Парный трейдинг: описание стратегии на Python
График изменений
 Парный трейдинг: описание стратегии на Python
Спред

Проверив значения коинтеграции и корреляции, видим что спред пары стационарен, p-значение рядом с нулем, и имеет высокую корреляцию около 95%. Код для получения значений оценки ниже: Исходный код на Quantrum.me.

Корреляция без коинтеграции

Однако, есть случаи, когда ряды имеют высокую корреляцию без коинтеграции. Пара с таким свойством не подходит для парного трейдинга. Для изучения сформируем два независимых произвольных времянных ряда: Исходный код на Quantrum.me.

И нарисуем спред: Исходный код на Quantrum.me.

Парный трейдинг: описание стратегии на Python
График изменений
 Парный трейдинг: описание стратегии на Python
Спред

Видим, что оба ряда имеют высокую корреляцию около 99% и проваливают тест на коинтеграцию с p-значением 0.885 (рядом с единицей). Мы видим, что спред имеет тенденцию роста со временем.

Коинтеграция без корреляции

Завершим знакомство примером стационарной пары без корреляции. Возьмем набор данных из нормального распределения и сравним его с квадратной волной: Исходный код на Quantrum.me.

Парный трейдинг: описание стратегии на Python
График изменений
 Парный трейдинг: описание стратегии на Python
Спред

Теперь тесты показывают p-значение равное нулю, что говорит о наличии коинтеграции пары и корреляцию рядом с нулем, а также указывает на отсутствие корреляции между ними. Эти две пары подходят для парного трейдинга, так как спред всякий раз возвращается к нулю.

Вывод

Здесь раскрыт общий смысл стратегии Парного трейдинга, а примеры показывают, какие пары надо искать и какие инструменты для этого можно использовать. Конечно, для торговли этого не достаточно, но уже позволяет избежать грубых ошибок. В следующих статьях я опишу 3 способа поиска пар для торговли: проверка коинтеграциитест Дики-Фуллера и положение средних.

В комментариях задавайте вопросы и напишите, где не хватает подробностей, а что можно описать иначе.

Александр Румянцев aka «iamraa»
Автор Quantrum.me


Обучение «Парному трейдингу» у профессионалов.
★27
28 комментариев
Говорят что стационарные спреды на Западе умерли году так в 2000-2002. На биржевых данных, я таких ни разу не видел. )
avatar
vlad1024, в следующих трех статьях я описываю 3 способа поиска пар с помощью Python. Пары есть, и стационарные спреды имеются.
буду ждать продолжения 
avatar
Igr, может быть у вас есть идеи, что еще можно протестировать? Я бы с удовольствием обсудил это.
возможно когда вы говорите, что есть стационарные пары, вы имеете ввиду американский рынок? Потому что на нашем рынке ни баскет ни парный трейдинг не работает, рано или поздно все связи ломаются и пары расходятся очень сильно. проверял сам на коинтеграцию тест дики фуллера. из недавнего, на мощном бычьем тренде на мамбе большинство хороших до этого момента пар, разорвало так что мама не горюй
Константин А., вы правы. Я знаком с российским рынком поверхностно. Начинал с американского рынка, на нем и живу. На нем и изучаю стратегии. 
Самая сложная составляющая стратегии статарбитража — это стратегия выхода. Имеется в вид когда спред неожиданно расширяется и конца этому не видно.
Странно, что она никак здесь не упоминается! Сам автор то давно их торгует? Подозреваю, что нет.
avatar
ivanovr, вы правы, когда писал эту статью, даже не понимал как искать пары, о выходе не задумывался. Где-то на 5-7 статье о парном трейдинге встретился с данной проблемой. В итоге, я пытаюсь рассуждать на этот счёт позже. 
Александр Румянцев, Ну вы хоть бы картинки поменяли говоря о том что статья Ваша. Еще в 2015 году некий Delaney Granizo-Mackenzie на квантопии это описал.
avatar
Denis, вы правы, статья основана на материалах из Quantopian. Везде есть исходный код, который генерирует именно такие графики. Зачем их раскрашивать?
Чисто логическое рассуждение. Если есть два инструмента, между которыми строится стационарный спрэд такой клёвый как у вас на картинках, причем по амплитуде этот спрэд явно больше транзакционных издержек на этот спрэд, то из этого следуют две вещи.

Первая вещь. Такой спрэд будет быстро сведен к близкому по издержкам.

Вторая вещь. Один из инструментов умрёт. Нафига на рынке два одинаковых инструмента?
avatar
Sergey Pavlov, ivanovr, Вот автор хорошо тему поднял, я тут как раз спросить хотел :)
В парном трейдинге обычно выбирают пары которые взаимосвязаны… одна область, сектор, а лучше что бы они похожи были, а еще лучше что бы это один инструмент был ).
Но надо ли это, вопрос ведь встает сможем ли мы просто узнать когда спред разбежался, так что мы его не сможем больше торговать, и в связи с этим можем выбирать активы которые по каким то причинам случайно корелируют и коинтегрируют?
И тут не понятно что проверять и на каком периоде. можно изменение волотильности мерять или же тупо по стандартным отклонениям?

Второй вопрос, построение среда, можно ведь торговать непосредственно его или же отклонение от среднего, но тогда каой период средней брать, ведь среднее значение каждый раз меняется.?

avatar
Denis, ответы на эти вопросы означают какую-то подгонку под историю, из которой никак не следует, что будет в будущем. Проблема в том, что статарбитраж как парный трейдинг это продажа волатильности по смыслу действий такого трейдинга. Отсюда растут все ужасные последствия такого трейдинга, которые, однако, не обязательно затронут конкретного трейдера на периоде его торговли.
avatar
Denis, период выбираете самостоятельно. Это может зависеть от ваших предпочтений в торговле. Ищете и контролируете жизнь пар внутри ваших условий. Тесты показали, что контроль стационарности позволяет вовремя закрыть пару, но абсолютно исключить убытки не получается.
Александр Румянцев, ну полностью исключить убытки это не нужно. т.е. тестить на стационарность и как только вышли за какой то порог закрываем позу? и если стационарность вернулась к нужному уровню опять рассматриваем как рабочий вариант?
хм… хватит ли одного этого условия?
avatar
Denis, при тестах прошлого такой подход работал. Будущее надо тестировать. Более глубокое изучение позволит лучше понять поведение пар. А это позволит добавить необходимые условия. 
Sergey Pavlov, на картинках такой клёвый спред, чтобы понять суть и принцип стратегии. В реальности все иначе.
Александр Румянцев, просмотрел ваш сайт, вы там описываете как отбираете пары. А не пробовали отбирать именно по подсекторам, а не так со всего что есть?

avatar
Denis, можно и так. Но ничего не мешает найти пары, а затем отфильтровать по секторам или подгруппам. В одной из статей я к этому пришел. Изначально искал пары, а затем найденные пары анализирую и фильтрую.
Александр Румянцев, вот я вопросы выше задавал, я никак не могу в себе побороть дилему. С одной стороны логика говорит что пары должны быть как бы взаимосвязаны, хоть область что бы была, но с другой, если мы все ровно проверяем стационарность, то любая пара подходит, будь то случайный активы или схожи.

У меня еще вопрос есть, вы у вас на сайте zыcore считаете сами, а почему не стандартной функцие которая имеется в scipy?

ну и раз такая пьянка, как часто пересчитываете значение хэджа? и меняете ли его в открытой позиции?
avatar

Denis, подходит любая пара. Взаимосвязь компаний из разных секторов никто не исключает. Причины могут быть неизвестны.

Можете использовать библиотеку для z-score. Это не принципиально. Только проверьте предварительно, как там считается.

При тестировании в открытой позиции доли участников не менял. Я на этом вообще не заострял внимание, а покупал активы на равные суммы. Расчет правильных долей достоин отдельной статьи, и даже не одной.

Александр Румянцев, в нете документ гуляет, там пишут что через total least squares отлично считается. Сам я как то считал через OLS. а zscore брал из стандартной либы, помнится у меня на некоторых спрэдах разные значения получались если методом как у вас считать и стандартной функцией, но может я и ошибся где тогда :)
avatar
Denis, МНК тоже работает. Я пробовал и с ним тестировать. Все зависит от трейдера/программиста, опыта и предпочтений. 
если бы привели исследования, как ведет себя спред на ООС, было бы другое дело. на истории куча красивых спредов.
возьмите 350 дневных  баров, по первым 250барам постройте кучу спредов, и затем продолжите этот спред без изменения коэфтов на ООС.
вот нечто подобное делал автор тут
goo.gl/RzU7kG
там есть намайненные спреды в pdf
quantsniper.files.wordpress.com/2013/05/spreads1.pdf




avatar
kaus_bonus, я это делаю через 4 статьи. Провожу тексты за период, когда нашёл пары и последующий период для проверки скорости смерти пары. 
Ссылки, ведущие на сайт quantrum.me, битые.
Поправьте, пожалуйста.
avatar

теги блога Александр Румянцев

....все тэги



UPDONW
Новый дизайн