(9-2)基于深度强化学习的量化交易策略(OpenAI Baselines +FinRL+DRL+PyPortfolioOpt):准备环境+下载数据

9.4  准备环境

1. FinRL

本项目通过著名的库FinRL实现,这是是一个专注于金融领域的强化学习库,旨在为研究人员和开发者提供一个便捷的工具,用于开发、训练和评估金融交易策略。该库建立在强化学习的理论基础之上,通过提供易用的接口和实用的功能,帮助用户在金融市场中应用深度强化学习算法。库FinRL的主要特点和组件如下所示:

  1. 强化学习环境:FinRL提供了金融领域特定的强化学习环境,使用户能够模拟和测试交易策略。这包括定义动作、状态、奖励函数等。
  2. 集成的数据处理工具:FinRL库包括用于金融数据处理的工具,简化了从不同数据源获取、清理和准备数据的过程。
  3. DRL算法实现:FinRL实现了多种深度强化学习算法,例如基于Actor-Critic的算法、Proximal Policy Optimization(PPO)等,使用户能够选择适合其需求的算法。
  4. 性能评估工具:为了方便用户评估他们的交易策略,FinRL提供了性能评估工具,包括回测统计和可视化。
  5. 案例: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)

9.5  下载数据

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)

未完待续

你可能感兴趣的:(金融大模型,算法,python,人工智能,机器学习,深度学习)