事件研究
前面四篇都在回答「什么样的股票/行情值得买」。这一篇换一个更朴素的问题:**一件事发生之后,股价平均会怎么走?**业绩预增公告、高送转、定增、大股东增持、被调入指数——A 股每天都在发生这类事件。单次事件没法看:某家公司发预增公告第二天涨 3%,你无法分辨这是公告的效果,还是那天大盘恰好大涨、或者纯属噪声。事件研究(event study)的解决办法漂亮得像一句大白话:把很多次同类事件对齐到同一天,然后取平均。每次事件的日子不同,但把每个事件的公告日都记作「第 0 天」,前一天记作 −1,后一天记作 +1……对齐之后,很多次事件的股价走势就可以逐日平均。平均会把各次事件里不相干的噪声相互抵消,留下来的共同形态,就是「这件事本身的平均效果」。这是金融学里最古老也最耐用的一套方法论,从 1969 年 Fama 等人的经典论文用到现在,你读过的几乎每一份「某某事件后股价表现」的研报,内核都是它。
方法论:事件定义 → 窗口 → 超额收益 → 对齐平均
Section titled “方法论:事件定义 → 窗口 → 超额收益 → 对齐平均”- R1(事件定义):先把「事件」写成一条可机械执行的判定规则,而不是一句口头描述。「业绩预增」要落实成:公告类型为业绩预告、预告净利润同比增速大于某阈值、以公告日为事件日。定义越机械,样本越不容易被手抖污染(常见坑第 1 条)。
- R2(窗口选择):以事件日为 0,向前向后各取一段交易日,比如 [-20, +20]。向前取 20 天是为了检查事件前有没有异动(消息泄露、样本被挑过);向后取 20 天是看效果持续多久。窗口长度是假设的一部分,碰数据前写死。
- R3(超额收益):原始涨跌幅里混着大盘的起伏,必须减掉基准:每天算个股收益与基准收益的差,得到超额收益。基准可以是沪深 300、中证全指或同行业指数——关键是同一个样本里所有事件用同一把尺子。
- R4(对齐):把每条事件的时间轴平移,使事件日都落在相对日 0。对齐之后,「相对日 +3」对每条事件都指「公告后第 3 个交易日」,无论它们的日历日期差多少年。
- R5(平均与置信带):对每个相对日,把 N 条事件的超额收益取等权平均,再逐日累加,得到平均累计超额收益曲线(CAR);同时算出每个点上跨事件的离散程度,给出置信带。曲线回答「平均效果多大」,置信带回答「这个平均值靠不靠谱」。
- 成功标准:假设在碰数据前写死——「业绩预增公告后 20 个交易日内 CAR 显著大于 0,且事件前 20 日 CAR 无趋势」。「显著」沿用第 2 章的判据:置信带不包含 0。
本章演示数据是 60 次合成的「业绩预增公告」事件(事件研究演示:60 次合成「业绩预增公告」事件,窗口 [-20,+20] 日。每次事件的日超额收益(相对基准)= 事件日跳升(t=0 均值 1.2%)+ 事件后正向漂移(t=1..20 每日均值 0.18%)+ 噪声 N(0, 0.011²),事件前无漂移。car 为窗口起点累计、跨事件平均的 CAR;lower/upper = car ± 1.96×标准误,标准误 = 逐事件 CAR 的截面标准差(n−1) ÷ √60。单位均为百分数(%))。生成剧本是:事件前没有漂移(干净的对照段),事件日当天有一个平均 1.2% 的跳升,之后 20 天每天有平均 0.18% 的正向漂移(公告后缓慢消化,学界叫「公告后漂移」),再叠加上每日噪声。注意我们故意不造假事件前的泄露,好让你看到「无泄露」长什么样作为对照。
数学:超额收益、平均与累计
Section titled “数学:超额收益、平均与累计”第 次事件在相对日 的超额收益,是个股收益减基准收益:
把 次事件在相对日 的超额收益取平均,再把窗口起点以来的平均收益逐日累加,就是 CAR 曲线:
最后给 CAR 装上刻度尺——置信带。对相对日 ,把每次事件各自的累计超额收益(从窗口起点累到 )拿出来,算跨事件的截面标准差 ,则:
人话解释:第一步的减法是把大盘的「水涨船高」从个股涨跌里剔掉——公告日涨 3% 而当天大盘涨 1%,事件真正带来的只有 2%。第二步的平均是整套方法的灵魂:单次事件的噪声可能 ±5%,但噪声在每次事件里方向随机,N 次平均后相互抵消,共同的漂移被留下来——N 越大,均值越干净。第三步的置信带用了一个你在第 2 章见过的结论:平均值的波动是单次波动的 分之一,所以标准误 = 截面标准差除以 ;±1.96 倍标准误对应 95% 置信水平。带里没有 0,才能说「平均效果大概率不是碰运气」。
手算一遍:3 次事件、窗口 [-1, +1] 的玩具样本。原始数据与第一步减法如下:
| 事件 | 相对日 | 个股收益 | 基准收益 | |
|---|---|---|---|---|
| A | −1 | +0.5% | +0.2% | +0.3% |
| A | 0 | +3.0% | +0.1% | +2.9% |
| A | +1 | +0.8% | +0.3% | +0.5% |
| B | −1 | −0.4% | +0.1% | −0.5% |
| B | 0 | +2.2% | −0.2% | +2.4% |
| B | +1 | +1.2% | +0.4% | +0.8% |
| C | −1 | +0.2% | 0.0% | +0.2% |
| C | 0 | +4.1% | +0.5% | +3.6% |
| C | +1 | −0.3% | +0.2% | −0.5% |
第二步逐日平均:相对日 −1 的平均是 (0.3% − 0.5% + 0.2%) ÷ 3 = 0.00%;相对日 0 是 (2.9% + 2.4% + 3.6%) ÷ 3 = 2.97%;相对日 +1 是 (0.5% + 0.8% − 0.5%) ÷ 3 ≈ 0.27%。累加得 CAR(按未舍入值累加,再四舍五入展示):−1 日 0.00%,0 日 2.97%,+1 日 3.23%。第三步置信带(以相对日 0 为例):三次事件各自累计到 0 日的值是 A = 3.2%、B = 1.9%、C = 3.8%,均值 2.97%,截面标准差(除以 N − 1 = 2)约 0.97%,标准误 = 0.97% ÷ √3 ≈ 0.56%,置信带 = 2.97% ± 1.96 × 0.56%,即 [1.87%, 4.07%]——不含 0。当然 3 次事件的置信带只是演示算法,真实研究里 N 通常是几十到几百,带会窄得多。
伪代码:事件研究的完整流程
Section titled “伪代码:事件研究的完整流程”输入:事件清单 events(每条:股票、事件日,由机械规则筛出,共 N 条)、 日收益表 ret、基准日收益 mkt、窗口半长 W# ① 取窗口:每条事件取事件日前后各 W 个交易日的收益,对齐到相对日AR ← N × (2W+1) 的空矩阵 # 行 = 事件,列 = 相对日 −W … 0 … +W对每条事件 i: 对相对日 t 从 −W 到 +W: s ← 事件 i 的事件日之后第 t 个交易日 # t 为负则是之前 AR[i][t] ← ret[i][s] − mkt[s] # 超额收益:减同一把基准尺# ② 对齐平均:逐列(逐相对日)求 N 条事件的等权平均对 t 从 −W 到 +W: AAR[t] ← AR[:, t] 的均值# ③ 累计:CAR 曲线 = 平均超额收益从窗口起点逐日累加对 t 从 −W 到 +W: CAR[t] ← AAR[−W … t] 的累加和# ④ 置信带:换一条等价路径——逐事件先累计,再跨事件算离散程度对 t 从 −W 到 +W: 对每条事件 i:CARi ← AR[i][−W … t] 的累加和 σ[t] ← 所有 CARi 的截面标准差(除以 N−1) SE[t] ← σ[t] / √N 带上界[t] ← CAR[t] + 1.96·SE[t];带下界[t] ← CAR[t] − 1.96·SE[t]输出:CAR 曲线、95% 置信带(读法见下图)两处容易写错的地方:① 的相对日换算必须按交易日历走(事件日后的第 5 个交易日,不是日历日的第 5 天),且事件日落在停牌期、窗口内缺数据的处理规则要事先定好;③ 和 ④ 是两条不同的计算路径——③ 先平均后累计得到 CAR 曲线,④ 先(逐事件)累计后算离散得到置信带,次序不能换,先平均再算标准差会把跨事件的离散信息平均掉。
图:CAR 曲线与置信带
Section titled “图:CAR 曲线与置信带”把 60 次「业绩预增公告」事件按上面的流程跑完,画出 CAR 曲线(红线)、95% 置信带(浅蓝色区域)与事件日竖线(蓝色虚线):
读图三要点:
- 事件前是否已泄露:看 0 点左侧有没有提前上行。本例相对日 −20 到 −1 的 CAR 在 -0.379% 到 0.366% 之间窄幅晃,没有趋势,置信带始终包含 0——干净的对照段,说明公告前市场没有抢跑。如果你在真实数据里看到 0 点左侧 CAR 已经持续爬升,两种可能:消息提前泄露(内部人先买),或者你的样本被「事后挑过」(常见坑第 1 条)——无论哪种,「事件效果」都已经部分兑现,0 点后的涨幅会被低估。
- 事件后漂移方向:看 0 点右侧曲线的斜率。本例事件日单日 CAR 抬升 1.15 个百分点(公告的即时反应),之后 20 天曲线持续缓升,到 +20 日累计 4.591%——即时跳升加缓慢漂移,是「利好消息逐步被消化」的典型形态。如果曲线在事件日后掉头向下,说明市场先过度反应再回吐;平着不动,则说明信息在事件日一次性定价完毕。
- 置信带是否含 0:看浅蓝色区域的下界。本例下界从相对日 +4 起站上 0 并保持到窗口末端(+20 日为 [2.938%, 6.244%])——从那天起,「CAR 其实是 0、涨的是运气」这个解释在 95% 水平上被拒绝。带越宽说明跨事件的差异越大(本例窗口越往后带越宽,因为累计的时间越长、各事件分化越大);下界压着 0 的研究结论,只能当轶事听。
照例提醒:这是合成数据,「事件后缓升、带最终不含 0」是剧本安排好的形态,用来教你认图——真实事件研究的图会更毛糙,结论也经常落在「带含 0、不好说」这一档。
扩展:当事件的原料是文本——LLM 信号提取
Section titled “扩展:当事件的原料是文本——LLM 信号提取”本篇到目前为止的事件都是天然结构化的:业绩预告、增持、调入指数——数据库里一个字段就能筛出来。但市场里更多的信息以文本形态存在:新闻快讯、公告正文、券商研报、互动平台问答、社交媒体讨论。上一代做法(情感词典、微调小模型)脆弱且口径混乱;大语言模型(LLM)带来了质变——它能把一段文本直接读成结构化字段:这条新闻是利好还是利空(情感分数)、属于哪类事件(事件类型)、相对市场一致预期是超预期还是低预期(预期差方向)。
教学上最重要的一个定位:LLM 的输出不是结论,而是原料。它做的事是把「文本」翻译成「事件清单」或「因子值」,翻译完成之后,一切回到本篇的 R1–R5:机械定义 → 窗口 → 超额收益 → 对齐平均 → 置信带,一道工序都不少。「LLM 说这些是利好」和「业绩预告」在法律地位上完全平等——都是待检验的事件定义,都要过同一张图、同一条置信带。
但文本原料比数据库字段多出三层自己的纪律:
- 文本的可见时间。新闻有三个时间戳:发布时间、抓取时间、入库时间。回测时用「发布时间」而实盘时你拿到的是「入库时间」,中间差的几分钟就是一条隐形的前视通道。第 1 章与第 18 章的 PIT 纪律原样延伸到文本:信号只能用决策时点之前入库的文本。
- 模型版本即口径。同一个 LLM 处理同一批文本,输出才可比;升级模型 = 更换信号口径,全历史必须重跑,新旧口径混用的信号序列等于两条不同信号拼接。纪律:批量处理时锁定模型版本,并把版本号写进研究记录。
- LLM 可能「记得」历史。它的训练语料里包含历史行情与历史研报——让它处理 2020 年的新闻时,它也许不是「读出来的」而是「背出来的」。这是 AI 时代特有的前视,第 20 章 有专节展开。
- 样本选择偏差:只挑「成功案例」研究。最隐蔽的版本不是故意作弊,而是研究问题的提法本身带毒:「研究那些公告后大涨的股票,看它们公告前有什么特征」——样本按结果挑过,0 点后的上涨是被挑出来的,不是事件的平均效果;连 0 点前的「异动」也可能是挑样本时顺带挑进来的。判别纪律只有一条:事件清单必须由事件日本身(或之前)可得的信息机械筛出,不许看事件后的走势。「业绩预增」就按公告文本筛,一条都不许手动剔除「涨得不好看的」。
- 事件扎堆:「独立样本」的假象。置信带的公式假设 N 次事件相互独立,但 A 股财报季天然扎堆——业绩预告集中在 1 月、4 月、7 月、10 月的几周里密集发布,一次财报季就能贡献大半个样本。这些事件的窗口在日历上高度重叠:它们共享同一段大盘行情、同一个宏观环境、同一波行业轮动。某天大盘暴跌,几十条「独立」事件的超额收益一起为负——它们其实并不独立。后果是真实的跨事件离散程度被低估,置信带算出来偏窄,「显著」变廉价。缓解办法:按财报季分组检查结论是否在每一季都成立;或对同一时段的事件先聚类再算标准误(超出本篇范围,但实盘前必须知道这个修正的存在)。
- 事件日对错一天:盘后公告的归属。A 股大量公告在收盘后发布——业绩预告、定增预案、股东增持,多是晚上挂网。收盘后的公告,市场最早也要次日才能反应,事件日应记下一个交易日,而不是公告落款日。对错一天的效果很刁钻:CAR 曲线整体不会错得离谱,但「事件日跳升」会被记到 −1 日,制造出「消息提前泄露」的假象,或者把真实的泄露冲掉一半。处理规则同样要机械:统一按公告时间戳判断,15:00 后发布的顺延一个交易日。
事件研究到此告一段落:把「某件事发生了」写成机械规则、对齐、平均、配置信带——它是检验任何可枚举市场规律的通用工具。下一篇把镜头从「事件的平均效果」拉回「账户的整体结构」:投资组合与策略分散——第二编的收官章,也是把前面所有策略放进同一个账户时,最后那道风控工序。