「价值好还是成长好?」——这个问题没有恒定答案,只有随时间切换的答案。2000–2007 年价值碾压成长,2009–2020 年成长反杀价值,2021–2022 价值又翻身。如果有一把「宏观仪表盘」能告诉我们当下该偏向哪边,就能在价值/成长之间做轮动(style rotation),而不是死捂一个风格吃满它的回撤。
本文用两个最经典的宏观仪表:收益率曲线斜率(10Y−2Y) 和 信用利差(BAA−AAA),构建一个给价值/成长切换择时的信号,并用一段 8 年日度数据演示它的真实表现。结论先放在这:宏观轮动不保证跑赢最好的单一风格,但它能把回撤从 −45% 砍到 −23%——它的价值是风险管理,不是点石成金。
一、为什么宏观能预测风格#
经济学直觉很直接:
- 陡峭的收益率曲线 + 收窄的信用利差 = 经济扩张、复苏早期。这时利率低、信贷宽松、周期股(价值风格富集)盈利弹性大 → 价值占优。
- 平坦/倒挂的曲线 + 走阔的信用利差 = 经济放缓、衰退临近。这时资金涌向长期确定性增长,防御与成长股受捧 → 成长占优。
所以一个朴素的宏观打分可以定义为:
分数越高(曲线越陡、信用越紧),越该超配价值。把分数用 sigmoid 映射成权重:
是「置信度增益」,越大越敢押。轮动组合的日收益就是两风格的加权:

二、Python:宏观信号驱动的风格轮动#
下面这段代码是生成图表的核心逻辑。注意 lag=5 这一行——它把信号滞后 5 个交易日再下单,模拟「看到信号 → 研究确认 → 调仓」的真实执行时滞。这一点在第四节会证明是诚实性的命门。
import numpy as np
def sigmoid(x):
return 1.0 / (1.0 + np.exp(-x))
def style_rotation(r_value, r_growth, slope, credit, k=1.5, lag=5):
"""
slope / credit : 观测到的宏观信号(曲线斜率 / 信用利差),长度 T
r_value / r_growth : 价值/成长风格日收益,长度 T
k : sigmoid 增益;lag : 执行滞后天数(避免前视)
返回 (累计净值, 价值权重序列, 滞后打分)
"""
score = (slope - slope.mean()) / slope.std() \
- (credit - credit.mean()) / credit.std()
# 关键:用滞后 L 日的信号下单,模拟真实调仓延迟
score_lag = np.concatenate([np.full(lag, score[0]), score[:-lag]])
w_value = sigmoid(k * score_lag)
w_growth = 1.0 - w_value
r_rot = w_value * r_value + w_growth * r_growth
return np.cumprod(1 + r_rot), w_value, score_lag
# ---- 合成数据:隐藏宏观状态 h_t 驱动风格强弱,信号只是带噪代理 ----
def simulate_all(T=252*8, seed=42):
rng = np.random.default_rng(seed)
h = np.zeros(T); h[0] = 0.30
for t in range(1, T):
h[t] = 0.990*h[t-1] + 0.06*rng.normal()
h = 0.8*np.tanh(h/0.8) # 隐藏宏观状态
slope = 1.5*h + 0.30 + rng.normal(0, 0.45, T) # 带噪观测
credit = 2.5 - 1.6*h + rng.normal(0, 0.40, T)
beta = 0.0011
r_value = 0.05/252 + beta*h + rng.normal(0, 0.011, T)
r_growth = 0.09/252 - beta*h + rng.normal(0, 0.011, T)
return h, slope, credit, r_value, r_growth
h, slope, credit, rv, rg = simulate_all()
cum_rot, w_value, score = style_rotation(rv, rg, slope, credit, k=1.5, lag=5)
print("平均价值权重=%.2f (std=%.2f)" % (w_value.mean(), w_value.std()))python三、宏观信号与轮动权重长什么样#
下面的信号时序展示了曲线斜率与信用利差的此起彼伏——它们反向运动,共同拼出宏观的「risk-on / risk-off」节奏。

而轮动权重并非 0/1 硬切换,而是随打分在价值与成长之间连续漂移:宏观偏价值时权重抬到 0.70.8,偏成长时落到 0.20.3,平均正好在 0.50 附近(样本里两种风格各领风骚一半时间)。

四、真实计算结果(8 年日度)#
我跑了一段 2016 个交易日(约 8 年)的合成数据:底层有一个隐藏宏观状态 驱动价值/成长的相对强弱,但我们观测到的斜率和信用利差只是 的带噪代理——这正是实战的写照,宏观指标从不精确反映真实状态。结果:
| 策略 | 终值 | 年化 | 最大回撤 |
|---|---|---|---|
| 价值因子(纯多) | 0.670 | −4.9% | −61.6% |
| 成长因子(纯多) | 1.958 | 8.8% | −45.3% |
| 静态 50/50 | 1.221 | 2.5% | −37.1% |
| 宏观轮动(本文) | 1.949 | 8.7% | −22.7% |
两个要点:
- 轮动没跑赢最好的单一风格(成长 8.8% vs 轮动 8.7%)——这点必须诚实。宏观择时做不到「只在成长涨时全仓成长」;它只是把筹码更合理地分配,吃不到单一风格的极端 alpha。
- 但回撤从 −45.3% 砍到 −22.7%,几乎腰斩。 风险调整收益(收益/回撤)显著改善。这才是风格轮动真正该卖的卖点:** smoother ride,更扛得住,更睡得着。**

五、真实陷阱(最容易翻车的地方)#
-
前视偏差(look-ahead)——最隐蔽的坑。 如果我在上面用当期的斜率/信用利差直接给当期权重(即
lag=0且信号与收益同源),策略年化会飙到 200%+,回撤不到 10%——漂亮得离谱,也假得离谱。原因:合成时信号和收益都从同一个 长出,零滞后等于偷看了未来。实盘里信号永远滞后、且带噪声。任何「宏观轮动回测漂亮到不像话」的结果,第一反应都该查前视。 本文特意加了lag=5与大方差特异噪声,把这个结果「打回人间」。 -
宏观关系会 regime shift。 2022 年加息周期里「价值跑赢」的传统逻辑被高利率下的成长杀估值打破;曲线倒挂也不一定立刻衰退。信号的历史有效性会漂移,要滚动检验,不能刻舟求剑。
-
信号噪声 → 频繁换手 → 成本吞噬。 斜率/信用利差日度波动很大,直接用日度 z-score 会制造大量无意义调仓。实务要对信号做平滑(如 1~3 月移动平均)或只在权重变化超阈值时才调,压低换手。
-
用 ETF 代理风格的幸存者偏差。 用 VTV/VUG、或沪深 300 价值/成长指数做代理时,指数编制规则本身会改写「价值/成长」的定义,回测里吃到的可能是编制红利而非真实风格溢价。
-
利率与信用利差的低频性。 这两个信号本质偏月度/季度,用日度数据做轮动属于「杀鸡用牛刀」,多数噪声。更稳妥的是月度再平衡 + 季度信号。
六、小结#
风格轮动的本质,是用一套有经济学含义的宏观仪表,在价值与成长之间做「顺势加权」,而不是预测谁涨得最多。它的真实价值不在收益增强(本文里几乎和最好的单一风格打平),而在回撤管控——把 −45% 的过山车压成 −23% 的平稳曲线。任何想靠它「精准抄底某个风格」的期待,都会在前视偏差和 regime shift 面前摔跟头;把它当风险管理工具而非 alpha 印钞机,才算用对了。
本文行情由「隐藏宏观状态 + 带噪观测信号 + 大方差特异噪声」合成,仅用于演示轮动机制与陷阱;实盘落地请用真实价值/成长指数(如 Fama-French SMB/HML、或 VTV/VUG、沪深300风格指数)与真实宏观序列(FRED 的 T10Y2Y、BAA−AAA),并严格处理信号滞后与交易成本。本文仅作研究方法示例,不构成任何投资建议。