13.3.6 实现深度强化学习算法
在本项目中,强化学习算法基于OpenAI Baselines和Stable Baselines实现。其中Stable Baselines是OpenAI Baselines的一个分支,经过了重大的结构重构和代码清理。在库FinRL中包含了经过微调的标准强化学习算法,如DQN、DDPG、多智能体DDPG、PPO、SAC、A2C和TD3,并且还允许用户通过调整这些强化学习算法来设计他们自己的DRL算法。
在本项目中,将使用滚动窗口集成方法(参考代码)训练并验证3个代理(A2C、PPO、DDPG)。
(1)创建一个名为ensemble_agent的强化学习集成代理,这个代理将使用给定的数据和配置来进行强化学习训练和验证,以及在交易期间执行策略,将实现滚动窗口集成方法来管理和优化投资组合。具体实现代码如下所示。
rebalance_window = 63 # rebalance_window is the number of days to retrain the model
validation_window = 63 # validation_window is the number of days to do validation and trading (e.g. if validation_window=63, then both validation and trading period will be 63 days)
ensemble_agent = DRLEnsembleAgent(df=processed,
train_period=(TRAIN_START_DATE,TRAIN_END_DATE),
val_test_period=(TEST_START_DATE,TEST_END_DATE),
rebalance_window=rebalance_window,
validation_window=validation_window,
**env_kwargs)
对上述代码的具体说明如下:
- df=processed:传递了预处理过的数据 processed 作为代理的训练和验证数据。
- train_period=(TRAIN_START_DATE,TRAIN_END_DATE):指定了训练期间的开始日期和结束日期。
- val_test_period=(TEST_START_DATE,TEST_END_DATE):指定了验证和交易期间的开始日期和结束日期。
- rebalance_window=rebalance_window:重新平衡模型的窗口大小,即重新训练模型的频率,这里设置为63天。
- validation_window=validation_window:验证和交易期间的窗口大小,即在这个窗口内进行验证和交易,这里也设置为63天。
- **env_kwargs:传递了之前定义的环境配置参数 env_kwargs,包括行动空间、状态空间等配置信息。
(2)定义不同强化学习算法(A2C、PPO、DDPG)的模型参数和训练时间步数,不同算法的参数设置可以影响模型的性能和行为。这些参数用于配置不同算法的模型和训练参数,以便在训练过程中使用。具体实现代码如下所示。
A2C_model_kwargs = {
'n_steps': 5,
'ent_coef': 0.005,
'learning_rate': 0.0007
}
PPO_model_kwargs = {
"ent_coef":0.01,
"n_steps": 2048,
"learning_rate": 0.00025,
"batch_size": 128
}
DDPG_model_kwargs = {
#"action_noise":"ornstein_uhlenbeck",
"buffer_size": 10_000,
"learning_rate": 0.0005,
"batch_size": 64
}
timesteps_dict = {'a2c' : 10_000,
'ppo' : 10_000,
'ddpg' : 10_000
}
(3)调用前面创建的ensemble_agent代理的run_ensemble_strategy方法,用不同的强化学习算法(A2C、PPO、DDPG)和模型参数来运行集成策略,并返回了一个df_summary的数据框。具体实现代码如下所示。
df_summary = ensemble_agent.run_ensemble_strategy(A2C_model_kwargs,
PPO_model_kwargs,
DDPG_model_kwargs,
timesteps_dict)
对上述代码的具体说明如下:
- A2C_model_kwargs、PPO_model_kwargs、DDPG_model_kwargs、timesteps_dict:这些参数分别是之前定义的模型参数和训练时间步数字典。
- ensemble_agent.run_ensemble_strategy:这是一个方法调用,用于运行滚动窗口集成策略。它将使用不同的算法和参数配置来执行交易策略。
- df_summary:这是一个包含有关策略运行结果的数据框,它将包括有关每个算法的性能指标、交易结果和其他相关信息。
通过运行ensemble_agent.run_ensemble_strategy方法,可以评估不同强化学习算法在股票交易任务中的表现,并获得关于策略的总结信息。这些信息可以帮助我们了解每个算法的优势和劣势,以及在实际交易中的表现如何。
执行后会输出:
============Start Ensemble Strategy============
============================================
turbulence_threshold: 203.404793210979
======Model training from: 2009-04-01 to 2021-01-04
======A2C Training========
{'n_steps': 5, 'ent_coef': 0.005, 'learning_rate': 0.0007}
Using cpu device
Logging to tensorboard_log/a2c/a2c_126_1
--------------------------------------
| time/ | |
| fps | 40 |
| iterations | 100 |
| time_elapsed | 12 |
| total_timesteps | 500 |
| train/ | |
| entropy_loss | -41.3 |
| explained_variance | -0.092 |
| learning_rate | 0.0007 |
| n_updates | 99 |
| policy_loss | -28.4 |
| reward | 0.65518486 |
| std | 1 |
| value_loss | 6.85 |
--------------------------------------
###省略部分输出
======PPO Validation from: 2021-10-04 to 2022-01-03
PPO Sharpe Ratio: 0.049457174990951834
======DDPG Training========
{'buffer_size': 10000, 'learning_rate': 0.0005, 'batch_size': 64}
Using cpu device
Logging to tensorboard_log/ddpg/ddpg_315_1
day: 3148, episode: 10
begin_total_asset: 1000000.00
end_total_asset: 5065052.01
total_reward: 4065052.01
total_cost: 1086.82
total_trades: 53602
Sharpe: 0.857
=================================
----------------------------------
| time/ | |
| episodes | 4 |
| fps | 37 |
| time_elapsed | 336 |
| total_timesteps | 12596 |
| train/ | |
| actor_loss | 45.8 |
| critic_loss | 9.5 |
| learning_rate | 0.0005 |
| n_updates | 9447 |
| reward | 10.274927 |
----------------------------------
======DDPG Validation from: 2021-10-04 to 2022-01-03
======Best Model Retraining from: 2009-04-01 to 2022-01-03
======Trading from: 2022-01-03 to 2022-04-04
Ensemble Strategy took: 46.10980545679728 minutes
对上面的输出结果进行简要说明:
- 首先,输出显示启动了集成策略,并显示了turbulence_threshold(动荡阈值),该阈值可能用于策略中的某些操作。
- 接下来,输出显示了每个算法的训练过程。例如,对于A2C算法,显示了模型的参数设置,训练过程中的各种指标和信息,如学习率、策略损失、奖励等。每个算法的训练都伴随着详细的日志,展示了模型在训练过程中的表现。
- 输出还包括了模型的验证结果,如PPO算法的夏普比率(Sharpe Ratio)等。
- 对于DDPG算法,输出包括了模型在训练和验证期间的关键指标,以及在实际交易期间的一些结果,如总资产、总奖励、总成本、总交易次数、夏普比率等。
- 最后,输出显示了整个集成策略的总执行时间,以及模型的训练、验证和交易过程所花费的时间。
(4)获取不同算法在策略运行期间的性能指标和结果的信息,这些信息将包括各种列,如算法名称、夏普比率、累计回报等,以便可以对策略的性能进行比较和分析。具体实现代码如下所示。
df_summary
执行后会输出:
Iter Val Start Val End Model Used A2C Sharpe PPO Sharpe DDPG Sharpe
0 126 2021-01-04 2021-04-06 DDPG 0.11476 0.233932 0.317141
1 189 2021-04-06 2021-07-06 DDPG 0.152816 0.195925 0.269551
2 252 2021-07-06 2021-10-04 A2C 0.088863 -0.072948 -0.196661
3 315 2021-10-04 2022-01-03 DDPG 0.096011 0.049457 0.496793