halo 的技术博客

返回

问题:一纸公告为什么值 8%#

每年 6 月和 12 月,沪深 300 调整成份股;每个季度,S&P 500 换血。被纳入的股票什么基本面都没变——没有新订单、没有业绩超预期、没有管理层变动——但价格会涨。

原因简单粗暴:跟踪指数的被动资金必须买。截至目前全球被动化率持续上升,一只股票进入大指数,意味着数百亿甚至千亿规模的指数基金将在生效日按权重机械买入,不问价格。

这就是金融学里少有的、接近「受控实验」的场景:一个纯粹的需求冲击,与基本面信息几乎正交。Shleifer (1986) 用它证明了需求曲线不是水平的——「Do Demand Curves for Stocks Slope Down?」这篇标题即结论的论文,就是拿 S&P 500 纳入事件做的。

对量化交易者来说,问题是三个:冲击有多大?什么时候发生?事后会不会吐回来?

事件时间线:四个阶段的解剖#

指数纳入不是一个时点,是一条时间线:

T-N          公告日(0)        生效日(+10)        T+40
 |---------------|----------------|----------------|
   平静期         跳升↑    爬升↗    冲顶⬆   回落↘
plaintext

阶段一:公告日跳升。 指数公司公告调样名单(通常提前 1-2 周)。套利者瞬间计算出被动资金的必买量,价格当天跳升——我们模拟中约 45% 的总冲击在这一天完成。

阶段二:公告→生效的爬升。 主动型套利资金持续建仓,赌的是生效日有指数基金接盘。约 35% 的冲击摊在这段。

阶段三:生效日冲顶。 指数基金为了最小化跟踪误差,集中在生效日收盘时点买入(A 股是尾盘集合竞价,美股是 close auction)。当天成交量常常是平日的 5-10 倍。

阶段四:部分反转。 需求冲击消失,抢跑的套利者开始出货。价格回落——但不会跌回原点,因为纳入本身带来了永久性变化(详见下文)。

模拟一次典型事件:

def simulate_event(perm_frac=0.5, pressure=0.08, n_gap=10):
    """公告日跳升 45% + 爬升 35% + 生效日冲刺 20%,
    随后回吐 (1 - perm_frac) 的部分,指数衰减"""
    ann_jump = pressure * 0.45      # 公告日
    ramp     = pressure * 0.35      # 公告->生效摊销
    eff_jump = pressure * 0.20      # 生效日
    perm     = pressure * perm_frac # 永久成分
    total    = ann_jump + ramp + eff_jump
    rev      = total - perm         # 待回吐部分
    # 生效后第 k 日:path -= rev * (1 - exp(-k/12))
python

单个纳入事件路径

单次事件的路径:公告日跳升,爬升到生效日附近的峰值 8.3%,随后 40 个交易日回落到 5% 附近企稳。

500 个事件的平均像什么#

单个事件噪声太大,事件研究的标准做法是叠加平均。模拟 500 个纳入事件(每个事件的冲击大小、回吐比例都带随机扰动):

500 个事件的平均路径

平均路径干净地复现了教科书形态:

  • 生效日累计超额收益 +8.2%(峰值)
  • 40 日后回落到 +4.4%,即回吐了 46%
  • 置信带(±2 标准误)很窄——500 个事件平均后,形态是统计上稳固的

这个「一半永久、一半临时」的拆分是关键。临时部分是纯粹的价格压力(price pressure):需求来了价格涨,需求走了价格跌。永久部分的来源有好几种解释,学术界吵了三十年:

  1. 需求曲线下倾(Shleifer):可替代性不完美,永久多出来的需求就永久抬高价格
  2. 流动性改善:纳入后成交更活跃、价差更窄,流动性溢价下降
  3. 投资者认知(Merton 的 investor recognition):进了指数才进入很多人的视野
  4. 信息认证:被指数选中本身是个(弱)质量信号

对交易者来说不用裁判谁对——只需要记住:别假设价格会全部跌回去,也别假设一点都不回吐。

冲击多大?平方根律再次登场#

纳入的价格压力可以事前估算。需求侧:指数权重 × 跟踪该指数的被动 AUM ÷ 该股日均成交额(ADV),得到「被动需求折合多少天的成交量」。然后套用市场冲击的平方根律(我们在平方根冲击定律一文里详细推导过):

IYσQ/VI \approx Y \cdot \sigma \cdot \sqrt{Q/V}

需求 vs 冲击

用 Y=0.9、日波动 2% 校准:

  • 被动需求折合 5 天 ADV → 压力约 4%
  • 20 天 ADV → 约 8%

注意平方根的含义:需求翻 4 倍,冲击只翻 1 倍。所以小盘股进大指数(需求/ADV 比值巨大)才是冲击最猛的场景;大盘股进指数经常无感,因为几天 ADV 就消化了。

def estimate_inclusion_impact(index_aum, weight, adv, sigma_daily, Y=0.9):
    """事前估算纳入冲击"""
    demand = index_aum * weight          # 被动必买金额
    q_over_v = demand / adv              # 折合 ADV 天数
    return Y * sigma_daily * np.sqrt(q_over_v)
python

两个可交易窗口#

时间线上有两段可以做策略:

策略 A(抢跑):公告日收盘买入,生效日收盘卖出——赚阶段二 + 阶段三的爬升,把货交给生效日必须买入的指数基金。

策略 B(反转):生效日收盘做空,20 日后回补——赚阶段四的回吐。

在 500 个模拟事件上执行(策略 A 扣双边 20bp 交易成本;策略 B 另扣 20 日约 40bp 的借券费):

两个策略对比

策略 A 抢跑策略 B 反转
单事件均值(费后)+4.27%+2.61%
胜率97%81%
年化 Sharpe(约 12 事件/年)~6.4~3.0

模拟里两个都很美——但这正是需要泼冷水的地方。

为什么真实世界远没有这么肥#

模拟的数字是机制演示,不是收益预告。真实市场里这个策略的肉在过去二十年被吃得所剩无几:

1. 指数公司在主动对抗抢跑。 抢跑者赚的每一分钱,都是指数基金持有人多付的跟踪成本。指数公司的应对:缩短公告到生效的窗口、增加调样的不可预测性、把再平衡拆散到多日执行。S&P 的历次规则修订几乎都在挤压这个窗口。

2. 效应本身在衰减。 学术实证的时间序列很清楚:S&P 500 纳入的超额收益从 1990 年代的 +8% 一路降到 2010 年代后期的 +1% 以内,部分研究认为已在统计上不可区分于零。原因是套利资本的涌入——事件驱动基金、指数增强产品全都盯着调样名单,甚至在公告前就用规则预测名单提前埋伏(沪深 300 的调样规则是公开的、可复制的,预测准确率可以做到 80% 以上)。

3. 预测名单本身成了更早的博弈。 当所有人都能预测调样,「公告日跳升」会前移到「预测确定日」,事件被不断前置,最终摊平到无法交易。

4. A 股的特殊性。 沪深 300 / 中证 500 调样生效在 12 月和 6 月的第二个星期五收盘,被动资金集中在尾盘集合竞价成交。这三分钟的成交量畸变是可观测的,但个人投资者几乎无法参与这个时点的流动性供给博弈。

实现要点#

事件研究的代码骨架(真实数据版):

import pandas as pd

def event_study(prices, mkt, events, pre=20, post=40):
    """events: [(date, ticker), ...] 公告日列表"""
    paths = []
    for date, tk in events:
        # 超额收益 = 个股收益 - beta * 市场收益
        r = prices[tk].pct_change()
        ex = r - beta[tk] * mkt.pct_change()
        idx = ex.index.get_loc(date)
        window = ex.iloc[idx - pre : idx + post + 1]
        if len(window) == pre + post + 1:
            paths.append(window.cumsum().values)
    P = np.array(paths)
    return P.mean(axis=0), P.std(axis=0) / np.sqrt(len(P))
python

三个容易踩的坑:

  • 事件日对齐:公告经常在收盘后发布,事件日应记为下一交易日,否则「公告日收益」里混入了不可交易的信息
  • 同日事件的截面相关:一次调样几十只股票同日进出,它们的超额收益高度相关,标准误按独立事件算会严重低估——按「调样批次」聚类
  • 对照组:严谨做法要配一组「差点入选」的股票做 counterfactual,剔除行业和风格的共同漂移

结论#

指数纳入效应是市场微观结构里少有的「机制完全透明」的异象:被动资金必须买、时点公开、数量可算。它教给量化交易者三件事:

  1. 需求曲线不是水平的——纯需求冲击能持久改变价格,这是所有资金流因子(北向资金、ETF 申赎、基金调仓)的理论根基
  2. 冲击按平方根定价——需求/ADV 比值是事前估算冲击的正确坐标,小盘股进大指数才是大事件
  3. 公开的异象会死于拥挤——纳入效应三十年的衰减史,就是一部套利资本消灭 alpha 的标本记录。今天还剩下的部分,藏在规则改变的缝隙里(新指数、新市场、规则修订后的过渡期),而不是被研究了三十年的 S&P 500 里

模拟世界里抢跑策略胜率 97%,真实世界里它的黄金年代结束于大约十五年前。异象的生命周期本身,比异象更值得研究。

参考文献#

  1. Shleifer, A. (1986). Do Demand Curves for Stocks Slope Down? Journal of Finance, 41(3).
  2. Harris, L., & Gurel, E. (1986). Price and Volume Effects Associated with Changes in the S&P 500. Journal of Finance, 41(4).
  3. Chen, H., Noronha, G., & Singal, V. (2004). The Price Response to S&P 500 Index Additions and Deletions. Journal of Finance, 59(4).
  4. Patel, N., & Welch, I. (2017). Extended Stock Returns in Response to S&P 500 Index Changes. Review of Asset Pricing Studies, 7(2).
指数纳入效应:被动资金冲击下的价格压力与反转
https://blog.halo26812.eu.org/blog/index-inclusion-effect
Author halo
Published at 2026年7月29日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨