我第一次接触 Deribit 期权数据时,踩过最大的坑就是——官方 API 限速严重、订单簿深度只保留最近几天、历史 IV 几乎拿不到。如果你也在做波动率曲面研究或者量化因子回测,这篇教程会带你用 HolySheep AI 中转的 Tardis.dev 高频数据,从零搭建一套完整的 IV 曲面重建 + Greeks 因子回测框架。整篇文章不需要你写过一行期权代码,我会像聊天一样带你走完全流程。

一、为什么我们需要 Deribit 历史期权数据

Deribit 是目前全球最大的加密货币期权交易所,BTC 和 ETH 的未平仓合约量长期占行业 80% 以上。做期权研究的核心是「隐含波动率曲面(IV Surface)」——简单说,就是同一标的、不同行权价、不同到期日所对应的隐含波动率组成的一个三维曲面。这个曲面能告诉我们:

问题在于,Deribit 官方 API 只提供最近几天的订单簿快照,历史逐笔成交、深度、强平数据几乎拿不到。而学术研究、因子回测、Greeks 套利,都需要至少 6-12 个月的历史 tick 级数据。

二、为什么我选 HolySheep 的 Tardis.dev 中转

我自己对比过三个方案:

我最终选了 C 方案,不光是因为便宜,更关键的是 HolySheep 把 Tardis.dev 复杂的 S3 文件协议封装成了 REST 接口,对新手非常友好。下面开始实战。

三、环境准备(小白版)

假设你电脑上什么都没装,我们一步步来:

  1. 打开终端,输入 python --version,确认 Python ≥ 3.9。
  2. 创建项目文件夹:mkdir iv-surface && cd iv-surface
  3. 安装依赖:pip install requests pandas numpy scipy matplotlib
  4. 登录 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