Создание и проверка простых алгоритмов торговли акциями с использованием Python

Разработка и тестирование простых алгоритмов для торговли акциями с применением Python

Введение

Алгоритмическая торговля – это широко применяемая стратегия торговли, которая революционизировала способ, которым люди торгуют акциями. Все больше и больше людей зарабатывают деньги, инвестируя в акции и автоматизируя свои торговые стратегии. В этом учебнике вы узнаете, как создавать алгоритмы торговли акциями с использованием примитивных технических индикаторов, таких как MACD, SMA, EMA и т.д., и выбирать лучшие стратегии на основе их фактической эффективности/доходности, полностью с помощью Python.

Цели обучения

  • Узнать, что такое алгоритмическая торговля.
  • Создание простых алгоритмов торговли акциями на Python с использованием технических индикаторов для генерации сигналов покупки и продажи.
  • Научиться реализовывать торговые стратегии и автоматизировать их на Python.
  • Узнать, как сравнивать и выбирать лучшую торговую стратегию на основе их средней доходности.

Эта статья была опубликована в рамках Блогонауки по анализу иерархии дата-сайентиста.

Отказ от ответственности – это не является финансовым советом, и все работы, выполненные в этом проекте, предназначены только для образовательных целей.

Что такое алгоритмическая торговля?

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

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

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

Как использовать алгоритмы на Python для анализа торговли акциями?

Мы можем анализировать фондовый рынок, определять тренды, разрабатывать торговые стратегии и устанавливать сигналы для автоматизации торговли акциями – все это с использованием Python! Процесс алгоритмической торговли с использованием Python включает несколько этапов, таких как выбор базы данных, установка определенных библиотек и извлечение исторических данных. Погрузимся теперь в каждый из этих этапов и научимся создавать простые алгоритмы торговли акциями.

Выбор набора данных

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

В этой статье мы рассмотрим акции Nifty 50. Индекс Nifty 50 состоит из 50 лучших компаний в Индии, выбранных на основе различных факторов, таких как рыночная капитализация, ликвидность, секторное представительство и финансовые показатели. Индекс также широко используется как опора для измерения результативности индийского фондового рынка, и, следовательно, риск, связанный с инвестированием в эти компании, ниже, чем при инвестировании в мало- или среднекапитализированные компании. В этой статье для анализа мы рассмотрим акцию WIPRO. Подход, обсуждаемый в этой статье, можно применить к любому набору похожих акций, вызывая функции для каждой акции в цикле.

Установка необходимых библиотек

Мы будем использовать встроенные библиотеки, такие как pandas, numpy, matplotlib, а также yfinance и pandas_ta. Библиотека yfinance будет использоваться для извлечения исторических цен акций. Библиотека pandas_ta будет использоваться для реализации индикаторов SMA и MACD и создания торгового алгоритма. Эти модули могут быть установлены напрямую с использованием pip, как и любая другая библиотека Python. Подключим модули после установки.

!pip install yfinance!pip install pandas-ta

import yfinance as yfimport pandas as pdimport pandas_ta as taimport numpy as npfrom datetime import datetime as dtimport matplotlib.pyplot as pltfrom datetime import timedelta as deltaimport numpy as npimport osimport seaborn as sb

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

Извлечение исторических цен на акции с помощью yfinance

Мы будем использовать функцию “download()” из модуля yfinance для извлечения исторической цены акции, которая принимает символ акции, дату начала и дату окончания. В упрощенной форме мы возьмем “2000-01-01” в качестве начальной даты и текущую дату в качестве конечной даты. Мы напишем простую функцию, которая извлекает исторические цены акций и возвращает их в виде фрейма данных для дальнейшей обработки, сохраняя его как CSV-файл на диске.

def get_stock_info(stock, save_to_disk=False):    start_date = '2000-01-01'    end_date = (dt.now() + delta(1)).strftime('%Y-%m-%d')    df = yf.download(f"{stock}.NS", period='1d', start=start_date, end=end_date, progress=False)    if(save_to_disk == True):        path = './csv'        try: os.mkdir(path)        except OSError as error: pass        df.to_csv(f'{path}/{stock}.csv')    return dfdf = get_stock_info('WIPRO', save_to_disk = True)

Построение торговых алгоритмов с использованием технических показателей

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

Для пересечения SMA мы возьмем во внимание 10-дневную, 30-дневную, 50-дневную и 200-дневную скользящие средние. Для пересечения MACD мы возьмем во внимание 12-дневные, 26-дневные и 9-дневные экспоненциальные скользящие средние. Давайте рассчитаем эти значения с использованием библиотеки pandas_ta.

Для расчета SMA мы будем использовать функцию “sma()”, передавая цену на закрытие акции вместе с числом дней. Для расчета MACD мы будем использовать функцию “macd()”, передавая цену на закрытие акции и устанавливая параметры быстрого, медленного и сигнального значения соответственно 12, 26 и 9. Значения SMA и MACD по себе не имеют особого смысла. Поэтому давайте закодируем их, чтобы понять, есть ли перекрестки.

В случае SMA мы возьмем 3 условия:

  • 10-дневная SMA должна быть выше 30-дневной SMA.
  • 10-дневная и 30-дневная SMA должны быть выше 50-дневной SMA.
  • 10-дневная, 30-дневная и 50-дневная должны быть выше 200-дневной SMA.

В случае MACD у нас будет 2 условия:

  • MACD должен быть выше MACD сигнала.
  • MACD должен быть больше 0.

Приведенный ниже код на Python создает функцию для реализации указанных выше условий.

def add_signal_indicators(df):    df['SMA_10'] = ta.sma(df['Adj Close'],length=10)    df['SMA_30'] = ta.sma(df['Adj Close'],length=30)    df['SMA_50'] = ta.sma(df['Adj Close'],length=50)    df['SMA_200'] = ta.sma(df['Adj Close'],length=200)        macd = ta.macd(df['Adj Close'], fast=12, slow=26, signal=9)    df['MACD'] = macd['MACD_12_26_9']    df['MACD_signal'] = macd['MACDs_12_26_9']    df['MACD_hist'] = macd['MACDh_12_26_9']        df['10_cross_30'] = np.where(df['SMA_10'] > df['SMA_30'], 1, 0)        df['MACD_Signal_MACD'] = np.where(df['MACD_signal'] < df['MACD'], 1, 0)        df['MACD_lim'] = np.where(df['MACD']>0, 1, 0)        df['abv_50'] = np.where((df['SMA_30']>df['SMA_50'])            &(df['SMA_10']>df['SMA_50']), 1, 0)        df['abv_200'] = np.where((df['SMA_30']>df['SMA_200'])            &(df['SMA_10']>df['SMA_200'])&(df['SMA_50']>df['SMA_200']), 1, 0)        return dfdf =  add_signal_indicators(df)

Теперь, когда сигналы добавлены в наши данные, пришло время рассчитать доходность. Доходность будет самым важным аспектом для выбора лучшей торговой стратегии. Мы рассчитаем 5-дневную и 10-дневную доходность акций. Мы также закодируем доходность метками 0 и 1, где 0 указывает на отрицательную доходность, а 1 – на положительную доходность. Давайте продолжим и создадим функцию, реализующую это.

def calculate_returns(df):    df['5D_returns'] = (df['Adj Close'].shift(-5)-df['Adj Close'])/df['Close']*100    df['10D_returns'] = (df['Adj Close'].shift(-10)-df['Adj Close'])/df['Close']*100    df['5D_positive'] = np.where(df['5D_returns']>0, 1, 0)    df['10D_positive'] = np.where(df['10D_returns']>0, 1, 0)        return df.dropna()df = calculate_returns(df)    

Понимание результативности сигналов

Мы можем взять все вышеуказанные условия и выполнить простое агрегирование для расчета средней и медианной доходности, которую мы можем ожидать от торговли на основе этих сигналов. Мы также можем извлечь минимальную и максимальную доходность, которую каждый сигнал генерировал в прошлом. Это не только даст нам грубое представление о том, насколько хороши сигналы, но и представление о том, каких доходов можно ожидать при торговле с использованием этих сигналов. Давайте напишем простой код для выполнения этого на Python.

def get_eda_and_deepdive(df):    eda = df.dropna().groupby(['10_cross_30', 'MACD_Signal_MACD',     'MACD_lim', 'abv_50', 'abv_200'])[['5D_returns', '10D_returns']]\    .agg(['count', 'mean','median', 'min', 'max'])        deepdive = df.dropna().groupby(['10_cross_30', 'MACD_Signal_MACD',     'MACD_lim', 'abv_50', 'abv_200','5D_positive', '10D_positive'])[['5D_returns', '10D_returns']]\    .agg(['count', 'mean','median', 'min', 'max'])    return eda, deepdive        eda, deepdive = get_eda_and_deepdive(df)

Давайте визуализируем график ящиков с усами для 10 комбинаций сигналов с наибольшей 5-дневной и 10-дневной доходностью в порядке убывания.

x = df.copy()def _fun(x):    code = ''    for i in x.keys(): code += str(x[i])    return codex['signal'] = x[['10_cross_30', 'MACD_Signal_MACD', 'MACD_lim', 'abv_50', 'abv_200',                     '5D_positive', '10D_positive']].apply(_fun, axis=1)x = x.dropna()lim = x.groupby(['10_cross_30', 'MACD_Signal_MACD', 'MACD_lim', 'abv_50', 'abv_200', '5D_positive', '10D_positive'])['5D_returns'].agg(['mean']).reset_index()lim = lim.sort_values(by='mean', ascending=False).head(10)x = x.merge(lim, on=['10_cross_30', 'MACD_Signal_MACD', 'MACD_lim', 'abv_50', 'abv_200', '5D_positive', '10D_positive'], how='inner')

ax = sb.boxplot(x='signal', y='5D_returns', data=x)ax.set_xticklabels(ax.get_xticklabels(), rotation=45)plt.show()

ax = sb.boxplot(x='signal', y='10D_returns', data=x)ax.set_xticklabels(ax.get_xticklabels(), rotation=45)plt.show()

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

Вывод

Концепция алгоритмической торговли может быть крайне манящей для многих людей, так как она может быть очень прибыльной, но в то же время, строить алгоритмы торговли на фондовом рынке с нуля могут быть крайне сложными и трудоемкими задачами. Очень важно понимать тот факт, что все алгоритмы могут потерпеть неудачу, что может привести к огромным финансовым потерям при применении их в живой торговой среде. Целью этой статьи было исследовать, как можно создавать и проверять простые алгоритмы торговли с использованием Python. Чтобы продолжить работу над этим проектом, вы можете рассмотреть другие технические индикаторы и свечные паттерны и использовать их взаимозаменяемо для создания более сложных алгоритмов и стратегий.

Основные выводы

  • В этой статье мы научились извлекать исторические цены акций с помощью yfinance.
  • Мы научились вычислять значения MACD и SMA на основе цены акций, а также создавать алгоритмы на Python для создания сигналов/стратегий с использованием этих значений.
  • Мы также научились вычислять и визуализировать доходность стратегий на акции за 5 дней и 10 дней.

Примечание: Это не финансовый совет, и все работы, проведенные в этом проекте, предназначены только для образовательных целей. Это все, что касается данной статьи. Надеемся, вам понравилась эта статья и вы узнали что-то новое. Спасибо за чтение и счастливого обучения!

Часто задаваемые вопросы

Медиа, показанное в этой статье, не принадлежит Analytics Vidhya и используется по усмотрению автора.