因子投资-实验02-用回归估计Alpha和Beta

QUANT RESEARCH NOTE LAB 02

给定一列市场超额收益和一列资产超额收益,怎样用时序回归估计月度 Alpha、市场 Beta、置信区间和残差?本实验先用已知生成过程造数据,再用 OLS 反向估计。因为真参数已知,我们能判断代码是否恢复了正确对象。

类型动手实验
模块研究实验
阅读约 9 分钟
材料9 节 · 4 段代码

问题

给定一列市场超额收益和一列资产超额收益,怎样用时序回归估计月度 Alpha、市场 Beta、置信区间和残差?本实验先用已知生成过程造数据,再用 OLS 反向估计。因为真参数已知,我们能判断代码是否恢复了正确对象。

数据生成式是:

0.001 是真实月度 Alpha,1.2 是真实 Beta,ε 是人为给定的小噪声。真实研究看不到这些真值,所以更需要时间对齐、模型诊断和稳健标准误。

输入数据

使用 12 个月确定性市场收益与噪声,全部用小数:

输入数据 12 行 × 3 列
月份 market epsilon
1 -0.030 0.0010
2 0.020 -0.0010
3 0.010 0.0005
4 -0.010 -0.0005
5 0.040 0.0010
6 0.015 -0.0010
7 -0.025 0.0005
8 0.030 -0.0005
9 0.000 0.0000
10 0.010 0.0005
11 -0.015 -0.0005
12 0.025 0.0000

asset 由已知公式计算,不从外部下载。这里 market 与 asset 都被解释为超额收益;若输入的是原始收益,截距含义会不同。

逐步实现

第一步:构造可审计数据

PYTHON 可复现实验
1
2
3
4
# kb-skip
frame = pd.DataFrame({"market": market, "epsilon": epsilon})
frame["asset"] = 0.001 + 1.2 * frame["market"] + frame["epsilon"]
assert frame.notna().all().all()

数据生成时保留 epsilon 列只是教学需要。真实数据中残差只能在估计模型后得到,不能把未来残差当特征。

第二步:显式加入常数项

PYTHON 可复现实验
1
2
3
# kb-skip
X = sm.add_constant(frame[["market"]], has_constant="add")
model = sm.OLS(frame["asset"], X).fit()

statsmodels 不会在所有接口里自动加常数。不加常数相当于强迫 Alpha 为零,并会改变 Beta。X 的列是 const、market,维度为 12×2;y 是 12×1。

第三步:提取参数、置信区间与残差

PYTHON 可复现实验
1
2
3
4
5
# kb-skip
alpha_hat = model.params["const"]
beta_hat = model.params["market"]
confidence = model.conf_int(alpha=0.05)
frame["residual"] = model.resid

默认 fit 使用经典同方差标准误。本教学噪声很小且人为确定,适合验证接口;金融月收益中仍应检查异方差和自相关,并考虑 model.get_robustcov_results(cov_type=”HAC”, maxlags=L)。

完整代码

PYTHON 可复现实验
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import numpy as np
import pandas as pd
import statsmodels.api as sm

market = np.array([
-0.030, 0.020, 0.010, -0.010,
0.040, 0.015, -0.025, 0.030,
0.000, 0.010, -0.015, 0.025,
])
epsilon = np.array([
0.0010, -0.0010, 0.0005, -0.0005,
0.0010, -0.0010, 0.0005, -0.0005,
0.0000, 0.0005, -0.0005, 0.0000,
])

frame = pd.DataFrame({"market": market, "epsilon": epsilon})
frame["asset"] = 0.001 + 1.2 * frame["market"] + frame["epsilon"]

X = sm.add_constant(frame[["market"]], has_constant="add")
model = sm.OLS(frame["asset"], X).fit()

alpha_hat = float(model.params["const"])
beta_hat = float(model.params["market"])
confidence = model.conf_int(alpha=0.05)
frame["residual"] = model.resid

assert 1.1 <= beta_hat <= 1.3
assert abs(alpha_hat - 0.001) < 0.0002
assert np.isclose(frame["residual"].sum(), 0.0, atol=1e-12)
assert np.isclose(
frame["market"] @ frame["residual"],
0.0,
atol=1e-12,
)

print(f"alpha={alpha_hat:.9f}")
print(f"beta={beta_hat:.9f}")
print(f"r_squared={model.rsquared:.9f}")
print(confidence.round(9).to_string())
print(frame[["market", "asset", "residual"]].round(6).to_string(index=False))

预期输出

关键结果允许最后几位随数值库版本略有差异:

预期输出 3 行 × 3 列
项目 估计值 95% 经典置信区间
月度 Alpha 0.001032458 [0.000545274, 0.001519641]
市场 Beta 1.194435858 [1.172275866, 1.216595850]
R² 0.999307168 不适用

估计 Alpha 接近真值 0.001,Beta 接近真值 1.2。R² 接近 1 是因为我们刻意设置了很小噪声,不代表现实资产回归应有如此高拟合。

残差约为 0.000801、-0.000921、0.000523、-0.000588、0.001190、-0.000949、0.000328、-0.000366、-0.000032、0.000523、-0.000616、0.000107。它们不是原始 epsilon 的逐项复制,因为 OLS 会重新选择截距与斜率,使样本残差与常数和 market 正交。

断言

  1. Beta 范围: 估计值必须落在 [1.1,1.3];这能捕捉漏加常数、列顺序错位或收益单位错误等大问题。
  2. Alpha 邻域: 估计月 Alpha 与 0.001 的差小于 0.0002。
  3. 残差和为零: 含截距 OLS 的样本残差与常数列正交。
  4. 残差与市场正交: market 与残差内积在浮点误差内为零。

这些是代数和实现断言,不证明 CAPM 正确。真实研究还要断言日期完全对齐、收益频率一致、市场因子定义可追溯、样本长度足够以及数据没有未来函数。

结果解释

Beta 约 1.194 表示:在这个线性模型和样本中,市场超额收益每增加 1 个百分点,资产超额收益条件均值约增加 1.194 个百分点。它是敏感度,不表示资产“有 119.4% 的风险”,也不是相关系数。

月度 Alpha 约 0.1032%。精确复合年化为:

年化不增加统计证据;月度 Alpha 的标准误和置信区间也必须按正确方法变换。不能只把置信区间端点乘 12 后声称是精确年区间。

默认 95% 区间在本例不包含零,但数据是人为按正 Alpha 生成且噪声极小。现实中显著 Alpha 还可能来自遗漏规模、价值、动量、行业或流动性暴露;更丰富因子模型会改变截距。

残差是模型没有线性解释的样本部分。它可能包含真正特质冲击、遗漏因子、测量误差和非线性;“特质”不等于“可忽略”。

常见故障

  • 没有常数项: Beta 会吸收平均收益差异,模型无法估计 Alpha。
  • 原始收益与超额收益混用: CAPM 左右两边应使用同期限无风险收益调整后的口径。
  • 百分数和小数混用: 2 表示 200% 还是 2% 必须统一;Beta 可能因两边单位不一致放大 100 倍。
  • 日期错一位: market(t) 与 asset(t+1) 错位会把同期风险暴露回归变成预测回归。
  • 看错 params 顺序: 使用列名访问,不要默认 params[0] 永远是 Alpha。
  • 把高 R² 当成高收益: R² 衡量样本内线性拟合,和 Alpha 大小、未来收益不是同一对象。
  • 默认标准误万能: 月度收益若有异方差或自相关,应使用与研究设计一致的稳健协方差。
  • 样本太短: 12 个月只有 10 个残差自由度,置信区间对假设敏感;真实估计应报告更长样本与滚动稳定性。

练习

  1. 删除常数项重新回归,比较 Beta、残差和 R²,解释模型问题发生了什么变化。
  2. 把 epsilon 放大 10 倍,观察参数置信区间和 R²;点估计与精度谁变化更明显?
  3. 将 asset 和 market 都乘 100,再回归。Alpha 和 Beta 分别如何变化?只乘一边又会怎样?
  4. 加入一个与 market 高度相关的第二因子,观察共线性对两个斜率标准误的影响。
  5. 把 12 个月复制成 10 年但加入序列相关噪声,比较经典标准误与 Newey–West 标准误。
  6. 在真实 A 股实验设计中写出 market 的候选定义:全市场价值加权、沪深 300 或 CH-3 市场因子。说明每个定义对应的投资总体。

完成练习后,你应能把回归输出翻译成经济语言,同时明确它没有回答的因果、模型遗漏和可交易性问题。


因子投资-实验02-用回归估计Alpha和Beta
https://www.polarishaw.top/2026/07/17/因子投资-实验02-用回归估计Alpha和Beta/
作者
Polaris
发布于
2026年7月17日
许可协议