В статье, которой я хочу с вами поделиться, рассмотрен примитивный метод поиска похожих графиков с помощью корреляции. Все происходит под Linux с помощью Python 3.5. (Windows может добавить геморроя). Основная идея: когда нравится движение цены на графике в определенный момент времени, я хочу легко находить похожие движения на рынке на сегодняшний день.
Исходные данные:
Цены можно выкачивать с Yahoo.Finance, но это будет крайне медленно. Отпимальным решением будет бесплатная база на Quandl.
Объяснение и формулу можно почерпнуть на Вики, а кратко: Это статистическая взаимосвязь двух или более случайных величин.
В данном случае мы будем использовать корреляцию Пирсона. С помощью данного вида корреляции можно определить силу линейной зависимости между величинами. Корреляция будет измеряться от -1 (обратная корреляция, цены движутся в противоположных направлениях) до 1 (прямая корреляция, цены движутся в одном направлении).
Искать корреляцию будем с помощью библиотеки talib, так как она позволяет искать максимально быстро из доступных подручных пакетов для Python. Как устанавливать библиотеку можно почитать здесь. Для Python расширение, ее использующее, устанавливаем командой:
<code class=" language-batch">$ pip install TA-Lib</code>
Пример использования:
<code class=" language-python">import numpy as np import talib arr = np.array([x for x in range(0, 100, 1)], dtype=float) length = 50 # length of data for get correlation corr = talib.CORREL(arr[-length:], arr[-length:], length) print(corr[-1])</code>
В данном примере мы получим корреляцию для 50 последовательных элементов. Результатом будет единица, так как сравниваемая выборка равна самой себе.
Есть альтернативы — numpy.corrcoef и scipy.stats.pearsonr. Работают чуть медленнее, но значительно легче устанавливаются. Scipy.stats.pearsonr работает быстрее реализации numpy.
Примеры использования:
<code class=" language-python"># SciPy & Numpy import numpy as np from scipy.stats import pearsonr arr = np.array([x for x in range(0, 100, 1)], dtype=float) length = 50 # length of data for get correlation corr_np = np.corrcoef(arr[-length:], arr[-length:]) corr_scipy = pearsonr(arr[-length:], arr[-length:]) print(corr_np, corr_scipy)</code>
Тестируем скорость (для пытливых умов):
<code class=" language-python">%timeit talib.CORREL(arr[-length:], arr[-length:], length) %timeit np.corrcoef(arr[-length:], arr[-length:]) %timeit pearsonr(arr[-length:], arr[-length:])</code>
Для ускорения поиска похожих графиков, историю цен лучше иметь локально в базе данных. Можно выкачать все активы с Yahoo.Finance, но это и сложно и долго. Оптимальным решением вижу Quandl, где бесплатно доступны 3000 активов совершенно бесплатно, что будет более чем достаточно, чтобы поиграться. Примеры кода есть на Quandl.
Продолжить чтение и посмотреть результаты можно здесь.