(9-7)基于深度强化学习的量化交易策略(OpenAI Baselines +FinRL+DRL+PyPortfolioOpt):回测交易策略

9.10  回测交易策略

回测在评估交易策略绩效方面至关重要,自动化的回测工具因减少人为错误的风险而备受青睐。通常我们使用Quantopian的pyfolio包进行回测,该工具易于使用,提供了各种独立图表,全面展示了交易策略的绩效情况。

1. 回测统计

在量化金融领域,回测统计通常是指通过回测得到的统计数据,用于评估和比较交易策略的性能。这些统计数据可能包括年化收益率、累积收益、年化波动率、夏普比率、卡玛比率等,提供了对策略在历史数据上表现的全面评估。

(1)使用库Pyfolio中的timeseries模块,将由DRL策略生成的每日收益转换为Pyfolio时间序列对象。接着,通过perf_stats函数计算了该策略的各项绩效指标,包括年化收益率、波动率、夏普比率等。最终,将这些绩效指标存储在perf_stats_all变量中。这有助于对策略的整体表现进行全面的量化评估。

from pyfolio import timeseries
DRL_strat = convert_daily_return_to_pyfolio_ts(df_daily_return)
perf_func = timeseries.perf_stats
perf_stats_all = perf_func( returns=DRL_strat,
                              factor_returns=DRL_strat,
                                positions=None, transactions=None, turnover_denom="AGB")

(2)打印输出DRL策略的绩效统计信息,包括年化收益率、波动率、夏普比率等指标。通过查看这些统计数据,可以更全面地了解和评估策略的表现。

print("==============DRL Strategy Stats===========")

perf_stats_all

执行后会输出:

==============DRL Strategy Stats===========
Annual return          0.261142
Cumulative returns     0.363804
Annual volatility      0.133302
Sharpe ratio           1.807816
Calmar ratio           3.317809
Stability              0.906206
Max drawdown          -0.078709
Omega ratio            1.350606
Sortino ratio          2.736355
Skew                  -0.183264
Kurtosis               1.132931
Tail ratio             1.065654
Daily value at risk   -0.015838
Alpha                  0.000000
Beta                   1.000000
dtype: float64

上面输出的是DRL策略的绩效统计信息,包括年化收益率(Annual return)、累积收益率(Cumulative returns)、年化波动率(Annual volatility)、夏普比率(Sharpe ratio)等指标。这些统计数据提供了对策略表现的全面了解。在这里,年化收益率为0.2611,夏普比率为1.8078,最大回撤为-0.0787等。这些指标有助于评估策略的风险和收益特性。

(3)下面的代码用于获取基准(baseline)的绩效统计信息。基准使用了道琼斯工业平均指数(^DJI),并计算了相应的绩效指标,包括年化收益率、累积收益率、年化波动率、夏普比率等。这些基准统计信息可用于与DRL策略的表现进行比较,帮助评估策略的相对优劣。

print("==============Get Baseline Stats===========")
baseline_df = get_baseline(
        ticker="^DJI",
        start = df_daily_return.loc[0,'date'],
        end = df_daily_return.loc[len(df_daily_return)-1,'date'])
stats = backtest_stats(baseline_df, value_col_name = 'close')

执行后会输出:

==============Get Baseline Stats===========
[*********************100%***********************]  1 of 1 completed
Shape of DataFrame:  (336, 8)
Annual return          0.279047
Cumulative returns     0.388402
Annual volatility      0.139129
Sharpe ratio           1.844560
Calmar ratio           3.124551
Stability              0.918675
Max drawdown          -0.089308
Omega ratio            1.358960
Sortino ratio          2.734872
Skew                        NaN
Kurtosis                    NaN
Tail ratio             1.052781
Daily value at risk   -0.016510
dtype: float64

上面的输出结果展示了基准(道琼斯工业平均指数)的绩效统计信息,基准的绩效指标包括年化收益率、累积收益率、年化波动率、夏普比率等。通过与DRL策略的统计信息比较,可以更全面地评估策略相对于基准的优劣表现。

2. 回测结果可视化

通过绘制回测结果的可视化图来分析交易策略的性能,这些可视化图通常包括策略资产价值随时间的变化、策略每日收益率、基准(如道琼斯工业平均指数)的表现等,有助于更直观地理解策略的优势和劣势。

在下面的代码中,使用库Pyfolio生成完整的策略分析图表(tear sheet)。首先,通过 get_baseline 函数获取道琼斯指数作为基准的日线数据,然后计算基准的每日收益率。接着,使用 Pyfolio中的函数create_full_tear_sheet生成策略分析图表,其中参数returns传入了 DRL 策略的每日收益率,而参数benchmark_rets传入了基准的每日收益率。

import pyfolio
%matplotlib inline

baseline_df = get_baseline(
        ticker='^DJI', start=df_daily_return.loc[0,'date'], end='2021-11-01'
    )

baseline_returns = get_daily_return(baseline_df, value_col_name="close")

with pyfolio.plotting.plotting_context(font_scale=1.1):
        pyfolio.create_full_tear_sheet(returns = DRL_strat,
                                       benchmark_rets=baseline_returns, set_context=False)

执行后会输出提供了策略回测的多个性能指标,其中包括:

  1. Annual return(年化收益):26.114%
  2. Cumulative returns(累积收益):36.38%
  3. Annual volatility(年化波动率):13.33%
  4. Sharpe ratio(夏普比率):1.81
  5. Calmar ratio(卡玛比率):3.32
  6. Stability(稳定性):0.91
  7. Max drawdown(最大回撤):-7.871%
  8. Omega ratio(欧米茄比率):1.35
  9. Sortino ratio(索提诺比率):2.74
  10. Skew(偏度):-0.18
  11. Kurtosis(峰度):1.13
  12. Tail ratio(尾部比率):1.07
  13. Daily value at risk(每日风险值):-1.584%
  14. Alpha(阿尔法):0.00
  15. Beta(贝塔):0.94

并绘制对应的一系列可视化图,如图1-8所示。

图1-8  回测结果的可视化图

这些指标反映了当前策略在回测期间的收益、波动性、风险调整后的绩效等多个方面信息,其中夏普比率、卡玛比率、索提诺比率等是衡量策略风险调整后收益的重要指标,而最大回撤则是衡量策略可能面临的最大损失。

另外还输出了有关最差回撤期间和压力测试的详细信息:

Worst drawdown periods Net drawdown in % Peak date Valley date Recovery date Duration
0 7.87 2020-09-02 2020-10-28 2020-11-09 49
1 5.17 2021-08-16 2021-09-30 NaT NaN
2 4.06 2021-05-10 2021-06-18 2021-07-02 40
3 3.52 2021-02-24 2021-03-04 2021-03-10 11
4 3.40 2021-01-20 2021-01-29 2021-02-05 13
Stress Events mean min max
New Normal 0.10% -3.32% 3.32%

在上面的输出中,对最差回撤期间信息的具体说明如下所示。

  1. 第一个最差回撤期间:7.87%,起始于2020年9月2日,峰值日期为2020年10月28日,谷底日期为2020年11月9日,恢复日期为2020年11月9日,时长为49天。
  2. 第二个最差回撤期间:5.17%,起始于2021年8月16日,峰值日期为2021年9月30日,无法确定恢复日期,时长未知。
  3. 第三个最差回撤期间:4.06%,起始于2021年5月10日,峰值日期为2021年6月18日,恢复日期为2021年7月2日,时长为40天。
  4. 第四个最差回撤期间:3.52%,起始于2021年2月24日,峰值日期为2021年3月4日,恢复日期为2021年3月10日,时长为11天。
  5. 第五个最差回撤期间:3.40%,起始于2021年1月20日,峰值日期为2021年1月29日,恢复日期为2021年2月5日,时长为13天。

在上面的输出中,对压力测试(Stress Events)的具体说明如下所示。

  1. New Normal:压力测试的平均值为0.10%,最小值为-3.32%,最大值为3.32%。这些值反映了在“新常态”下的策略性能,涵盖了不同市场情况下的表现。

未完待续

最近更新

  1. TCP协议是安全的吗?

    2024-01-27 20:28:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-27 20:28:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-27 20:28:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-27 20:28:02       20 阅读

热门阅读

  1. Day46 动态规划part08 139.单词拆分 多重背包

    2024-01-27 20:28:02       37 阅读
  2. SpringBoot 基础概念:注册BeanDefinition

    2024-01-27 20:28:02       45 阅读
  3. 低代码助力企业转型可视化

    2024-01-27 20:28:02       38 阅读
  4. hbase shell行键过滤正则匹配

    2024-01-27 20:28:02       33 阅读
  5. Android创建保存Excel文件

    2024-01-27 20:28:02       33 阅读
  6. html:thymeleaf实现日期格式转换

    2024-01-27 20:28:02       51 阅读