2. 报价更新频率的数据结构与采集口径
要统计“报价更新频率”,第一步不是算频率,而是把“什么算一次更新”定义清楚。同一份报价数据,如果时间戳口径不同、事件切分方式不同、窗口边界处理不同,算出来的频率可能相差数倍。本节围绕三个核心字段——报价时间戳、更新事件、频率计算窗口——展开,并讨论采集频率、缺失值与异常更新的处理原则,为后续统计与建模打好数据基础。
一、三个关键字段的定义
报价时间戳是频率统计的时间基准,必须明确它代表的是“报价生成时刻”“交易所撮合时刻”还是“本地接收时刻”。三者含义不同:生成时刻反映做市商意图,撮合时刻反映市场可见状态,接收时刻还叠加了网络延迟。频率统计通常应使用市场可见的撮合时刻(或交易所发布的行情时间),并在数据字典中固定字段名与精度(如毫秒级 epoch)。若同一报价存在多个时间字段,必须指定唯一主时间戳,避免混用。
更新事件是频率的计数单位。一次“更新”可以定义为:任一侧价格变化、任一侧数量变化、或买卖任一侧发生任何字段变化。口径不同,计数结果差异显著。例如某做市商仅调整买价数量而价格不变,若口径为“价格变化才算更新”,则不计;若口径为“任一字段变化”,则计一次。实务中建议采用“任一报价字段变化即计一次更新”,并额外记录变化类型(价格变动/数量变动/双边同时变动),以便后续拆分分析。
频率计算窗口决定分母。常见窗口有固定时间窗(如每秒、每分钟、每5分钟)和事件窗(如每100次更新)。固定时间窗便于横向比较不同标的,但需处理窗口边界:一条报价恰好落在窗口分界点时,应约定“左闭右开”规则,即时间戳 t 满足 start ≤ t < end 计入该窗口,避免重复计数或漏计。窗口长度还应与标的流动性匹配——对高频更新的合约,1秒窗可能只有个位数事件,统计噪声大;对低频合约,1分钟窗又过于稀疏。
二、采集频率与统计频率的关系
采集频率是数据落地的采样节奏,统计频率是分析时计算的更新密度,两者不能混为一谈。若采集端以 1 秒快照方式记录盘口,那么两次快照之间的多次更新会被压缩为一次“状态变化”,统计出的频率是“快照变化频率”而非“真实更新频率”。因此,若研究目标是做市商报价行为,应优先使用逐笔更新(event-by-event)数据;若只有快照数据,则必须在结论中注明“基于快照口径”,并避免与逐笔口径的结果直接比较。
采集频率的选择还需考虑存储与延迟成本。逐笔数据量大,但保留了完整事件序列;快照数据量小,却丢失事件密度信息。一个折中做法是:逐笔采集并同时生成 1 秒聚合特征(更新次数、价格变动次数、数量变动次数),既保留明细又便于快速统计。
三、缺失值与异常更新的处理原则
缺失值常见于采集中断、字段为空或时间戳缺失。处理原则是“可追溯、不臆造”:对时间戳缺失的记录,若无法从上下游推断,应标记为无效并排除,而不是用相邻时间填充;对价格或数量字段缺失,应区分“该侧未报价”与“采集丢失”,前者是有效状态(如单边报价),后者应剔除。所有剔除都应在数据质量日志中记录条数与原因,保证统计口径可复现。
异常更新主要包括:时间戳回退(后一条早于前一条)、同一时间戳重复记录、价格跳变超出合理范围、以及零间隔的密集重复报价。处理原则是先标记后决策:时间戳回退通常意味着数据源切换或时钟问题,应按主时间戳排序并记录回退次数;完全重复的记录应去重;价格跳变需结合合约最小变动价位判断,超出多档的跳变可能是数据错误而非真实报价。对于零间隔密集重复,若确认为同一状态重复推送,应合并为一次更新,否则会虚增频率。
quote_ts(主时间戳,毫秒)、event_type(price/qty/both)、window_id(窗口编号)、is_valid(有效性标记)、invalid_reason(剔除原因)。频率统计只使用 is_valid=true 的记录,并按 window_id 分组计数。最后需要强调一致性:时间戳精度、事件定义、窗口规则、缺失与异常处理策略,必须在整份分析中保持统一,并在报告开头声明。只有口径锁定,后续的分布统计、自相关分析和更新频率建模才具有可比性与可复现性。