深度强化学习实战:构建自动赚钱机器人
FinRL量化框架集成
FinRL框架:从数据到决策
你已经掌握了Python和深度强化学习(DRL)的理论基础,现在是时候将这些知识应用于真实的金融市场了。FinRL是一个开源框架,旨在填补理论与实践之间的鸿沟,它能帮助我们快速构建、训练和评估量化交易策略。
我们将不再从零开始搭建所有组件,而是利用FinRL的模块化设计,专注于策略本身的逻辑。这趟旅程的第一步,是学习如何将原始市场数据转化为一个可供DRL智能体学习的标准化环境。
解构FinRL的三层架构
为了保持灵活性和可扩展性,FinRL采用了分层设计。理解这三层结构是高效使用该框架的关键。
1. 环境层 (Environment Layer) 这是基础。它模拟了金融市场,包括提供价格数据、处理交易指令、计算交易成本(如手续费和滑点)等。FinRL将复杂的市场动态封装成一个与OpenAI Gym兼容的标准接口,让我们可以专注于策略开发,而非环境搭建的繁琐细节。
2. 智能体层 (Agent Layer) 这是决策核心。这一层包含了各种DRL算法的实现,例如你熟悉的PPO、A2C、DDPG等。智能体从环境层获取市场状态(State),然后输出一个动作(Action),比如买入、卖出或持有。
3. 应用层 (Application Layer) 这是最终执行和评估的层面。在这一层,我们将训练好的智能体应用于具体任务,如历史数据回测、模拟交易或连接券商API进行实盘交易。它负责整个工作流的运行、性能指标的计算和结果的可视化。
搭建你的交易环境
一切策略都始于数据。在金融领域,最常见的数据格式是OHLCV,即开盘价(Open)、最高价(High)、最低价(Low)、收盘价(Close)和成交量(Volume)。原始的OHLCV数据需要经过预处理才能用于训练模型。
FinRL提供了一套便捷的数据处理工具。这不仅包括数据清洗和缺失值处理,还内置了丰富的技术指标计算功能。你可以轻松地为数据添加移动平均线(MA)、相对强弱指数(RSI)等特征,为智能体提供更丰富的决策依据。
from finrl.meta.preprocessor.yahoodownloader import YahooDownloader
from finrl.meta.preprocessor.preprocessors import FeatureEngineer
# 1. 下载数据
# 下载2020年到2023年的道琼斯30指数成分股数据
df = YahooDownloader(start_date = '2020-01-01',
end_date = '2023-01-01',
ticker_list = DOW_30_TICKER).fetch_data()
# 2. 特征工程
# 添加常用技术指标
fe = FeatureEngineer(
use_technical_indicator=True,
tech_indicator_list = ['macd', 'rsi_14', 'cci_14', 'dx_14'],
use_turbulence=True, # 增加一个市场波动性指标
user_defined_feature = False)
processed_df = fe.preprocess_data(df)
完成数据预处理后,下一步是构建一个Gym环境。在FinRL中,多资产交易环境 StockTradingEnv 是核心。你需要向它提供处理好的数据、初始资金、以及交易成本等参数。
一个关键步骤是将金融约束模型化。真实交易并非零成本,手续费和滑点会显著影响策略表现。在模拟环境中准确地反映这些成本,是模型能否在现实世界中成功的关键。
在 StockTradingEnv 中,你可以通过参数直接设定交易手续费和滑点。例如,hmax 控制单次最大交易股数,transaction_cost_pct 设置交易成本百分比,reward_scaling 用于调整奖励函数的尺度,以帮助模型更快收敛。
from finrl.env.env_stocktrading import StockTradingEnv
# 将处理好的数据分割为训练集和交易集
train_data = data_split(processed_df, '2020-01-01', '2022-01-01')
trade_data = data_split(processed_df, '2022-01-01', '2023-01-01')
# 定义状态空间和动作空间
stock_dimension = len(train_data.tic.unique())
state_space = 1 + 2*stock_dimension + len(config.INDICATORS)*stock_dimension
action_space = stock_dimension
# 配置环境参数
env_kwargs = {
"hmax": 100, # 每只股票最大交易量
"initial_amount": 1000000, # 初始资金
"transaction_cost_pct": 0.001, # 交易成本百分比 (0.1%)
"state_space": state_space,
"action_space": action_space,
"reward_scaling": 1e-4 # 奖励缩放因子
}
# 创建交易环境实例
e_train_gym = StockTradingEnv(df = train_data, **env_kwargs)
通过这几步,你就成功地将原始OHLCV数据转化为了一个功能完备、贴近真实市场的多资产交易环境。这个环境已经准备好接收来自智能体的指令,并返回相应的状态和奖励。至此,我们已经打通了从数据到环境的流水线,为后续的智能体训练奠定了坚实的基础。
在FinRL的分层设计中,哪一层负责将复杂的市场动态封装成一个与OpenAI Gym兼容的标准接口?
FinRL内置了丰富的技术指标计算功能,可以轻松为数据添加移动平均线(MA)、相对强弱指数(RSI)等特征。