FinRL-Library项目实战:基于集成策略的多股票交易深度强化学习

FinRL-Library项目实战:基于集成策略的多股票交易深度强化学习

FinRL 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. 关键技术与创新点

  1. 集成策略:结合多种DRL算法的优势,提高策略鲁棒性
  2. 状态空间设计:包含技术指标、持仓信息等多维度特征
  3. 交易成本建模:精确考虑买卖手续费对收益的影响
  4. 风险控制:通过波动率指标(turbulence)实现动态风险控制

8. 实际应用建议

  1. 数据质量:确保使用清洗过的高质量市场数据
  2. 参数调优:需要针对不同市场周期调整超参数
  3. 风险控制:建议设置止损机制和头寸限制
  4. 实时更新:定期用新数据重新训练模型以适应市场变化

本项目展示了FinRL框架在量化交易中的强大能力,通过深度强化学习可以实现自动化、智能化的多股票交易策略。

FinRL FinRL 项目地址: https://gitcode.com/gh_mirrors/fi/FinRL-Library

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郜垒富Maddox

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值