Skip to content

4.3 方差分析(ANOVA)

方差分析(Analysis of Variance, ANOVA)用于比较三个及以上总体的均值是否相等。核心思想是将总变异分解为组间变异(由处理因素引起)和组内变异(由随机误差引起)。


一、基本概念

1.1 为什么不用两两 t 检验?

比较 k=3k=3 个策略的均值,如果两两做 t 检验需要 C32=3C_3^2=3 次。随着 kk 增大,多重比较的累积 Type I 错误率急剧上升。ANOVA 通过一次 F 检验解决这个问题。

1.2 模型设定

yij=μ+τj+εij,εijN(0,σ2) y_{ij} = \mu + \tau_j + \varepsilon_{ij}, \quad \varepsilon_{ij} \sim N(0, \sigma^2)

  • yijy_{ij}:第 jj 组的第 ii 个观测值
  • μ\mu:总体均值
  • τj\tau_j:第 jj 组的效应
  • εij\varepsilon_{ij}:随机误差

假设:H0:τ1=τ2==τk=0H_0: \tau_1 = \tau_2 = \cdots = \tau_k = 0 vs H1:j,τj0H_1: \exists\, j, \tau_j \neq 0


二、方差分解

2.1 平方和分解

总平方和 SST = 组间平方和 SSA + 组内平方和 SSE:

来源平方和公式自由度均方
组间(处理)SSA=j=1knj(yˉjyˉ)2SSA = \sum_{j=1}^k n_j(\bar{y}_j - \bar{y})^2k1k-1MSA=SSA/(k1)MSA = SSA/(k-1)
组内(误差)SSE=j=1ki=1nj(yijyˉj)2SSE = \sum_{j=1}^k \sum_{i=1}^{n_j} (y_{ij} - \bar{y}_j)^2NkN-kMSE=SSE/(Nk)MSE = SSE/(N-k)
总和SST=j=1ki=1nj(yijyˉ)2SST = \sum_{j=1}^k \sum_{i=1}^{n_j} (y_{ij} - \bar{y})^2N1N-1

2.2 F 统计量

F=MSAMSEF(k1,Nk) F = \frac{MSA}{MSE} \sim F(k-1, N-k)

F>Fα(k1,Nk)F > F_\alpha(k-1, N-k),拒绝 H0H_0,至少有一组均值与其他组显著不同。


三、手算示例:比较三种交易策略

某量化团队开发了三种日内交易策略(A、B、C),记录了各自 10 天的收益率(%):

原始数据

天数策略 A策略 B策略 C
12.31.20.8
21.81.51.0
32.00.90.6
42.51.81.2
51.51.00.5
62.21.30.9
71.91.10.7
82.11.41.1
91.70.80.4
102.41.61.0

第一步:计算各组均值

策略总和 yij\sum y_{ij}均值 yˉj\bar{y}_jnjn_j
A20.420.42.042.041010
B12.612.61.261.261010
C8.28.20.820.821010

总均值 yˉ=(20.4+12.6+8.2)/30=41.2/30=1.3733\bar{y} = (20.4 + 12.6 + 8.2) / 30 = 41.2 / 30 = 1.3733

第二步:计算 SSA(组间平方和)

SSA=10×(2.041.3733)2+10×(1.261.3733)2+10×(0.821.3733)2 SSA = 10 \times (2.04-1.3733)^2 + 10 \times (1.26-1.3733)^2 + 10 \times (0.82-1.3733)^2

SSA=10×0.4444+10×0.0128+10×0.3052=4.444+0.128+3.052=7.624 SSA = 10 \times 0.4444 + 10 \times 0.0128 + 10 \times 0.3052 = 4.444 + 0.128 + 3.052 = 7.624

第三步:计算 SSE(组内平方和)

iiyiAy_{iA}(yiAyˉA)2(y_{iA}-\bar{y}_A)^2yiBy_{iB}(yiByˉB)2(y_{iB}-\bar{y}_B)^2yiCy_{iC}(yiCyˉC)2(y_{iC}-\bar{y}_C)^2
12.30.06761.20.00360.80.0004
21.80.05761.50.05761.00.0324
32.00.00160.90.12960.60.0484
42.50.21161.80.29161.20.1444
51.50.29161.00.06760.50.1024
62.20.02561.30.00160.90.0064
71.90.01961.10.02560.70.0144
82.10.00361.40.01961.10.0784
91.70.11560.80.21160.40.1764
102.40.12961.60.11561.00.0324

SSEA=0.924,SSEB=0.924,SSEC=0.636 SSE_A = 0.924, \quad SSE_B = 0.924, \quad SSE_C = 0.636

SSE=0.924+0.924+0.636=2.484 SSE = 0.924 + 0.924 + 0.636 = 2.484

第四步:构建 ANOVA 表

来源SSdfMSFF临界值
组间(策略)7.6247.624223.8123.81241.4141.41F0.05(2,27)=3.35F_{0.05}(2,27)=3.35
组内(误差)2.4842.48427270.0920.092
总和10.10810.1082929

第五步:结论

F=41.41>3.35F = 41.41 > 3.35p<0.0001p < 0.0001,拒绝 H0H_0。三种策略的收益率均值存在显著差异。


四、事后检验(Post-hoc Analysis)

ANOVA 只能告诉你有差异,但不能告诉你哪几组有差异。常用事后检验:

方法特点
Tukey HSD(Honest Significant Difference,诚实显著差异)控制所有两两比较的 FWER(Family-Wise Error Rate,族系错误率)
Bonferroni最保守,αadj=α/m\alpha_{\text{adj}} = \alpha/m
Scheffé适用于所有线性组合比较

Tukey HSD 对本例的计算

比较均值差HSD 临界值显著?
A vs B2.041.26=0.782.04 - 1.26 = 0.783.49×0.092/10=0.3353.49 \times \sqrt{0.092/10}=0.335
A vs C2.040.82=1.222.04 - 0.82 = 1.220.3350.335
B vs C1.260.82=0.441.26 - 0.82 = 0.440.3350.335

三者两两之间均显著不同,策略 A 最优。


Quant Link:策略选择

ANOVA 在量化中的应用:

  1. 策略分组比较:不同参数配置下的策略表现是否存在显著差异
  2. 因子分组检验:按因子分位数分组(如 5 组),检验各组的未来收益均值是否相等
  3. 市场状态分析:不同市场环境(牛市/熊市/震荡市)下策略表现比较
  4. 多因子排序:多个备选因子,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组内均方(合并方差)估计 σ2\sigma^2
F 值信号/噪声比越大说明策略差异越可靠

下一步:继续学习 4.4 回归分析——量化因子与收益之间的线性关系。

Built with VitePress