Подробное руководство по торговле акциями с использованием FinRL

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

Слова впереди

В последние годы обучение с подкреплением (RL) привлекло внимание людей удивительными достижениями. В 2016 году AlphaGo (от Google DeepMind) обыграла Ли Седоля, одного из сильнейших игроков в го в мире. Это показывает высокий потенциал RL в играх и задачах принятия решений. В 2022 году ChatGPT (от OpenAI) дал людям совершенно новое представление о том, как ИИ может общаться с людьми. А пока люди никогда не перестают исследовать бесконечные возможности искусственного интеллекта и обучения с подкреплением, а финансы — это для них райский сад. В этой серии мы шаг за шагом узнаем, как использовать RL для количественной торговли.

Вы можете найти коды в соответствующем блокноте Stock_NeurIPS2018_1_Data.ipynb в FinRL-Tutorial:



Описание задания

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

Установка и импорт пакетов

Мы будем использовать код, предоставленный FinRL, для загрузки данных из Yahoo Finance. Необходимые пакеты включают: pandas, numpy, yfinance и finrl. Вы можете использовать conda install или pip install для установки пакетов.

import pandas as pd
import numpy as np
import datetime
import yfinance as yf

from finrl.meta.preprocessor.yahoodownloader import YahooDownloader
from finrl.meta.preprocessor.preprocessors import FeatureEngineer, data_split
from finrl import config_tickers
from finrl.config import INDICATORS

import itertools

Получить данные

данные OHLCV

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

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

Скачать данные с помощью yfinance

aapl_df_yf = yf.download(tickers = "aapl", start='2020-01-01', end='2020-01-31')

Скачать данные с помощью FinRL

В YahooDownloader от FinRL мы по-прежнему используем API yfinance для получения данных. Исходя из этого, мы модифицировали фрейм данных до вида, удобного для дальнейшей обработки данных. Мы используем скорректированную цену закрытия вместо цены закрытия и добавляем столбец, представляющий день недели (0–4, соответствующий понедельник-пятница).

aapl_df_finrl = YahooDownloader(start_date = '2020-01-01',
                                end_date = '2020-01-31',
                                ticker_list = ['aapl']).fetch_data()

Скачать данные, которые нам нужны для обучения и торговли

После того, как мы ознакомились с API для загрузки данных, теперь мы получаем данные, необходимые для обучения и тестирования на истории. Мы используем ценовые данные текущих 30 акций, выбранных Dow30. Хотя Dow30 продолжал меняться, мы установили фиксированные тикеры для удобства преобразования ценовых данных в состояния RL.

Мы настраиваем следующие переменные, чтобы указать диапазон данных обучения и данных тестирования. Затем напрямую используйте список тикеров Dow30 в config_tickers, который мы ранее импортировали.

TRAIN_START_DATE = '2009-01-01'
TRAIN_END_DATE = '2020-07-01'
TRADE_START_DATE = '2020-07-01'
TRADE_END_DATE = '2021-10-31'
df_raw = YahooDownloader(start_date = TRAIN_START_DATE,
                     end_date = TRADE_END_DATE,
                     ticker_list = config_tickers.DOW_30_TICKER).fetch_data()

Данные предварительной обработки

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

Добавление технических индикаторов

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

Технические индикаторы — это эвристические или основанные на информации значения, рассчитываемые с использованием исторических данных, таких как цена, объем или информация об открытом интересе. Они являются фундаментальной частью технического анализа. Аналитики используют технические индикаторы для прогнозирования будущих рыночных тенденций. Вместе с OHLCV мы собираем технические индикаторы, чтобы дать агенту более полное представление о рынке.

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

Добавление индекса контроля рисков

Неприятие риска отражает то, предпочитает ли инвестор защищать капитал. Это также влияет на торговую стратегию при столкновении с разным уровнем волатильности рынка. Чтобы контролировать риск в наихудшем сценарии, таком как финансовый кризис 2007–2008 годов, FinRL использует индекс VIX и индекс турбулентности.

Индекс VIX, популярное название индекса волатильности CBOE Чикагской биржи опционов, представляет собой тиккер, который измеряет ожидания фондового рынка в отношении волатильности. Это 30-дневная ожидаемая волатильность S&P500.

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

# add technical indicaters
fe = FeatureEngineer(use_technical_indicator=True,
                     tech_indicator_list = INDICATORS,
                     use_vix=True,
                     use_turbulence=True,
                     user_defined_feature = False)

processed = fe.preprocess_data(df_raw)
# make DataFrame for RL environments
list_ticker = processed["tic"].unique().tolist()
list_date = list(pd.date_range(processed['date'].min(),processed['date'].max()).astype(str))
combination = list(itertools.product(list_date,list_ticker))

processed_full = pd.DataFrame(combination,columns=["date","tic"]).merge(processed,on=["date","tic"],how="left")
processed_full = processed_full[processed_full['date'].isin(processed['date'])]
processed_full = processed_full.sort_values(['date','tic'])

processed_full = processed_full.fillna(0)

Сохраните данные

Теперь мы закончили этапы обработки. Осталось только разделить данные на набор поездов и торговый набор, а затем сохранить данные для последующего использования (мы будем использовать train_data в части 2 для обучения агентов и использовать trade_data в части 3, чтобы увидеть производительность обученных агентов). агенты).

train = data_split(processed_full, TRAIN_START_DATE,TRAIN_END_DATE)
trade = data_split(processed_full, TRADE_START_DATE,TRADE_END_DATE)
train.to_csv('train_data.csv')
trade.to_csv('trade_data.csv')

Ссылка

[1] Сяо-Ян Лю, Чжуоран Сюн, Шань Чжун, Хунъян Ян и Анвар Валид. Практический подход к глубокому обучению с подкреплением для торговли акциями. Семинар по проблемам и возможностям ИИ в финансовых услугах, NeurIPS, 2018 г.



СТАНЬТЕ ПИСАТЕЛЕМ на MLearning.ai