一、Tick数据、分钟线、日线:它们到底是什么?

做量化交易,第一关就是搞懂行情数据。

我刚开始接触期货时,也被这些概念绕晕过。Tick、分钟线、日线,听起来好像就是时间长短不一样?

其实没那么简单。它们的数据结构、用途、存储方式,差别很大。

1. Tick数据:最原始的脉搏

Tick数据,说白了就是交易所每笔成交的原始记录。每一笔交易,都会生成一条Tick。

举个例子,螺纹钢主力合约在09:30:15.123秒成交了一手,价格是3850元,这就是一条Tick。

Tick数据的核心特征:

  • 时间精度高:精确到毫秒甚至微秒
  • 数据量大:一天几百万条是常事
  • 包含完整信息:成交价、成交量、买卖盘口等

我在项目中遇到过一个问题:某家数据商提供的Tick时间戳,居然只精确到秒。同一秒内几十笔交易,时间戳一模一样。这导致回测时订单排序全乱了。嗯,这里要注意——Tick数据的灵魂就是时间精度,精度不够,后面全白搭。

2. 分钟线:压缩后的快照

分钟线,就是把Tick数据按分钟聚合。比如1分钟K线,包含这一分钟内的开盘价、最高价、最低价、收盘价、成交量。

你想想看,一天240根1分钟K线,比几百万条Tick好处理多了。大部分策略,用分钟线就够了。

我个人习惯:

做日内策略,用1分钟或5分钟线。做波段,用15分钟或60分钟线。Tick数据我只用来做高频策略,或者回测时验证分钟线的准确性。

3. 日线:最经典的行情数据

日线,就是一天一根K线。开盘价、最高价、最低价、收盘价、成交量、持仓量。

日线数据量最小,但信息密度最高。很多长周期策略,比如趋势跟踪、套利,都用日线。

我曾经犯过一个低级错误:用日线数据做回测,结果发现某天的最高价比最低价还低。查了半天,原来是数据源把日期搞混了,把两天的数据拼在了一起。所以,数据清洗永远是第一步。

二、数据精度:差之毫厘,谬以千里

数据精度,是量化交易的生命线。精度不够,策略再牛也白搭。

1. 价格精度

期货品种不同,最小变动价位也不同。螺纹钢是1元/吨,黄金是0.02元/克,股指期货是0.2点。

品种 最小变动价位 报价精度
螺纹钢 1元/吨 整数
黄金 0.02元/克 两位小数
沪深300股指 0.2点 一位小数

我建议,存储价格时统一用整数。比如螺纹钢3850元,就存3850。黄金385.50元,就存38550。这样避免浮点数精度问题,计算也快。

2. 时间精度

时间戳是行情数据的灵魂。Tick数据必须精确到毫秒,分钟线精确到秒,日线精确到天。

避坑指南:

我曾经用Python的datetime直接存时间戳,结果发现不同数据源的时间格式不一样。有的用"2024-01-15 09:30:00",有的用"20240115093000"。后来我统一用Unix时间戳(毫秒级),再也不用担心格式问题了。

三、时间戳处理:统一标准,避免混乱

时间戳处理,是数据采集中最容易出问题的地方。我总结了几个要点:

1. 统一时区

国内期货用北京时间(UTC+8)。但有些数据源可能用UTC时间。一定要统一。

2. 处理夜盘

期货有夜盘,晚上21:00到次日凌晨。日线怎么算?

我习惯把夜盘和日盘合并成一天。比如今晚21:00到明日下午15:00,算作同一个交易日。这样日线才完整。

3. 时间戳对齐

分钟线的时间戳,应该用该分钟的结束时间还是开始时间?

我个人习惯用结束时间。比如09:31:00这根1分钟K线,包含09:30:00到09:30:59的数据。这样逻辑清晰,不容易混淆。

四、知识体系总览

下面这张图,是我梳理的行情数据知识体系。你可以把它当作本章的思维导图。

行情数据基础:知识体系 行情数据 Tick数据 分钟线 日线 每笔成交记录 毫秒级时间精度 数据量大,需压缩存储 按分钟聚合 OHLCV结构 常用1分/5分/15分/60分 一天一根K线 含持仓量数据 长周期策略首选 核心:数据精度 + 时间戳统一 Tick→分钟线→日线,逐层压缩,精度递减

五、实战:如何选择合适的数据精度?

说了这么多理论,来点实际的。我一般这样选择:

  1. 高频策略:必须用Tick数据,毫秒级精度。存储用列式存储(比如Parquet),压缩率高,查询快。
  2. 日内策略:1分钟或5分钟线足够。时间戳精确到秒。
  3. 中长线策略:日线就够了。时间戳精确到天。

一个小技巧:

如果你不确定该用哪种精度,先存Tick。因为Tick可以向下聚合成分时线、日线。反过来就不行。我一般把Tick数据存一年,分钟线存五年,日线存十年。这样既节省空间,又保证数据完整。

六、代码示例:Tick数据转分钟线

最后,给一个简单的Python代码。把Tick数据聚合成1分钟K线。

import pandas as pd
import numpy as np

def tick_to_minute(tick_df):
    """
    将Tick数据聚合成1分钟K线
    tick_df: DataFrame,包含时间戳、价格、成交量
    """
    # 确保时间戳是datetime类型
    tick_df['time'] = pd.to_datetime(tick_df['time'])
    
    # 设置时间索引
    tick_df.set_index('time', inplace=True)
    
    # 按分钟聚合
    minute_df = tick_df.resample('1min').agg({
        'price': 'ohlc',  # 开盘、最高、最低、收盘
        'volume': 'sum'
    })
    
    # 展平多级列索引
    minute_df.columns = ['open', 'high', 'low', 'close', 'volume']
    
    return minute_df

这段代码我用了很多年。注意resample的用法,它会把时间戳自动对齐到整分钟。比如09:30:15.123会被归到09:31:00这根K线。嗯,这里要确认一下你的业务逻辑是否一致。

好了,关于Tick数据、分钟线、日线的定义、区别、精度和时间戳处理,就讲到这里。这些是行情数据的基础,也是后续所有策略的基石。搞懂了这些,后面的路就好走了。

专注资料整理