20. 实证研究方法:事件研究法、回归分析、向量自回归(VAR)在微观结构中的应用

做微观结构研究,光有理论模型是不够的。你得有工具,能把手上的数据「盘活」。今天聊的三个方法——事件研究法、回归分析、向量自回归(VAR),就是我这些年最常用的实证武器。

说白了,它们解决的是三类问题:

  • 事件研究法:某个事情发生了,市场怎么反应?
  • 回归分析:变量之间是什么关系?谁影响谁?
  • 向量自回归(VAR):多个变量互相纠缠,怎么拆解?

咱们一个一个来拆。

20.1 事件研究法:看市场对「突发」的反应

事件研究法,我习惯叫它「照妖镜」。你想想看,一个新闻出来,股价跳空高开,到底是真利好还是情绪宣泄?用事件研究法就能算清楚。

核心逻辑很简单:

  1. 定义事件窗口(比如公告前后各10个交易日)
  2. 计算预期收益率(用市场模型或CAPM)
  3. 算超额收益率(实际 - 预期)
  4. 检验超额收益率是否显著不为零

关键点:事件研究法在微观结构里特别适合分析「订单流冲击」、「大单拆单」、「做市商报价调整」这类场景。

举个例子。我在项目中遇到过一家高频做市商,他们想知道「自己调整报价后,对手方会不会跟单」。我们用事件研究法,把报价调整当作事件,窗口设为前后5秒。结果发现,对手方在2秒内跟单的概率高达73%。这个结论直接帮他们优化了报价策略。

避坑指南:我曾经犯过一个错——事件窗口选得太宽。微观结构数据是高频的,窗口宽了会混入太多噪音。建议用毫秒级或秒级窗口,别超过分钟级。

代码实现也不复杂。我贴一段伪代码,你感受一下:

# 事件研究法伪代码
def event_study(price_series, event_time, window=(-10, 10)):
    # 1. 计算实际收益率
    actual_returns = price_series.pct_change()
    
    # 2. 估计预期收益率(用市场模型)
    market_returns = get_market_returns()
    beta = estimate_beta(price_series, market_returns)
    expected_returns = beta * market_returns
    
    # 3. 超额收益率
    abnormal_returns = actual_returns - expected_returns
    
    # 4. 窗口内累计
    event_window = abnormal_returns[event_time+window[0]:event_time+window[1]]
    car = event_window.sum()
    
    # 5. t检验
    t_stat = car / event_window.std()
    return car, t_stat

20.2 回归分析:量化变量间的「因果关系」

回归分析,大家应该不陌生。但在微观结构里,它有几个特殊用法。

我最常用的是多元线性回归,用来解释买卖价差、订单不平衡这些核心指标。

比如,我想知道「订单流不平衡」对「短期价格变动」的影响。模型可以写成:

ΔPrice_t = α + β₁ * OrderImbalance_t + β₂ * Volatility_t + β₃ * Volume_t + ε_t

这里有个坑——微观结构数据通常有序列自相关异方差。直接用普通最小二乘法(OLS),标准误会偏小,t统计量会虚高。

注意:我建议用Newey-West标准误(HAC稳健标准误)来修正。或者用GARCH模型处理异方差。别偷懒,否则你的显著性可能是假的。

另外,回归分析里有个经典问题——内生性。比如,价格变动会影响订单流,订单流也会影响价格变动。这就成了「鸡生蛋蛋生鸡」。

怎么解决?我常用的办法是:

  • 工具变量法:找个外生变量,比如其他市场的价格冲击
  • 滞后变量:用t-1期的订单流解释t期的价格变动
  • 差分GMM:动态面板数据时特别好用

20.3 向量自回归(VAR):拆解多变量的「纠缠」

如果说回归分析是「单挑」,那VAR就是「群架」。它把所有变量都当作内生变量,一起建模。

在微观结构里,VAR特别适合分析价格、订单流、波动率、成交量之间的动态关系。

一个典型的VAR模型长这样:

Y_t = A₁Y_{t-1} + A₂Y_{t-2} + ... + A_pY_{t-p} + ε_t

其中 Y_t = [Price_t, OrderFlow_t, Volatility_t, Volume_t]'

你可能会问:这么多变量互相回归,结果怎么看?

嗯,这里有两个核心工具:

  • 格兰杰因果检验:判断A是不是B的「因」
  • 脉冲响应函数(IRF):给一个变量一个单位的冲击,看其他变量怎么响应

实战经验:我记得有一次帮一家量化私募做策略诊断。他们发现自己的模型在盘中经常失效。我们用VAR跑了一遍,发现「订单流对价格的冲击」在开盘后30分钟内衰减得特别快,但他们的模型假设冲击是持久的。这就是问题所在。

VAR的阶数选择也很关键。我习惯用AIC或BIC准则,但要注意:高频数据下,AIC容易选过多的滞后阶数。我一般会结合似然比检验来确认。

小技巧:做脉冲响应时,记得用Cholesky分解来正交化。变量的排序会影响结果。我通常把「最外生」的变量排前面,比如市场层面的冲击先于个股层面的冲击。

20.4 三种方法的对比与选择

说了这么多,到底什么时候用哪个?我画了张图,帮你理清思路。

实证研究方法选择框架 你的研究问题是什么? 事件研究法 适用场景 • 新闻/公告对价格的影响 • 大单拆单的市场冲击 • 做市商报价调整的效果 回归分析 适用场景 • 价差与波动率的关系 • 订单流对价格的解释力 • 流动性指标的因子分解 向量自回归(VAR) 适用场景 • 多变量动态关系 • 冲击传导路径分析 • 价格发现机制研究 💡 我的建议 先用事件研究法做探索性分析,再用回归验证假设,最后用VAR做动态建模

你看,这三种方法不是互斥的,而是递进的。我个人习惯的流程是:

  1. 先用事件研究法:快速判断某个事件是否有「异常」
  2. 再用回归分析:量化变量间的线性关系
  3. 最后上VAR:把动态反馈和传导路径搞清楚

20.5 实战中的注意事项

最后,分享几个我踩过的坑:

  • 数据频率要匹配:别用日频数据做秒级事件研究,也别用毫秒级数据做日频回归。频率不匹配,结论就是扯淡。
  • 注意微观结构噪声:买卖价差、订单簿的微小波动,在低频数据里是噪音,在高频数据里可能是信号。要区分清楚。
  • 稳健性检验不能省:换窗口、换样本期、换估计方法,都跑一遍。如果结论变了,说明你的模型有问题。
  • 别过度解读格兰杰因果:格兰杰因果不等于真正因果。它只是说「A的过去能预测B的现在」,不代表A是B的原因。

总结一下:事件研究法、回归分析、VAR,是微观结构实证研究的「三驾马车」。掌握好它们,你就能从海量数据里挖出真正有价值的规律。别怕复杂,多动手跑几遍代码,慢慢就有感觉了。