用 pyfolio 进行量化交易回测

Posted Python中文社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用 pyfolio 进行量化交易回测相关的知识,希望对你有一定的参考价值。

Pyfolio 使用一组丰富的指标和可视化来促进对样本内外的投资组合绩效的分析。它使用多种内置场景生成涵盖回报、头寸和交易以及市场压力期间事件风险分析的报告,其中还包含贝叶斯样本性能分析。

Pyfolio 依赖于投资组合回报和头寸数据,还可以考虑交易活动的交易成本和滑点损失。它使用 empyrical 库,该库也可以独立使用来计算性能指标。

创建回报和基准输入

Pyfolio 库是 Quantopian 生态系统的一部分,与 Zipline 和 Alphalens 兼容。我们将首先演示如何从 Alphalens 生成必要的输入,然后展示如何从 Zipline 回测性能数据帧中提取它们。

从 Alphalens 获取 pyfolio 输入

Pyfolio 还直接与 Alphalens 集成,并允许使用 create_pyfolio_input 创建 pyfolio 输入数据:

from alphalens.performance import create_pyfolio_input
qmin, qmax = factor_data.factor_quantile.min(),
             factor_data.factor_quantile.max()
input_data = create_pyfolio_input(alphalens_data,
                                  period='1D',
                                  capital=100000,
                                  long_short=False,
                                  equal_weight=False,
                                  quantiles=[1, 5],
                                  benchmark_period='1D')
returns, positions, benchmark = input_data

有两个选项可以指定如何生成投资组合权重:

long_short:如果为 False,权重将对应于因子值除以其绝对值,以便负因子值生成空头头寸。如果为 True,则首先贬低因子值,以便多头和空头头寸相互抵消,并且投资组合是市场中性的。

equal_weight:如果它和 long_short 为 True,资产将被分成两个大小相等的组,上半部分/下半部分构成多头/空头头寸。

如果 factor_data 包括每个资产信息,也可以为组创建多空投资组合。

从 Zipline 回测中获取 pyfolio 输入

Zipline 回测的结果也可以使用 extract_rets_pos_txn_from_zipline 转换为所需的 pyfolio 输入:

returns, positions, transactions =
         extract_rets_pos_txn_from_zipline(backtest)

前向测试 – 样本外回报

测试交易策略涉及回测和前向测试。前者涉及历史数据,通常是指用于微调 alpha 因子参数的采样周期。前向测试在新的市场数据上模拟该策略,以验证它在样本外的表现良好性,并且不会过于紧密地适应特定的历史情况。

Pyfolio 允许指定样本外时段来模拟前向测试。在测试策略以获得统计上可靠的结果时,需要考虑许多方面。

plot_rolling_returns 函数根据用户定义的基准(我们使用标准普尔 500 指数)显示样本内和样本外的累积回报。Pyfolio 将累积回报计算为简单回报的乘积,在每个回报上加 1:

from pyfolio.plotting import plot_rolling_returns
plot_rolling_returns(returns=returns,
                     factor_returns=benchmark_rets,
                     live_start_date='2016-01-01',
                     cone_std=(1.0, 1.5, 2.0))

下图中包括一个锥体,它显示了扩大的置信区间,以表明在给定随机游走假设的情况下,样本外回报出现的可能性不大。在这里,在模拟的 2016 年样本外期间,我们的策略相对于标准普尔 500 指数表现不佳:

性能统计汇总

Pyfolio 提供了几个分析函数和图。 perf_stats 摘要显示年度和累积回报、波动性、偏斜和回报的峰度以及 SR。以下附加指标(也可以单独计算)是最重要的:

•最大回撤:自前一个峰值的最高百分比损失•卡尔马比率:相对于最大回撤的年度投资组合回报•Omega 比率:回报目标的收益与损失的概率加权比率•索提诺比率:相对于下行标准差的超额回报•尾部比率:右尾部的大小(增益,第 95 个百分位数的绝对值)相对于左尾的大小(损失,第 5 个百分位数的绝对值)•每日风险价值 (VaR):与低于每日平均值两个标准差的回报相对应的损失•Alpha:基准回报无法解释的投资组合回报•Beta:暴露于基准

plot_perf_stats函数引导估计参数可变性并将结果显示为箱线图:

show_perf_stats 函数计算整个时间段的大量指标,也分别计算样本内和样本外时间段的多个指标:

from pyfolio.timeseries import show_perf_stats
show_perf_stats(returns=returns,
                factor_returns=benchmark_rets,
                positions=positions,
                transactions=transactions,
                live_start_date=oos_date)

对于从 MeanReversion 因子导出的模拟多空投资组合,我们获得以下性能统计数据:

回撤期和因子敞口

plot_drawdown_periods(returns) 函数绘制投资组合的主要回撤期,其他几个绘制函数显示滚动 SR 和滚动因子对市场 beta 或 Fama-French 规模、增长和动量因子的敞口:

fig, ax = plt.subplots(nrows=2, ncols=2, figsize=(16, 10))
axes = ax.flatten()
plot_drawdown_periods(returns=returns, ax=axes[0])
plot_rolling_beta(returns=returns, factor_returns=benchmark_rets,
                  ax=axes[1])
plot_drawdown_underwater(returns=returns, ax=axes[2])
plot_rolling_sharpe(returns=returns)

下图突出显示了各种可视化子集,说明了 pyfolio 如何让我们深入了解性能特征并让我们了解风险和回报的基本驱动因素:

事件风险建模

Pyfolio 还包括各种事件的时间表,您可以使用这些时间表将投资组合在此期间的表现与基准进行比较。Pyfolio 默认使用标准普尔 500 指数,但您也可以提供您选择的基准回报。以下示例将英国退欧公投后 2015 年秋季抛售期间的表现与标准普尔 500 指数进行了比较:

interesting_times = extract_interesting_date_ranges(returns=returns)
interesting_times['Fall2015'].to_frame('pf') \\
 .join(benchmark_rets) \\
 .add(1).cumprod().sub(1) \\
 .plot(lw=2, figsize=(14, 6), title='Post-Brexit Turmoil')

总结

在本文中,我们讨论了投资组合管理的重要主题,它涉及以管理风险回报权衡为目标的投资头寸组合。我们引入了 pyfolio 来计算和可视化关键风险和回报指标,以及比较各种算法的性能。

E N D

扫描本文最下方二维码获取全部完整源码和Jupyter Notebook 文件打包下载。

长按扫码获取完整源码

以上是关于用 pyfolio 进行量化交易回测的主要内容,如果未能解决你的问题,请参考以下文章

R语言金融市场量化交易:布林带价差策略RSI交易策略,回测COMP 226|附代码数据

自己做量化交易软件(45)小白量化实战18--直接使用通达信自编指标公式进行分析绘图和回测

自己做量化交易软件(45)小白量化实战18--直接使用通达信自编指标公式进行分析绘图和回测

易经量化交易系统之回测系统2

如何看待量化交易的回测?

用Python编程借助现有量化平台编写股票交易策略和回测分析