本章节作者结合自己的量化交易经验,对回测中涉及的诸多细节问题做了阐述,主要分为如下 6 部分内容:
- 第一部分:作者对自己常用的回测平台和免费或便宜的历史数据库做了介绍。作者比较喜欢用MATLAB写程序。对用于回测的历史数据库,作者罗列了一个表格,介绍了各个数据库的优缺点。
- 第二部分:作者介绍了在使用历史数据做回测时需要考虑的问题或可能面临的陷阱:出现分红送股时股价的调整、日最高、最低价的噪声、如何降低或消除数据存活偏差对回测的影响。
- 第三部分:作者结合例子详细介绍了 2 个经典的业绩度量指标:夏普比率、挫跌。
- 第四部分:作者介绍了“前视偏差”和“数据迁就偏差”这 2 大回测陷阱,以及相应的规避方法:可以通过扩大样本量、样本外测试、无参数模型、敏感性分析来避免“数据迁就偏差”。
- 第五部分:介绍回测时如何处理交易成本。
-
一、历史数据可能存在的问题或陷阱
1.1 数据是否经分拆或股息调整?
股票分割与合并
若一家上市公司,在除权日 T 分拆或合并股票,每股分拆为 N 股(如果 N 大于 1,对应的是“股票分割、拆股、拆细”,即 1 股股票均等地拆成若干股;如果 N 小于 1,对应的是“股票合并、并股”,即将若干股股票合并为 1 股),则 T 日之前的所有股票价格应该乘以 1/N。
- 发生股利政策
若一家上市公司,在除息日 T 每股派发 d 元的股息(对应的是派发现金股利/派现的情况),则 T 日之前的所有股票价格都乘以 (Close(T-1)-d)/Close(T-1),其中 Close(T-1) 为 T 日前一交易日的收盘价。
- 为什么要对历史数据做调整
如果不对历史数据作调整,发生上述行为后(即从除权日和除息日开始),股价会比之前的价格低很多,但股票的实际价值并未发生变化,如果直接用新的价格 Close(T) 和除权除息前的原始价格 (Close(T-1)、…..) 计算收益率,得到的收益率偏低,并不能反映真实的收益情况,进而很容易得到一个错误的交易信号。
- 补充
- 在中国市场上,实务中股利发放的形式主要有:
① 派现:即“现金股利”,指股份公司以现金分红的方式将“盈余公积”或“当期应付利润的部分或全部”发放给股
东,股东需要支付 20%/2=10% 的所得税。
② 送股:即“股票股利”,指股份公司对原有股东无偿派发股票的行为。具体是将公司的“留存收益”(包括盈余
公积+未分配利润)转入“股本”账户,本质上即“留存收益”的资本化,股东需要支付 10% 的所得税。
③ 资本公积金转增资本:即将资本公积金转入“实收资本”或“股本”账户,然后按投资者所持有公司的股份份额
比例的大小分配至各个投资者账户中。(资本公积金主要来源:股票发行的溢价收入、接受的赠予、资产增
值、因合并而接受的其他公司的资产净额。) 资本公积金转增资本增加了公司的注册资本(发行在外的股本
规模),不属于利润分配行为,所以无需纳税。
- 历史价格调整方式主要有:
① 前复权:保持股票现有价格,对除权除息以前的价格进行缩减,复权后的价格 =[(复权前价格-现金红
利)+ 配(新)股价格流通股股份变动 ] /(1+流通股份变动比例);
② 后复权:保持股票最初的价格,把历史所有分红送股都加起来(从上市起所有分红都要进行处理),对除
权除息的价格进行增加,复权后的价格 = 复权前价格(1+流通股份变动比例)+ 现金红利 - 配(新)股价格
流通股股份变动 ;
③ 定点复权:定点复权一般是对定点之前的价格进行前复权调整,对定点之后的价格保持不变,若定点之后遇到
除权除息日,则进行后复权调整。
④ 复权方式的选择:一般技术分析选用前复权,保留当前最真实的成交价格,且K线或均线都是连续的;如果是
价值分析,选用后复权,保留上市第一天的价格不变,后复权后的价格显示了公司真实价值的增加,进而更
能体现投资者的真实收益。
1.2 数据有无存活偏差?
作者提供了 2 个办法用于避免或减少数据存活偏差的影响:
- 自己去收集将来可用于做回测的带时刻标签的数据。如果每天都保存了所有关注的股票的价格,就有了可供未来使用的带时刻标签或无存活偏差的数据,因为自己存的历史数据中是仍然保留了未来可能因破产、退市、兼并或收购而消失的股票的数据,而不会出现只保留了幸存者数据的情况。
- 若想降低存活偏差的影响,可以只用近期数据对策略进行回测,这样就不会因为有太多消失的股票而影响回测结果。
1.3 适合用最高价、最低价做回测吗?
回测时,以开盘价或收盘价作为下单价格比以最高价、最低价作为下单价格更可靠,使用最高价或最低价做回测一般会抬高回测收益。原因:在几乎所有股票的日数据中,最高价和最低价的噪声要远大于开盘价和收盘价,这个噪声主要是最高价和最低价的不确定性导致的,因为一般很少会下达以最高价成交的指令,记录得到的最高价或最低价是不正确的且没有被筛掉。
可以对数据库的数据进行查错,比如可以计算一下日收益率(如果有完整的高开低收数据,还可以计算不同价格组合下的日收益率,如用昨天的最高价和今天的收盘价计算收益率),一般对偏离均值4个标准差的收益要仔细检查,极端收益一般与消息发布或市场指数异动有关,否则就是数据本身存在问题。二、业绩度量
作者认为在不同策略之间或不同交易员之间进行横向比较,最重要的 2 个指标是:夏普比率、挫跌。2.1 夏普比率
夏普比率是信息比率的一个特例,信息比率的计算公式如下所示:
信息比率 = 超额收益率的均值 / 超额收益率的标准差
其中,超额收益率 = 组合收益率 - 基准收益率。假设每个交易时段的长度为 T,需要根据时段长度 T ,计算一年的交易时段数量,然后可以计算得到:
年化夏普比率 =* 基于 T 的夏普比率
在计算夏普比率时需要注意的细节问题:
是否需要从货币中性组合的收益中减去无风险利率?
可以忽略无风险利率。因为货币中性组合可以用卖空所得的现金买入证券,本质上是自融资,融资成本很低(存
贷利率差),在回测时可以忽略,而且保证金余额还能获得与无风险利率近似的存款利率。
什么情况下需要减掉无风险利率?
一般仅当策略需要支付资金成本的时候,才需要减掉无风险利率。所以,对于那些没有隔夜头寸的纯多头当日交
易策略,就不需要减去无风险利率,因为这类策略没有资金成本。对于非日内交易的策略,需要承担资金成本,
一般需要减去无风险利率。
2.2 最大挫跌、最大挫跌期
在计算挫跌之前,需要在每日收盘时计算“最高水位线”,即到这一天为止策略的最大累积收益率,然后再基于“最高水位线”来计算最大挫跌和最大挫跌期。(用累计收益率曲线来计算最高水位线和挫跌,与使用净值曲线是一样的,因为净值 = 初始投资额与“1+累积收益率”的乘积。)
- 时刻 t 的挫跌 = 当前净值(假定期间内未发生任何赎回或注资)- t 时刻或之前的净值曲线最大值;
- 最大挫跌 = 净值曲线最大值(高水位线) - 之后的净值曲线最小值;
- 最长挫跌期 = 净值重返亏损前的水平所花费的最长时间。
三、常见的回测陷阱
3.1 前视偏差
前视偏差是指使用交易完成之后的信息,引入了未来数据。避免前视偏差的方法有:使用滞后的历史数据来计算策略信号。可以通过下述方法检验回测程序是否犯了前视偏差错误:1. 先是使用所有历史数据运行程序,得到每天的推荐头寸;2. 移除最近 N 天的历史数据(10 <= N <= 100),即如果最后一天是 T 日,移除 N 天后的数据的最后一天就是 N-T 日,然后使用这 N-T 日的数据集运行程序,得到每天的推荐头寸;3. 比较没有移除数据和移除 N 日后的数据得到的推荐头寸是不是一致,如果一致,就不存在前视偏差,反之则说明在计算头寸时提前使用了删除的历史数据,存在前视偏差。3.2 数据迁就偏差
数据迁就偏差是指因迁就历史数据的噪音而过度优化(拟合)模型参数,造成策略的回测业绩高于未来业绩。在构建模型时,如果能用到的独立数据量越少,交易模型中用到的可调整参数就应该越少。作者介绍了下面几种用于降低数据迁就偏差的方法:
- 样本含量
根据要优化的自由参数个数,使用足够多的回测样本数据。作者给出的经验规则是:
样本量 = 252(倍) * 自由参数个数
例如:回测 3 参数的当日交易模型,至少要用 3 年的日价格数据。如果是分钟交易模型,则至少需要 7 个月(252/390 年)的分钟数据(每天交易分钟数:6.5*60=390)。
- 样本外测试
将历史数据根据时间先后分为 2 段:前一段数据集称为“训练集”,用于模型的参数优化和定性选择;后一段数据集称为“测试集”,用于测试最终构建的模型。
- 2 段数据的大小要大致相等;
- 如果数据量不够,则至少要用三分之一的数据做测试。训练集的最小数据量因符合“1. 样本含量”中提到的要求。
“无参数交易模型” 指的是:模型中的所有参数都在一个移动回溯窗口期中进行动态优化的模型。这类模型通过不断地适应变化的历史数据,来消除数据迁就偏差。参数优化并不一定是挑选使得回测业绩最好的参数,而应该挑选使得某种平均情况最优的参数,如使得测试集和训练集上的业绩结构都较好的参数集。
最靠谱的样本外测试方法是:“仿真交易”,即用尚未发生的真实数据来运行模型。仿真交易不仅能够做真实准确地样本外测试,还能发现模型中的前视偏差以及各种与操作相关的问题。
- 敏感性分析
在完成模型参数和各种特征的优化、通过测试集的检验之后,可以通过改变这些参数或改变模型的定性决策,来观察模型业绩在训练集和测试集上的变化。如果业绩变化很大,在参数取任何其他值时业绩都很糟糕,模型很有可能存在数据迁就偏差。
可以尝试各种简化模型的方法,在简化过程中,即使模型在测试集上的业绩会有所减低,只要没有显著的降低,就应该尽可能的移除更多的条件、约束和参数。
四、交易成本
一般假设回测结果没有考虑交易成本,然后需要判断在考虑交易成本后的策略是否仍然有效。一般对一个交易循环中的买入和卖出记做 2 次交易成本。如果你的指令规模不比最佳买卖报价的平均规模大很多,交易成本通常可以用平均买卖价差的一半再加上佣金来估计。
五、策略改进
策略改进的原则是:任何策略改进都要同时提高测试集和训练集的业绩。
优化策略的方法可以有:1. 排除某只或某组特定股票、2. 改变进出市场的时间、3. 改变交易频率、4. 选择一组不同的股票(即改变股票池)。
策略的改进,最好基于经济学基本原理,或者透彻研究过的市场现象,而不是依据一些主观的试错法则。否则将可能产生数据迁就偏差。