Блог им. Quantrum
Первый из трех способов автоматического поиска пар на Python для торговли по стратегии «Парного трейдинга». Исходя из результатов предыдущей статьи, во всех примерах мы будем использовать только поиск коинтеграции.
Кратко о «Парном трейдинге»: в основе стратегии лежит предположение, что есть две акции, которые имеют глубокую экономическую связь друг с другом, и их цена движется в одном направлении с разной скоростью. Когда отстает акция А, мы ее покупаем и одновременно продаем в короткую акцию Б. И наоборот.
Используем дневные цены закрытия, отрегулированные на дивиденды и сплиты. Вы можете скачать бесплатную историю дневных цен с Quandl.
Для правильной работы необходимо соблюсти следующие условия:
Коинтеграцию каждого времянного ряда будем проверять с помощью метода Дики-Фуллера из библиотеки statsmodels. Код подготовки ниже: Исходный код на Quantrum.me.
Искать пары будем среди активов торгующихся на рынке, включая ETF, ограничив следующими условиями:
Проверяем на ликвидных активах с хорошим движением внутри дня. Из 6 тысяч американских акций, торгующихся на биржах, нам подходят ~1500 активов. Тестировать будем предыдущий год (360 календарных дней).
Использую самую первую попавшуюся на глаза функцию для проверки пары на стационарность. Это тест на наличие единичных корней найден в библиотеке statsmodels.
Функция проверки стационарности: statsmodels.tsa.stattools.coint(X, Y)
Функция поиска пар получает словарь с историей относительного изменения цен и последовательно проверяет каждую пару. Для 1500 активов это примерно 1.1 миллиона вариантов.
Выбираем пары с оценкой ниже 5% уровня ошибки и p-значением меньше 0,001. Код поиска пар ниже: Исходный код на Quantrum.me.
На момент написания статьи тест нашел 6400 пар (~0.6%), поиск загружал 1 ядро процессора и длился порядка 45 минут. Вот первые несколько пар с наименьшим p-значением:
Видно, что это ETF на индексы и первые два действительно имеют стационарный спред, а вот начиная с IVV и SPY найти проблемы нам помогут графики.
Проверим несколько графиков найденных пар и оценим результаты, чтобы оценить, можно ли положиться на скрипт для автоматического поиска. Для проверки возьмем произвольные пары:
XIV — ETN (аналог ETF) обратный индексу страха $VIX.
VSXY — ETF обратный индексу страха $VIX.
На графике история цен и сигнальная линия z-оценки. SVXY домножен на коэффициент для приведения цен к единой величине. Видно, что график хорош, но два месяца назад (ноябрь-декабрь 2016) спред уменьшился. Причина в моем поставщике данных. Ранее была бо́льшая погрешность в цене, которую нивелировали.
Код z-оценки: Исходный код на Quantrum.me.
DUST — 3х-кратный обратный ETF к GDX.
GDX — ETF компаний-золотодобытчиков.
График разочаровывает и подобных графиков в результатах много. Данные активы обратно-скоррелированы — этот факт в их природе существования. Функция coint(X, Y) на вход получает два времянных ряда и сама проверяет их стационарность. Видимо эта функция использует в основе проверку корреляции и дополнительно подгоняет ряды.
XLK — ETF на индекс технологических компаний.
QQQ — ETF на индекс NASDAQ-100, где преимущественно технологические компании.
Здесь результаты лучше, но так как в QQQ также много компаний из XLV (здравоохранение), то в январе 2017 XLK сумел вырваться вперед.
Копнем поглубже и возьмем несколько компаний.
PRU — Prudential Financials, страховая компания.
C — Citibank, банк.
Большую часть года компании шли в ногу, что не удивительно, так как обе в XLF (финансовый сектор) и обе выигрывают от роста ставок. Но за январь 2017 появилось расхождение.
TMUS — T-Mobile US, американский сотовый оператор.
WCG — WellCare Health Plans, компания из сектора здравоохранения.
Связь данной пары меня удивляет, но с графиком не поспоришь, они идут нога в ногу и обладают хорошим спредом.
Данный метод имеет право на существование. Удается найти хорошие пары, которые достойны участия в бэктестинге. Но одновременно к нам приходит большое количество шлака, что заставляет отсматривать результаты вручную. Лучше себя проявил поиск с помощью метода Дики-Фуллера, о котором я буду писать в следующей статье.
В комментариях задавайте вопросы и спрашивайте, что описать подробнее. Покажите примеры лучших пар, по вашему мнению.
Обучение «Парному трейдингу» у профессионалов.
ru-ticker.com
Графики, по идее, тоже будут расходиться на средне и долгосрочном периоде, хотя и в меньшей степени… На первый взгляд это может показаться парадоксальным, но несмотря на 3-е плечо в NUGT, его график почти всегда будет под GDX.
Впрочем, если рассмотреть изолировано период только первой половины 2016 года, то NUGT на какое-то время обгонит свою базу.
А долгосрочное расхождение будет формироваться как раз из-за маржинальной природы NUGT, поскольку на падающих днях, особенно на падающих резко, его Net Assets Value регулярно как бы утрамбовывается, и практически уже не восстанавливается до прежних значений (что, кстати, лишний раз напоминает о пагубности плечей).
Какова вероятность что порвет сильнее, чем заработаешь?
это уже растрата семени в союзе с кулачеством.
выкинь гадость сразу… не трать время… на дневках тестить нельзя, т.к дневки содержат сделки за пределами торговой сессии… т.е один актив не торгуется уже а по второму идут сделки… и эти сделки входят в дневные цены… ты как бы заглядываешь в будущее...
это легко можно проверить… берешь дневки смотришь цены открытия закрыти хая и лоя… затем смотришь 15ти минутку за тот же день и смотришь что было реально внутри торговой сессии
Допустим спред отклонился от среднего уровня на величину входа, которая у вас определена системой. Вы вошли по направлению возврата к среднему уровню. Но спред идет дальше против вашей позы. При этом вы постоянно следите за состоянием пары.
Что будете делать в такой ситуации для минимизации убытка?