1. Tick 数据基础

1.1 Tick 数据的定义

Tick 数据是金融市场中最原始、最细粒度的交易数据记录。每一笔 Tick 代表交易所撮合系统在某一时刻生成的一条成交或报价快照。在 A 股市场,Tick 数据通常包含以下字段:

字段 说明 示例
时间戳 精确到毫秒或微秒的成交时间 2025-03-21 09:30:01.250
最新价 当前最后一笔成交价格 15.68
成交量 当前 Tick 对应的成交手数 200
成交额 当前 Tick 对应的成交金额 313,600
买卖方向 主动买/主动卖/未知 B(主动买)
买一~买五 申买价与量(Level-2 行情) 15.67 / 1500
卖一~卖五 申卖价与量(Level-2 行情) 15.69 / 800
关键认知:Tick 数据不是"每秒一条"的固定频率数据,而是事件驱动的——只要有成交或报价变动,就会产生一条新的 Tick。在交易活跃时段,每秒可能产生数十条 Tick;在冷清时段,可能几秒才有一条。

1.2 Tick 数据与分钟数据的区别

分钟数据是对 Tick 数据按固定时间窗口(如 1 分钟、5 分钟)进行聚合后的结果。两者在信息密度、延迟敏感度和回测精度上存在本质差异:

对比维度 Tick 数据 分钟数据
时间粒度 毫秒/微秒级,事件驱动 固定 60 秒间隔
数据量 单只股票日均 3000~8000 条 单只股票日均 240 条
价格信息 每一笔成交价 + 盘口深度 仅 O(开盘)/ H(最高)/ L(最低)/ C(收盘)
成交量分布 精确到每一笔 分钟累计量,丢失内部分布
订单簿状态 实时买卖盘口快照 无盘口信息
回测精度 可模拟真实撮合与滑点 只能近似估计成交
存储成本 高(单只股票年约 500MB) 低(单只股票年约 10MB)
实战启示:使用分钟数据回测时,你无法知道"价格在分钟内的波动路径"。例如,某分钟 K 线收阳,但实际价格是先暴跌后拉回——如果策略在分钟开盘价买入,可能买在最高点;而 Tick 数据能精确捕捉到这种日内微观结构。

1.3 Tick 数据在量化回测中的重要性

为什么专业量化团队越来越依赖 Tick 数据而非分钟数据?以下三个核心原因决定了 Tick 数据在高频交易和精细回测中的不可替代性:

  1. 滑点模拟更真实——Tick 数据包含盘口深度(买一~买五、卖一~卖五),可以精确计算市价单的预期成交价格和冲击成本,避免分钟回测中"以收盘价成交"的理想化偏差。
  2. 信号延迟可量化——Tick 级时间戳允许你测量从信号产生到订单送达交易所之间的真实延迟,从而评估策略对延迟的敏感度。
  3. 微观结构因子挖掘——订单簿不平衡、Tick 级动量、买卖压力比等高频因子,只有基于 Tick 数据才能构建,这些因子在分钟数据上完全不可见。
常见误区:不要认为"我的策略是日频交易,不需要 Tick 数据"。即使持仓周期为一天,入场时刻的 Tick 级滑点也可能吃掉策略的大部分利润。用分钟数据回测时,滑点往往被严重低估。

1.4 Tick 数据与分钟数据的结构对比

下面的 SVG 图直观展示了 Tick 数据与分钟数据在信息维度上的差异:

Tick 数据 vs 分钟数据:信息维度对比 Tick 数据(事件驱动) 时间戳:09:30:01.250 最新价:15.68 | 成交量:200 买卖方向:主动买(B) 买一~买五:15.67/1500 ... 卖一~卖五:15.69/800 ... 数据量:日均 3000~8000 条 分钟数据(时间聚合) 时间戳:09:31:00 开盘:15.60 | 收盘:15.68 最高:15.72 | 最低:15.55 成交量:5800(分钟累计) 无盘口信息 数据量:日均 240 条

1.5 Tick 数据在回测流程中的位置

在完整的 Tick 级回测流程中,Tick 数据处于最底层输入的位置,向上逐层构建信号、订单和绩效:

Tick 级回测流程架构 Tick 数据输入(原始行情) 数据清洗与对齐 Tick 级信号计算 订单执行(滑点模拟)→ 绩效统计

1.6 读取 Tick 数据的 Python 示例

以下代码展示了如何用 Python 读取并解析 CSV 格式的 Tick 数据:

import pandas as pd

# 读取 Tick 数据(CSV 格式)
tick_df = pd.read_csv(
    'sh600519_20250321_tick.csv',
    dtype={
        'time': str,
        'price': float,
        'volume': int,
        'turnover': float,
        'direction': str
    }
)

# 将时间戳列转为 datetime 类型
tick_df['time'] = pd.to_datetime(tick_df['time'])

# 查看前 5 条 Tick
print(tick_df.head())

# 统计当日 Tick 总数
print(f"当日 Tick 总数: {len(tick_df)}")

# 计算 Tick 级收益率(对数收益率)
tick_df['log_return'] = np.log(
    tick_df['price'] / tick_df['price'].shift(1)
)
数据获取提示:国内 Tick 数据通常来自 Level-2 行情接口(如通达信、万得、聚宽等),或通过交易所授权数据商购买。CSV 格式是最通用的存储方式,但生产环境建议使用 Parquet 或 HDF5 格式以提升读写性能。