Парный трейдинг: фильтруем пары по смешанной корреляции

Этой статьей мы продолжим улучшать результы автоматического поиска пар🎏 для торговли. Дополнительным фильтром будем использовать 📐измерения, доступные после построения регрессии методом statsmodels.api.OLS(). Этот же фильтр будем применять к парам во время торговли📈.

Найденные пары проверим в Quantopian, а исходный код напишем на Python🐍.

Подробнее о регрессии и МНК читайте в этой статье. Стратегия «Парного трейдинга» описана здесь.

В этот раз пары тестируем в 2015 году. То есть в году, когда эти пары были найдены. Наша цель — улучшить поиск. Тестировать на будущих периодах будем в следующих статьях.

Исходные данные

Пары ищем на американском рынке среди акций, удовлетворяющих условиям:

  • цена более $10;
  • объем более 300 тыс./день;
  • ATR более $0,30;
  • история более 255 торговых дней;
  • спред стационарен за 255 дней;
  • спред стационарен за последние 127 дней.

Пары ищем на 1 января 2016 года. Используем исторические цены, отрегулированные на дивиденды и сплиты. На стационарность проверяем спред относительных значений (доходность), чтобы торговать активами на равные суммы.

Коэффициент смешанной корреляции

Коэффициент показывает, какой процент изменения цены одного актива обусловлен изменением цены другого актива. Если кратко, то это квадрат корреляции цен активов. Принимает значения от 0 (независмы друг от друга) до 1 (зависимы друг от друга). Обозначается r^2.

Ниже графики зависимостей с построенной линией регрессии. Слева — высокая зависимость, центр — оптимальная зависимость, справа — низкая зависимость.

Оптимальные значения лежат в диапазоне:

    \[ 0.6 < r^2 < 0.93 \]

Ниже 0.6 — зависимость низкая, большой разброс и плохие результаты тестов. Выше 0.93 — слишком высокая зависимость и при отклонениях недостаточно «разбега», чтобы заработать.

Оценка стандартной ошибки

Оценка определяет объем разброса значений вокруг кривой регрессии. Обозначается se. Чем лучше пара, тем ниже значение. Ниже график сравнений значений r^2 и se, а также r^2 и стандартного отклонения спреда скользящих средних для найденных пар.

Тестирование пар

Мы протестируем три пары с разными значениями r^2 и se. Три пары — это очень мало. Для принятия решений следует проводить большее количество тестов.

Пара r^2 se Доходность  Просадка
VAL, TLK 0.77 0.03 +34.5% -4.8%
ALNY, DATA 0.73 0.03 +84.7% -22.2%
CF, CMI 0.70 0.03 +21.7% -4.3%

Во время теста будем останавливать торговлю при потере стационарности за предыдущие 130 торговых дней или выходе r^2 за границы диапазона 0.6 < r^2 < 0.93.

VLK, TLK

На графиках видно, что пара имеет прочную связь. Цены меняются схоже, а z-оценка имеет достаточное количество сигналов. На тесте (внизу) видно, что пара начинает удовлетворять условиям торговли только во второй половине года. Результаты торговли удовлетворительные.

Под графиком доходности теста расположены изменения z-оценки и r^2.

ALNY, DATA

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

Под графиком доходности теста расположены изменения z-оценки и r^2.

CF, CMI

У данной пары доходность ведет себя схоже только после сентября, что также видно на графике z-оценки. На тесте видно, что торговать начинает алгоритм лишь в ноябре. Исправно работают фильтры стационарности и r^2.

🎁Код в студию

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

🏁Вывод

Фильтр по r^2 позволил улучшить результаты автоматического выбора пар для торговли. Я проверил большее количество произвольных пар. Практически все пары показали положительную доходность.

В одной из будущих статей мы рассмотрим алгоритм для одновременного тестирования нескольких пар. Данный алгоритм будет запущен торговать в реальном времени на демо-счете.

В данный момент команда👥 Quantrum активно изучает возможности бэктестинга и торговли русскими акциями🇷🇺 с помощью Python🐍. Результаты ждите в будущих статьях.

💬В комментариях напишите, как еще можно проверять пары? Что можно упростить? А что можно улучшить?

Александр Румянцев aka "iamraa"
Автор Quantrum.me
Интересуетесь алготрейдингом на Python? Присоединяйтесь к команде. Пишите в личку или на email.
🎓Обучение «Парному трейдингу» у профессионалов👍.