1. 库FinRL
本项目通过著名的库FinRL实现,这是是一个专注于金融领域的强化学习库,旨在为研究人员和开发者提供一个便捷的工具,用于开发、训练和评估金融交易策略。该库建立在强化学习的理论基础之上,通过提供易用的接口和实用的功能,帮助用户在金融市场中应用深度强化学习算法。库FinRL的主要特点和组件如下所示:
总体而言,FinRL是一个为金融领域设计的强化学习库,为开发者提供了一套完整的工具和资源,以在金融市场中应用深度强化学习技术。
在使用库FinRL之前,建议通过FinRL安装本项目所需的软件包,安装命令如下所示。
pip install git+https://github.com/AI4Finance-LLC/FinRL-Library.git
上述命令将直接从FinRL库的GitHub存储库安装,还将自动安装FinRL所需的任何依赖项。安装完成后,能够在Python环境中使用库FinRL实现自动交易程序。
2. 导入包
(1)首先导入用于金融强化学习的必要库和FinRL框架,通过Stable-Baselines3库的强化学习代理进行投资组合配置策略的训练。然后,通过绘图和回测工具,对策略进行可视化和绩效评估。sys.path.append("FinRL-Library")则添加了FinRL库的相对路径,确保脚本可以访问该库。
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
matplotlib.use('Agg')
%matplotlib inline
import datetime
from finrl import config
from finrl import config_tickers
from finrl.meta.preprocessor.yahoodownloader import YahooDownloader
from finrl.meta.preprocessor.preprocessors import FeatureEngineer, data_split
from finrl.meta.env_portfolio_allocation.env_portfolio import StockPortfolioEnv
from finrl.agents.stablebaselines3.models import DRLAgent
from finrl.plot import backtest_stats, backtest_plot, get_daily_return, get_baseline,convert_daily_return_to_pyfolio_ts
from finrl.meta.data_processor import DataProcessor
from finrl.meta.data_processors.processor_yahoofinance import YahooFinanceProcessor
import sys
sys.path.append("../FinRL-Library")
(2)检查并创建与FinRL框架相关的四个子目录,包括数据保存目录、训练模型保存目录、TensorBoard日志目录以及结果保存目录。这确保了在当前工作目录下存在必要的目录结构,以便存储和组织金融数据、训练模型、TensorBoard日志和交易策略结果。
import os
if not os.path.exists("./" + config.DATA_SAVE_DIR):
os.makedirs("./" + config.DATA_SAVE_DIR)
if not os.path.exists("./" + config.TRAINED_MODEL_DIR):
os.makedirs("./" + config.TRAINED_MODEL_DIR)
if not os.path.exists("./" + config.TENSORBOARD_LOG_DIR):
os.makedirs("./" + config.TENSORBOARD_LOG_DIR)
if not os.path.exists("./" + config.RESULTS_DIR):
os.makedirs("./" + config.RESULTS_DIR)
Yahoo Finance是一个提供股票数据、财经新闻、财报等信息的网站,并且提供的数据是免费的。在FinRL中,使用类YahooDownloader从Yahoo Finance API获取数据。在使用 Yahoo Finance 的公共 API(无需提供用户身份验证)时,每个 IP 地址在一个小时内最多可以发送 2,000 次请求,或者每天最多可以发送 48,000 次请求。这是 Yahoo Finance 对于公共 API 使用的一种限制,旨在控制对其服务的访问频率,以维持平稳的服务运行。如果超过这个限制,可能会导致请求被拒绝或服务暂时不可用。因此,在使用 Yahoo Finance API 时,需要注意并遵循其调用限制。
(1)使用print语句打印输出config_tickers.DOW_30_TICKER的值,该变量是FinRL库中预定义的标志着道·琼斯指数成分股的股票代码列表。
print(config_tickers.DOW_30_TICKER)
执行后将显示Dow Jones Industrial Average指数的成分股票的代码:
(2)开始准备金融数据,以供后续的强化学习模型训练和分析使用。下面的代码将创建一个YahooFinanceProcessor的实例对象dp,然后使用该对象的download_data方法下载了指定时间范围内(从2008年1月1日到2021年10月31日)Dow Jones Industrial Average指数成分股的每日股票数据。下载的数据被存储在DataFrame对象df中。
dp = YahooFinanceProcessor()
df = dp.download_data(start_date = '2008-01-01',
end_date = '2021-10-31',
ticker_list = config_tickers.DOW_30_TICKER, time_interval='1D')
执行后会输出:
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
#####省略部分输出
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
[*********************100%***********************] 1 of 1 completed
Shape of DataFrame: (101615, 9)
(3)通过df.head()显示DataFrame df 的前几行数据,目的是展示下载的金融数据的头部,以便查看数据的结构和内容。
df.head()
执行后会输出:
date open high low close adjcp volume tic day
0 2008-01-02 7.116786 7.152143 6.876786 6.958571 5.941450 1079178800 AAPL 2
1 2008-01-02 46.599998 47.040001 46.259998 46.599998 35.172192 7934400 AMGN 2
2 2008-01-02 52.090000 52.320000 50.790001 51.040001 40.326855 8053700 AXP 2
3 2008-01-02 87.570000 87.839996 86.000000 86.620003 63.481602 4303000 BA 2
4 2008-01-02 72.559998 72.669998 70.050003 70.629997 46.850491 6337800 CAT 2
通过这种方式,我们可以快速了解数据的格式,包括日期、股票代码以及相关的开盘价、最高价、最低价、收盘价和成交量等信息。这有助于确保数据被正确下载,并以适当的形式准备供后续分析和建模使用。
(4)通过df.shape获取DataFrame df 的形状,返回一个表示数据框维度的元组(行数,列数)。这行代码的目的是查看下载的金融数据的规模,即数据框中的行数和列数。
df.shape
通过df.shape,可以得知数据中有多少条记录(行数)和每个记录包含多少个特征(列数),从而更好地理解数据的规模和结构。执行后会输出:
(101615, 9)