Легко извлекайте базовую информацию об акциях в расширенные технические индикаторы

Технические индикаторы очень интригуют и всегда привлекают мое внимание. Я активно изучаю их, и я узнал, что важная часть изучения технических индикаторов заключается в их применении на реальном рынке, но прежде чем продолжить, нам нужно сделать что-то, называемое бэктестированием, которое является не чем иным, как процессом определения стратегии стратегии. производительность, протестировав его на прошлых исторических данных.

Сейчас для проведения тестирования на истории существует несколько платформ, но я не смог найти необходимую гибкость. Итак, я начал использовать Python (и я все еще использую) для кодирования всей программы, что, кстати, тоже очень гибкое и интересное.

Единственный недостаток использования Python для кодирования всей программы для меня - создание технического индикатора с нуля. Для этого мы должны сначала понять основную идею индикатора, а затем его математические формулы (у некоторых их две или более). Итак, я решил использовать пакеты Python для выполнения работы, но все еще не смог найти достойную внимания библиотеку по двум причинам. Первым была установка и плохая документация, а вторым - неточности в показаниях.

Я начал следовать своему обычному методу, который строил индикатор с нуля, пока не наткнулся на эту библиотеку Python. Вот, Stockstats. Это оболочка для фреймов данных Pandas, которая предлагает данные, начиная от базовой информации об акциях и заканчивая расширенными техническими индикаторами. В этой статье мы углубимся в эту библиотеку и исследуем ее функциональные возможности. Без лишних слов, вперед!

Импорт пакетов

Импорт необходимых пакетов в нашу среду Python - шаг, который нельзя пропустить. В этой статье нам понадобится сумма из пяти пакетов: Pandas для работы с фреймами данных, запросы для выполнения вызовов API и извлечения данных о запасах, NumPy для расширенных функций, Matplotlib для визуализации и, наконец, пакет StockStats для доступа к техническим индикаторам и другим. основная информация об акциях. Для тех, кто еще не установил эти пакеты, скопируйте этот код в свой терминал:

pip install pandas
pip install requests
pip install numpy
pip install matplotlib
pip install stockstats

После завершения установки пакетов пора импортировать их в нашу среду Python.

import requests
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from stockstats import StockDataFrame

plt.style.use('fivethirtyeight')
plt.rcParams['figure.figsize'] = (20, 10)

Извлечение данных о запасах

Теперь, когда мы импортировали все необходимые пакеты. Давайте возьмем исторические данные об акциях Apple с помощью конечной точки API, предоставленной twelvedata.com. Перед этим заметка на twelvedata.com: Twelve Data - один из ведущих поставщиков рыночных данных, имеющий огромное количество конечных точек API для всех типов рыночных данных. Очень легко взаимодействовать с API, предоставляемыми Twelve Data, и у него одна из лучших документации. Кроме того, убедитесь, что у вас есть учетная запись на twelvedata.com, только тогда вы сможете получить доступ к своему ключу API (жизненно важный элемент для извлечения данных с помощью API).

Реализация Python:

def get_historical_data(symbol, start_date):
    api_key = 'YOUR API KEY'
    api_url = f'https://api.twelvedata.com/time_series?symbol={symbol}&interval=1day&outputsize=5000&apikey={api_key}'
    raw_df = requests.get(api_url).json()
    df = pd.DataFrame(raw_df['values']).iloc[::-1].set_index('datetime').astype(float)
    df = df[df.index >= start_date]
    df.index = pd.to_datetime(df.index)
    return df

aapl = get_historical_data('AAPL', '2020-01-01')
aapl.tail()

Вывод:

В приведенном выше коде мы первым делом определили функцию с именем get_historical_data, которая принимает в качестве параметров символ акции (symbol) и дату начала исторических данных (start_date).

Внутри функции мы определяем ключ API и URL-адрес и сохраняем их в соответствующей переменной. Затем мы извлекаем исторические данные в формате JSON с помощью функции get и сохраняем их в переменной raw_df. После выполнения некоторых процессов очистки и форматирования необработанных данных JSON мы возвращаем их в виде чистого фрейма данных Pandas. Наконец, мы вызываем созданную функцию, чтобы извлечь исторические данные Apple с начала 2020 года и сохранить их в переменной aapl.

Фреймворк данных Pandas в фрейм данных Stockstats

Одна из самых важных вещей, которую нужно сделать, прежде чем что-либо делать, - это изменить фрейм данных Pandas на фреймворк Stockstats. На предыдущем этапе, когда мы извлекали исторические данные Apple с помощью конечной точки API, мы преобразовали ответ JSON и сохранили его в форме фрейма данных Pandas. Итак, сначала мы должны изменить его на фрейм данных Stockstats, что можно легко сделать, вызвав основной класс пакета StockDataFrame и передав в него фрейм данных. Следуйте приведенному ниже фрагменту кода, чтобы сделать это:

aapl = StockDataFrame(aapl)

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

Доступ к техническим индикаторам

Теперь мы готовы сосредоточиться на основной части этой статьи. Как я уже упоминал в заголовке, Stockstats предлагает технические индикаторы таким образом, что нам нужно закодировать только строку, и мы можем получить желаемый результат, который, кстати, является не ложной надеждой, а реальным. Все, что нам нужно сделать, это просто выбрать имя столбца, например, как мы получаем доступ к столбцам в фрейме данных Pandas, а Stockstats позаботится обо всем остальном. Чтобы показать, насколько это просто, давайте рассмотрим пример, в котором мы будем получать доступ к показаниям SMA с разными периодами ретроспективного анализа:

aapl[['closewindowsma', 'close_20_sma', 'close_50_sma']]

Приведенный выше код предоставит нам значения SMA для периодов ретроспективного анализа 10, 20 и 50. Наряду с этим, значения будут добавлены в исходный фрейм данных Apple, что действительно здорово и не предлагается другой библиотекой технического анализа. Результатом кода будет фрейм данных Stockstats, который выглядит следующим образом:

Stockstats ожидает, что мы будем следовать определенной структуре для доступа к техническим индикаторам: {columnName_window_statistics}, где columnName - это столбец в нашем фрейме данных, который мы хотим учитывать при вычислении индикатора, window - период ретроспективного анализа, а statistics - это индикатор, к которому мы хотим получить доступ. В приведенном выше примере мы упомянули close как columnName, что означает, что мы хотим принять во внимание цену закрытия Apple, 10,20,50 как период ретроспективного анализа и sma как статистику или технический индикатор, к которому мы хотим получить доступ.

Stockstats не только позволяет нам получить доступ к основным техническим индикаторам, таким как простая скользящая средняя, ​​но также открывает двери для многих других продвинутых индикаторов, таких как полосы Боллинджера, индекс относительной силы,% R Вильямса, схождение / расхождение скользящих средних, индекс товарного канала и скоро. Следующий фрагмент кода будет обращаться ко всем упомянутым выше расширенным техническим индикаторам, имеющим ту же структуру, что и код SMA.

# 1. BOLLINGER BANDS
aapl[['boll', 'boll_ub', 'boll_lb']]

# 2. RSI
aapl[['rsi_11', 'rsi_14', 'rsi_21']]

# 3. WILLIAMS %R
aapl[['wr_11', 'wr_14', 'wr_21']]

# 4. MACD
aapl[['macd', 'macdh', 'macds']]

# 5. COMMODITY CHANNEL INDEX
aapl[['cci_11', 'cci_14', 'cci_21']]

Каждая строка в приведенном выше коде будет обращаться к упомянутому индикатору для разных периодов ретроспективного анализа и добавлять значения в исходный фрейм данных. Можно заметить, что я использовал двойные скобки при доступе к техническим индикаторам, потому что Stockstats построен на основе класса фрейма данных Pandas и по-прежнему сохраняет свои функции, поэтому при использовании одинарных скобок вывод будет в форма серии Pandas. Поскольку я хочу, чтобы вывод был во фрейме данных Pandas, я использовал двойные скобки.

Генерация торговых сигналов

Одной из уникальных особенностей Stockstats является его способность генерировать сигналы от упомянутой торговой стратегии. Это здорово, потому что алгоритмическая торговля - это генерация торговых сигналов, и без этого созданные торговые стратегии устареют. Подобно тому, как мы обращались к техническим индикаторам, для этого также требуется всего лишь строка кода, но структура отличается. Следующий фрагмент кода генерирует торговые сигналы входа, когда SMA 20 пересекает SMA 50:

aapl['close_50_sma_xd_close_20_sma']

Приведенный выше код дает серию логических значений в качестве выходных данных, которые меняют значение True, если условие удовлетворяется, или же значение равно False. Следующий код выведет это на следующий уровень, генерируя торговые сигналы входа и выхода, что делает стратегию более реалистичной по своему характеру:

buy_signals = aapl['close_50_sma_xd_close_20_sma']
sell_signals = aapl['close_20_sma_xd_close_50_sma']
for i in range(len(buy_signals)):
    if buy_signals.iloc[i] == True:
        buy_signals.iloc[i] = aapl.close[i]
    else:
        buy_signals.iloc[i] = np.nan
for i in range(len(sell_signals)):
    if sell_signals.iloc[i] == True:
        sell_signals.iloc[i] = aapl.close[i]
    else:
        sell_signals.iloc[i] = np.nan
        
plt.plot(aapl['close'], linewidth = 2.5, label = 'AAPL')
plt.plot(aapl['close_20_sma'], linewidth = 2.5, alpha = 0.6, label = 'SMA 20')
plt.plot(aapl['close_50_sma'], linewidth = 2.5, alpha = 0.6, label = 'SMA 50')
plt.plot(aapl.index, buy_signals, marker = '^', markersize = 15, color = 'green', linewidth = 0, label = 'BUY SIGNAL')
plt.plot(aapl.index, sell_signals, marker = 'v', markersize = 15, color = 'r', linewidth = 0, label = 'SELL SIGNAL')
plt.legend(loc = 'upper left')
plt.title('AAPL SMA 20,50 CROSSOVER STRATEGY SIGNALS')
plt.show()

Давайте разберем код по каждой строке. В первых двух строках кода мы используем Stockstats для генерации торговых сигналов входа и выхода и сохраняем значения в соответствующих переменных. После этого мы создаем два цикла for, которые заменят торговые сигналы ценой закрытия акции, если значение равно True, иначе значения False будут заменены на NaN. Следующие строки отображают созданные торговые сигналы вместе с ценой закрытия Apple и рассчитанной SMA 20, 50, которая даст следующий результат:

Из приведенного выше графика можно заметить, что всякий раз, когда красная линия (SMA 20) пересекает золотую линию (SMA 50), сигнал на покупку отображается зеленым цветом, аналогично, когда золотая линия пересекает красную линию, появляется сигнал на продажу отображается красным цветом.

Последние мысли!

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

Единственным недостатком этого пакета на данный момент является плохая документация, на полное понимание которой уходит тысячелетия. Хотя пакет не такой большой, как другие, такие как Pandas и NumPy, важно поддерживать идеальную документацию, поскольку предоставляемые функции сложны и отличаются от других, поскольку это библиотека-оболочка. Большое спасибо Эрику Левинсону за то, что он познакомил меня с этим пакетом в своей отличной статье (настоятельно рекомендуется проверить ее).

В заключение, Stockstats является единственной в своем роде и представляет собой отличную библиотеку для всех, кто только начинает заниматься техническим анализом, и предоставляет мощные функции, к которым можно получить доступ с помощью всего лишь строчки кода, что в конечном итоге сокращает усилия программиста и экономит время. Сказав это, вы подошли к концу статьи. Надеюсь, вы узнали что-то полезное и новое из этой статьи.