经济政策不确定性 EPU 与股债配置切换
经济政策不确定性指数 EPU(Baker-Bloom-Davis)是少数能被量化的宏观状态变量。本文用自洽合成月度 EPU、股票与长债收益,验证股票对 Δ EPU 负向暴露(−0.00089)、债券正向(+0.00072),朴素『高 EPU 切债券』策略年化 6.9%、Sharpe 0.66,反而跑输 60/40 的 13.2%/1.19——诚实拆穿它不是收益信号而是风险信号,并给出股债缩放而非清零的正确用法(中阶)。
做宏观的人喜欢说「不确定性上升」。但做量化的要问一句:不确定性能不能被编成一个数字,再喂进组合的权重? 经济政策不确定性指数 EPU(Baker、Bloom、Davis 三人构建)就是少数真正做到了这一点的宏观变量——它从主流报纸里数「经济 / 政策 / 不确定性」三类词同框的频率,再用税收、央行、贸易等政策事件做加权,得到一条可回测的时间序列。
一个朴素的直觉:政策越不确定,企业越不敢投资、股民越想落袋,股票承压;与此同时避险资金涌向国债,债券上涨(flight-to-quality)。如果这件事成立,EPU 就应该是一个股债配置的择时开关。 本文用一组自洽合成数据,把「EPU 能不能指导股债切换」做成可检验的实验,并得到一个反直觉但诚实的结论:它确实是信号,但主要是一个风险信号,不是收益信号。
一、先把 EPU 造出来#
真实的 EPU 是日频指数,但配置决策是月频的,所以我们合成一条月度 EPU:基线 100 附近均值回复,叠加多起政策事件尖峰(大选、债务上限、加息周期),尖峰按指数衰减:
import numpy as np
T = 360 # 360 月 ≈ 30 年
epu = np.zeros(T)
events = {24: 180, 70: 140, 130: 210, 200: 120, 260: 170, 320: 150}
event_shock = np.zeros(T)
for m, s in events.items(): # 政策事件: 尖峰 + 指数衰减
for k in range(8):
if m + k < T:
event_shock[m + k] += s * np.exp(-k / 3.0)
epu[0] = 100
for t in range(1, T):
epu[t] = epu[t-1] + 0.30 * (100 - epu[t-1]) + np.random.normal(0, 6) + event_shock[t]
epu = np.maximum(epu, 20)
dep = np.diff(epu) # 月度 EPU 变化 Δ EPUpython这条路径(图 1)长得像真实 EPU 的历史:平时在 100 上下晃,遇到 2008、2011、2016、2020 那种节点会窜到 200 甚至更高,然后缓缓回落。红虚线是 75 分位阈值——后面策略用它来定义「高不确定性月」。

二、两类资产对 EPU 的暴露#
核心假设:股票对 Δ EPU 负向加载(政策不确定 → 股票跌),债券正向加载(避险 → 债券涨)。我们用一个共享市场因子 MKT 加各自的 EPU 暴露来造两类资产收益:
MKT = np.random.normal(0.006, 0.035, T-1)
r_e = 0.008 + MKT + (-0.0009) * dep + np.random.normal(0, 0.040, T-1) # 股票: EPU↑ 跌
r_b = 0.003 - 0.10 * MKT + (0.00075) * dep + np.random.normal(0, 0.018, T-1) # 债券: EPU↑ 涨
r_c = 0.0020 * np.ones(T-1) # 现金无风险月息python图 2 把两者净值叠在一起:股票长期 upward 但回撤深,债券平稳上行、在 EPU 尖峰那几段明显充当了「避险垫」。注意这不是事后看图说话——下面用回归把暴露的斜率算出来。

三、朴素策略:高 EPU 切债券#
最直接的策略:月末已知 EPU[t-1](无前瞻,只用过去信息),若它高于 75 分位,下个月把股票清零、全切债券;否则维持 60/40。对比基准是永远 60/40 和永远满仓股票:
th = np.percentile(epu, 75)
epu_lag = epu[:-1] # 用 t-1 月末 EPU 决定 t 月暴露
w_eq = np.where(epu_lag <= th, 0.6, 0.0)
w_bd = np.where(epu_lag <= th, 0.4, 1.0)
strat = w_eq * r_e + w_bd * r_b
bench = 0.6 * r_e + 0.4 * r_bpython图 3 是三条净值。结果要让「朴素轮动党」失望:
- 满仓股票:年化 18.2%,Sharpe 0.96,但最大回撤 −45.3%
- 60/40:年化 13.2%,Sharpe 1.19,回撤 −23.9%
- EPU 切换:年化 6.9%,Sharpe 0.66,回撤 −38.8%
EPU 切换在收益和 Sharpe 上都跑输了 60/40。 这正是一个值得写进文章的诚实结果——它说明「高不确定性就躲进债券」这个动作本身在牺牲太多股票敞口。债券的 4.2% 年化根本填不上股票空窗期的机会成本。

四、把暴露量化:回归#
与其看图,不如直接回归。把股票、债券月收益对 Δ EPU 和市场因子做横截面回归,斜率就是各自的 EPU 风险暴露:
X = np.column_stack([np.ones(T-1), dep, MKT])
coef_e, *_ = np.linalg.lstsq(X, r_e, rcond=None) # 股票暴露 = coef_e[1]
coef_b, *_ = np.linalg.lstsq(X, r_b, rcond=None) # 债券暴露 = coef_b[1]python图 4 给出两个散点 + 拟合线:
- 股票暴露 = −0.000886(Δ EPU 每升 1 点,股票月收益平均掉 0.09%)
- 债券暴露 = +0.000722(Δ EPU 每升 1 点,债券月收益平均涨 0.07%)
两者符号相反、量级相近——这正是「股债此消彼长」的量化证据,也是 EPU 能用来做对冲而非择时的根本原因。

五、机制是真的吗:高 vs 低 EPU 月#
最后把样本按 Δ EPU 高低切开,看平均收益差(图 5):
- 股票:高 EPU 月平均 −0.56%,低 EPU 月 +3.43%,差 −4.0%
- 债券:高 EPU 月平均 +1.96%,低 EPU 月 −1.09%,差 +3.05%
机制完全成立:政策不确定期股票吃亏、债券占优。但注意——这是风险维度的差异(波动和回撤),不是收益维度的免费午餐。把它当成「高 EPU 就空股票」会吃回撤和机会成本的亏。

六、诚实陷阱:为什么朴素策略跑输#
- 它是风险信号,不是收益信号:EPU 解释的是「这段会不会更颠」,不是「这段股票会不会涨」。用风险信号去做方向择时,天然错位。本文实验里 EPU 切换输给 60/40,恰恰印证了这一点。
- 债券收益太低填不上空窗:把股票清零换来的债券只有 4.2% 年化,空窗期越长,机会成本越大。真实里美债长端有时连这都未必有。
- 阈值与频率敏感:75 分位、月度调仓都是拍的。换成 66/90 分位、双月调仓,结果会大幅漂移——这是参数脆弱性的直接证据,不是稳健 alpha。
- 前瞻污染:真实 EPU 月内才发布,用「当月 EPU 决定当月调仓」是偷看。本文特意用
epu[t-1]决定t月,已经是合规写法;但用日频 EPU 做日内切换仍要小心发布滞后。 - 幸存者偏差与样本:30 年合成里「事件」是我们塞进去的。真实 EPU 的历史大尖峰(金融危机、疫情)样本极少,统计意义有限,外推要保守。
- 国别差异:美国 EPU 和 A 股相关性弱,且中国政策不确定性更多体现在其他维度(如行业整顿、汇率)。直接搬美国 EPU 做 A 股择时,暴露错位。
七、正确用法:缩放而非清零#
既然机制在「风险」上,正确姿势是把 EPU 当成敞口缩放器,而不是开关:
- 部分缩放:高 EPU 时把股票从 60% 降到 40%(而非清零),保留 beta 同时压回撤;
- 叠加对冲:高 EPU 月用黄金 / 长债 / 波动率多头对冲股票,而不是完全退出;
- 风险预算:让股票的目标波动随 EPU 反向调整(EPU 高 → 降杠杆),把「不确定性」直接写进风险预算。
这样 EPU 的价值才真正落地——它帮你少亏在颠簸段,而不是指望它帮你多赚。
结语#
EPU 是一个被低估的「可量化宏观状态变量」:本文用合成数据证明,股票对它负向暴露(−0.00089)、债券正向(+0.00072),高 EPU 月股票平均比低 EPU 月少赚 4.0%、债券多赚 3.05%。但朴素的「高 EPU 切债券」策略年化只有 6.9%、Sharpe 0.66,反而输给永远 60/40 的 13.2% / 1.19——因为它牺牲了太多股票敞口。结论很克制:EPU 是风险信号,不是收益信号;用它缩放敞口、叠加对冲,而不是用它做方向开关。 把不确定性写进风险预算,才是这个指数真正值钱的地方。