Advance Finance Machine Learning读书笔记
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
因为年初疫情影响,书剩在别的地方无法出门取,所以断更了很久,现在持续更新中……
之前有搜到大神weixin_38753422的AFML系列。写得很详细并且有代码和图片解释,链接在此
此系列从Part 1 Chapter 3开始写起,Chapter3之前内容可以在上面的链接里看到。(注意并不是所有内容的整理,而是我个人觉得需要整理的内容)
本文讲的时Part 3 Chapter 11 The Dangers of Backtesting (回测的坑)
回测你真的做的好吗?
首先作者批判了一通大家使用Backtesting的时候,有很多错误。引用了**Seven Sins of Quantitative Investing” (Luo et al. [2014])**文章里提到的7大错误:
- 幸存者偏差:执行回测时,没考虑到被退市的公司和股票。
- 前视偏差:在回测的时候用到了回测时间段之后的信息,导致信息泄露
- 讲故事:对回测时遇到的随机规律强行编故事解释
- 数据挖掘:在测试集上训练
- 交易成本:在回测时,很难考虑全所有的交易费用(很难吗??)
- 异常值:异常值对最后模型影响过大
- 做空:做空需要向第三方融券,如何保证回测时百分百实现能够融到券进行做空?
- ……
但是就算你绕开了这些错误,但是这个回测可能还是错的。
The maddening thing about backtesting is that, the better you become at it, the more likely false discoveries will pop up.
不要将回测作为一个研究工具,Feature Importance 才是
生成feature Importance 是在历史数据进入之前就
回测的目的是判别差模型,而不是对模型进行调优。如果回测结果不佳那就从头开始再建一次模型。在运行多次回测之后就会发生选择性偏差,从而导致模型在回测数据集上出现过拟合
说的直白一点:前期数据处理、分析、建模都花这么大力气走过来了,是个人都想在之前的数据上多回测几次。可能第一第二次回测结果都不好,那可能就换其他时间段去回测,直到回测到一次结果很好的,就以此为准了。(选择性偏差)
下面是几个Tips去防止在回测阶段Overfitting:
- 资产分散化,别对单一资产做策略,错误出现在多个资产上的可能性会小很多
- 使用Bagging方法
- 在你数据探索真的完成之后再做回测
- 将每一次回测都记录下来,过拟合的可能性可以在最后结果得出(过程在另一本书上,我也没懂为啥)
- 自己生成的数据可能比历史数据更好,尽量把回测放到多种不同的Dataset
- 回测失败,从头来啦。别修正
如何选择策略
在之前文章中提到,普通的K-fold CV会把互相冗余的信息分散到Train set 和Test set中,导致CV结果不可信。所以一个正确的验证过程应该做到训练模型和验证模型的数据互不(At least not)相关/冗余
虽然sklearn里面有前向K-fold CV方法,但是这个方法还是存在很多弊端
- 在时间序列存在长范围的序列相关,那就很难避免信息泄露
- 前向CV并没有随机抽样,所以在一个时间轴上不断前向CV,假正例就很容易出现
介绍一种选择策略的CV方式(根据回测过拟合的概率probability of backtest overfitting (PBO).操作的CV)
CV名字叫combinatorially symmetric cross-validation (CSCV) method
第一步、 创建一个 M M M的矩阵(TxN), N N N个列,每一列代表在时间点 t = 1 … … T t=1……T t=1……T的策略逐日盯市的PNL(收益或亏损)的向量。 T T T行,每一行代表一个时间点
这个矩阵有两个特性:
- 每一列(trail)是具有同时性的,每一行发生的Pnl都是同时的
- 优化策略的评价指标同样可以放在子样本空间的列上,因为我们认为这些trail都是服从IID正态分布(如果trail在不同的时间跨度上进行的,记得放入到矩阵前,将他们聚合到相同的 T T T上)