第九章:高频数据特征——微观结构噪声、跳跃、自相关、日内周期性

做高频交易的人,每天面对的都是「脏数据」。

我刚开始接触Tick级数据时,差点被吓退。价格跳来跳去,明明上一秒还是100.01,下一秒就变成99.99,中间还夹着几个100.02。这到底是真的市场波动,还是数据本身在「说谎」?

嗯,这就是我们今天要聊的核心——高频数据的四大特征。搞懂它们,你才算真正入了高频量化的门。

9.1 微观结构噪声:市场在「抖」

什么叫微观结构噪声?说白了,就是价格里那些「不该有的抖动」。

举个例子。你盯着一只股票的逐笔成交,发现价格在100.00和100.01之间来回跳。这真的是市场信息在驱动吗?不一定。很多时候,这只是买卖单的博弈、做市商的报价策略、甚至是交易所的撮合机制造成的。

核心观点:微观结构噪声不是「错误」,而是市场机制本身的副产品。它包含了信息,也包含了大量冗余。

我个人习惯把噪声分成两类:

  • 独立同分布噪声:比如报价的舍入误差,随机性较强,没什么信息量。
  • 序列相关噪声:比如做市商连续调整报价,这种噪声有「记忆」,处理起来更麻烦。

我在项目中遇到过最典型的案例:用1秒K线做统计套利,结果回测曲线漂亮得不像话。一上实盘就亏钱。后来发现,问题出在微观结构噪声上——回测时用了「未来数据」,因为Tick级的买卖价差在聚合时产生了伪相关性。

避坑指南:处理高频数据时,我建议先用「价格变化」而不是「价格水平」做分析。差分能有效降低噪声的影响。另外,别直接用Tick数据做回归,先降采样到合适频率再说。

9.2 跳跃:市场在「抽风」

跳跃,就是价格在极短时间内发生大幅变动。你想想看,正常市场每秒波动几个基点,突然一下跳了20个基点——这就是跳跃。

跳跃的来源很多:

  • 重大新闻发布(比如美联储加息)
  • 大单砸盘或拉升
  • 交易所系统故障(我遇到过,那叫一个酸爽)
  • 隔夜开盘的跳空

为什么跳跃很重要?因为大多数统计模型假设价格是「连续变化」的。跳跃一出现,模型就崩了。比如你用布朗运动建模,跳跃会让你的波动率估计直接翻倍。

注意:跳跃和异常值不是一回事。异常值可能是数据错误,跳跃是真实的市场行为。我曾经把一次明显的跳跃当成异常值剔除,结果错过了重要的市场信号。后来我学乖了——先判断跳跃是否伴随成交量放大,如果是,那大概率是真实的。

检测跳跃的方法,我常用两种:

  1. 阈值法:设定一个倍数(比如5倍标准差),超过就算跳跃。简单粗暴,但有效。
  2. 双幂次变差法:利用已实现波动率的分解,把跳跃部分和连续部分分开。更精确,但计算量大。
# 一个简单的跳跃检测函数
def detect_jumps(price_series, threshold=5):
    returns = np.diff(np.log(price_series))
    mean_ret = np.mean(returns)
    std_ret = np.std(returns)
    jump_idx = np.where(np.abs(returns - mean_ret) > threshold * std_ret)[0]
    return jump_idx

9.3 自相关:价格有「记忆」

自相关,简单说就是「过去的价格能预测未来的价格」。在低频数据里,自相关通常很弱,因为市场是有效的。但在高频数据里,情况完全不同。

为什么会这样?

  • 订单流的不平衡:连续几笔买单会把价格推高,然后出现短暂的反向修正。
  • 做市商的库存管理:做市商为了控制风险,会在买卖报价上做文章,导致价格序列出现负自相关。
  • 微观结构噪声的粘性:报价在买卖价差之间来回跳,产生正自相关。

我记得有一次做高频因子研究,发现一个因子在1秒频率上IC值高得离谱。后来一检查,原来是自相关在作祟——因子本身和滞后一期的价格高度相关,本质上是在预测「噪声」而不是「信号」。

关键点:高频自相关不等于套利机会。很多时候,它只是市场微观结构的「影子」。真正的alpha,需要把自相关部分剥离掉再看。

处理自相关,我一般用两个方法:

  • 预白化:用AR模型把自相关部分过滤掉,剩下的残差再做分析。
  • 使用已实现波动率:用高频数据计算波动率时,自相关会导致估计偏差。用Newey-West调整或者子采样法可以缓解。

9.4 日内周期性:市场有「生物钟」

这一点,做过交易的人都有感觉。开盘和收盘时,市场最活跃;中午时段,交易量萎缩,波动率下降。这就是日内周期性。

我习惯把日内模式画成一张图——横轴是时间,纵轴是波动率或成交量。你会发现,它像个「U型」或者「W型」。

日内波动率典型模式(U型) 9:30 11:30 13:00 15:00 开盘活跃 午间低迷 收盘活跃

这张图看着简单,但处理起来有不少坑。我刚开始做高频模型时,直接把所有时间段的数据混在一起训练。结果模型在开盘时段表现很好,午间时段一塌糊涂。为什么?因为不同时段的波动率结构完全不同。

我的做法:把一天分成几个时段(比如开盘30分钟、上午盘、午间盘、下午盘、收盘30分钟),分别建模。或者用时间虚拟变量把周期性吸掉。你想想看,如果模型不知道现在是几点,它怎么可能做出正确的预测?

9.5 四大特征的关系:一张图说清楚

这四个特征不是孤立的。它们互相影响,共同构成了高频数据的「脾气」。

高频数据 特征 微观结构 噪声 跳跃 特征 自相关 结构 日内 周期性 噪声影响自相关估计 | 跳跃破坏周期性模式 | 周期性改变噪声结构

这张图我想表达的是:

  • 噪声和自相关是一对「孪生兄弟」。噪声会产生伪自相关,自相关又会放大噪声的影响。
  • 跳跃会破坏日内周期性的规律。比如一个突发新闻,让午间本来平静的市场突然活跃起来。
  • 日内周期性决定了噪声和自相关的强度。开盘时噪声大、自相关强;午间时两者都弱。

实战提醒:做高频模型时,千万别只盯着一个特征。我见过有人只处理了噪声,没管自相关,结果模型在实盘里疯狂过拟合。也有人只做了跳跃检测,忽略了日内周期性,导致参数在不同时段失效。这四个特征,你得一起考虑。

9.6 实战中的处理流程

说了这么多理论,来点实际的。我一般处理高频数据的流程是这样的:

  1. 数据清洗:剔除明显错误的数据(比如价格为零、时间戳错乱)。
  2. 跳跃检测与处理:用阈值法或双幂次变差法找出跳跃点,根据策略需求决定是剔除还是保留。
  3. 降采样:从Tick数据聚合到合适频率(比如1秒或100毫秒),这一步能有效降低噪声。
  4. 预白化:用AR模型过滤掉自相关部分,得到「干净」的残差序列。
  5. 时段划分:根据日内周期性,把数据分成不同时段,分别建模或加入时间虚拟变量。
  6. 验证:用样本外数据检验处理效果,看看特征是否被有效消除。

一个小技巧:处理完数据后,我会画一下自相关函数(ACF)图和日内波动率曲线。如果ACF在滞后1-5阶还有显著值,说明自相关没处理干净。如果日内曲线还是U型,说明周期性没吸掉。可视化是最好的诊断工具。

好了,关于高频数据的四大特征,今天就聊到这里。这些内容看起来有点抽象,但相信我——等你真正上手处理Tick数据时,你会发现每一个特征都在你的数据里「活生生」地存在着。到时候再回头看这一章,你会觉得:嗯,原来如此。