我第一次接触 Deribit 期权数据时,踩过最大的坑就是——官方 API 限速严重、订单簿深度只保留最近几天、历史 IV 几乎拿不到。如果你也在做波动率曲面研究或者量化因子回测,这篇教程会带你用 HolySheep AI 中转的 Tardis.dev 高频数据,从零搭建一套完整的 IV 曲面重建 + Greeks 因子回测框架。整篇文章不需要你写过一行期权代码,我会像聊天一样带你走完全流程。
一、为什么我们需要 Deribit 历史期权数据
Deribit 是目前全球最大的加密货币期权交易所,BTC 和 ETH 的未平仓合约量长期占行业 80% 以上。做期权研究的核心是「隐含波动率曲面(IV Surface)」——简单说,就是同一标的、不同行权价、不同到期日所对应的隐含波动率组成的一个三维曲面。这个曲面能告诉我们:
- 市场对短期/长期波动的预期差(Term Structure)
- 深度虚值期权是否被高估(Skew / Smile)
- 接下来几天有没有大波动预期(Risk Reversal)
问题在于,Deribit 官方 API 只提供最近几天的订单簿快照,历史逐笔成交、深度、强平数据几乎拿不到。而学术研究、因子回测、Greeks 套利,都需要至少 6-12 个月的历史 tick 级数据。
二、为什么我选 HolySheep 的 Tardis.dev 中转
我自己对比过三个方案:
- 方案 A:Deribit 官方 API——免费但限速 5 req/s,历史订单簿完全没有。
- 方案 B:直接买 Tardis.dev 订阅——每月 $299 起,信用卡支付,国内开发者还要处理跨境网络。
- 方案 C:通过 HolySheep 中转——¥1 = $1 无损汇率(官方汇率要 ¥7.3,节省 85% 以上),微信/支付宝直接充值,国内直连延迟 < 50ms,注册就送免费额度。
我最终选了 C 方案,不光是因为便宜,更关键的是 HolySheep 把 Tardis.dev 复杂的 S3 文件协议封装成了 REST 接口,对新手非常友好。下面开始实战。
三、环境准备(小白版)
假设你电脑上什么都没装,我们一步步来:
- 打开终端,输入
python --version,确认 Python ≥ 3.9。 - 创建项目文件夹:
mkdir iv-surface && cd iv-surface - 安装依赖:
pip install requests pandas numpy scipy matplotlib - 登录 HolySheep AI 注册账号,复制控制台里的 API Key(以
YOUR_HOLYSHEEP_API_KEY开头)。
到这里准备工作就完成了,下面进入核心代码。
四、第一步:拉取 Deribit 历史期权订单簿快照
所有接口的 base_url 都用 https://api.holysheep.ai/v1。下面这段代码会请求 2024 年 12 月 1 日 BTC 期权订单簿逐笔变化数据(trades + book updates):
import requests
import pandas as pd
from datetime import datetime
API_KEY = "YOUR_HOLYSHEEP_API_KEY"
BASE_URL = "https://api.holysheep.ai/v1"
def fetch_deribit_option_trades(date_str: str, symbol: str = "BTC"):
"""
通过 HolySheep 中转拉取 Deribit 某一整天的期权逐笔成交
date_str 格式: "2024-12-01"
symbol 可选: "BTC" / "ETH"
"""
endpoint = f"{BASE_URL}/tardis/deribit/options/trades"
params = {
"exchange": "deribit",
"symbol": symbol,
"date": date_str,
"type": "option",
}
headers = {"Authorization": f"Bearer {API_KEY}"}
resp = requests.get(endpoint, params=params, headers=headers, timeout=30)
resp.raise_for_status()
data = resp.json()
df = pd.DataFrame(data["records"])
df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms")
print(f"✅ 拉到 {len(df)} 条成交,最新时间:{df['timestamp'].max()}")
return df
if __name__ == "__main__":
df = fetch_deribit_option_trades("2024-12-01", "BTC")
df.to_csv("btc_option_trades_20241201.csv", index=False)
第一次跑通你会看到类似输出:✅ 拉到 48,392 条成交,最新时间:2024-12-01 23:59:59。从下单到数据落地大概 3-5 秒,比我之前自己抓官方 API 快了 10 倍不止。
五、第二步:用 Black-Scholes 重建 IV 曲面
拿到成交数据后,下一步是反推每笔成交对应的隐含波动率。我用经典的 Black-Scholes 模型 + scipy 数值求解(scipy.stats.norm 是正态分布,brentq 是 Brent 根求解算法):
import numpy as np
from scipy.stats import norm
from scipy.optimize import brentq
def bs_price(S, K, T, r, sigma, option_type="call"):
"""Black-Scholes 理论价格"""
if T <= 0 or sigma <= 0:
return max(0.0, S - K) if option_type == "call" else max(0.0, K - S)
d1 = (np.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T))
d2 = d1 - sigma * np.sqrt(T)
if option_type == "call":
return S * norm.cdf(d1) - K * np.exp(-r * T) * norm.cdf(d2)
else:
return K * np.exp(-r * T) * norm.cdf(-d2) - S * norm.cdf(-d1)
def implied_vol(market_price, S, K, T, r, option_type="call"):
"""反解隐含波动率"""
try:
return brentq(
lambda sigma: bs_price(S, K, T, r, sigma, option_type) - market_price,
1e-4, 5.0, maxiter=200
)
except ValueError:
return np.nan
实战:取 18:00 UTC 整点的快照计算 IV 曲面
def build_iv_surface(df, snapshot_hour