我第一次接触期权 orderbook 数据时,完全不知道从哪下手。Deribit 是全球最大的期权交易所,但它的 WebSocket 实时数据对我来说太复杂,而我又需要历史快照来做回测研究。后来我发现了 Tardis.dev 这个工具,它把十几家交易所的历史数据整理成统一格式,终于让我不用再折腾各种奇怪的 API 对接。
这篇文章我将从零开始,手把手教你怎么用 Tardis 历史数据 API 拉取 Deribit 的期权 orderbook 快照。文章末尾会告诉你怎么用 HolySheep AI 分析这些数据,两套工具组合起来做量化研究效率会高很多。
一、前置准备:你需要什么
在开始之前,请确保你已经有以下东西:
- Tardis.dev 账号:访问 tardis.dev 注册账号,新用户有免费额度可以试用
- Deribit 测试网账号(可选):如果你需要测试数据,建议先用测试网
- 基础 Python 环境:推荐 Python 3.8 以上
- 网络环境:国内访问需要稳定网络,延迟大概在 80-150ms 左右
(文字模拟截图提示:打开 tardis.dev 官网,点击右上角 "Sign Up",填写邮箱和密码完成注册)
二、什么是 Orderbook 快照?
简单说,orderbook 就是“订单簿”,记录了某个时刻所有买家和卖家的挂单信息。一个快照(snapshot)就是在某个具体时间点,orderbook 的完整状态。
对于期权来说,orderbook 快照包含:
- 看涨期权(Call)和看跌期权(Put)的买卖盘信息
- 每个价格档位的挂单数量
- 时间戳(精确到毫秒)
我第一次拉数据时,拿到的是一串嵌套的 JSON 结构,看了半天没看懂。后来我才明白,这些数据是按买卖方向分层存储的。
三、Tardis API 基础调用方法
Tardis 提供了 REST API 和 WebSocket 两种方式获取数据。对于历史快照,REST API 更简单直接。
3.1 基础请求格式
Tardis 的 API 基础 URL 是:
https://api.tardis.dev/v1
获取 Deribit 期权 orderbook 快照的核心端点是:
https://api.tardis.dev/v1/derivative/deribit/orderbook_snapshots
3.2 Python 实战代码
下面是完整的 Python 示例代码,我用这个脚本成功拉到了 2025 年底的 Deribit BTC 期权 orderbook 数据:
import requests
import json
from datetime import datetime, timedelta
Tardis API 配置
TARDIS_API_KEY = "your_tardis_api_key_here" # 替换成你的 API Key
BASE_URL = "https://api.tardis.dev/v1"
设置请求头
headers = {
"Authorization": f"Bearer {TARDIS_API_KEY}",
"Content-Type": "application/json"
}
查询参数
params = {
"exchange": "deribit",
"symbol": "BTC-PERPETUAL", # BTC 永续期权
"start_time": "2025-12-01T00:00:00Z",
"end_time": "2025-12-01T01:00:00Z",
"limit": 100 # 单次最多返回条数
}
发起请求
response = requests.get(
f"{BASE_URL}/derivative/deribit/orderbook_snapshots",
headers=headers,
params=params
)
检查响应状态
if response.status_code == 200:
data = response.json()
print(f"成功获取 {len(data)} 条快照数据")
# 打印第一条数据看看结构
if data:
print(json.dumps(data[0], indent=2))
else:
print(f"请求失败: {response.status_code}")
print(response.text)
我第一次运行这段代码时,遇到了 401 错误。排查了半天发现是 API Key 格式写错了,Tardis 的 Key 前面要加 Bearer 前缀。
3.3 响应数据结构解析
成功请求后,你会得到类似这样的 JSON 结构:
{
"timestamp": "2025-12-01T10:30:00.123456Z",
"symbol": "BTC-PERPETUAL",
"exchange": "deribit",
"data": {
"bids": [
["105000.5", "12.5"], # [价格, 数量]
["105000.0", "8.3"],
["104999.5", "25.0"]
],
"asks": [
["105001.0", "15.2"],
["105001.5", "9.7"],
["105002.0", "30.0"]
]
}
}
我注意到 bids 是买方报价(价格从高到低排序),asks 是卖方报价(价格从低到高排序)。每个嵌套数组的第一位是价格,第二位是挂单量。
四、按期权类型过滤数据
Deribit 的期权产品很多,如果你只想拉某个具体品种的数据,可以在 symbol 参数中指定。
# 只拉取 BTC 看涨期权(Call) orderbook
params_call = {
"exchange": "deribit",
"symbol": "BTC-28MAR2025-100000-C", # C 表示 Call
"start_time": "2025-03-20T00:00:00Z",
"end_time": "2025-03-20T23:59:59Z",
"limit": 500
}
只拉取 BTC 看跌期权(Put) orderbook
params_put = {
"exchange": "deribit",
"symbol": "BTC-28MAR2025-95000-P", # P 表示 Put
"start_time": "2025-03-20T00:00:00Z",
"end_time": "2025-03-20T23:59:59Z",
"limit": 500
}
批量请求函数
def fetch_orderbook_data(symbol, start, end, limit=100):
params = {
"exchange": "deribit",
"symbol": symbol,
"start_time": start,
"end_time": end,
"limit": limit
}
response = requests.get(
f"{BASE_URL}/derivative/deribit/orderbook_snapshots",
headers=headers,
params=params
)
if response.status_code == 200:
return response.json()
else:
raise Exception(f"API 请求失败: {response.status_code}")
测试调用
try:
call_data = fetch_orderbook_data(
"BTC-28MAR2025-100000-C",
"2025-03-20T00:00:00Z",
"2025-03-20T23:59:59Z"
)
print(f"成功获取 Call 期权 {len(call_data)} 条快照")
except Exception as e:
print(f"错误: {e}")
我实际使用中发现,期权 symbol 的命名规则是:标的-到期日-行权价-C/P。比如 "BTC-28MAR2025-100000-C" 表示 2025 年 3 月 28 日到期、行权价 100000 的 BTC 看涨期权。
五、数据导出与存储
拉到数据后,你需要存下来做后续分析。我推荐用 Parquet 格式存储,压缩率高且查询速度快。
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq
from pathlib import Path
def save_orderbook_to_parquet(data, filename):
"""将 orderbook 快照数据保存为 Parquet 文件"""
records = []
for snapshot in data:
timestamp = snapshot["timestamp"]
bids = snapshot["data"]["bids"]
asks = snapshot["data"]["asks"]
# 展开 bids 数据
for price, volume in bids:
records.append({
"timestamp": timestamp,
"side": "bid",
"price": float(price),
"volume": float(volume),
"symbol": snapshot["symbol"]
})
# 展开 asks 数据
for price, volume in asks:
records.append({
"timestamp": timestamp,
"side": "ask",
"price": float(price),
"volume": float(volume),
"symbol": snapshot["symbol"]
})
# 转换为 DataFrame
df = pd.DataFrame(records)
df["timestamp"] = pd.to_datetime(df["timestamp"])
# 保存为 Parquet
output_path = Path(f"./data/{filename}.parquet")
output_path.parent.mkdir(parents=True, exist_ok=True)
df.to_parquet(output_path, engine="pyarrow", compression="snappy")
print(f"已保存 {len(df)} 条记录到 {output_path}")
return df
使用示例
df = save_orderbook_to_parquet(call_data, "btc_call_orderbook_20250320")
简单统计分析
print(f"数据时间范围: {df['timestamp'].min()} 至 {df['timestamp'].max()}")
print(f"Bid 价格范围: {df[df['side']=='bid']['price'].min():.2f} - {df[df['side']=='bid']['price'].max():.2f}")
print(f"Ask 价格范围: {df[df['side']=='ask']['price'].min():.2f} - {df[df['side']=='ask']['price'].max():.2f}")
我用这套流程存了三个月的 Deribit BTC 期权数据,总共大约 2GB 的 Parquet 文件,用 pandas 加载查询基本在 1 秒以内。
六、如何用 HolySheep AI 分析这些数据
拉到的 orderbook 数据是原始的,如果你想做深度分析,可以用 HolySheep AI 来帮你解读。我经常把 orderbook 数据丢给 AI,让它帮我识别大户动向和异常交易。
下面是一个用 HolySheep 分析 orderbook 的示例:
import requests
import json
HolySheep API 配置
HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY" # 从 https://www.holysheep.ai/register 获取
HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"
构造分析 prompt
analysis_prompt = """请分析以下 Deribit BTC 期权 orderbook 快照数据:
1. 买卖盘深度对比
2. 隐含波动率估算
3. 异常大单检测
4. 市场情绪判断
数据样例:
"""
添加数据样例
sample_data = call_data[:10] # 取前10条
analysis_prompt += json.dumps(sample_data, indent=2)
调用 HolySheep Chat Completion API
response = requests.post(
f"{HOLYSHEEP_BASE_URL}/chat/completions",
headers={
"Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
"Content-Type": "application/json"
},
json={
"model": "gpt-4.1", # $8/MTok,适合复杂分析
"messages": [
{"role": "user", "content": analysis_prompt}
],
"temperature": 0.3,
"max_tokens": 2000
}
)
if response.status_code == 200:
result = response.json()
analysis = result["choices"][0]["message"]["content"]
print("=== AI 分析结果 ===")
print(analysis)
# 计算成本
input_tokens = result["usage"]["prompt_tokens"]
output_tokens = result["usage"]["completion_tokens"]
cost = (input_tokens / 1_000_000) * 2.50 + (output_tokens / 1_000_000) * 8.00
print(f"\n本次分析成本: ${cost:.4f}")
else:
print(f"API 调用失败: {response.status_code}")
print(response.text)
我对比过几家 AI API 的价格,HolySheep 的 GPT-4.1 是 $8/MTok,比官方价格便宜很多,而且支持微信/支付宝充值,对于国内开发者来说非常方便。关键是不用科学上网,国内直连延迟 <50ms。
七、常见报错排查
错误 1:401 Unauthorized - API Key 无效
# 错误信息
{"error": "Invalid API key"}
原因:API Key 格式错误或已过期
解决方案
1. 检查 API Key 是否正确复制(不要有空格或换行)
2. 确保请求头包含 "Authorization: Bearer {YOUR_KEY}"
3. 在 tardis.dev 控制台检查 Key 是否还有效
正确的请求头格式
headers = {
"Authorization": "Bearer " + TARDIS_API_KEY, # 注意空格
"Content-Type": "application/json"
}
我第一次对接时,把 API Key 复制到了 Bearer 后面但忘了加空格,导致一直 401。
错误 2:400 Bad Request - 时间范围超限
# 错误信息
{"error": "Time range too large, maximum is 24 hours"}
原因:单次请求的时间范围超过了 API 限制
解决方案
1. 将大时间范围拆分成多个小请求
2. 使用循环分批获取数据
def fetch_date_range(symbol, start_date, end_date):
"""分批获取指定日期范围的数据"""
all_data = []
current_start = datetime.fromisoformat(start_date)
end = datetime.fromisoformat(end_date)
while current_start < end:
current_end = current_start + timedelta(hours=23, minutes=59)
if current_end > end:
current_end = end
params = {
"exchange": "deribit",
"symbol": symbol,
"start_time": current_start.isoformat() + "Z",
"end_time": current_end.isoformat() + "Z",
"limit": 1000
}
response = requests.get(
f"{BASE_URL}/derivative/deribit/orderbook_snapshots",
headers=headers,
params=params
)
if response.status_code == 200:
all_data.extend(response.json())
print(f"已获取 {len(all_data)} 条数据...")
current_start = current_end + timedelta(seconds=1)
time.sleep(0.1) # 避免请求过快
return all_data
我曾经试图一次性拉一个月的历史数据,结果被 API 返回 400 错误。改成按小时分批请求后就没问题了。
错误 3:429 Too Many Requests - 请求频率超限
# 错误信息
{"error": "Rate limit exceeded. Please wait 60 seconds"}
原因:请求频率太高,触发了限流
解决方案
1. 在请求之间添加延时
2. 升级到付费计划获取更高配额
3. 使用缓存避免重复请求
import time
def rate_limited_request(url, headers, params, max_retries=3):
"""带重试和限流的请求函数"""
for attempt in range(max_retries):
try:
response = requests.get(url, headers=headers, params=params)
if response.status_code == 429:
wait_time = 60 * (attempt + 1)
print(f"触发限流,等待 {wait_time} 秒...")
time.sleep(wait_time)
continue
return response
except requests.exceptions.RequestException as e:
print(f"请求异常: {e}")
time.sleep(5)
raise Exception("请求失败,已达到最大重试次数")
错误 4:Symbol 不存在
# 错误信息
{"error": "Symbol not found: BTC-WRONGSYMBOL-C"}
原因:期权 symbol 格式不正确
解决方案
1. 使用 Tardis 的 symbol 搜索 API 获取正确的 symbol
2. 注意大小写敏感
查询可用的 Deribit 期权 symbol
search_response = requests.get(
f"{BASE_URL}/derivative/deribit/symbols",
headers=headers,
params={"type": "option"} # 只返回期权类型
)
if search_response.status_code == 200:
symbols = search_response.json()
# 过滤出包含 BTC 的期权
btc_options = [s for s in symbols if "BTC" in s and "CALL" in s]
print(f"BTC 看涨期权数量: {len(btc_options)}")
print(f"示例: {btc_options[:5]}")
八、Tardis 定价与 HolySheep 组合方案
如果你需要做期权量化研究,我推荐组合使用 Tardis 和 HolySheep:
- Tardis.dev:提供 Deribit、OKX、Bybit 等交易所的历史数据,订阅费用从 $49/月起,适合需要大量历史 orderbook 做回测的用户
- HolySheep AI:提供 GPT-4.1、Claude Sonnet、Gemini 2.5 Flash 等模型,国内直连延迟 <50ms,支持微信/支付宝,汇率按 ¥7.3=$1 计算,比官方节省 85%+
我自己的使用场景是:先用 Tardis 拉历史 orderbook 数据存到本地,然后用 HolySheep 做数据分析和策略回测。整个流程月均成本大概 $150 左右,比雇人写代码便宜多了。
九、实战经验总结
我使用 Tardis + HolySheep 组合做了半年多的期权研究,有几点心得:
- 数据清洗很重要:原始 orderbook 数据经常有空值或异常值,我用 pandas 做预处理,剔除明显错误的数据点
- 分批请求效率高:一次请求 24 小时数据比分段请求更省 API 调用次数
- 缓存复用:同一份数据可能被多次分析,存成 Parquet 文件方便后续查询
- 用 AI 辅助研究:以前要花几天写的分析报告,现在用 HolySheep 几个小时就能完成初稿
整体来说,这套工具链对于个人量化研究者非常友好。如果你也是刚入门期权数据分析,推荐从 Tardis 的免费额度开始试起。
下一步行动
现在你已经掌握了用 Tardis API 拉取 Deribit 期权 orderbook 快照的方法。如果你想进一步用 AI 分析这些数据,建议:
- 先去 Tardis.dev 注册,获取免费试用额度
- 然后到 HolySheep AI 注册,获取首月赠额度和优惠价格
- 运行本文的示例代码,尝试拉取你感兴趣的期权数据
有问题可以随时在评论区留言,我会尽量解答。