第一章:回测与自动化执行的核心思想

回测的七大陷阱

① 前视偏差 (Look-ahead Bias)
错误:回测中用了"当天的最高价"来决定"当天"是否买入。但实盘中,你收盘前根本不知道今天最高价是多少。
唯一解法:让回测程序和实盘程序共用同一套代码,只是喂的数据不同(回测喂历史数据,实盘喂实时数据)。这样代码里就不可能用了"未来信息"。
② 数据窥探偏差 (Data-snooping Bias)
本质:参数越多、模型越复杂,就越容易"拟合"过去数据中随机出现的假模式,这些模式未来不会重现。
最简单的解药——线性模型。 Chan 给出一个极端但有效的做法:所有因子的权重相等(而非用优化算法去拟合),直接把各因子归一化成 Z-score,然后等权相加。丹尼尔·卡尼曼在《思考,快与慢》中也说:"给所有预测变量赋相等权重的公式往往更优,因为它们不受采样误差的影响。"
最终验证:没有任何测试比得上拿真金白银小仓位实盘跑(walk-forward test)。实盘夏普率能达到回测的一半,多数人就该偷笑了。
③ 股票拆分与股息调整
问题:1拆2后股价砍半,但你的持股数量翻倍,总市值不变。如果历史价格没做"后向调整"(把拆股前的价格除以2),回测中看到股价"暴跌"就会错误触发买入信号。
实操:不仅回测要调整,实盘时也要在除权日前把历史数据做相应调整。可以用 earnings.com 查询拆分和股息信息。
④ 幸存者偏差 (Survivorship Bias)
最危险的陷阱之一。 如果数据库里只有"活到今天"的股票,你的回测会完美避开所有退市股。一个"买昨天跌最狠的股票"的策略,实盘里大概率买到破产股亏光,但回测中你买的都是"曾经跌惨但后来活下来"的股票,收益完美。
对策略类型的影响:对纯多头均值回归策略伤害最大(收益被虚高);对纯空头策略反而压低回测收益(退市股做空本该大赚但数据里没有);对多空策略有所抵消但仍有虚高。
数据来源:csidata.com、kibot.com、tickdata.com、crsp.com 提供无幸存者偏差的数据。
⑤ 主交易所 vs 合并行情价格
关键区别:你看到的"收盘价"可能是任意一个交易场所(NYSE、纳斯达克、暗池等)最后一笔成交价。但你的市价收盘单(MOC)只会路由到主交易所。IBM 的 MOC 单去 NYSE,SPY 的去 NYSE Arca,微软的去纳斯达克。如果回测用了合并行情数据,一个在暗池上以异常价格成交的小单可能触发你回测中的"下单"——但你在主交易所根本复现不了那个价格。
结论:依赖开盘收盘信号的策略,必须用主交易所的历史价格来回测。
⑥ 期货连续合约的价格缺口
核心问题:期货有到期日,你不能永远持有"同一个合约"。当你从近月合约"展期"到远月合约时,两个价格之间可能有巨大缺口。如果不做后向调整,回测中展期当天会出现假的盈亏。
但调整方式有讲究:
价格后向调整:修正了盈亏计算,但收益率计算会出错,而且调整到很早期价格可能变负数。
收益率后向调整:修正了收益率计算,但盈亏计算会出错。
选哪个?如果你的策略看的是价格差(如价差套利),必须用价格后向调整;如果看的是价格比率,必须用收益率后向调整。
⑦ 做空约束与融券限制
做空不是想空就能空。如果某只股票"难借到"(hard to borrow),你不仅可能要付高昂的融券利息,甚至根本借不到。2008年雷曼兄弟倒闭后,SEC 直接禁止了所有金融股的做空。如果你的回测大举做空金融股获得漂亮收益,这根本无法在实盘中复现。
实操建议:小盘股的做空约束远大于大盘股,其空头回测收益要打很大折扣。

第二章:均值回归与协整策略

判断一个序列是不是均值回归

ADF 检验(Augmented Dickey-Fuller)

它的逻辑直白:如果价格均值回归,那么当前价位就能预测下一步往哪走——高于均值就该往下,低于均值就该往上。把这个想法写成线性模型:

把今天的价格变化 Δy(t),对昨天的价格水平 y(t−1) 做回归,得到系数 λ

  • 如果 λ = 0:下一步变化跟当前价位无关 → 随机游走,不能交易。
  • 如果 λ < 0 且足够负:当前价位越高,下一步越往下压 → 均值回归。

Hurst 指数与方差比检验

这是”平稳性视角”的工具,衡量价格扩散的速度。定义 log 价格在时间间隔 τ 内的方差:

这个 H 就是 Hurst 指数,它像一个”性格指标”:

H < 0.5
均值回归
越接近0越强
H = 0.5
几何随机游走
(无法交易)
H > 0.5
趋势
越接近1越强

判断回归一次要多久

半衰期(Half-life) 告诉你价格回归一半距离需要多长时间。

数学上,忽略漂移和滞后项后,方程 2.1 就变成了随机微积分里的 Ornstein-Uhlenbeck(OU)均值回归过程,可以解析求出价格的期望值随时间指数衰减回到 −μ/λ,衰减的半衰期是:

λ 的三种情况,直接决定要不要做这个序列
λ > 0 根本不回归,别浪费时间写均值回归策略。
λ ≈ 0 半衰期极长,回归太慢,单位时间完成的往返交易太少,不赚钱。
λ 足够负 半衰期短,回归快,适合做。半衰期还直接告诉你该用多长的 look-back。

半衰期最实用的价值:它给策略参数提供了一个”天然时间尺度”。比如半衰期是20天,你就不该用5天的窗口去算移动均线或标准差。作者建议把 look-back 设成半衰期的一个小倍数,往往就接近最优——这样你就不用对窗口参数做暴力优化,避免了过拟合。

协整:自己”制造”均值回归序列

现成的平稳资产很少,但我们不必受限于此——可以把几个本身不平稳的价格序列,按合适的比例组合成一个市值平稳(均值回归)的组合。能这样组合的序列,就叫协整(cointegrating)

最常见的就是两个资产的配对交易(pairs trading):做多一个、做空另一个。但协整可以推广到三个甚至更多资产。

CADF 检验(仅限两个资产)

Engle-Granger 的思路:先用线性回归在两个序列间拟合出最优对冲比率,按这个比率组成组合(残差),再对这个组合序列跑 ADF 检验。

CADF 的大坑:顺序相关。把 EWA 当自变量、还是把 EWC 当自变量,会得到不同的对冲比率(而且不是简单的倒数关系)。很多情况下只有一个顺序能得到真正平稳的组合。所以实操中要两个顺序都试,选 t 统计量最负(最显著)的那个。

Johansen 检验(任意数量资产,顺序无关)

要处理三个以上资产,就要用 Johansen 检验。它把方程 2.1 推广成矩阵形式(价格变成向量 Y,系数 λ 变成矩阵 Λ),然后通过对 Λ 做特征向量分解,求出一个叫”秩 r”的数:

秩 r = 能形成的独立平稳组合的个数。n 个序列里:r=0 表示完全没有协整关系;r 越大,可独立构造的均值回归组合越多。Johansen 用 Trace 统计量Eigen 统计量两种方式逐级检验 r≤0, r≤1, … 能否被拒绝。

Johansen 相比 CADF 的两个关键优势:

① 顺序无关
跑一次就给出所有独立协整关系,不用像 CADF 那样换着顺序试。EWA-EWC 跑出来 r=2,正对应 CADF 里换顺序得到的两个不同对冲比率。
② 直接给出对冲比率
分解出的特征向量就是各资产的权重(份额)。特征值最大的那个特征向量,对应最强、半衰期最短的协整关系,优先选它建组合。

第三章:实施均值回归策略

均值回归(Mean Reversion)的物理学隐喻就像拉伸的弹簧:当价格偏离其历史均值过远时,它倾向于向均值产生一股拉力(回归)。在量化实操中,我们通常寻找具有平稳性(Stationary)或协整性(Cointegrated)的资产组合(如经典的配对交易),将其价格合成一条围绕固定均值上下波动的平稳曲线。

配对交易的信号选择:价差、对数价差与比例

构建配对交易(Pair Trading)最核心的一步是如何合成“交易信号”。文献中对比了三种最经典的方法:

价格价差 (Price Spread)

y = y1 - h * y2

对冲比例 h 的含义:持有的股票数量(股数)比例。
实操特点:最简单直接。只需在建仓时按比例买入/卖出对应股数,持仓期间无需频繁调整。

对数价差 (Log Price Spread)

log(q) = h1*log(y1) + h2*log(y2)

对冲比例 h 的含义:分配的资金权重(百分比)
实操特点:在价格波动巨大时更科学。但由于价格变化会导致资金权重偏离,需要频繁每日调仓(Rebalancing),交易成本较高。

价格比例 (Price Ratio)

Ratio = y1 / y2

对冲比例 h 的含义:非协整情况下的替代方案。
实操特点:适合不具备长期协整关系但短期回归的配对。当两只股票价格成倍增长(如 10:5 涨到 100:50),比例仍为 2,避免了绝对价差失效。外汇交易(Cross Rates)天然使用此模式。


布林带策略 (Bollinger Bands)

线性均值回归策略(如按偏离程度线性按比例加仓)在现实中是无法执行的,因为价格有可能在彻底回归前出现无限偏离,导致交易员爆仓。

更务实的方法是使用布林带(Bollinger Bands)。我们将偏离度标准化为 Z-Score(即:(当前价差 - 移动平均价差) / 移动标准差),并设定具体的进出场界限。

布林带(Bollinger Bands)均值回归交易逻辑

上轨 (+entryZscore)
做空价差 (Short)
均值线 (exitZscore = 0)
平仓离场 (Exit)
下轨 (-entryZscore)
做多价差 (Long)

当价格偏移度(Z-Score)突破设定的标准差阈值时进场,回归至均值(Z-Score = 0)时离场。避免了线性策略无限占用资金的问题。


分批建仓与一次性建仓

分批建仓 (Scaling-in)

随着价格偏离均值越来越远,逐步增加持仓权重(例如在 1, 2, 3 倍标准差处分批买入)。
实操现实:如果价格未完全回归到均值,只做小幅微调,频繁分批平仓依然能锁定微小利润;在实操中能有效降低大额订单的市场冲击成本 (Market Impact)。最适合应用于波动率变动的实际市场。

一次性建仓 (All-in)

寻找一个最优的偏离度阈值(如 2 倍标准差),价格一旦触及,直接投入全部预定资金。
学术结论:在假设波动率和反转概率恒定的简易数学模型下,一次性建仓在历史回测中的平均期望收益永远优于分批建仓。

卡尔曼滤波 (Kalman Filter)

传统的滚动窗口对冲比例(如用过去 20 天数据计算 OLS 斜率)存在**“滑窗死穴”**:当窗口最老的一根 K 线被剔除、或者新一根 K 线进来时,计算出的对冲比例容易产生剧烈、非自然的跳跃。

卡尔曼滤波(Kalman Filter) 是一种没有滞后性、无需历史窗口的动态估计算法。它可以被形象地理解为“智能雷达追踪仪”:

🧠 卡尔曼滤波:告别“滑窗死穴”的动态对冲利器

卡尔曼滤波不需要存储历史窗口数据,它采用“预测-更新”的递归机制。

第一步:状态预测 (State Prediction)
基于昨天的对冲比例 $\beta_{t-1}$,预测今天的对冲比例。我们假定它与昨天大致相同,但允许带有微小的过程噪声 $V_w$。
第二步:观测更新 (Measurement Update)
观察今天真实的价格 $y_t$,计算预测误差 $e_t$,并结合卡尔曼增益 (Kalman Gain) 平滑修正对冲比例。

实战增益:卡尔曼滤波在更新对冲比例 $\beta$ 的同时,副产品是直接输出 spread 的动态均值(拦截项)和预测误差标准差 $\sqrt{Q}$。这使得我们无需设定任何滑窗长度,就能天然构建出完美的自适应布林带策略!

第四章:股票与ETF的均值回归

1. 为什么配对交易股票(Stock Pairs)这么难?

配对交易(Pairs Trading)的初衷是寻找两个走势高度相关的资产(例如可口可乐与百事可乐),买入落后者、做空领跑者,赚取两者的价差收敛。但在实际股票市场中,这种方法非常脆弱。

股票配对(Stock Pairs)

痛点:高单体风险
即使同属一个行业(如苹果 vs 经典黑莓),个股的基本面和管理层决策也可能瞬间分化,导致历史上的协整关系在实盘中彻底失效,一去不回头。

ETF 配对(ETF Pairs)

优势:宏观经济绑定
ETF 代表一篮子股票。宏观经济体或整个行业的走势变化缓慢(如澳大利亚 ETF EWA vs 加拿大 ETF EWC),其协整关系更具生命力。

此外,股票配对还面临严重的做空限制(Short-sale Constraints)。如果做空了一只很难借到的股票(Hard-to-borrow),一旦它由于突发利好飙升,出借人会强行召回,逼你在最差的价格“斩仓”买回,导致严重的空头挤压(Short Squeeze)。同时,由于高频交易和暗盘的普及,现在个股盘口显示的“最佳买卖报价”(NBBO)数量极小。如果你直接用市价单进场,会承受巨大的滑点(Slippage)。


2. ETF 三因子套利(Triplets)

既然 ETF 相比个股更稳定,那是否可以高枕无忧?答案是否定的。即使是看似完美的商品与其生产商的配对,也会被隐藏的宏观因素打碎。

这揭示了一个量化研究的重要思想:当一个策略失效时,应该去探寻其背后的经济学因果。提出假设并引入新的解释变量(如能源成本),往往能够将失效的双因子配对升级为成功的三因子(Triplet)套利组合。


3. 日内均值回归:跳空买入模型(Buy-on-Gap)

学术界常说股票长期走势是几何随机游走,但在日内超短线维度,由于投资者的情绪波动,均值回归效应会阶段性变得极其强烈。典型代表就是“跳空买入模型(Buy-on-Gap)”。

该模型的运作逻辑非常直观:在市场开盘时,筛选出开盘价比前一日最低价还要低一个标准差的股票。这些股票往往承受了开盘时的恐慌性抛盘,大概率跌过头了。然而,为了避免买到真正基本面变坏的股票,模型加入了一个关键的动量过滤器:限制股票的开盘价必须高于其 20 日均线

通过这一限制,我们能确保该股票长期趋势依然向上,开盘的暴跌仅仅是临时的流动性踩踏(容易修复),而不是公司基本面暴雷(会继续阴跌)。最后,我们在开盘买入跌幅最大的 10 只,并在收盘时无条件全部平仓。


4. 截面均值回归(Cross-Sectional Mean Reversion)

在均值回归中,除了时间维度,还有空间(截面)维度。

时间序列回归 (Time Series)

核心:单个资产与自己历史的价格进行比较。当价格偏离其历史均值时进行反向操作。

截面回归 (Cross-Sectional)

核心:资产与同时期一篮子资产的平均收益进行比较。跑得太快的被做空,掉队的被做多。

著名的 Khandani & Lo (2007) 线性多空模型 就是截面回归的经典。其数学思想非常纯粹:每天收盘前计算整个标普 500 指数中所有个股的平均收益率。如果个股今天的收益率高于平均收益率,就在开盘分配做空权重;如果低于平均收益率,就分配做多权重。由于每只股票的权重都减去了市场均值,整个组合每天开盘时都保持绝对的美元中性。这种简单到没有任何参数的线性模型,在 2008 年金融海啸中不仅没有亏损,反而取得了 30% 的年化收益。