Алгоритмическая торговля с использованием Python

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

Алгоритмическая торговля - это процесс выполнения заказов с использованием автоматических и предварительно запрограммированных торговых инструкций для учета таких переменных, как цена, время и объем. - investopedia.com

Python - один из самых популярных языков программирования для финансов, наряду с другими, такими как C # и R. Торговая стратегия, которая будет использоваться в этой статье, называется пересечение двойных скользящих средних.

Пересечение двойной скользящей средней происходит, когда краткосрочная средняя пересекает долгосрочную. Этот сигнал используется для определения того, что импульс смещается в сторону краткосрочной средней. Сигнал на покупку генерируется, когда краткосрочная средняя пересекает долгосрочную среднюю и поднимается выше нее, в то время как сигнал на продажу запускается, когда краткосрочная средняя пересекает долгосрочную среднюю и опускается ниже нее. - datacamp.com

Пожалуйста, оставьте аплодисменты над этой статьей, если вы найдете ее полезной или интересной. Я также хотел бы узнать некоторые из ваших торговых стратегий в разделе ответов.

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

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

Хорошо, теперь, когда все это в порядке, давайте приступим к программированию!

Начать программирование:

Начну эту программу с описания.

#Description: This program uses the dual moving average crossover to determine when to buy and sell stock.

Импортируйте зависимости.

import pandas as pd
import numpy as np
from datetime import datetime
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')

Затем загрузите данные. Поскольку я использую веб-сайт Google для программирования, мне нужно использовать Google для загрузки файла данных.

#Load the data 
from google.colab import files # Use to load data on Google Colab 
uploaded = files.upload() # Use to load data on Google Colab

Файл, который я загружаю, представляет собой CSV-файл с именем «AAPL.csv», который содержит данные (Дата, Цена открытия, Максимальная цена, Цена закрытия, Скорректированная цена закрытия и Объем) для цены акций Apple Corporation с 2 октября 2006 г. до 30 декабря 2011 г.

Затем сохраните данные в переменной.

#Store the data into the df variable
AAPL = pd.read_csv('AAPL.csv')

Теперь покажите данные.

#Show the dataframe
AAPL

Создайте и покажите новый фрейм данных, который содержит скорректированную цену закрытия акций.

df = pd.DataFrame()
df['AAPL'] = AAPL['Adj Close Price'].values
df

Визуально покажите цену акции.

# Visually Show The Stock/Portfolio Price(s)
# Create the title 
title = 'Stock Adj. Close Price History    '
#Get the stocks
my_stocks = df
  
#Create and plot the graph
plt.figure(figsize=(12.2,4.5)) #width = 12.2in, height = 4.5
# Loop through each stock and plot the Adj Close for each day
for c in my_stocks.columns.values:
  plt.plot( my_stocks[c],  label=c)#plt.plot( X-Axis , Y-Axis, line_width, alpha_for_blending,  label)
  
plt.title(title)
plt.xlabel('Oct. 02, 2006 - Dec. 30, 2011',fontsize=18)
plt.ylabel('Adj. Price USD ($)',fontsize=18)
plt.legend(my_stocks.columns.values, loc='upper left')
plt.show()

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

Настройка и тестирование торговой стратегии

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

Сначала мне нужно создать краткосрочную среднюю, поэтому я создам 30-дневную простую скользящую среднюю.

#Create the 30 day simple moving average
SMA30 = df.rolling(window=30).mean()
SMA30

Затем мне нужно создать долгосрочную среднюю, поэтому я создам 100-дневную простую скользящую среднюю.

#Create the 100 day simple moving average
SMA100 = df.rolling(window=100).mean()
SMA100

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

# Visually Show The Stock and The Moving Averages
# Create the title 
title = 'Adj. Close Price History Simple Moving Averages   '
#Get the stocks
my_stocks = df
  
#Create and plot the graph
plt.figure(figsize=(12.2,4.5)) #width = 12.2in, height = 4.5
plt.plot( my_stocks['AAPL'],  label='AAPL')#plt.plot( X-Axis , Y-Axis, line_width, alpha_for_blending,  label)
plt.plot( SMA30['AAPL'],  label='SMA30')
plt.plot( SMA100['AAPL'],  label='SMA100')
  
plt.title(title)
plt.xlabel('Oct. 02, 2006 - Dec. 30, 2011 ',fontsize=18)
plt.ylabel('Adj. Price USD ($)',fontsize=18)
plt.legend( loc='upper left')
plt.show()

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

#Create a function to signal when to buy and sell an asset
def buy_sell(signal):
  sigPriceBuy = []
  sigPriceSell = []
  flag = -1
  for i in range(0,len(signal)):
    #if sma30 > sma100  then buy else sell
      if signal['SMA30'][i] > signal['SMA100'][i]:
        if flag != 1:
          sigPriceBuy.append(signal['AAPL'][i])
          sigPriceSell.append(np.nan)
          flag = 1
        else:
          sigPriceBuy.append(np.nan)
          sigPriceSell.append(np.nan)
        #print('Buy')
      elif signal['SMA30'][i] < signal['SMA100'][i]:
        if flag != 0:
          sigPriceSell.append(signal['AAPL'][i])
          sigPriceBuy.append(np.nan)
          flag = 0
        else:
          sigPriceBuy.append(np.nan)
          sigPriceSell.append(np.nan)
        #print('sell')
      else: #Handling nan values
        sigPriceBuy.append(np.nan)
        sigPriceSell.append(np.nan)
  
  return (sigPriceBuy, sigPriceSell)

Создайте новый фрейм данных для хранения всех данных.

#Create a new dataframe
signal = pd.DataFrame(index=df['AAPL'].index)
signal['AAPL'] = df['AAPL']
signal['SMA30'] = SMA30['AAPL']
signal['SMA100'] = SMA100['AAPL']

Покажи данные.

signal

Продолжайте хранить больше данных во фрейме данных.

x = buy_sell(signal)
signal['Buy_Signal_Price'] = x[0]
signal['Sell_Signal_Price'] = x[1]

Покажи данные.

signal

# Visually Show The Stock buy and sell signals
# Create the title 
title = 'Adj. Close Price History Buy / Sell Signals   '
#Get the stocks
my_stocks = signal
ticker = 'AAPL'
  
#Create and plot the graph
plt.figure(figsize=(12.2,4.5)) #width = 12.2in, height = 4.5
plt.scatter(my_stocks.index, my_stocks['Buy_Signal_Price'], color = 'green', label='Buy Signal', marker = '^', alpha = 1)
plt.scatter(my_stocks.index, my_stocks['Sell_Signal_Price'], color = 'red', label='Sell Signal', marker = 'v', alpha = 1)
plt.plot( my_stocks[ticker],  label=ticker, alpha = 0.35)#plt.plot( X-Axis , Y-Axis, line_width, alpha_for_blending,  label)
plt.plot( my_stocks['SMA30'],  label='SMA30', alpha = 0.35)
plt.plot( my_stocks['SMA100'],  label='SMA100', alpha = 0.35)
plt.title(title)
plt.xlabel('Oct. 02, 2006 - Dec. 30, 2011',fontsize=18)
plt.ylabel('Adj. Close Price USD ($)',fontsize=18)
plt.legend( loc='upper left')
plt.show()

Похоже, следуя этой стратегии, я терял бы деньги в 1/4 раза, то есть примерно в 25% случаев, но увеличивал бы прибыль в 3/4 или 75% случаев. Из графика видно, что период с 400 по 450 день был единственным случаем, когда эта стратегия потерпела неудачу в этом наборе данных. Эта стратегия также не кажется оптимальной, так как лучшее время для продажи никогда не приходилось на пик цены акции.

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

Спасибо за чтение этой статьи, надеюсь, она будет полезной и интересной для всех вас! Если вам понравилась эта статья и вы нашли ее полезной, пожалуйста, оставьте несколько аплодисментов, чтобы выразить свою признательность. Продолжайте обучение, и если вам нравится машинное обучение, математика, информатика, программирование или анализ алгоритмов, посетите и подпишитесь на мои каналы YouTube (randerson112358 и компьютерные науки).

Если вам также интересно узнать больше о машинном обучении в целом, чтобы сразу приступить к работе с проблемами и примерами, я настоятельно рекомендую вам ознакомиться с Практическое машинное обучение с помощью Scikit-Learn и TensorFlow: концепции, инструменты и методы для создания интеллектуальных систем. Системы ». Это отличная книга, которая поможет новичкам научиться писать программы машинного обучения и понять концепции машинного обучения.

Примечание от Python In Plain English

Мы всегда заинтересованы в продвижении качественного контента. Если у вас есть статья, которую вы хотели бы отправить в какую-либо из наших публикаций, отправьте нам электронное письмо по адресу [email protected] с вашим именем пользователя Medium, и мы добавим вас в качестве автора.