Zhuang's Diary

言之有物,持之以恒

Ernie Chan《算法交易:制胜策略与原理》第四章读书笔记。市场已经经历了大量的“统计套利”算法和策略工程师,均值回归模式已经被竭尽所能地开发出来,所以,均值回归策略相关的收益率一般都降低很多了。2015 年英文版本出版。

第四章:股票与ETF基金的均值回归模式

一、 标的分散化:从个股配对到ETF组合

在第二章和第三章中,我们讨论的主要是两只股票的配对交易。但在实盘中,个股配对存在极大的“特质风险”。

  1. 个股配对的致命缺陷:基本面冲击
    • 原理:即使两只股票(如可口可乐与百事可乐)在历史上高度协整,一旦其中一家发生黑天鹅事件(如财报造假、CEO突发离职、产品致癌丑闻),其基本面发生永久性改变,导致价差永久发散,均值回归策略将面临毁灭性打击。这种风险,再顶尖的回测系统也无法预测。
  2. ETF组合的降维打击:分散特质风险
    • 实战优势:ETF是一篮子股票的组合。当我们在两个具有协整关系的ETF之间(例如金融行业ETF XLF 与 区域银行ETF KRE)进行套利时,单只股票的个体风险被充分分散。
    • 数值对比:假设KRE中某家小银行倒闭,可能只导致KRE净值下跌0.5%,价差略微偏离;但如果是配对交易这两家银行的个股,价差可能瞬间偏离20%直接触发强平。ETF组合的协整关系在样本外(OOS)的存活率和稳定性远高于个股。

二、 衍生品对冲的隐含成本:滚动收益

当使用期货合约替代ETF现货进行均值回归交易时(为了获得杠杆或方便做空),不能只看价格走势,必须将滚动收益纳入总收益的计算。

  1. 期货定价公式与升贴水
    • 理论公式:$F = S \times e^{(r-d)T}$ (其中 $F$ 为期货价格,$S$ 为现货价格,$r$ 为无风险利率,$d$ 为股息率,$T$ 为到期时间)。
    • 常态:通常 $r > d$,因此远月期货价格 $F > S$(处于升水状态,Contango)。
  2. 滚动收益的实战计算
    • 定义:当你做空昂贵的远月合约,并在到期前平仓、买入更便宜的近月合约时,由于价格向现货收敛所赚取的隐含收益。
    • 数值案例:标普500现货 $S=4000$,6个月后期货 $F=4040$(升水40点)。你做空期货。1个月后,现货没涨没跌仍为4000,但期货由于时间流逝,价格变成 $4020$。此时你平仓,虽然现货没动,但你赚取了20点的滚动收益
    • 实战铁律:在回测ETF与期货的套利策略时,必须明确区分现货收益滚动收益。如果忽视滚动收益,你会错误评估策略的真实Alpha,尤其是在高利率环境下,升水带来的滚动收益可能占到大头。

三、 日内与季节性均值回归的特殊性

并非所有的均值回归都能用ADF检验或约翰森检验来证明。

  1. 统计检验的失效
    • 原因:日内数据(Tick或分钟级)充满了微观结构噪音(买卖价差跳动、延迟)。季节性数据(如每年1月份效应)样本点太少。传统的协整检验要求大样本连续数据,在此类场景下会失效(即无法得出“平稳”的统计学结论)。
  2. 实战替代方案:经验法则与规则驱动
    • 做法:放弃寻找数学上的协整性,转而寻找经验上的均值回归
    • 案例:“如果标普500迷你期货在开盘前15分钟内下跌超过0.5%,则在接下来的1小时内做多,收盘前平仓。” 这种策略通不过ADF检验,但由于日内流动性断裂导致的过度反应,其实盘收益可以非常好

四、 策略增强:均值回归与动量的融合

纯粹的均值回归最怕遇到“单边下跌趋势”(即所谓“接飞刀”)。引入动量过滤可以显著提高策略的胜率和一致性。

  • 实战机制:只有当标的的短期动量指标不处于极度恶化状态时,才允许执行均值回归做多信号。
  • 数值案例:假设你的策略发现股票A相对于指数严重超跌(Z-Score < -2),发出做多A的信号。
    • 无过滤:直接买入。结果A是因为业绩暴雷被机构砸盘,继续跌停,策略巨亏。
    • 动量过滤:在执行前,检查股票A过去5天的动量(如5日收益率)。如果5日跌幅超过-10%(动量极度恶化),说明处于强趋势中,拒绝执行该均值回归信号。只有当5日跌幅在-2%以内(只是随大盘轻微拖累)时,才执行做多。这有效剔除了“基本面崩塌”导致的假信号。

五、 指数套利的降维打击与横截面策略

传统的股票指数与期货之间的指数套利,已经沦为高频交易(HFT)的领地,中低频策略必须寻找新的战场。

  1. 指数套利的破局点:成分股子集
    • 现状:直接交易 SPY(标普500 ETF)与 ES(标普500期货)的价差,毫秒级内就会被HFT抹平,无利可图。
    • 实战策略:不要交易全样本指数。挑选指数内受特定宏观因子驱动最强烈的子集。例如,只挑选标普500中前50大科技股,合成一个“微型科技指数”,再与纳斯达克期货(NQ)进行套利。子集的噪音更小,定价效率相对较低,中频策略仍有套利空间。
  2. 横截面均值回归:最经典的线性多空策略
    • 定义:不再寻找特定股票之间的配对关系,而是将整个股票池(如沪深300)作为一个整体,通过某个变量进行横截面排名,做多排名最靠后的,做空排名最靠前的。
    • 核心变量:相对收益率
      • 操作:计算沪深300所有成分股过去5天的收益率。排名前10%(涨得最多的)大概率短期超涨,做空;排名后10%(跌得最多的)大概率短期超跌,做多。每隔一段时间(如5天)进行一次再平衡。这本质上是在赌“涨多了的会跌,跌多了的会涨”。
    • 扩展变量:基本面因子
      • 横截面排名的变量不限于收益率,也可以是**市盈率(P/E)、市净率(P/B)**等。
      • 实战应用:在同一个行业内(如银行业),按市盈率排名。做空PE最高的10%股票(高估),做多PE最低的10%股票(低估)。此时,均值回归策略在形式上已经演变成了传统的价值投资多空策略,但其数学执行逻辑依然是基于统计平均的回归。

Ernie Chan《算法交易:制胜策略与原理》第三章读书笔记。

第三章:均值回归策略的运行机制

一、 对冲比率的精确计算(OLS回归法)

在构建协整投资组合时,对冲比率(Hedge Ratio, 即 $\beta$)的计算方式直接决定了组合是否真正平稳。根据交易意图的不同,必须严格区分价格与对数价格的使用场景:

  1. 固定股数对冲(按数量交易)
    • 方法:直接对两个资产的价格序列 $Y$ 和 $X$ 进行普通最小二乘法(OLS)线性回归:$Y = \beta X + \epsilon$。
    • 实战意义:回归得到的斜率 $\beta$ 即为对冲比率。意味着每交易1股 $X$ 资产,需要交易 $\beta$ 股 $Y$ 资产来构建平稳价差。
  2. 固定市值对冲(按金额交易)
    • 方法:对两个资产价格序列的自然对数 $\ln(Y)$ 和 $\ln(X)$ 进行OLS回归。
    • 数值样例:假设我们要配对交易贵州茅台(Y)和五粮液(X)。茅台价格1700元,五粮液价格150元。
      • 错误做法(用价格OLS):假设算出 $\beta = 2$。策略要求“买1股五粮液,卖2股茅台”。实际资金占用:做多 150元,做空 3400元。资金占比极度失衡,组合收益完全被茅台的单边风险主导,并非真正的均值回归。
      • 正确做法(用对数价格OLS):对 $\ln(1700)$ 和 $\ln(150)$ 回归。假设算出 $\beta = 1.2$(代表价格弹性)。实盘中,我们设定总资金为100万元,则做多五粮液分配50万(买入3333股),做空茅台分配50万(卖出294股)。此时无论两者绝对价格差多远,组合中多空两边的市值是完全对等的
  3. 货币对的特殊处理
    • 原则:货币对(如EUR/USD)本质已经是相对报价,其“价差”没有直接的经济学意义。
    • 实战指标:应直接使用价格比率(Price Ratio, $P_A / P_B$)或对数价差($\ln(P_A) - \ln(P_B)$)作为均值回归的指标,而非算术价差($P_A - P_B$)。

二、 参数漂移与卡尔曼滤波

静态的协整检验假设对冲比率 $\beta$ 是恒定的,但这在实盘中不存在。初级做法是用“移动窗口(如20天)”,但存在断崖式跳变的问题。高级做法是引入卡尔曼滤波。

  • 卡尔曼滤波动态对冲样例
    假设我们在交易AMD(Y)和英伟达(X)的价差。
    • 状态方程(预测):$\beta_t = \beta_{t-1} + \omega$ (假设今天的对冲比率等于昨天,加上微小随机噪声 $\omega$)
    • 观测方程(实测):$Y_t = \beta_t X_t + v$ (实际价格关系,$v$ 为观测噪声)
    • 卡尔曼增益(核心公式):$K_t = \frac{P_{t|t-1}}{P_{t|t-1} + R}$
      (注:$P_{t|t-1}$ 是预测误差方差,$R$ 是市场观测噪声方差。$K_t$ 决定了我们多大程度上相信新数据)
    • 数据推演
      • T-1日:模型估算 $\beta_{t-1} = 0.5$(即1股NVDA对冲0.5股AMD)。预测误差方差 $P = 0.01$,市场噪声方差设定为 $R = 1.0$。
      • T日新Tick到来:NVDA暴涨,$X_t = 800$;AMD跟涨,$Y_t = 450$。
      • 计算卡尔曼增益:$K_t = 0.01 / (0.01 + 1.0) \approx 0.0098$ (因为市场价格噪声极大,所以 $K$ 很小,模型选择“不信谣不传谣”)。
      • 计算残差(意外幅度):实际AMD价格 - 预测AMD价格 = $450 - (0.5 \times 800) = 50$ 美元。
      • 更新对冲比率:$\beta_{new} = 0.5 + 0.0098 \times 50 = 0.5 + 0.49 = 0.99$。
    • 实战优势:如果用静态20天窗口,$\beta$ 会突然从0.5跳变到1.0,导致巨量换手;而卡尔曼滤波通过 $K_t$ 的调节,将其平滑过渡到了0.99,完美解决了参数漂移引发的实盘冲击成本问题。

三、 仓位管理与波动率自适应

标准线性Z-Score策略(仓位 = $-k \times Z$)假设方差恒定。实盘中必须引入布林带(动态标准差),并深刻理解“加仓”在动态系统中的双刃剑效应。

  • 布林带与被动加仓的数值推演
    假设我们交易一个股指期货价差组合,历史均值 = 0点。
    • 初始建仓(T1):过去20天标准差 $\sigma = 10$ 点。价差突然扩大到 $+20$ 点。
      • 静态Z-Score = $(20-0)/10 = 2.0$。触发做空信号,建立空头底仓。
    • 极端行情演化(T2):价差继续单边发散,涨到了 $+30$ 点。此时实盘波动率剧增,布林带带宽被撑大,最近10天的实际标准差变成了 $\sigma = 15$ 点
    • 策略分化
      • 静态模型的灾难:如果死板使用历史 $\sigma=10$,此时的 $Z = 30/10 = 3.0$。模型认为“偏离更大了,更值得做空”,从而盲目加仓。这往往是实盘爆仓的元凶(逆势死扛)。
      • 布林带模型的自救:使用动态 $\sigma=15$,此时 $Z = 30/15 = 2.0$。Z-Score并没有进一步放大,模型拒绝加仓,甚至如果均值发生微小漂移,还会发出减仓信号。
    • 何为“被动加仓的有效性”?
      在上述T2场景中,如果交易员采用网格交易法(不依赖Z-Score,而是设定每上涨5点手动加仓一次)。当价格从20涨到30时,交易员“被动”地在25和30加了空单。
      • 为何回测中无效? 回测假设波动率恒定,一次性在20点做空是最优的,后续加仓增加了手续费且拉低了平均收益。
      • 为何实盘中有效? 因为实盘的波动率和概率分布实时变化。如果在30点被动加仓后,价差真的从30点回归到0点,这种分批建仓法有效降低了整体持仓的平均成本(从20点降至了25点左右),提高了安全垫。
      • 致命前提:这种“被动加仓”必须配合严格的止损线(例如价差突破40点无条件全部平仓)。因为如果价差从30点涨到100点,网格加仓会让你在错误方向上越陷越深。

四、 数据误差对均值回归的致命影响

数据质量是均值回归策略的生死线,其对数据的敏感度远高于动量策略。

  1. 均值回归 vs. 动量:对误差的容忍度
    • 动量策略:只关心价格的方向(今天涨还是跌),对绝对数值的误差不敏感。即使某个价格点被错误记录,只要趋势方向对,策略依然有效。
    • 均值回归策略:极其依赖价格的绝对水平(当前价格偏离均值有多远)。
  2. 误差的“膨胀效应”数值案例
    • 案例:某股票因除权除息,价格在一天内从 100元 真实下跌到 90元。但你的数据供应商漏掉了这笔分红,未做后复权处理。
    • 后果
      • 动量策略:看到一根-10%的大阴线,视为一次普通的下跌趋势,可能不做交易或顺势做空,影响有限。
      • 均值回归策略:假设该股与另一只平稳股票的价差历史均值为 5元,标准差为 2元。由于未复权,价差瞬间变成了 $-5$ 元。Z-Score计算为 $(-5 - 5) / 2 = -5.0$。策略会认为出现了“千年一遇”的极度低估,触发满仓逆势做多信号,最终造成灾难性亏损。
    • 实战铁律:在运行基于价差的均值回归策略前,必须对输入数据进行极其严格的异常值剔除(如MAD法)复权处理。即使是非常微小的数据误差(如几分钱的偏差),在高频或高杠杆的价差交易中也会被急剧放大。

Ernie Chan《算法交易:制胜策略与原理》第二章读书笔记。

第二章:均值回归与平稳性

一、 核心概念与统计检验

  1. 均值回归
    • 定义:价格的变化与“平均价格”和“当前价格”之差成正比。即跌多了会涨,涨多了会跌。
    • 公式:$dY(t) = \lambda (Y_{mean} - Y(t-1)) dt + dW$ (其中 $\lambda$ 为回归速度,$dW$ 为随机噪声)
  2. 平稳性
    • 定义:价格序列的统计特性(均值、方差)不随时间漂移。价格离散的速率小于几何随机游走的速率。
  3. ADF检验
    • 目的:测试单只股票/资产是否具备均值回归特性。
    • 实战阈值:计算出的ADF统计量需小于临界值(如1%显著性水平下的-3.43),或 P值 < 0.05,才认为序列具备均值回归性。注:单只股票极少通过ADF检验,通常呈现随机游走。
  4. 赫斯特指数与方差比率检验
    • 目的:测试平稳性及长期记忆性。
    • 实战阈值:赫斯特指数 $H$。
      • $H = 0.5$:纯随机游走。
      • $H < 0.5$:具备均值回归性(越小越强,实战中寻找 $H$ 在 0.3 - 0.45 之间的标的)。
      • $H > 0.5$:具备动量/趋势延续性。

二、 均值回归的实战指标

  1. 半衰期
    • 定义:测定价格向其均值回归的速度有多快(即偏离均值后,回归一半所需的时间)。
    • 实战意义与阈值:半衰期决定了持仓周期。实战中,半衰期通常应在 1 到 50 个交易日之间。若半衰期 < 1,回归太快,多为噪音,交易成本吞噬利润;若半衰期 > 50,回归太慢,资金占用成本过高。
  2. 线性交易策略(Z-Score策略)
    • 定义:投资组合的仓位份数与其Z分数的负值成正比。
    • 公式:$Z = \frac{Price - SMA(Price)}{Std(Price)}$
    • 实战阈值:当 $Z > +2$ 时做空(高估),当 $Z < -2$ 时做多(低估),当 $Z$ 回归至 0 附近平仓。

三、 协整:多资产的均值回归

  1. 协整
    • 定义:两只(或多只)非平稳的价格序列(如股票A和股票B各自随机游走),如果它们的某种线性组合是平稳的,则称它们协整。这意味着尽管各自价格发散,但它们之间的“价差”会均值回归。
  2. 检验方法
    • CADF检验:用于测试两个序列的协整性。
    • 约翰森检验:用于测试三个及以上序列的协整性。
  3. 实战应用:特征向量与对冲比例
    • 原理解析:约翰森检验生成的特征向量,即为资产间的对冲比例。将各资产价格乘以对应的特征向量权重,即可合成一条平稳的“价差序列”。
    • 实战阈值:约翰森检验会输出多个特征值和特征向量。应选择最大特征值对应的特征向量,因为最大特征值对应最平稳的组合和最短的半衰期,最适合用于套利交易。

Ernie Chan《算法交易:制胜策略与原理》第一章读书笔记。

第一章:回测系统的陷阱与统计学应用

一、 回测的核心目的与常见缺陷

回测系统的终极目标是预测未来交易策略的绩效,但过程中潜藏的诸多陷阱会严重削弱其预测能力。常见的缺陷及实战清除策略如下:

  1. 前视偏差
    • 原理:使用了回测当时根本无法获取的未来数据。
    • 实战修复:回测生成信号与执行交易的代码逻辑必须完全一致。通常采用“T日收盘生成信号,T+1日开盘执行交易”的严格时序。
  2. 数据探测偏差
    • 原理:在大量历史数据中反复测试不同参数,碰巧找到一段表现极佳的参数组合(过度拟合)。
    • 实战修复
      • 样本外测试(OOS)与交叉验证:将数据分为训练集(如2010-2018)和测试集(如2019-2023),仅在训练集调参。
      • 模型简化原则:参数越少越好,拒绝过度复杂的拟合曲线。
      • Deflated Sharpe Ratio( deflate 夏普比率):根据尝试的参数组合数量对夏普比率进行惩罚。
  3. 数据质量缺陷(生存者偏差与公司行动)
    • 案例:“为什么2021年7月9日会生成做空THQI的信号?哦,因为忘了按1:10的比例调整历史复权价格。”
    • 实战修复:必须使用后复权价格计算收益率;必须在回测引擎中引入退市、并购、ST特别处理等状态标记,剔除当前已退市的股票会导致回测收益虚高(生存者偏差)。
  4. 流动性约束与微观结构缺陷
    • 案例:“回测用收盘价效果很好,但实盘用真实市场数据却大幅缩水。”
    • 实战修复:回测必须考虑滑点交易佣金。对于容量有限的策略(如小盘股),需设置单笔交易量不超过该标的日均成交量的X%(如5%)的阈值限制。
  5. 制度性与规则性限制
    • 案例:“模型在2008年11月做空很多股票表现很好,但当时美国SEC禁止裸卖空。”或“高频交易忽视了涨跌停板限制。”
    • 实战修复:回测引擎必须内置历史交易规则变更(如限制做空名单、涨跌停板限制、T+1制度)。

二、 回测系统的统计学假设检验

仅仅依靠高夏普比率不能证明策略有效,必须通过统计学假设检验(零假设:策略收益率为0)。

  1. 夏普比率的T检验
    • 公式:$T = \frac{Mean(R)}{Std(R)} \times \sqrt{N}$ (其中N为交易次数/样本数)
    • 实战阈值:通常要求 $T > 2$(对应95%置信水平),即策略的收益并非随机产生。但若收益率序列存在自相关,需使用Newey-West调整后的标准差,否则会高估夏普比率。
  2. 蒙特卡洛模拟与P值检验
    • 场景:策略年化收益10%,如何证明这不是碰运气?
    • 方法一(随机入场法):保持交易次数和持仓时间不变,但随机改变入场时间,生成10,000次模拟。如果其中只有100次模拟的年化收益大于10%,则P值 = 100/10000 = 1%。
    • 方法二(价格序列重采样法):对历史价格进行打乱重排,运行策略10,000次。
    • 实战判断P值必须 < 0.05(甚至<0.01),才能拒绝零假设,证明策略具备真正的Alpha。

Data Wrangler Extension for Visual Studio Code

Data Wrangler is a data viewing and cleaning tool that is integrated into VS Code and VS Code Jupyter Notebooks. It provides a rich user interface to view and analyze your data, show insightful column statistics and visualizations, and can automatically generate Pandas code as you clean and transform the data if that’s your goal.

  1. Viewing mode: The viewing mode optimizes the interface for you to quickly view, filter and sort your data. This mode is great for doing initial exploration on the dataset.
  2. Editing mode: The Editing mode optimizes the interface for you to apply transformations, cleaning, or modifications to your dataset. As you apply these transformations in the interface, Data Wrangler automatically generates the relevant Pandas code, and this can be exported back into your notebook for reuse.