Парный трейдинг: 1 из 3 способов поиска пар

Первый из трех способов автоматического поиска пар🎏 на Python🐍 для торговли по стратегии «Парного трейдинга». Исходя из результатов предыдущей статьи, во всех примерах мы будем использовать только поиск коинтеграции.

Кратко о «Парном трейдинге»: в основе стратегии лежит предположение, что есть две акции, которые имеют глубокую экономическую связь друг с другом, и их цена движется в одном направлении с разной скоростью. Когда отстает акция А, мы ее покупаем и одновременно продаем в короткую акцию Б. И наоборот.

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

📏Подготовка к поиску

Для правильной работы необходимо соблюсти следующие условия:

  1. Истории цен должны быть равной длины. (Результат сравнения историй за 200 дней и за 20 дней может быть непредсказуем).
  2. Значения должны быть переведены в относительные величины. (Тяжело сравнивать активы за $200 и за $1).
  3. Каждая история не должна обладать стационарностью сама по себе. (Важна именно стационарность спреда пары, а не отдельного актива в ней).

Коинтеграцию каждого времянного ряда будем проверять с помощью метода Дики-Фуллера из библиотеки statsmodels. Код подготовки ниже:

☝Выбор акций для поиска

Искать пары будем среди активов торгующихся на рынке, включая ETF, ограничив следующими условиями:

  • Цена более $10.
  • Средний объем более 500 тыс. акций в день.
  • ATR за 13 дней более $0.40.

Проверяем на ликвидных активах с хорошим движением внутри дня. Из 6 тысяч американских акций, торгующихся на биржах, нам подходят ~1500 активов. Тестировать будем предыдущий год (360 календарных дней).

🔍1 из 3: Простой коинтеграционный тест

Использую самую первую попавшуюся на глаза функцию для проверки пары на стационарность.  Это тест на наличие единичных корней найден в библиотеке statsmodels.

Функция проверки стационарности:
statsmodels.tsa.stattools.coint(X, Y)

Функция поиска пар получает словарь с историей относительного изменения цен и последовательно проверяет каждую пару. Для 1500 активов это примерно 1.1 миллиона вариантов.

Выбираем пары с оценкой ниже 5% уровня ошибки и p-значением меньше 0,001. Код поиска пар ниже:

На момент написания статьи тест нашел 6400 пар (~0.6%), поиск загружал 1 ядро процессора и длился порядка 45 минут. Вот первые несколько пар с наименьшим p-значением:

  • XIV, SVXY
  • IWB, SPY
  • IVV, SPY
  • DUST, GDX
  • SPY, SPXU

Видно, что это ETF на индексы и первые два действительно имеют стационарный спред, а вот начиная с IVV и SPY найти проблемы нам помогут графики.

🎏Проверка найденных пар

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

  • XIV, SVXY
  • DUST, GDX
  • XLK, QQQ
  • PRU, C
  • TMUS, WCG

👎XIV, SVXY

XIV — ETN (аналог ETF) обратный индексу страха $VIX.
VSXY — ETF обратный индексу страха $VIX.

На графике история цен и сигнальная линия z-оценки. SVXY домножен на коэффициент для приведения цен к единой величине. Видно, что график хорош, но два месяца назад (ноябрь-декабрь 2016) спред уменьшился. Причина в моем поставщике данных. Ранее была бо́льшая погрешность в цене, которую нивелировали.

Код z-оценки:

👎DUST, GDX

DUST — 3х-кратный обратный ETF к GDX.
GDX — ETF компаний-золотодобытчиков.

График разочаровывает и подобных графиков в результатах много. Данные активы обратно-скоррелированы — этот факт в их природе существования. Функция coint(X, Y) на вход получает два времянных ряда и сама проверяет их стационарность. Видимо эта функция использует в основе проверку корреляции и дополнительно подгоняет ряды.

👍XLK, QQQ

XLK — ETF на индекс технологических компаний.
QQQ — ETF на индекс NASDAQ-100, где преимущественно технологические компании.

Здесь результаты лучше, но так как в QQQ также много компаний из XLV (здравоохранение), то в январе 2017 XLK сумел вырваться вперед.

👌PRU, C

Копнем поглубже и возьмем несколько компаний.

PRU — Prudential Financials, страховая компания.
C — Citibank, банк.

Большую часть года компании шли в ногу, что не удивительно, так как обе в XLF (финансовый сектор) и обе выигрывают от роста ставок. Но за январь 2017 появилось расхождение.

👍TMUS, WCG

TMUS — T-Mobile US, американский сотовый оператор.
WCG — WellCare Health Plans, компания из сектора здравоохранения.

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

🏁Вывод

Данный метод имеет право на существование. Удается найти хорошие пары, которые достойны участия в бэктестинге. Но одновременно к нам приходит большое количество шлака💩, что заставляет отсматривать👀 результаты вручную. Лучше себя проявил поиск с помощью метода Дики-Фуллера, о котором я буду писать в следующей статье.

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

🎓Обучение «Парному трейдингу» у профессионалов👍.
Александр Румянцев
Автор Quantrum.me
Telegram-канал📣: @quantiki

Подбор и тестирование портфелей. Подключение стратегий к IB.