一、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数据,毫秒级精度。存储用列式存储(比如Parquet),压缩率高,查询快。
- 日内策略:1分钟或5分钟线足够。时间戳精确到秒。
- 中长线策略:日线就够了。时间戳精确到天。
一个小技巧:
如果你不确定该用哪种精度,先存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数据、分钟线、日线的定义、区别、精度和时间戳处理,就讲到这里。这些是行情数据的基础,也是后续所有策略的基石。搞懂了这些,后面的路就好走了。