FinRL-Library项目实战:基于集成策略的多股票交易深度强化学习
FinRL 项目地址: https://gitcode.com/gh_mirrors/fi/FinRL-Library
1. 项目概述
FinRL-Library是一个专注于金融领域的深度强化学习(DRL)开源框架。本项目展示了如何使用FinRL实现基于集成策略的多股票交易系统,该成果曾在ICAIF 2020会议上发表。
1.1 核心问题定义
我们将股票交易过程建模为马尔可夫决策过程(MDP),交易目标被表述为一个最大化问题。强化学习环境的组成要素包括:
-
动作空间:定义代理与环境的交互方式
- 典型动作:买入/卖出/持有
- 扩展动作:可操作多股,如"买入10股AAPL"对应动作值10
-
奖励函数:r(s, a, s′) = v′ − v
- 反映采取动作a后投资组合价值的变化
- v′和v分别表示新状态和原状态的投资组合价值
-
状态空间:包含代理观察到的各类市场信息
- 类似人类交易员需要分析多种信息后才执行交易
- 包含多种特征以更好地学习环境交互
-
交易标的:道琼斯30指数成分股
2. 环境准备
2.1 安装必要依赖包
项目需要安装多个金融和强化学习相关的Python包:
!pip install wrds
!pip install swig
!pip install git+https://github.com/AI4Finance-Foundation/FinRL.git
关键依赖包括:
- 金融数据接口:wrds、yfinance
- 强化学习框架:stable-baselines3、elegantrl
- 金融分析工具:pyfolio、pyportfolioopt
- 数据处理:pandas、numpy、scikit-learn
2.2 导入核心模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from finrl import config
from finrl import config_tickers
from finrl.meta.preprocessor.yahoodownloader import YahooDownloader
from finrl.meta.preprocessor.preprocessors import FeatureEngineer
from finrl.meta.env_stock_trading.env_stocktrading import StockTradingEnv
from finrl.agents.elegantrl.models import DRLAgent
from finrl.plot import backtest_stats, backtest_plot, get_daily_return, get_baseline
3. 数据处理流程
3.1 数据获取
使用Yahoo Finance API获取道琼斯30成分股的OHLCV(开盘价、最高价、最低价、收盘价、成交量)数据:
ticker_list = config_tickers.DOW_30_TICKER
start_date = '2009-01-01'
end_date = '2021-10-31'
data = YahooDownloader(start_date=start_date,
end_date=end_date,
ticker_list=ticker_list).fetch_data()
3.2 特征工程
为增强模型学习能力,需要构造技术指标特征:
fe = FeatureEngineer(use_technical_indicator=True,
tech_indicator_list=config.TECHNICAL_INDICATORS_LIST,
use_turbulence=True,
user_defined_feature=False)
processed = fe.preprocess_data(data)
常用技术指标包括:
- 移动平均线(MA)
- 指数移动平均线(EMA)
- 相对强弱指数(RSI)
- 布林带(Bollinger Bands)
- 平均真实波幅(ATR)
4. 强化学习环境构建
4.1 数据划分
将数据分为训练集和交易集:
train = processed[(processed['date'] >= '2009-01-01') &
(processed['date'] <= '2020-07-01')]
trade = processed[(processed['date'] >= '2020-07-01') &
(processed['date'] <= '2021-10-31')]
4.2 环境配置
定义股票交易环境的关键参数:
stock_dimension = len(train.tic.unique())
state_space = 1 + 2*stock_dimension + len(config.TECHNICAL_INDICATORS_LIST)*stock_dimension
env_kwargs = {
"hmax": 100, # 最大交易股数
"initial_amount": 1000000, # 初始资金
"buy_cost_pct": 0.001, # 买入成本
"sell_cost_pct": 0.001, # 卖出成本
"state_space": state_space,
"stock_dim": stock_dimension,
"tech_indicator_list": config.TECHNICAL_INDICATORS_LIST,
"action_space": stock_dimension,
"reward_scaling": 1e-4
}
e_train_gym = StockTradingEnv(df=train, **env_kwargs)
5. 深度强化学习算法实现
FinRL支持多种DRL算法,本项目采用集成策略:
agent = DRLAgent(env=e_train_gym)
# 训练PPO算法
PPO_params = {
"n_steps": 2048,
"ent_coef": 0.01,
"learning_rate": 0.00025,
"batch_size": 128
}
model_ppo = agent.get_model("ppo", model_kwargs=PPO_params)
trained_ppo = agent.train_model(model=model_ppo,
tb_log_name='ppo',
total_timesteps=50000)
# 训练A2C算法
A2C_params = {
"n_steps": 5,
"ent_coef": 0.01,
"learning_rate": 0.0007
}
model_a2c = agent.get_model("a2c", model_kwargs=A2C_params)
trained_a2c = agent.train_model(model=model_a2c,
tb_log_name='a2c',
total_timesteps=50000)
6. 回测与性能评估
6.1 回测统计
df_account_value_ppo, df_actions_ppo = DRLAgent.DRL_prediction(
model=trained_ppo,
environment=e_trade_gym)
df_account_value_a2c, df_actions_a2c = DRLAgent.DRL_prediction(
model=trained_a2c,
environment=e_trade_gym)
backtest_stats(df_account_value_ppo)
backtest_stats(df_account_value_a2c)
6.2 可视化分析
# 绘制投资组合价值曲线
backtest_plot(df_account_value_ppo)
backtest_plot(df_account_value_a2c)
# 与基准比较
df_dji = get_baseline(
ticker="^DJI",
start=df_account_value_ppo.loc[0,'date'],
end=df_account_value_ppo.loc[len(df_account_value_ppo)-1,'date'])
plt.figure(figsize=(15,5))
plt.plot(df_dji['date'], df_dji['close']/df_dji['close'].iloc[0], label='DJI')
plt.plot(df_account_value_ppo['date'], df_account_value_ppo['account_value']/df_account_value_ppo['account_value'].iloc[0], label='PPO')
plt.plot(df_account_value_a2c['date'], df_account_value_a2c['account_value']/df_account_value_a2c['account_value'].iloc[0], label='A2C')
plt.legend()
plt.show()
7. 关键技术与创新点
- 集成策略:结合多种DRL算法的优势,提高策略鲁棒性
- 状态空间设计:包含技术指标、持仓信息等多维度特征
- 交易成本建模:精确考虑买卖手续费对收益的影响
- 风险控制:通过波动率指标(turbulence)实现动态风险控制
8. 实际应用建议
- 数据质量:确保使用清洗过的高质量市场数据
- 参数调优:需要针对不同市场周期调整超参数
- 风险控制:建议设置止损机制和头寸限制
- 实时更新:定期用新数据重新训练模型以适应市场变化
本项目展示了FinRL框架在量化交易中的强大能力,通过深度强化学习可以实现自动化、智能化的多股票交易策略。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考