halo 的技术博客

返回

实现核与预平均去噪:把高频价格里的「微观噪声」剥掉,量出真波动率#

先说结论:用日内数据估计波动率,采样越密不等于越准。 如果你天真地把一天的秒级收益全部平方求和(这就是「实现波动率」RV),得到的数字会随采样频率上升而系统性爆炸——本文的仿真里,真实年化波动率是 21%,但用 1 秒采样的朴素 RV 跳到了 276%。多出来的 255 个百分点不是波动,是微观结构噪声

这篇文章讲两件事:为什么会这样,以及怎么把噪声剥掉。我们从零实现两套业界主流的抗噪估计器——实现核(Realized Kernel)预平均(Pre-averaging),全部用 numpy,不调任何现成的高频库。

一、问题的根源:观测价格 ≠ 有效价格#

1. 有效价格与噪声的分离#

金融计量里有一个基础假设:你在盘口看到的观测对数价格 YtY_t,等于一个不可观测的有效价格 XtX_t(efficient price,代表信息的真实价值)加上一层微观结构噪声 ϵt\epsilon_t

Yt=Xt+ϵtY_t = X_t + \epsilon_t

噪声 ϵt\epsilon_t 从哪来?三个主要来源:

  • 买卖价差跳动(bid-ask bounce):成交价在买价和卖价之间来回弹,即使中间价没动,成交价也在抖
  • 价格离散化:价格只能落在最小变动单位(tick)的整数倍上
  • 报价错配 / 不同步:多资产或多交易所的报价时间戳对不齐

我们要估计的是有效价格的积分波动率(Integrated Variance, IV):

IV=0Tσs2dsIV = \int_0^T \sigma_s^2 \, ds

也就是有效价格 XtX_t 在这一天真正累积了多少波动。噪声不该算进去。

噪声让观测价格在有效价格附近抖动,并在一阶滞后制造强负自相关

左图里,绿线是有效价格(不可观测的「真值」),红线是加了噪声的观测价格——它在绿线附近高频抖动。右图是关键诊断:噪声会在收益序列的一阶滞后上制造强烈的负自相关(本例约 −0.5)。这是因为噪声今天把价格顶高、明天又被拉回,相邻两个收益方向相反。有效收益的自相关(绿柱)则几乎为零。这个负自相关是所有抗噪估计器的突破口。

2. 为什么 RV 会爆炸#

朴素实现波动率把一天切成 nn 段,每段收益平方后求和:

RV=i=1n(YtiYti1)2RV = \sum_{i=1}^{n} (Y_{t_i} - Y_{t_{i-1}})^2

没有噪声的理想世界里,nn 越大,RV 越逼近真实 IV,这是漂亮的一致性。但现实里每个收益都含噪声 Δϵ\Delta\epsilon,平方展开后:

E[RV]IV+2nω2噪声项E[RV] \approx IV + \underbrace{2 n \, \omega^2}_{\text{噪声项}}

其中 ω2\omega^2 是噪声方差。注意噪声项和 nn 成正比——你采样越密,nn 越大,噪声项越大。当 nn 到达秒级(一天 2 万多个点),噪声项彻底压倒真实 IV。

波动率信号图:RV 随采样加密而爆炸,RK 保持稳定

这张图叫波动率信号图(volatility signature plot),是诊断微观噪声的标准工具。横轴是每天采样次数(越往右越密),纵轴是年化波动率估计:

  • 红线(朴素 RV):在采样约 100 次时还接近真值,之后随频率上升一路飙到 276%——教科书级的噪声爆炸
  • 绿虚线(真实 IV):稳定在 21%
  • 蓝线(实现核 RK):无论采样多密,都紧贴真值附近

传统的「解法」是稀疏采样——只用 5 分钟一根 bar,故意扔掉大部分数据来躲开噪声。但这等于把 99% 的信息扔进垃圾桶。实现核和预平均的意义就在于:用上全部数据,同时不被噪声带偏。

二、实现核:用核函数加权自协方差#

实现核(Barndorff-Nielsen, Hansen, Lunde, Shephard, 2008)的核心思路是:既然噪声在自协方差结构里留下了可识别的痕迹(那个负自相关),那我们就把各阶自协方差用一个核函数加权组合起来,让噪声项相互抵消。

估计式长这样:

RK=γ0+h=1Hk ⁣(h1H)(γh+γh)RK = \gamma_0 + \sum_{h=1}^{H} k\!\left(\frac{h-1}{H}\right) \left(\gamma_h + \gamma_{-h}\right)

其中 γh=irtirtih\gamma_h = \sum_i r_{t_i} r_{t_{i-h}} 是收益的 hh 阶自协方差,k()k(\cdot) 是核函数,HH 是带宽(用多少阶)。我们用经典的 Parzen 核——它平滑、恒正、保证估计结果非负。

直觉上:γ0\gamma_0 就是被噪声污染的朴素 RV(偏高);而噪声制造的负自相关让 γ1\gamma_1 显著为负。把 γ1\gamma_1(及更高阶)加回来,正好抵消掉 γ0\gamma_0 里那部分噪声膨胀。核权重 kk 保证高阶自协方差平滑衰减,避免引入过多方差。

三、预平均:先局部平滑,再平方#

预平均(Jacod et al., 2009)走的是另一条路:既然噪声是高频抖动,那就先在一个局部窗口内对收益做加权平均,把噪声平滑掉,再对平滑后的收益求和。

设窗口长度 knnk_n \approx \sqrt{n},用三角权重 g(x)=min(x,1x)g(x) = \min(x, 1-x) 对窗口内的收益加权平均,得到「预平均收益」rˉ\bar{r},然后:

IV^=1θψ2rˉ2偏差修正项\widehat{IV} = \frac{1}{\theta \psi_2} \sum \bar{r}^2 - \text{偏差修正项}
def preaveraging(logp, kn):
    """预平均估计器:局部窗口平滑 + 偏差修正"""
    ret = np.diff(logp)
    n = len(ret)
    j = np.arange(1, kn)
    g = np.minimum(j/kn, 1 - j/kn)        # 三角权重
    pavg = np.convolve(ret, g[::-1], mode="valid")   # 预平均收益
    psi2 = np.sum(g**2)
    theta = kn / np.sqrt(n)
    main = np.sum(pavg**2) / np.sqrt(n)
    # 用剩余的高频收益平方项做噪声偏差修正
    psi1 = np.sum(np.diff(np.concatenate([[0], g, [0]]))**2)
    bias = (psi1 / (2*theta**2 * psi2 * n)) * np.sum(ret**2)
    return main/(theta*psi2) - bias
python

两套方法在渐近理论上等价(都达到最优收敛率 n1/4n^{1/4}),实务里实现核更常用于单资产、预平均更方便推广到多资产协方差与带跳跃的情形。本文主力用实现核做验证。

四、验证:60 个交易日的 IV 追踪#

光看单日不够,我们连续仿真 60 个交易日(每天用 Heston 型随机波动率路径生成有效价格,再叠加 i.i.d. 噪声),每天用「每分钟一根 bar」的现实采样频率,对比朴素 RV 和实现核 RK 谁更贴合真实 IV:

60 个交易日:RK 贴合真实 IV,RV 系统性偏高

结果很干净:

  • 绿线(真实 IV) 上下起伏,反映随机波动率
  • 蓝线(实现核 RK) 紧紧贴着绿线走,捕捉到了波动率的时变
  • 红线(朴素 RV) 整体明显浮在上方——系统性高估

量化对比:60 天里,朴素 RV 的 RMSE 是 20.95%,实现核 RK 的 RMSE 只有 2.58%。也就是说,抗噪估计把误差压缩到了朴素方法的 八分之一。对于任何依赖波动率输入的下游任务(期权定价、风险平价、VaR、波动率择时),这个差距是决定性的。

五、带宽 H 怎么选:一场偏差-方差权衡#

实现核唯一的调参就是带宽 HH(用多少阶自协方差)。它不是越大越好,也不是越小越好:

带宽权衡:H 太小残留噪声偏高,H 太大方差放大

  • H 太小:自协方差用得不够,噪声抵消不干净,估计仍偏高
  • H 太大:纳入太多本身就是噪声的高阶项,估计方差放大,误差棒变长
  • 中间有个甜区:本例在 H816H \approx 8 \sim 16 附近,偏差接近零且方差可控

理论上的最优带宽约为 Hξ4/5n3/5H^* \propto \xi^{4/5} n^{3/5},其中 ξ2=ω2/IV\xi^2 = \omega^2 / \sqrt{IV} 是「噪声-信号比」——噪声越大,需要的带宽越大。实务里通常先估一个 ω2\omega^2(用最密采样的 RV 反推),再代入公式定 HH

六、五个不能忽略的真实陷阱#

写抗噪估计器,最容易在下面这些地方翻车。逐一拆穿:

1. 噪声结构假设(i.i.d. 是理想化) 实现核的最简形式假设噪声是 i.i.d. 白噪声。但真实盘口噪声往往有自相关(连续几笔都打在同一侧盘口)、甚至和有效价格相关(信息驱动的成交)。噪声一旦有依赖结构,简单核估计会残留偏差,需要用「flat-top」核或更长的端点平均来补救。本文仿真用的是干净的 i.i.d. 噪声,现实要打折扣。

2. 带宽选择的自证陷阱 上面的甜区是在已知真实 IV 的仿真里找出来的。实盘你没有真值可对照,带宽只能靠噪声-信号比公式估计,或用样本外交叉验证——绝不能拿一段数据反复试 HH 试到 RMSE 最小,那是把噪声当信号拟合。

3. 跳跃污染 积分波动率衡量的是连续部分的波动。如果当天有价格跳跃(财报、突发新闻),RV 和 RK 都会把跳跃的平方计进去,高估连续波动。要分离跳跃得上「双幂次变差」(bipower variation)或阈值截断,本文没有建模跳跃。

4. 流动性与采样错配 仿真里价格在等间隔时间网格上生成。真实成交是不规则到达的——流动性差的时段几分钟没有一笔成交,流动性好的时段一秒几十笔。等时钟采样(calendar time)和等笔数采样(tick time)会给出不同结果,冷门标的的高频估计尤其不可靠。

5. 端点效应 自协方差在收益序列的两端样本不足,实现核对端点(开盘、收盘)附近的处理会引入偏差。规范做法(BNHLS)要对首尾做「jittering」局部平均,本文的实现是简化版,没有做端点修正。

七、小结#

采样越密越准,是低频世界的直觉;在高频世界里它是陷阱。微观结构噪声让朴素实现波动率随采样频率爆炸——本文里从 21% 炸到 276%。

实现核与预平均的价值,是让你用满全部高频数据的同时不被噪声带偏:实现核用 Parzen 核加权自协方差,正好抵消噪声制造的负自相关,把 60 天 RMSE 从 21% 压到 2.6%。代价是引入一个带宽参数,要在「噪声残留」和「方差放大」之间找平衡。

但记住那五个陷阱——i.i.d. 噪声假设、带宽自证、跳跃污染、流动性错配、端点效应——它们决定了这套方法从仿真走到实盘时会打多少折扣。波动率是所有衍生品定价和风险模型的地基,地基上的噪声,值得你花力气剥干净。

实现核与预平均去噪:把高频价格里的「微观噪声」剥掉,量出真波动率
https://blog.halo26812.eu.org/blog/realized-kernel-preaveraging
Author halo
Published at 2026年7月21日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨