4.3 方差分析(ANOVA)
方差分析(Analysis of Variance, ANOVA)用于比较三个及以上总体的均值是否相等。核心思想是将总变异分解为组间变异(由处理因素引起)和组内变异(由随机误差引起)。
一、基本概念
1.1 为什么不用两两 t 检验?
比较 个策略的均值,如果两两做 t 检验需要 次。随着 增大,多重比较的累积 Type I 错误率急剧上升。ANOVA 通过一次 F 检验解决这个问题。
1.2 模型设定
- :第 组的第 个观测值
- :总体均值
- :第 组的效应
- :随机误差
假设: vs
二、方差分解
2.1 平方和分解
总平方和 SST = 组间平方和 SSA + 组内平方和 SSE:
| 来源 | 平方和公式 | 自由度 | 均方 |
|---|---|---|---|
| 组间(处理) | |||
| 组内(误差) | |||
| 总和 | — |
2.2 F 统计量
若 ,拒绝 ,至少有一组均值与其他组显著不同。
三、手算示例:比较三种交易策略
某量化团队开发了三种日内交易策略(A、B、C),记录了各自 10 天的收益率(%):
原始数据
| 天数 | 策略 A | 策略 B | 策略 C |
|---|---|---|---|
| 1 | 2.3 | 1.2 | 0.8 |
| 2 | 1.8 | 1.5 | 1.0 |
| 3 | 2.0 | 0.9 | 0.6 |
| 4 | 2.5 | 1.8 | 1.2 |
| 5 | 1.5 | 1.0 | 0.5 |
| 6 | 2.2 | 1.3 | 0.9 |
| 7 | 1.9 | 1.1 | 0.7 |
| 8 | 2.1 | 1.4 | 1.1 |
| 9 | 1.7 | 0.8 | 0.4 |
| 10 | 2.4 | 1.6 | 1.0 |
第一步:计算各组均值
| 策略 | 总和 | 均值 | |
|---|---|---|---|
| A | |||
| B | |||
| C |
总均值
第二步:计算 SSA(组间平方和)
第三步:计算 SSE(组内平方和)
| 1 | 2.3 | 0.0676 | 1.2 | 0.0036 | 0.8 | 0.0004 |
| 2 | 1.8 | 0.0576 | 1.5 | 0.0576 | 1.0 | 0.0324 |
| 3 | 2.0 | 0.0016 | 0.9 | 0.1296 | 0.6 | 0.0484 |
| 4 | 2.5 | 0.2116 | 1.8 | 0.2916 | 1.2 | 0.1444 |
| 5 | 1.5 | 0.2916 | 1.0 | 0.0676 | 0.5 | 0.1024 |
| 6 | 2.2 | 0.0256 | 1.3 | 0.0016 | 0.9 | 0.0064 |
| 7 | 1.9 | 0.0196 | 1.1 | 0.0256 | 0.7 | 0.0144 |
| 8 | 2.1 | 0.0036 | 1.4 | 0.0196 | 1.1 | 0.0784 |
| 9 | 1.7 | 0.1156 | 0.8 | 0.2116 | 0.4 | 0.1764 |
| 10 | 2.4 | 0.1296 | 1.6 | 0.1156 | 1.0 | 0.0324 |
第四步:构建 ANOVA 表
| 来源 | SS | df | MS | 临界值 | |
|---|---|---|---|---|---|
| 组间(策略) | |||||
| 组内(误差) | — | — | |||
| 总和 | — | — | — |
第五步:结论
,,拒绝 。三种策略的收益率均值存在显著差异。
四、事后检验(Post-hoc Analysis)
ANOVA 只能告诉你有差异,但不能告诉你哪几组有差异。常用事后检验:
| 方法 | 特点 |
|---|---|
| Tukey HSD(Honest Significant Difference,诚实显著差异) | 控制所有两两比较的 FWER(Family-Wise Error Rate,族系错误率) |
| Bonferroni | 最保守, |
| Scheffé | 适用于所有线性组合比较 |
Tukey HSD 对本例的计算:
| 比较 | 均值差 | HSD 临界值 | 显著? |
|---|---|---|---|
| A vs B | ✅ | ||
| A vs C | ✅ | ||
| B vs C | ✅ |
三者两两之间均显著不同,策略 A 最优。
Quant Link:策略选择
ANOVA 在量化中的应用:
- 策略分组比较:不同参数配置下的策略表现是否存在显著差异
- 因子分组检验:按因子分位数分组(如 5 组),检验各组的未来收益均值是否相等
- 市场状态分析:不同市场环境(牛市/熊市/震荡市)下策略表现比较
- 多因子排序:多个备选因子,ANOVA 筛选哪些因子在 top/minus/bottom 组间有显著区分度
注意事项:
- ANOVA 要求方差齐性(各组方差相近)——可用 Levene 检验验证
- 若方差差异大,使用 Welch's ANOVA 替代
- 策略数量较多时,需控制多重比较的误差累积
Python 验证
python
import numpy as np
from scipy import stats
import statsmodels.api as sm
from statsmodels.formula.api import ols
# 数据
A = np.array([2.3, 1.8, 2.0, 2.5, 1.5, 2.2, 1.9, 2.1, 1.7, 2.4])
B = np.array([1.2, 1.5, 0.9, 1.8, 1.0, 1.3, 1.1, 1.4, 0.8, 1.6])
C = np.array([0.8, 1.0, 0.6, 1.2, 0.5, 0.9, 0.7, 1.1, 0.4, 1.0])
# 单因素 ANOVA
f_stat, p_val = stats.f_oneway(A, B, C)
print(f"F 统计量 = {f_stat:.4f}, p-value = {p_val:.6f}")
print(f"结论: {'策略间有显著差异' if p_val < 0.05 else '策略间无显著差异'}")
# 事后 Tukey HSD
from statsmodels.stats.multicomp import pairwise_tukeyhsd
import pandas as pd
all_returns = np.concatenate([A, B, C])
groups = ['A']*10 + ['B']*10 + ['C']*10
tukey = pairwise_tukeyhsd(all_returns, groups, alpha=0.05)
print(tukey)小结
| 概念 | 含义 | 在策略比较中的作用 |
|---|---|---|
| SSA | 组间变异(策略差异) | 越大说明策略效果差异越明显 |
| SSE | 组内变异(随机噪声) | 反映了策略收益的稳定性 |
| MSA | 组间均方 | 策略效应强度 |
| MSE | 组内均方(合并方差) | 估计 |
| F 值 | 信号/噪声比 | 越大说明策略差异越可靠 |
下一步:继续学习 4.4 回归分析——量化因子与收益之间的线性关系。