实现核与预平均去噪:把高频价格里的「微观噪声」剥掉,量出真波动率
把日内价格采样越密,波动率估计越准?恰恰相反——朴素实现波动率(RV)会随采样加密而爆炸,因为它把买卖价差跳动、价格离散、报价错配这些微观结构噪声当成了真波动。本文用纯 numpy 从零实现实现核(Realized Kernel)与预平均(Pre-averaging)两套抗噪估计器,用波动率信号图展示 RV 如何从 21% 爆到 276%,再验证实现核如何把 60 天的 RMSE 从 21% 压到 2.6%,并诚实拆穿噪声结构假设/带宽选择/跳跃污染/流动性错配/端点效应五类真实陷阱(中阶)。
实现核与预平均去噪:把高频价格里的「微观噪声」剥掉,量出真波动率#
先说结论:用日内数据估计波动率,采样越密不等于越准。 如果你天真地把一天的秒级收益全部平方求和(这就是「实现波动率」RV),得到的数字会随采样频率上升而系统性爆炸——本文的仿真里,真实年化波动率是 21%,但用 1 秒采样的朴素 RV 跳到了 276%。多出来的 255 个百分点不是波动,是微观结构噪声。
这篇文章讲两件事:为什么会这样,以及怎么把噪声剥掉。我们从零实现两套业界主流的抗噪估计器——实现核(Realized Kernel) 和 预平均(Pre-averaging),全部用 numpy,不调任何现成的高频库。
一、问题的根源:观测价格 ≠ 有效价格#
1. 有效价格与噪声的分离#
金融计量里有一个基础假设:你在盘口看到的观测对数价格 ,等于一个不可观测的有效价格 (efficient price,代表信息的真实价值)加上一层微观结构噪声 :
噪声 从哪来?三个主要来源:
- 买卖价差跳动(bid-ask bounce):成交价在买价和卖价之间来回弹,即使中间价没动,成交价也在抖
- 价格离散化:价格只能落在最小变动单位(tick)的整数倍上
- 报价错配 / 不同步:多资产或多交易所的报价时间戳对不齐
我们要估计的是有效价格的积分波动率(Integrated Variance, IV):
也就是有效价格 在这一天真正累积了多少波动。噪声不该算进去。

左图里,绿线是有效价格(不可观测的「真值」),红线是加了噪声的观测价格——它在绿线附近高频抖动。右图是关键诊断:噪声会在收益序列的一阶滞后上制造强烈的负自相关(本例约 −0.5)。这是因为噪声今天把价格顶高、明天又被拉回,相邻两个收益方向相反。有效收益的自相关(绿柱)则几乎为零。这个负自相关是所有抗噪估计器的突破口。
2. 为什么 RV 会爆炸#
朴素实现波动率把一天切成 段,每段收益平方后求和:
在没有噪声的理想世界里, 越大,RV 越逼近真实 IV,这是漂亮的一致性。但现实里每个收益都含噪声 ,平方展开后:
其中 是噪声方差。注意噪声项和 成正比——你采样越密, 越大,噪声项越大。当 到达秒级(一天 2 万多个点),噪声项彻底压倒真实 IV。

这张图叫波动率信号图(volatility signature plot),是诊断微观噪声的标准工具。横轴是每天采样次数(越往右越密),纵轴是年化波动率估计:
- 红线(朴素 RV):在采样约 100 次时还接近真值,之后随频率上升一路飙到 276%——教科书级的噪声爆炸
- 绿虚线(真实 IV):稳定在 21%
- 蓝线(实现核 RK):无论采样多密,都紧贴真值附近
传统的「解法」是稀疏采样——只用 5 分钟一根 bar,故意扔掉大部分数据来躲开噪声。但这等于把 99% 的信息扔进垃圾桶。实现核和预平均的意义就在于:用上全部数据,同时不被噪声带偏。
二、实现核:用核函数加权自协方差#
实现核(Barndorff-Nielsen, Hansen, Lunde, Shephard, 2008)的核心思路是:既然噪声在自协方差结构里留下了可识别的痕迹(那个负自相关),那我们就把各阶自协方差用一个核函数加权组合起来,让噪声项相互抵消。
估计式长这样:
其中 是收益的 阶自协方差, 是核函数, 是带宽(用多少阶)。我们用经典的 Parzen 核——它平滑、恒正、保证估计结果非负。
import numpy as np
def parzen_weight(x):
"""Parzen 核,定义在 [0,1] 上"""
x = np.abs(x)
return np.where(x <= 0.5, 1 - 6*x**2 + 6*x**3,
np.where(x <= 1.0, 2*(1-x)**3, 0.0))
def realized_kernel(logp, H):
"""实现核估计器:用 Parzen 核加权自协方差到带宽 H"""
ret = np.diff(logp) # 日内对数收益
n = len(ret)
gamma0 = np.sum(ret**2) # 0 阶 = 朴素 RV
rk = gamma0
for h in range(1, H + 1):
g = np.sum(ret[h:] * ret[:n-h]) # h 阶自协方差 gamma_h
w = parzen_weight((h - 1) / H)
rk += 2 * w * g # 对称加上 gamma_{-h}
return rkpython直觉上: 就是被噪声污染的朴素 RV(偏高);而噪声制造的负自相关让 显著为负。把 (及更高阶)加回来,正好抵消掉 里那部分噪声膨胀。核权重 保证高阶自协方差平滑衰减,避免引入过多方差。
三、预平均:先局部平滑,再平方#
预平均(Jacod et al., 2009)走的是另一条路:既然噪声是高频抖动,那就先在一个局部窗口内对收益做加权平均,把噪声平滑掉,再对平滑后的收益求和。
设窗口长度 ,用三角权重 对窗口内的收益加权平均,得到「预平均收益」,然后:
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) - biaspython两套方法在渐近理论上等价(都达到最优收敛率 ),实务里实现核更常用于单资产、预平均更方便推广到多资产协方差与带跳跃的情形。本文主力用实现核做验证。
四、验证:60 个交易日的 IV 追踪#
光看单日不够,我们连续仿真 60 个交易日(每天用 Heston 型随机波动率路径生成有效价格,再叠加 i.i.d. 噪声),每天用「每分钟一根 bar」的现实采样频率,对比朴素 RV 和实现核 RK 谁更贴合真实 IV:
![]()
结果很干净:
- 绿线(真实 IV) 上下起伏,反映随机波动率
- 蓝线(实现核 RK) 紧紧贴着绿线走,捕捉到了波动率的时变
- 红线(朴素 RV) 整体明显浮在上方——系统性高估
量化对比:60 天里,朴素 RV 的 RMSE 是 20.95%,实现核 RK 的 RMSE 只有 2.58%。也就是说,抗噪估计把误差压缩到了朴素方法的 八分之一。对于任何依赖波动率输入的下游任务(期权定价、风险平价、VaR、波动率择时),这个差距是决定性的。
五、带宽 H 怎么选:一场偏差-方差权衡#
实现核唯一的调参就是带宽 (用多少阶自协方差)。它不是越大越好,也不是越小越好:

- H 太小:自协方差用得不够,噪声抵消不干净,估计仍偏高
- H 太大:纳入太多本身就是噪声的高阶项,估计方差放大,误差棒变长
- 中间有个甜区:本例在 附近,偏差接近零且方差可控
理论上的最优带宽约为 ,其中 是「噪声-信号比」——噪声越大,需要的带宽越大。实务里通常先估一个 (用最密采样的 RV 反推),再代入公式定 。
六、五个不能忽略的真实陷阱#
写抗噪估计器,最容易在下面这些地方翻车。逐一拆穿:
1. 噪声结构假设(i.i.d. 是理想化) 实现核的最简形式假设噪声是 i.i.d. 白噪声。但真实盘口噪声往往有自相关(连续几笔都打在同一侧盘口)、甚至和有效价格相关(信息驱动的成交)。噪声一旦有依赖结构,简单核估计会残留偏差,需要用「flat-top」核或更长的端点平均来补救。本文仿真用的是干净的 i.i.d. 噪声,现实要打折扣。
2. 带宽选择的自证陷阱 上面的甜区是在已知真实 IV 的仿真里找出来的。实盘你没有真值可对照,带宽只能靠噪声-信号比公式估计,或用样本外交叉验证——绝不能拿一段数据反复试 试到 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. 噪声假设、带宽自证、跳跃污染、流动性错配、端点效应——它们决定了这套方法从仿真走到实盘时会打多少折扣。波动率是所有衍生品定价和风险模型的地基,地基上的噪声,值得你花力气剥干净。