Поиск графиков по шаблону через корреляцию

Рассмотрен примитивный метод поиска похожих графиков с помощью корреляции. Все происходит под Linux с помощью Python 3.5. (Windows может добавить геморроя.)

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

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

  • Linux (Ubuntu).
  • Python 3.5.
  • История цен.
  • Ipython (Jupyter).

Цены можно выкачивать с Yahoo.Finance, но это будет крайне медленно. Отпимальным решением будет бесплатная база на Quandl.

🎓Корреляция: что это?

Объяснение и формулу можно почерпнуть на Вики, а кратко: это статистическая взаимосвязь двух или более случайных величин.

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

Искать корреляцию будем с помощью библиотеки talib, так как она позволяет искать максимально быстро из доступных подручных пакетов для Python. Как устанавливать библиотеку можно почитать здесь. Расширение для Python устанавливаем командой:

Пример использования:

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

Есть альтернативы — numpy.corrcoef и scipy.stats.pearsonr. Работают чуть медленнее, но значительно легче устанавливаются. Scipy.stats.pearsonr работает быстрее реализации numpy.

Примеры использования:

Тестируем скорость (для пытливых умов):

🔭Где взять историю цен?

Для ускорения поиска похожих графиков историю цен лучше иметь локально в базе данных. Можно выкачать все активы с Yahoo.Finance, но это и сложно и долго. Оптимальным решением вижу Quandl, где бесплатно доступны 3000 активов совершенно бесплатно, что будет более чем достаточно, чтобы поиграться. Примеры кода есть на Quandl.

Ищем шаблоны цены

Мне нравятся шаблоны следующих графиков:

CIM — 30 сессий до 25 июля 2016

CIM на 25-07-16

WIN — 20 сессий до 5 сентября 2016

WIN шаблон 2016-09-05

Чтобы найти подобные графики нам нужен штамп изменения цены за определенное время. Получаем историю изменения цены (используем только adjusted close) и заворачиваем в numpy-массив.

Далее делаем запрос и получаем историю цен всех активов на заданную продолжительность. Для каждого актива заворачиваем close в numpy-массив аналогично штампу.

Итогом у нас имеется массив со штампом и список массивов с ценами для сравнения.

Вот результат на 11 октября 2016 по шаблону CIM (PTCT, KERX, CARA, LITE):

Сравниваем 30 торговых сессий с порогом корреляции выше 0,93.

Результат на 11 октября 2016 по шаблону WIN (TLDR, MHLD):

Сравниваем 20 торговых сессий с порогом корреляции выше 0,85.

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

Дополнительно можно создавать свои штампы, например:

Ищем ровные тренды

Ищем параболы

🎁Код в студию

Блокнот Ipython с кодом доступен в репозитории. Там достаточно поменять настройки подключения к базе данных и sql-запрос получения цен. У меня цены хранятся в integer и при получении их необходимо поделить на 10000.

Подключение к базе данных

Здесь описан класс для работы с базой данных. При создании передаем параметры соединения. Подтверждением успеха будет тишина…

Далее по коду будем дергать метод [code python]Db().query()[/code] для выполнения запросов и получения данных.

Вспомогательные функции

  • prices() — получение истории цен на заданный промежуток времени для массива тикеров.
  • check_stamp() — поиск корреляций для списка тикеров и возвращение тикеров с корреляцией выше/ниже указанной границы.

Готовим штамп для поиска

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

🍰А теперь самое вкусное

Готовим список тикеров, которые будем проверять, или заполняем его вручную. Список тикеров со штампом и настройками кидаем на обработку в [code]check_stamp()[/code] и результатом получаем найденные тикеры, отсортированные в сторону большей корреляции.

Графики найденных тикеров всем скопом можно посмотреть на finviz.

💬Напишите в комментариях, допустима ли такая погрешность? И надо ли так искать?

Александр Румянцев
Автор на Quantrum.me
Telegram-канал📣: @quantiki

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