因子模拟组合:用多头空头组合把抽象因子变成可交易资产
一个因子(风格因子、宏观因子、文本情绪因子)本身往往不可直接交易——你没法在交易所「买入价值因子」。但 APT / 因子定价框架要求每个因子对应一个「因子模拟组合(FMP)」,它的收益跟该因子相关性最高,于是抽象因子被投影成一组可交易资产的多头-空头权重。本文用真实数值演示:怎么用 w = Σ⁻¹·Cov(R,f) / 𝟙ᵀΣ⁻¹Cov(R,f) 闭式解造出 FMP、它和因子相关性从等权的 0.376 拉到 0.739、以及关键的「因子 Sharpe 上界 vs FMP 实现 Sharpe」边界(损耗 17.7%)。附完整 Python 与六类真实陷阱(中阶)。
做因子研究的人迟早会撞到一个尴尬:你测出来一个因子很牛,但它在交易所里根本买不到。
「价值因子」「动量因子」「宏观流动性因子」「分析师文本情绪因子」——这些都是抽象的数字序列,不是能下单的标的。因子定价理论(APT、Fama-French)却要求每个因子对应一个可交易的投资组合,否则你没法说「这个因子在实证上到底赚不赚钱」「它该拿多少风险溢价」。
解决办法是 因子模拟组合(Factor Mimicking Portfolio, FMP)——用一组可交易资产的多头+空头,拼成一个「收益曲线跟那个抽象因子最像」的组合。抽象因子被投影到了可交易资产张成的空间里,于是它变成了真金白银能交易的资产。
本文用一个 12 资产、240 个月的合成面板,把 FMP 从公式到数字完整跑通。
一、问题:因子不可交易,但因子定价需要它能交易#
设你有 个可交易资产的月度超额收益矩阵 ,还有一个你想要研究的抽象因子序列 (比如一个你自己算的「价值打分」)。
因子的「投资组合版本」 想满足一件事:在可交易资产张成的空间里,找权重 让组合收益 跟 的相关性最高。等价于把 投影到资产空间——这正是一个回归问题,而且有闭式解。
约束上我们让 是真实组合权重:(可以有多头和空头,不必非负)。在这个约束下,最大化 的最优权重是:
其中 是资产协方差, 是各资产收益与因子的协方差向量。这个解最早由 Huberman & Kandel (1987) 系统给出,后来成为 Fama-French 构造 SMB/HML 模拟组合的理论依据。
它的两个核心性质:
- 追踪性:FMP 收益 与 的相关系数,是所有可交易组合里最大的;
- Sharpe 上界:FMP 的 Sharpe 绝不可能超过因子自身的 Sharpe,等号成立当且仅当因子完全落在资产张成的空间内。这中间的差距,就是这个因子「没法被完美复制」的代价——也是 APT 给因子定价的边界。
二、造数据:3 个底层因子驱动 12 个资产#
我们造一个结构化的收益面板:三个底层因子(市场 / 规模 / 价值),每个资产对它们有不同载荷,再加特质噪声。
import numpy as np
rng = np.random.default_rng(20260718)
N, T = 12, 240 # 12 资产, 240 月
fm = rng.normal(0.0080, 0.040, T) # 市场因子
fs = rng.normal(0.0040, 0.030, T) # 规模因子
fv = rng.normal(0.0060, 0.025, T) # 价值因子(本文目标因子)
F = np.column_stack([fm, fs, fv])
beta = np.zeros((N, 3))
for i in range(N):
beta[i, 0] = rng.uniform(0.6, 1.3) # 市场 beta
beta[i, 1] = rng.uniform(-0.5, 0.8) # 规模暴露
beta[i, 2] = rng.uniform(-0.3, 0.9) # 价值暴露(有正有负)
eig = rng.uniform(0.02, 0.05, N)
R = F @ beta.T + rng.normal(0, 1, (T, N)) * eig # TxN 资产收益python目标因子 自身年化均值 10.79%、年化波动 9.30%,是个真有油水的因子。现在我们的任务是:不碰 本身,只用 12 个可交易资产把它「模拟」出来。
三、闭式解:一步算出 FMP 权重#
Sigma = np.cov(R, rowvar=False) # NxN 资产协方差
C = np.cov(R, fv, rowvar=False)
gamma = C[:N, N] # N 向量 Cov(R, fv)
Sigma_inv = np.linalg.inv(Sigma)
w_raw = Sigma_inv @ gamma
w = w_raw / w_raw.sum() # 归一使 sum(w) = 1
P = R @ w # 因子模拟组合收益序列
corr = np.corrcoef(P, fv)[0, 1]python跑出来的结果:
- 权重 ,多头权重之和 3.79、空头权重之和 −2.79(典型的长-短组合)
- 最大多头 +1.60(资产08),最大空头 −1.99(资产02)
- FMP 与因子的相关系数 corr = 0.739,R² = 0.546

对比一下等权组合:等权与因子的 corr 只有 0.376。FMP 用闭式解把相关性从 0.376 拉到 0.739——这就是「投影到资产空间、最大化相关性」带来的实打实的提升,不是靠调参。

四、追踪质量:时间序列与散点#
FMP 收益序列 和原始因子 在月度上高度同步。散点图配 OLS 拟合,斜率 2.98、corr 0.739、R² 0.546——线性复制得相当干净。
![]()

注意:R² 不是 1。这不是 bug,是结构性事实——因子本身的「特质成分」(不在任何资产上被定价的部分)就是复制不掉。年化追踪误差 31.29%,主要就是这块不可复制的残差。下面第四点的 Sharpe 边界会把它讲清楚。
五、关键边界:因子 Sharpe 上界 vs FMP 实现 Sharpe#
这是 FMP 最容易被忽略、却最重要的一个性质。定义 Sharpe:
- 因子自身 Sharpe(理论上界)= 1.160
- FMP 实现的 Sharpe = 0.954
- 损耗 = 0.206(17.7%)

为什么 FMP 的 Sharpe 一定 ≤ 因子自身? 直观讲:因子 里有一部分收益来自「卖出了不可交易的风险」或「纯特质跳动」,这些没法用资产组合精确复制。你能复制的只是 落在资产张成空间里的那部分,其余都被平滑掉了。所以这个 17.7% 的损耗,不是你算错了,而是这个因子「不可交易成分」的度量——它告诉你:想把这个因子做成实盘策略,预期能吃到的是 0.954 这个量级,而不是 1.160。
这也解释了 Fama-French 当年为什么要造 SMB/HML 模拟组合:他们要的不是「完美复制规模/价值因子」,而是一个可交易、可定价的近似。FMP 就是那个近似的精确配方。
六、六类真实陷阱(实战必看)#
- Σ 估计噪声 → 权重爆炸:用样本协方差 直接求逆,12 个资产下噪声极大,权重能飘到几十倍。实战一定要对 做收缩(shrinkage)或因子结构降维,否则 FMP 变成高杠杆怪物。本文用合成干净数据,权重才收敛在 ±2 区间。
- 短视复制、未来函数: 和 必须用滚动窗口实时估计。用全样本 算出的 FMP 暗含了未来协方差,实盘一跑就崩。正确做法:t 时刻用截至 t−1 的数据估 ,算出 ,持有一期。
- 可卖空约束:闭式解天然含空头(本文空头之和 −2.79)。真实市场有融券限制 / 卖空成本,纯多头近似(把空头截断到 0 再归一)会显著拉低 corr,复制质量打折。
- 换手成本: 缓慢漂移,FMP 权重每月变一点,但累积换手不小。月频再平衡 + 交易成本 10bp 量级就得吃掉一部分那 17.7% 损耗里的实盘收益。
- 因子自身的 look-ahead:如果目标因子 是用未来信息算的(比如用全年财报算的「价值打分」去匹配月度收益),FMP 的 corr 会被高估。因子和资产必须严格对齐到同一信息集。
- 相关性 ≠ 因果 / ≠ 可获利:corr 0.739 只说明「复制得像」,不保证 FMP 实盘能赚钱。FMP 的价值在定价与检验(它能不能被旧因子模型解释),不在它本身是策略。把它当策略用要另外做样本外验证。
七、小结#
因子模拟组合把「买不到的因子」变成「买得到的多头-空头权重」,闭式解 一步到位。本文实证里它把与因子的相关性从等权的 0.376 拉到 0.739,但 Sharpe 从因子理论上界 1.160 掉到 0.954——那 17.7% 的损耗才是这个因子的真身:可交易的部分能复制,不可交易的部分就是它的定价边界。下一篇我们会反过来问:当你真造出一个候选新因子,怎么用 GRS 跨越检验判断它到底有没有增量信息、还是被旧模型白嫖了。
代码与图表均由 Python(numpy + matplotlib)真实计算,数据为带结构的可复现合成面板,非占位符。