第一章:课程导论与数据准备
1.1 订单簿到底是什么?
做量化交易的朋友,没人能绕开订单簿。说白了,它就是交易所里那个实时更新的「买卖挂单大屏」。你想想看,每一笔成交背后,其实都有一串挂单在排队等着。
我个人习惯把订单簿理解成「市场的毛细血管」。它记录了每个价格档位上,有多少人想买、多少人想卖。这些数据每秒都在变,甚至毫秒级都在跳动。
我在项目中遇到过最头疼的事,就是刚拿到订单簿数据时,发现时间戳对不上。嗯,这里要注意:不同交易所的时间精度不一样,有的精确到毫秒,有的只到秒。这坑我踩过,后面会细说。
1.2 Level2 和 Level3 数据差异
很多新手会问:Level2 和 Level3 到底差在哪?我直接给你个表格,一看就明白。
| 对比维度 | Level2 数据 | Level3 数据 |
|---|---|---|
| 挂单深度 | 通常显示前 10 档 | 全量挂单,无限制 |
| 更新频率 | 快照式,约 100ms 一次 | 逐笔事件驱动,微秒级 |
| 数据量 | 较小,适合入门 | 极大,需要高性能存储 |
| 典型用途 | 趋势判断、盘口分析 | 高频策略、做市商系统 |
为什么会这样?因为 Level3 数据记录了每一笔挂单的「生老病死」——谁挂的单、什么时候撤单、成交了多少。而 Level2 只是给你一个汇总的快照。
我曾经为了省存储空间,只用 Level2 数据做策略,结果回测时发现信号总是慢半拍。后来换成 Level3 的逐笔数据,效果立竿见影。所以我的建议是:如果你做高频,别省那点存储钱。
1.3 数据源获取与存储
数据源这块,我踩过的坑比赚的钱还多。先说说常见的几个渠道:
- 交易所官方 API:最可靠,但限流严重。我试过用币安的 WebSocket,高峰期经常断连。
- 第三方数据商:比如 QuantConnect、Polygon。数据干净,但要花钱。一分钱一分货。
- 开源数据集:Kaggle 上有些历史订单簿数据,适合练手。但注意,很多是模拟数据,别当真。
存储方面,我个人强烈推荐用 Parquet 格式。为什么?因为它压缩率高,读取速度快。我曾经用 CSV 存了一个月的 Level3 数据,结果文件 200GB,加载一次要半小时。换成 Parquet 后,直接压缩到 30GB,读取只要 3 分钟。
核心要点:订单簿数据的时间戳必须统一成 UTC 时间。不同交易所的时区不同,不统一的话,你的策略会「穿越」到未来。
我的小技巧:写数据时,按日期分区存储。比如 data/2024/01/01/orderbook.parquet。这样查询某一天的数据时,不用扫描全表。
注意:不要直接用交易所的原始时间戳做计算。我遇到过某交易所的时间戳是字符串格式,还带时区偏移。一定要先解析成 datetime64[ns] 类型。
1.4 数据清洗实战:一个代码示例
光说不练假把式。我给你看一段我实际项目中用过的清洗代码。这段代码处理的是 Level2 快照数据。
import pandas as pd
import numpy as np
def clean_orderbook_snapshot(df):
"""
清洗订单簿快照数据
"""
# 1. 去除时间戳为空的记录
df = df.dropna(subset=['timestamp'])
# 2. 将时间戳转为 datetime 类型
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
# 3. 检查价格是否合理(比如不能为负)
df = df[df['bid_price'] > 0]
df = df[df['ask_price'] > 0]
# 4. 去除买卖价差为负的异常数据
df = df[df['ask_price'] > df['bid_price']]
# 5. 按时间排序
df = df.sort_values('timestamp')
return df
# 使用示例
raw_data = pd.read_parquet('orderbook_20240101.parquet')
cleaned_data = clean_orderbook_snapshot(raw_data)
print(f"清洗前 {len(raw_data)} 行,清洗后 {len(cleaned_data)} 行")
这段代码看起来简单,但我在实际项目中遇到过一个问题:有些交易所的卖一价竟然比买一价还低。这明显是数据错误,必须过滤掉。你想想看,如果这种脏数据进了模型,预测结果能准吗?
1.5 知识体系总览
为了让你对整个章节有个直观认识,我画了一张 SVG 流程图。它展示了从数据获取到清洗的完整链路。
这张图把整个流程串起来了。你从数据源拿到原始数据,经过解析、存储、清洗,最后变成模型能用的特征。每一步都有坑,但每一步也都有技巧。
好了,这一章的内容就到这里。数据准备是订单簿预测的基石,地基打不牢,后面盖什么楼都得塌。我个人建议你先把数据清洗这部分代码跑通,再往下走。