2. 数据粒度基础
在回测系统中,数据粒度决定了策略能"看到"多少市场信息。分钟K线与逐笔成交是两类最常用的数据形态,它们不仅记录频率不同,更在数据结构、时间戳语义和字段含义上存在本质差异。理解这些差异,是判断回测结果是否可信的第一步。
分钟K线:聚合后的"摘要"结构
分钟K线是对某一分钟内所有成交的统计压缩。一根标准分钟K线通常包含以下字段:时间戳、开盘价、最高价、最低价、收盘价、成交量、成交额,部分数据源还会附带成交笔数、持仓量或均价。以常见的CSV格式为例:
datetime,open,high,low,close,volume,amount
2024-03-01 09:31:00,10.52,10.58,10.49,10.55,128400,1352760.00
2024-03-01 09:32:00,10.55,10.61,10.53,10.60,96300,1018920.00
这里的时间戳语义需要特别注意:09:31:00这根K线,通常代表09:30:00至09:31:00这一分钟内的成交聚合,即时间戳标记的是K线结束时刻。但不同数据源存在差异——部分数据源用起始时刻标记,部分用结束时刻标记。若在回测中混用两种约定,会导致信号提前或滞后一分钟,对高频策略影响显著。因此拿到数据后,第一件事应是核对时间戳约定,而非直接跑策略。
K线的字段含义也有陷阱。成交量单位可能是股、手(100股)或张(可转债/期权),成交额单位可能是元或万元。开盘价并非该分钟第一笔成交价,而是聚合后的首笔价格;收盘价同理。这些字段是"统计量"而非"原始记录",一旦聚合完成,分钟内的价格路径信息就永久丢失了。
逐笔成交:原始记录的"流水"结构
逐笔成交(Tick/Trade)记录每一笔撮合成交,字段通常包括:成交时间(精确到毫秒或微秒)、成交价格、成交数量、成交方向(主动买/主动卖)、成交编号、买卖双方订单号等。示例:
time,price,volume,direction,trade_id
2024-03-01 09:30:00.120,10.52,300,B,10001
2024-03-01 09:30:00.350,10.51,500,S,10002
2024-03-01 09:30:01.080,10.53,200,B,10003
逐笔数据的时间戳是事件发生时刻,精度远高于分钟线。方向字段(B/S)通常由数据商根据成交价与盘口买卖价的关系推断,不同数据商的推断规则可能不同,导致同一笔成交在不同源中方向标注不一致。成交编号用于去重和排序,但在部分数据源中并非全局唯一。
逐笔数据的核心价值在于保留了分钟内的价格路径和成交节奏。同样一根"开盘10.52、收盘10.55"的分钟K线,逐笔数据可能显示价格先跌至10.49再拉回,也可能一路单边上行——这两种路径对滑点估计、订单成交概率判断的影响截然不同。
常见数据源差异与核对要点
实际工程中,分钟线与逐笔数据往往来自不同供应商,差异集中在几个方面。第一是时间戳约定:有的分钟线用左闭右开区间标记起始时刻,有的用结束时刻;逐笔数据有的带交易所原始时间,有的经过本地时区转换。第二是复权处理:分钟线常提供前复权、后复权、不复权三种版本,而逐笔数据通常是不复权的原始成交价,若直接混用会导致价格断层。第三是集合竞价处理:部分数据源将开盘集合竞价并入第一根分钟线,部分单独列出。第四是缺失与补全:无成交的分钟可能被跳过、补零或前值填充,不同处理方式会影响成交量类指标的计算。
从回测设计角度看,分钟K线适合信号频率较低、持仓周期较长的策略,其聚合特性会天然平滑掉部分微观噪声;逐笔数据则适合需要精确估计成交价、滑点和排队位置的策略。两者并非替代关系,而是同一市场在不同观察尺度下的两种投影。真正需要警惕的是:用分钟线回测却假设逐笔级别的成交精度,或用逐笔数据却忽略其方向标注的推断误差。数据粒度的选择,应当与策略的信号频率、成交假设和成本模型保持一致,否则回测曲线再漂亮,也只是在错误的信息集上做的优化。