Advance Finance Machine Learning读书笔记
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
因为年初疫情影响,书剩在别的地方无法出门取,所以断更了很久,现在持续更新中……
之前有搜到大神weixin_38753422的AFML系列。写得很详细并且有代码和图片解释,链接在此
此系列从Part 1 Chapter 3开始写起,Chapter3之前内容可以在上面的链接里看到。(注意并不是所有内容的整理,而是我个人觉得需要整理的内容)
本文讲的时Part 3 Chapter 12 Backtesting through Cross-Validation (使用CV进行回测)
啥是回测
回测是用于检测投资策略在OOS上的性能表现,大致有两个方向:
- 前向回测法:将策略在曾经的数据上跑一边,这也是经常被提到的那个回测(历史数据检测)
- 虚拟回测法:模拟从未发生过的数据,在这个数据上进行测试
前向回测法
缺点:
- 因为是在一条单一时间线上进行回测,所以很容发生过拟合
- 如果测试放在一些明显的趋势性时间序列上,会导致在上下波动的区间训练的策略表现极差,如果实际交易中发生于回测时间序列区间相反的趋势,就会发生过拟合,无法泛化的结果
- 训练数据集太少(Warm-up set 没看懂)
优点:
- 前向法在历史数据上进行模拟交易,所以它的表现可以直接有策略交易详单得出
- 历史回测本身就可以避免信息泄露,只要Purge这步操作过就能保证Testset是OOS
交叉验证回测法
优点:
- 使用CV的Test set是k个不同的情境
- 生成策略的训练集样本大小一致,也就说利用的信息量一致,后期有可比性
- 每一个样本都能参与到test set中去
缺点:
- 和WF回测一样仍是在已有的时间序列方向上进行测试
- CV在历史数据上并没有像WF一样有交易的模拟记录
- 操作时要特别主要Test Set 的信息不能流入Train Set(参考Chapter 7 提到的Purge 和 Embargo)
将Purge与CV结合的CPCV回测
1.第一步:将T TT个样本进行分组,分成N NN个组,前1 … … N − 1 1……N-11……N−1个组的样本容量是T / N T/NT/N,最后第N NN组的样本容量是T − [ T / N ] ∗ ( N − 1 ) T-[T/N]*(N-1)T−[T/N]∗(N−1).
([.]为向下求整,[3.33]=3)
2.第二步:我们从N NN个组中取k kk个组作为Test set 那么就有C N n − k C_N^{n-k}CNn−k个组合(N-k个Train,k个test)
3.对每一组组合进行Purge 和 Embargo 因为有一些测试集的标签可能又训练集的数据得到
4.在每个组合上的训练集上训练出模型,并在对应的测试集上做出预测结果
5.我们可以得到ϕ \phiϕ个Path 每个Path上面都有N NN个测试集预测结果,并最后计算每个Path的夏普率
Path计算公式:


(注意:图中红框圈出来的为Path 1)
解释一下这个图:
一共六个组(N = 6 N=6N=6)
要选两个测试组(K = 2 K=2K=2)
一共C 6 2 C_6^{2}C62种组合法(C 6 2 = 15 C_6^{2}=15C62=15)
看第一个组合S 1 S_1S1,组1和组2是选做了测试集所以在图片中标出,那么组3、组4、组5、组6将合成训练集,这个训练集将fit出模型1并在组1、组2的测试集上得出预测结果,并计算出执行策略在Test set上面的夏普率
(个人觉得CV中test set 应该叫validation set)
文中关于CPCV的例子
当K = 1 K=1K=1时:
CPCV的Path只有一条,那么CPCV就退化成了普通CV
当K = 2 K=2K=2时:
CPCV的Path有N − 1 N-1N−1条,十分接近于N NN组,所以当我们有指定的Path需要生成时,我们直接将数据分成P a t h + 1 Path+1Path+1组就可以了。理论上我们希望Path 越多越好这样就能更真实地反应策略的效果。那么我们极限情况下可以把N = T N=TN=T(T之前提到过是总共样本数),那么这时的Path共有T − 1 T-1T−1个,那么策略将会在1 − 2 T 1-\frac{2}{T}1−T2的比例上进行训练。实际运用中通常将K设置成2就行了。