Этой статьей мы продолжим улучшать результы автоматического поиска пар для торговли. Дополнительным фильтром будем использовать измерения, доступные после построения регрессии методом statsmodels.api.OLS(). Этот же фильтр будем применять к парам во время торговли.
Найденные пары проверим в Quantopian, а исходный код напишем на Python.
Подробнее о регрессии и МНК читайте в этой статье. Стратегия «Парного трейдинга» описана здесь.
В этот раз пары тестируем в 2015 году. То есть в году, когда эти пары были найдены. Наша цель — улучшить поиск. Тестировать на будущих периодах будем в следующих статьях.
Пары ищем на американском рынке среди акций, удовлетворяющих условиям:
Пары ищем на 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. Три пары — это очень мало. Для принятия решений следует проводить большее количество тестов.
Пара | Доходность | Просадка | ||
---|---|---|---|---|
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.
На графиках видно, что пара имеет прочную связь. Цены меняются схоже, а z-оценка имеет достаточное количество сигналов. На тесте (внизу) видно, что пара начинает удовлетворять условиям торговли только во второй половине года. Результаты торговли удовлетворительные.
Под графиком доходности теста расположены изменения z-оценки и r^2.
Данная пара имеет схожее поведение доходности в течение всего года. Возможно, в этот раз фильтры работают не идеально. Это приводит к большой просадке, когда спред сильно отклоняется. К концу года пара все-таки приносит ощутимую прибыль.
Под графиком доходности теста расположены изменения z-оценки и r^2.
У данной пары доходность ведет себя схоже только после сентября, что также видно на графике z-оценки. На тесте видно, что торговать начинает алгоритм лишь в ноябре. Исправно работают фильтры стационарности и r^2.
Исходный код доступен на Quantrum.me
Фильтр по r^2 позволил улучшить результаты автоматического выбора пар для торговли. Я проверил большее количество произвольных пар. Практически все пары показали положительную доходность.
В одной из будущих статей мы рассмотрим алгоритм для одновременного тестирования нескольких пар. Данный алгоритм будет запущен торговать в реальном времени на демо-счете.
В данный момент команда Quantrum активно изучает возможности бэктестинга и торговли русскими акциями с помощью Python. Результаты ждите в будущих статьях.
В комментариях напишите, как еще можно проверять пары? Что можно упростить? А что можно улучшить?
Александр Румянцев aka «i.am.raa»
Автор Quantrum.me
Интересуетесь алготрейдингом на Python? Присоединяйтесь к команде. Пишите в личку или на email.