02 - 统计套利与量化策略
02 - 统计套利与量化策略
定位:给有10年金融经验的架构师/PM讲清楚量化策略的科学基础 目标:理解时间序列分析、配对交易、因子模型、回测科学 前提:你知道什么是收益率、标准差、相关系数,但不需要会测度论
一、核心概念与直觉
1.1 什么是统计套利?
无风险套利:同一个东西在两个地方价格不同 → 低买高卖 → 确定赚钱。 例:A交易所BTC=60000,B交易所BTC=60100 → 在A买在B卖 → 赚100。
统计套利:两个相似的东西价格偏离了历史关系 → 赌它们会回归 → 大概率赚钱。 例:可口可乐和百事可乐股价通常同步。如果可口可乐涨了3%而百事没动 → 做空可口可乐做多百事 → 等价差回归。
关键区别:
无风险套利:100%赚钱(理论上),但机会极少且瞬间消失
统计套利:有概率亏钱,但长期大数定律站在你这边
→ 本质是一个"正期望值"的赌局,重复玩足够多次
1.2 Alpha 与 Beta
你的投资收益 = Beta收益 + Alpha收益 + 噪声
Beta收益:
跟着市场涨跌获得的收益
大盘涨10%,你的组合涨12%,其中10%是Beta
任何人都能获得(买指数基金就行)
不值钱
Alpha收益:
超越市场的部分
大盘涨10%,你涨12%,其中2%是Alpha
极难获得且不可持续(EMH的诅咒)
非常值钱
量化策略的核心目标:寻找可重复的Alpha
为什么Alpha很难找到?
- 金融市场的信噪比极低(远低于图像识别、NLP等领域)
- Alpha一旦被发现就会被套利者竞争消灭
- 交易成本会吃掉微小的Alpha
- 过拟合让你以为找到了Alpha实际上没有
1.3 量化策略的本质
量化策略 = 统计信号 + 执行系统 + 风控系统
统计信号:发现价格中可预测的模式
→ 这是"科学"部分
执行系统:把信号转化为实际交易
→ 这是"工程"部分
风控系统:控制亏损在可承受范围内
→ 这是"活下来"的部分
三者缺一不可。信号再好,执行有bug也白搭。
信号和执行都好,没有风控迟早爆仓。
二、时间序列分析基础
2.1 平稳性(Stationarity)
为什么重要?
一个非平稳的时间序列,它的统计特性(均值、方差)会随时间变化。在这样的序列上做预测就像用GPS导航——如果起点在移动,你计算的路线没有意义。
平稳序列:均值和方差不随时间变化
→ 温度在0度附近波动:-2, 1, -1, 3, 0, -3, 2, 1
→ 你可以说"平均温度是0度",这个说法有意义
非平稳序列:均值随时间变化(趋势)
→ 股价:100, 102, 105, 103, 108, 112, 115, 120
→ "平均价格是108"这个说法没什么用
→ 因为明天的价格取决于今天的价格,不是平均价格
直觉类比:
- 平稳序列 = 弹簧上的球:偏离中心后会被拉回来
- 非平稳序列 = 河上的纸船:随水流走,不会回到起点
- 差分后的平稳序列 = 纸船的速度:虽然位置在变,但速度在某个范围波动
ADF检验(Augmented Dickey-Fuller):
目的:检验序列是否平稳(是否有单位根)
零假设 H0:序列有单位根 → 非平稳
备择假设 H1:序列没有单位根 → 平稳
做法:
1. 对序列做回归:ΔY(t) = α + β·Y(t-1) + 滞后项 + ε
2. 检验 β 是否显著为负
3. 如果 β 显著为负 → 拒绝H0 → 序列平稳
p-value 解读:
p < 0.01 → 强烈拒绝H0,序列很可能平稳
p < 0.05 → 拒绝H0,序列可能平稳
p > 0.05 → 不能拒绝H0,序列可能非平稳
实际应用:
股价 → ADF检验 p=0.89 → 非平稳(符合直觉)
股价收益率 → ADF检验 p=0.001 → 平稳(收益率围绕0波动)
配对交易的价差 → 需要检验是否平稳 → 平稳才能做均值回复策略
2.2 自相关与偏自相关
自相关函数(ACF):当前值与过去第k期的相关性
ACF图示例:
相关系数
1.0 |█
0.8 |█ █
0.6 |█ █ █
0.4 |█ █ █ █
0.2 |█ █ █ █ █
0.0 |──█──█──█──█──█──── (虚线=置信区间)
-0.2 |
└─────────────────→ 滞后期(k)
0 1 2 3 4 5
ACF慢慢衰减 → 可能是AR过程
ACF突然截断 → 可能是MA过程
偏自相关函数(PACF):去掉中间期影响后,当前值与第k期的"净"相关性
PACF图示例:
相关系数
1.0 |█
0.5 |█ █
0.0 |──█──█──█──█──█──── (虚线=置信区间)
-0.5 |
└─────────────────→ 滞后期(k)
0 1 2 3 4 5
PACF在第p期截断 → AR(p)模型
实际用法:通过看ACF和PACF图来确定ARIMA模型的阶数。
2.3 ARIMA模型
ARIMA(p, d, q) 是时间序列预测的"瑞士军刀"。
三个组件:
AR(p) — 自回归:
Y(t) = c + φ₁·Y(t-1) + φ₂·Y(t-2) + ... + φₚ·Y(t-p) + ε(t)
直觉:今天的价格 = 过去p天价格的加权平均 + 噪声
例:AR(1) → 今天的价格主要由昨天的价格决定
I(d) — 差分:
对序列做d次差分使其变平稳
一阶差分:ΔY(t) = Y(t) - Y(t-1) = 收益率
大多数金融序列 d=1 就够了
MA(q) — 移动平均:
Y(t) = μ + ε(t) + θ₁·ε(t-1) + θ₂·ε(t-2) + ... + θq·ε(t-q)
直觉:今天的价格受过去q天的"意外冲击"影响
例:MA(1) → 昨天的意外涨跌会影响今天
建模流程(Box-Jenkins方法):
Step 1: 平稳性检验
→ ADF检验
→ 不平稳则差分 (d=1 或 d=2)
Step 2: 模型识别
→ 看ACF → 确定q (MA阶数)
→ 看PACF → 确定p (AR阶数)
Step 3: 参数估计
→ 最大似然估计(MLE)
Step 4: 诊断检验
→ 残差是否为白噪声?(Ljung-Box检验)
→ 如果不是 → 回到Step 2调整
Step 5: 预测
→ 但注意:金融时间序列的ARIMA预测效果通常不好
→ 因为信噪比太低
对架构师的实际意义:ARIMA本身在高频交易中用得不多(太慢、预测力太弱),但它的思想(平稳性、差分、自相关)是所有时间序列分析的基础。你设计的回测系统需要支持这些操作。
2.4 GARCH模型(波动率聚集)
核心现象:金融市场的波动率不是常数,而是"聚集"的。
波动率聚集现象:
日收益率序列:
+0.5%, -0.3%, +0.2%, -0.1%, ← 平静期:波动小
+3.2%, -2.8%, +4.1%, -3.5%, ← 剧烈期:波动大
+2.1%, -1.9%, +0.8%, -0.5%, ← 衰减期:波动逐渐减小
+0.3%, -0.2%, +0.1%, -0.4% ← 恢复平静
直觉:大波动后面跟大波动,小波动后面跟小波动
像地震的余震:主震后会有一系列小余震
GARCH(1,1)模型:
收益率:r(t) = μ + ε(t),其中 ε(t) = σ(t)·z(t),z(t)~N(0,1)
波动率方程:
σ²(t) = ω + α·ε²(t-1) + β·σ²(t-1)
ω:基准波动率水平(长期平均)
α:昨天的冲击对今天波动率的影响(ARCH项)
β:昨天的波动率对今天波动率的影响(GARCH项)
α + β < 1:波动率会回归长期均值(稳定)
α + β 接近 1:波动率持续性很强(高波动会持续很久)
典型参数值(美股日数据):
ω = 0.00001
α = 0.08 ← 昨天的冲击影响8%
β = 0.91 ← 昨天的波动率影响91%
α+β = 0.99 ← 接近1,说明波动率持续性很强
实际应用:
1. 动态VaR计算:
传统VaR用固定波动率 → 低估风险
GARCH VaR用时变波动率 → 波动大时自动放大VaR
2. 期权定价:
BS公式假设波动率恒定 → 现实中波动率在变
GARCH提供时变波动率 → 期权定价更准确
3. 风控系统设计:
波动率突增 → 自动调小仓位/调宽止损
波动率平静 → 可以适当加大仓位
三、配对交易(Pairs Trading)
3.1 核心思想
找两个"注定在一起"的资产:
→ 它们可能是同行业的竞争对手(可口可乐 vs 百事)
→ 它们可能是同一资产的不同形态(原油 vs 原油ETF)
→ 它们可能有经济逻辑上的联系(黄金 vs 金矿股)
当它们的价差偏离历史均值时:
→ 做空涨得多的 + 做多涨得少的
→ 等价差回归均值后平仓
→ 赚取价差回归的利润
为什么有效? 因为两个相关资产的价差偏离通常是临时性的(噪声或短期事件),长期会被市场力量拉回来。
3.2 相关性 ≠ 协整(经典误区)
这是量化交易中最常见的误区之一。
相关性(Correlation):
两个序列的变化方向一致
例:可口可乐涨1%,百事也涨1%
→ 相关系数高(比如0.85)
协整(Cointegration):
两个序列的线性组合是平稳的
例:可口可乐价格 - 1.2 × 百事价格 = 在某个均值附近波动
→ 价差是平稳的,会回归均值
区别:
两个都涨的序列可以高度相关但不协整
例:A股票从10涨到100,B股票从10涨到200
→ 相关系数 ≈ 0.99(都在涨)
→ 但 A - 0.5B 并不平稳(价差越来越大)
→ 做配对交易会亏死
只有协整的配对才适合做配对交易!
3.3 协整检验:Engle-Granger两步法
Step 1:对两个价格序列做回归
Price_A(t) = α + β · Price_B(t) + ε(t)
得到残差 ε(t) = Price_A(t) - α - β · Price_B(t)
直觉:ε(t)就是两个资产的"价差"(经过β调整后)
Step 2:对残差做ADF检验
如果残差是平稳的 → 两个序列协整 → 可以做配对交易
如果残差不平稳 → 不协整 → 不能做配对交易
示例(Python伪代码):
from statsmodels.tsa.stattools import coint
# 直接检验两个序列是否协整
score, p_value, _ = coint(price_A, price_B)
if p_value < 0.05:
print("协整!可以做配对交易")
else:
print("不协整,放弃")
Johansen检验:当你想同时检验多个序列(3个以上)的协整关系时使用。Engle-Granger只能检验两个序列。
3.4 交易策略
构建价差序列:
Spread(t) = Price_A(t) - β · Price_B(t)
其中 β 来自协整回归
标准化为Z-Score:
Z(t) = (Spread(t) - Mean) / Std
其中 Mean 和 Std 使用滚动窗口计算(例如60天)
交易信号:
Z > +2.0 → 开仓:做空A,做多B(价差太大,赌它回归)
Z < -2.0 → 开仓:做多A,做空B(价差太小,赌它回归)
|Z| < 0.5 → 平仓:价差回归到均值附近,获利了结
|Z| > 3.0 → 止损:模型可能失效了,赶紧跑
图示:
Z-Score
+3.0 |─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ 止损线
|
+2.0 |───────────────────────────── 开仓线(做空价差)
| ╱╲ ╱╲
+0.5 |────────╱──╲──────╱──╲─────── 平仓线
0.0 |───╱──╱────╲────╱────╲──╱─── 均值
-0.5 |──╱────────╲──╱──────╲╱───── 平仓线
| ╱ ╲╱
-2.0 |───────────────────────────── 开仓线(做多价差)
|
-3.0 |─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ 止损线
└────────────────────────────→ 时间
3.5 半衰期(Half-life)
为什么重要? 半衰期告诉你价差回归均值需要多长时间,直接决定了策略是否可行。
OU过程(Ornstein-Uhlenbeck):
dS = θ·(μ - S)·dt + σ·dW
θ = 均值回复速度
μ = 长期均值
σ = 波动率
半衰期 = ln(2) / θ
含义:
半衰期 = 5天 → 价差偏离后,大约5天回归一半
半衰期 = 30天 → 价差偏离后,大约30天回归一半
半衰期 = 200天 → 太慢了,不实用
实际经验:
半衰期 < 5天 → 太短,交易成本吃掉利润
半衰期 5-30天 → 最佳区间
半衰期 30-60天 → 可以做,但资金占用高
半衰期 > 60天 → 不建议做,周期太长风险太大
Python估算半衰期:
import numpy as np
from statsmodels.regression.linear_model import OLS
spread = ... # 价差序列
spread_lag = spread.shift(1)
delta_spread = spread - spread_lag
# 回归:ΔSpread = α + θ·Spread(-1)
model = OLS(delta_spread.dropna(), spread_lag.dropna()).fit()
theta = -model.params[0] # 注意负号
half_life = np.log(2) / theta
print(f"半衰期:{half_life:.1f} 天")
3.6 配对交易的风险
| 风险 | 描述 | 应对 |
|---|---|---|
| 协整断裂 | 两个资产的长期关系改变了 | 定期重新检验协整、设止损 |
| 均值漂移 | 价差的均值本身在变化 | 使用滚动窗口计算均值 |
| 执行风险 | 一条腿成交了另一条腿没有 | 限价单 + 滑点容忍 |
| 融资成本 | 做空需要借券成本 | 纳入成本计算 |
| 流动性风险 | 某只股票突然流动性枯竭 | 选择流动性好的标的 |
| 黑天鹅 | 某只股票退市/被收购 | 分散多个配对 |
真实案例: 2007年8月的"量化地震"——大量配对交易策略同时止损,导致价差进一步扩大,引发更多止损,形成负反馈循环。多家量化基金单周亏损超过20%。教训:策略拥挤本身是一个巨大的系统性风险。
四、因子模型
4.1 从CAPM到多因子
CAPM (1960s):
R = Rf + β · (Rm - Rf)
股票收益 = 无风险利率 + β × 市场风险溢价
只有一个因子:市场风险
→ 太简单,现实中很多异象解释不了
Fama-French三因子 (1993):
R = Rf + β₁·(Rm-Rf) + β₂·SMB + β₃·HML
新增两个因子:
SMB (Small Minus Big):小盘股跑赢大盘股的超额收益
HML (High Minus Low):高B/P跑赢低B/P的超额收益
→ 能解释更多的收益差异
Fama-French五因子 (2015):
R = Rf + β₁·(Rm-Rf) + β₂·SMB + β₃·HML + β₄·RMW + β₅·CMA
又新增两个:
RMW (Robust Minus Weak):高盈利跑赢低盈利
CMA (Conservative Minus Aggressive):低投资跑赢高投资
直觉理解:
因子 = 系统性的收益来源
市场因子:你承担了市场涨跌的风险 → 获得风险补偿
规模因子:小公司风险更高 → 历史上获得了额外回报
价值因子:低估值公司风险更高 → 历史上获得了额外回报
盈利因子:高盈利公司更稳定 → 获得质量溢价
投资因子:保守投资的公司更稳健 → 获得低风险溢价
Alpha = 用因子模型解释不了的部分
= 你的"真本事"
4.2 常用Alpha因子
| 因子类别 | 因子名 | 逻辑 | 衰减速度 |
|---|---|---|---|
| 动量 | 12个月动量 | 过去赢家继续赢(行为偏差) | 慢 |
| 反转 | 短期反转(5天) | 过度反应后回调 | 快 |
| 波动率 | 低波动率 | 低波动股票风险调整后收益更高 | 慢 |
| 流动性 | 非流动性溢价 | 不流动的股票给更高回报 | 慢 |
| 质量 | ROE/毛利率 | 高质量公司长期表现好 | 慢 |
| 情绪 | 新闻情绪 | NLP分析新闻/社交媒体 | 快 |
| 资金流 | 机构买入 | 聪明钱的方向 | 中 |
4.3 因子评价指标
IC (Information Coefficient):
= 因子值与未来收益的相关系数
IC = Corr(Factor, Future_Return)
|IC| > 0.05 → 有一定预测力
|IC| > 0.10 → 很好的因子
|IC| > 0.15 → 非常强的因子(很罕见)
IR (Information Ratio):
= IC的均值 / IC的标准差
= Mean(IC) / Std(IC)
IR > 0.5 → 可用的因子
IR > 1.0 → 优秀的因子
直觉:
IC衡量"一次预测有多准"
IR衡量"预测的稳定性"
→ 你宁愿要一个IC=0.03但IR=1.0的因子
也不要一个IC=0.10但IR=0.3的因子
→ 因为稳定性比单次准确度更重要
4.4 因子衰减
Alpha因子的生命周期:
发现期 繁荣期 衰减期 消亡期
────→───→──────→──────→───────→──────→──────→
学术论文 基金采用 拥挤 Alpha=0
发现异象 赚钱 竞争加剧 成为Beta
收益下降
例:
动量因子:1990s发现 → 2000s大量采用 → 2010s衰减
低波动率:2000s发现 → 2010s被ETF产品化 → 溢价缩小
教训:
没有永恒的Alpha
找到Alpha → 验证 → 执行 → 赚一段时间 → 然后找下一个
这就是量化交易的本质:永远在寻找新的信号
五、回测科学(避坑指南)
这一节可能是整篇笔记中最重要的部分。回测做不好,前面所有的模型都是空中楼阁。
5.1 常见陷阱
陷阱1:过拟合(Overfitting)
你有100个参数的策略,在历史数据上完美拟合。
→ 样本内Sharpe = 5.0 (太好了!)
→ 样本外Sharpe = -0.5 (亏钱了!)
原因:策略不是在学规律,而是在记忆噪声。
类比:
一个学生把所有考试题的答案都背下来了
→ 做原题得满分
→ 换一套新题就不会了
→ 这不叫"学会了",这叫"背答案"
如何识别:
→ 参数太多相对于数据量
→ 样本内和样本外表现差距巨大
→ 策略对参数微调非常敏感(参数改1%收益变50%)
陷阱2:前视偏差(Look-ahead Bias)
你用了"未来才知道"的信息来做决策。
错误示例:
→ 用当天收盘价决定当天是否交易(你在收盘前不知道收盘价)
→ 用年报数据在发布日之前就纳入模型(年报还没公布呢)
→ 用调整后的价格回测(拆股调整是事后才做的)
更隐蔽的前视偏差:
→ 选择表现最好的参数组合 → 你怎么知道哪个最好?因为你看了未来
→ 只选择了存活的股票 → 你怎么知道哪些股票退市了?因为你看了未来
陷阱3:存活偏差(Survivorship Bias)
你的股票池只包含"现在还在"的股票。
问题:
→ 2010年你的宇宙有500只股票
→ 其中50只在2015年退市了(通常是因为业绩差/破产)
→ 你用2025年的股票列表回测2010年
→ 自动排除了那50只表现差的股票
→ 策略看起来比实际好
影响:
美国股市:存活偏差每年大约高估1-2%的收益率
→ 你以为年化15%的策略实际上可能只有13%
陷阱4:数据窥探(Data Snooping)
你尝试了1000种策略组合,其中50种"显著"盈利。
问题:
→ 1000次尝试,5%显著性水平
→ 预期有 1000 × 5% = 50 种"看起来显著"
→ 但这50种可能全是假的!(多重检验问题)
类比:
→ 你扔100次硬币,发现第37-42次连续出正面
→ "哇,从第37次开始买入的策略太好了!"
→ 这不是策略,这是随机
对策:
→ Bonferroni校正:显著性水平 / 尝试次数
→ 但这太保守,实际中用更温和的方法
5.2 科学的回测方法
Walk-Forward Analysis(滚动窗口验证)
传统回测:
训练集(5年)──────── → 测试集(1年)
↑ 用这个训练 ↑ 用这个测试
Walk-Forward:
┌──训练──┐┌测试┐
│Year1-3 ││ Y4 │ → 记录Y4表现
└────────┘└────┘
┌──训练──┐┌测试┐
│Year2-4 ││ Y5 │ → 记录Y5表现
└────────┘└────┘
┌──训练──┐┌测试┐
│Year3-5 ││ Y6 │ → 记录Y6表现
└────────┘└────┘
最终表现 = Y4 + Y5 + Y6 的汇总
→ 每次都是用"过去"训练、"未来"测试
→ 模拟真实的策略运行方式
蒙特卡洛置换检验
目的:检验策略收益是否真的来自信号,而不是随机
方法:
1. 打乱信号的时间顺序(保留其他不变)
2. 用打乱后的信号重新运行策略
3. 重复1000次
4. 看原始策略的收益在1000个随机收益中排第几
如果原始策略排在前5% → 策略显著
如果原始策略排在中间 → 策略不显著(你的"信号"其实是噪声)
多资产/多时期外样本验证
空间维度:
策略在美股有效 → 检验在欧洲/亚洲是否也有效
如果也有效 → 更可能是真信号
时间维度:
策略在2010-2020有效 → 检验在2000-2010是否也有效
如果也有效 → 更可能是真信号
如果一个策略只在某个特定市场的特定时期有效
→ 大概率是过拟合
5.3 关键评价指标
Sharpe Ratio:
SR = (Return - Rf) / Std(Return)
SR < 0.5 → 不值得交易
SR 0.5-1 → 一般
SR 1-2 → 好
SR 2-3 → 非常好
SR > 3 → 你很可能有bug或数据问题
注意:Sharpe Ratio的统计检验
→ SR=1.0,你需要至少4年的数据才能在5%水平上显著
→ SR=0.5,你需要至少16年的数据
→ 这就是为什么短期回测的高SR不可信
Maximum Drawdown(最大回撤):
从峰值到谷底的最大跌幅
→ 告诉你最坏情况下会亏多少
→ 基金投资人最关心的指标
Calmar Ratio:
= Annual Return / Max Drawdown
→ 衡量"每承受1%的最大风险能获得多少年化收益"
→ Calmar > 1 是好策略的基本要求
换手率(Turnover):
→ 策略每天换多少仓位
→ 高换手 = 高交易成本
→ 很多回测很好的策略一旦考虑交易成本就不赚钱了
容量(Capacity):
→ 策略能承载多少资金
→ 很多高Sharpe的策略容量只有几百万美元
→ 资金量翻倍 → 市场冲击翻倍 → 收益大幅下降
六、工程落地要点
6.1 回测系统架构
两种主流架构:
事件驱动(Event-Driven):
┌─────────┐ ┌──────┐ ┌──────┐ ┌──────┐
│数据源 │──→│策略 │──→│执行 │──→│组合 │
│(每个tick)│ │(信号) │ │(订单) │ │(持仓) │
└─────────┘ └──────┘ └──────┘ └──────┘
优点:更接近实盘逻辑,容易切换到实盘
缺点:慢(Python每个tick都要处理)
向量化(Vectorized):
┌───────────────────┐
│ 全部数据加载到矩阵 │
│ 信号 = f(价格矩阵) │ ← NumPy/Pandas一次性计算
│ 收益 = 信号 × 收益率 │
└───────────────────┘
优点:快(利用NumPy向量化,比事件驱动快100倍)
缺点:难以模拟复杂的执行逻辑(滑点、部分成交等)
实际方案:
研究阶段 → 向量化(快速迭代)
验证阶段 → 事件驱动(精确模拟)
实盘阶段 → C++/Rust重写(性能)
6.2 策略研发平台设计
核心组件:
┌─────────────────────────────────────┐
│ 策略研发平台 │
├──────────┬──────────┬───────────────┤
│ 数据管理 │ 策略框架 │ 分析工具 │
│ │ │ │
│ 行情存储 │ 回测引擎 │ 绩效分析 │
│ 因子库 │ 参数优化 │ 风险归因 │
│ 事件库 │ 信号生成 │ 可视化 │
│ 基本面 │ 组合构建 │ 报告生成 │
└──────────┴──────────┴───────────────┘
技术选型:
数据存储:时序数据库(InfluxDB/QuestDB) + 列存(Parquet)
计算框架:Python(研究) + C++/Rust(实盘)
因子计算:NumPy/Pandas + 增量计算引擎
可视化:Plotly/Dash
6.3 从研究到实盘
研究环境 实盘环境
────────── ──────────
Python C++/Rust/Java
分钟级延迟可接受 微秒级延迟
历史数据 实时数据流
完美执行假设 真实滑点/部分成交
无风控约束 严格风控
单机运行 分布式/高可用
最大的坑:研究和实盘的差距
→ 研究中假设的"完美执行"在实盘中不存在
→ 策略在研究中年化20%,实盘可能只有8%
→ 差距来自:交易成本、滑点、延迟、部分成交
七、常见误区
误区1:"历史回测好 = 未来一定赚"
过拟合是最大的敌人。一个在历史数据上Sharpe=3.0的策略,很可能只是对历史噪声的完美记忆。越是复杂的策略、越多的参数、越高的历史表现,越需要警惕。
经验法则:如果你的策略在回测中表现"好得难以置信",那它很可能确实不可信。
误区2:"Sharpe 3.0的策略太好了"
在你相信一个SR=3.0的策略之前,先检查:
- 数据期间够长吗?(至少3-5年)
- 交易成本算了吗?(包括滑点和冲击)
- 有前视偏差吗?(你是不是偷看了未来?)
- 试了多少个策略?(有没有数据窥探?)
- 策略容量多大?(能放多少钱?)
大多数宣称SR>2的公开策略,在上述调整后会降到1以下。
误区3:"机器学习一定比传统方法好"
金融时间序列有一个根本问题:信噪比极低。
图像识别:信噪比高
→ 猫就是猫,特征明显
→ 深度学习效果远超传统方法
金融预测:信噪比极低
→ 收益率中99%是噪声,1%是信号
→ 复杂模型更容易过拟合噪声
→ 简单的线性模型可能比神经网络更好
正确姿势:
→ 先用简单模型建立基线
→ ML用于特征工程(构造因子)而非直接预测
→ 严格的外样本验证
→ 控制模型复杂度
八、DeFi中的统计套利
8.1 跨DEX套利
传统配对交易 → DeFi版本
同一个Token在不同DEX价格不同:
Uniswap V3:ETH = $3000.50
SushiSwap: ETH = $3001.20
→ 在Uniswap买,在Sushi卖,赚$0.70(减去Gas费)
→ 这更接近无风险套利而非统计套利
更像统计套利的DeFi策略:
→ 两个相关Token的价差交易(如stETH vs ETH)
→ 跨链同一Token的价差
→ LP位置的动态调整
8.2 DeFi的特殊挑战
传统市场的优势 DeFi不具备的
────────────── ──────────────
亚毫秒执行 12秒区块时间
订单可以取消 链上交易不可逆
私密交易 所有交易公开(被MEV前跑)
稳定的费率 Gas费波动剧烈
九、延伸阅读
必读书籍
-
《Advances in Financial Machine Learning》 — Marcos Lopez de Prado
- 量化策略的"现代圣经"
- 重点章节:回测过拟合、特征重要性、元标签
- 适合有编程基础的读者
-
《Algorithmic Trading》 — Ernest Chan
- 实战导向,代码丰富(Python/MATLAB)
- 配对交易、均值回复、动量策略
-
《Quantitative Trading》 — Ernest Chan
- 入门级,适合非量化背景的读者
- 从开户到策略上线的完整流程
经典论文
-
Fama & French (1993) — "Common Risk Factors in the Returns on Stocks and Bonds"
- 三因子模型的原始论文
-
Engle & Granger (1987) — "Co-Integration and Error Correction"
- 协整检验方法,诺贝尔奖论文
-
Lopez de Prado (2018) — "The 10 Reasons Most Machine Learning Funds Fail"
- 机器学习在金融中失败的原因
在线资源
- QuantConnect / Zipline — 开源回测框架
- Quantopian Lecture Series — YouTube免费课程
- AQR Research Papers — 因子投资的前沿研究
十、本章小结
| 概念 | 一句话总结 |
|---|---|
| 统计套利 | 用统计方法寻找可重复的价格偏离,赚大数定律的钱 |
| 平稳性 | 时间序列分析的前提,非平稳序列的预测没有意义 |
| 协整 | 配对交易的基础,不是相关性!价差平稳才能做 |
| 半衰期 | 价差回归速度,5-30天最适合配对交易 |
| 因子模型 | 收益的系统性来源,Alpha=因子解释不了的超额收益 |
| 过拟合 | 量化策略的头号杀手,复杂模型更容易中招 |
| 数据窥探 | 试太多策略总有看起来好的,但可能全是假阳性 |
| Walk-Forward | 科学的回测方法,模拟真实的策略运行方式 |
对架构师的核心启示:
- 回测系统需要支持事件驱动和向量化两种模式
- 因子库是量化平台的核心资产,要设计好因子的计算、存储、版本管理
- 研究到实盘的鸿沟是最大的工程挑战——需要严格的一致性保证
- 策略评估不能只看收益,要看统计显著性——这决定了评估模块的设计
- DeFi的统计套利面临独特的约束(区块时间、MEV、Gas费),需要专门的架构适配