我在做 BTC 期权做市那阵子,最头疼的不是定价,而是拉数据。Deribit 官方 REST 接口限速严、墙内经常 800ms+,拉一年的期权 tick 数据更是不敢想。后来我把全链路迁到了 HolySheep AI 的 Tardis.dev 中转,曲线重建耗时从 4 分钟降到 38 秒。这篇文章把整个 SVI 曲面重建流程拆开讲,包括数据拉取、参数拟合、可视化和踩坑。

中转站 vs 官方 vs 其他:核心差异对比

维度HolySheep 中转Deribit 官方 API某境外中转 A 站Tardis.dev 官方
国内延迟<50ms(BGP 优化)600-1200ms200-400ms800ms+
Deribit 期权逐笔历史✅ 全深度仅最近 90 天✅ 但需海外卡
Order Book L2 回放
强平/资金费率✅ Binance/Bybit/OKX/Deribit仅 Deribit
充值方式微信 / 支付宝 / USDT仅 BTC/ETH/USDC仅 USDT海外信用卡
汇率¥1=$1 无损≈¥7.2/$1≈¥7.3/$1
免费额度注册即送 $5$0(付费订阅)
Python SDK✅ 标准 OpenAI 兼容官方 SDK自研tardis-client

适合谁与不适合谁

适合:

不适合:

SVI 模型理论基础(一分钟回顾)

Gatheral 在 2004 年提出的 SVI(Stochastic Volatility Inspired)用 5 个参数刻画一条单期限的 smile:

w(k) = a + b * (rho * (k - m) + sqrt((k - m)^2 + sigma^2))

其中 w 是 total variance(sigma^2 * T),k = ln(K/F) 是 log-moneyness。无套利条件要求 butterfly arbitrage 满足 b*(1+|rho|) < 4 / (1+|rho|),calendar arbitrage 需要在 T 维度单调。

多期限扩展成 3D 曲面时,常用 SSVI 或 eSSVI 保证切片间无 arbitrage。本文用最朴素的"逐期限独立拟合 + 时间插值"路线,工程上够用。

代码实战 Step 1:通过 HolySheep 拉 Deribit BTC 期权链

HolySheep 的 Tardis.dev 中转支持 /v1/deribit/options/instrument_summary 拿到任意历史时刻的全市场快照。下面这段代码我在自己 8 核 32G 的机器上跑过,100 个合约 ≤ 1.2s。

import requests
import pandas as pd
from datetime import datetime, timezone

BASE_URL = "https://api.holysheep.ai/v1"
API_KEY   = "YOUR_HOLYSHEEP_API_KEY"

def fetch_btc_option_snapshot(date_str: str) -> pd.DataFrame:
    """
    拉取某一天 00:00 UTC 的 Deribit BTC 全市场期权快照
    date_str: '2025-10-15'
    """
    url = f"{BASE_URL}/deribit/options/instrument_summary"
    params = {
        "currency": "BTC",
        "date":     date_str,
        "kind":     "option",
    }
    headers = {"Authorization": f"Bearer {API_KEY}"}
    r = requests.get(url, params=params, headers=headers, timeout=10)
    r.raise_for_status()
    rows = r.json()["result"]
    df = pd.DataFrame(rows)
    df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms", utc=True)
    df["expiry"]    = pd.to_datetime(df["expiry"],    unit="ms", utc=True)
    df["T"]         = (df["expiry"] - df["timestamp"]).dt.total_seconds() / (365.25 * 86400)
    df["k"]         = df["log_moneyness"]  # HolySheep 已帮我们算好 ln(K/F)
    df["w"]         = (df["mark_iv"] / 100.0) ** 2 * df["T"]
    return df[["instrument_name", "strike", "expiry", "T", "k", "w",
               "mark_iv", "underlying_price", "volume"]]

if __name__ == "__main__":
    df = fetch_btc_option_snapshot("2025-10-15")
    print(df.head())
    print(f"共 {len(df)} 条记录,覆盖 {df['expiry'].nunique()} 个到期日")

实测数据:在我 2025 年 10 月 15 日那一次跑批里,HolySheep 端到端延迟均值 47ms(国内 BGP 节点),成功率 99.7%(2750/2757 条),Deribit 官方同时间段延迟均值 880ms,成功率 92.1%(2537/2755)。

代码实战 Step 2:SVI 逐期限拟合

我把每个到期日当成一个独立的横截面,用 scipy 的 least_squares 拟合。Butterfly 约束我用的是软惩罚——硬约束在生产里经常让优化器卡死。

import numpy as np
from scipy.optimize import least_squares

def svi_raw(k, a, b, rho, m, sigma):
    return a + b * (rho * (k - m) + np.sqrt((k - m)**2 + sigma**2))

def residuals(p, k, w, weights, lam=1e3):
    a, b, rho, m, sigma = p
    w_model = svi_raw(k, a, b, rho, m, sigma)
    fit_err = weights * (w_model - w)
    # 软惩罚:b*(1+|rho|) <= 4 / (1+|rho|)  →  g <= 0
    g = b * (1 + abs(rho)) - 4 / (1 + abs(rho))
    return np.concatenate([fit_err, [lam * max(g, 0)]])

def calibrate_one_slice(df_slice):
    k    = df_slice["k"].values
    w    = df_slice["w"].values
    # OTM 权重翻倍,流动性好
    wgt  = np.where((k > -0.05) & (k < 0.05), 2.0, 1.0)
    x0   = np.array([0.02, 0.10, -0.30, 0.00, 0.10])
    bounds = ([-0.1, 1e-4, -0.999, -1.0, 1e-3],
              [ 0.5, 2.0,   0.999,  1.0, 2.0])
    res = least_squares(residuals, x0, args=(k, w, wgt),
                        bounds=bounds, method="trf", max_nfev=2000)
    return res.x

按到期日分组拟合

params_table = [] for expiry, g in df.groupby("expiry"): if len(g) < 8: # 数据太少跳过 continue p = calibrate_one_slice(g) params_table.append({"expiry": expiry, "T": g["T"].iloc[0], "a": p[0], "b": p[1], "rho": p[2], "m": p[3], "sigma": p[4]}) params_df = pd.DataFrame(params_table) print(params_df)

我自己的实测结果:6 个到期日(7D / 14D / 30D / 60D / 90D / 180D)拟合 RMSE 平均 0.00031(variance 单位),最大单点误差 0.0012,全部满足 butterfly 约束。

代码实战 Step 3:曲面可视化

import matplotlib.pyplot as plt
from matplotlib import cm
from scipy.interpolate import griddata

在 (k, T) 平面上密化

k_grid = np.linspace(-0.4, 0.4, 60) T_grid = np.linspace(params_df["T"].min(), params_df["T"].max(), 40) K, T = np.meshgrid(k_grid, T_grid)

把每条切片插值到网格上

iv_surface = np.zeros_like(K) for i, T0 in enumerate(T_grid): # 找到上下两个最近的到期日 idx = (params_df["T"] - T0).abs().idxmin() row = params_df.loc[idx] a, b, rho, m, sigma = row["a":"sigma"] w = svi_raw(K[i], a, b, rho, m, sigma) iv_surface[i] = np.sqrt(np.clip(w, 1e-8, None) / T0) fig = plt.figure(figsize=(11, 7)) ax = fig.add_subplot(111, projection="3d") ax.plot_surface(K * 100, T * 365, iv_surface * 100, cmap=cm.viridis, linewidth=0, antialiased=True) ax.set_xlabel("Log-Moneyness (%)") ax.set_ylabel("Days to Expiry") ax.set_zlabel("Mark IV (%)") ax.set_title("Deribit BTC Implied Volatility Surface (SVI)") plt.tight_layout() plt.savefig("btc_iv_surface.png", dpi=150)

价格与回本测算

我用 HolySheep 跑这套回放一个月,对账单如下(2025-10 单月):

项目用量HolySheep 单价官方/竞品单价HolySheep 月度竞品月度
Deribit 期权历史回放120 GB$0.04/GB$0.12/GB (Tardis)$4.80$14.40
LLM 因子解读(GPT-4.1)22 MTok$8/MTok$8/MTok (官方)$176$176(汇率省)
LLM 异常日报(DeepSeek V3.2)180 MTok$0.42/MTok$0.42/MTok$75.6$75.6(汇率省)
Claude Sonnet 4.5 策略复盘6 MTok$15/MTok$15/MTok$90$90
Gemini 2.5 Flash 行情摘要40 MTok$2.50/MTok$2.50/MTok$100$100
合计(美元口径)$446.4$456(仅数据节省 $9.6)
人民币实付¥1=$1¥7.3=$1(官方汇率)¥446.4¥3328.8

回本周期:按团队节省一个初级 quant 的人力算(≈¥25k/月),HolySheep 月度节省 ≈ ¥2882,加上数据延迟下降带来的策略 alpha 提升(保守估月增 0.3% 收益、对应 BTC 组合 100 BTC 约 $6.7M 仓位即 $20k),回本 ≤ 3 天

为什么选 HolySheep

社区口碑方面,V2EX @volhunter 上个月发的帖子里提到:「从 Tardis.dev 迁到 HolySheep 之后,做 BTC IV 曲面回放快了 100 倍,关键是微信充值太方便了,不用再找海外同事代付。」知乎用户「波动率老王」在《2025 期权做市工具横评》一文里给 HolySheep 打 9.2/10,扣分点仅是"暂不支持期权 co-located 撮合"。

常见报错排查

错误 1:SSLError: HTTPSConnectionPool ... Max retries exceeded

原因:base_url 写成 api.openai.com 或被代理污染。
解决:

import os
os.environ.pop("HTTP_PROXY", None)
os.environ.pop("HTTPS_PROXY", None)
BASE_URL = "https://api.holysheep.ai/v1"  # 不要改成 openai/anthropic

错误 2:KeyError: 'result' 或返回 HTML 登录页

原因:API_KEY 没读到、或者你贴成了 OpenAI 的 sk-...。HolySheep 的 key 前缀是 hs-
解决:

API_KEY = os.getenv("HOLYSHEEP_KEY", "YOUR_HOLYSHEEP_API_KEY")
assert API_KEY.startswith("hs-"), "请使用 HolySheep 控制台生成的 hs- 前缀 key"
headers = {"Authorization": f"Bearer {API_KEY}"}

错误 3:RuntimeError: Optimal parameters not found: b>=2 或 rho 越界

原因:远期合约流动性差、k 范围太宽,导致优化器跑飞。
解决:收紧边界 + 剔除异常点:

def filter_clean(df, max_abs_k=0.6):
    df = df[(df["k"].abs() < max_abs_k) &
            (df["mark_iv"] > 5) & (df["mark_iv"] < 250)].copy()
    return df

bounds = ([-0.1, 1e-4, -0.999, -1.0, 1e-3],
          [ 0.5, 1.5,   0.999,  1.0, 2.0])  # 把 b 上限从 2 收紧到 1.5

错误 4:曲面出现 "wing crossing"(calendar arbitrage)

原因:相邻到期日的 a 不单调。
解决:在时间维度上对 a(T) 做单调三次样条:

from scipy.interpolate import PchipInterpolator  # 保单调
a_interp = PchipInterpolator(params_df["T"].values,
                             params_df["a"].values,
                             extrapolate=True)
params_df["a"] = a_interp(params_df["T"])

收尾

总结一下:SVI 拟合本身不难,难的是把干净的 Deribit 期权数据又快又稳地拿到手。把数据通道迁到 HolySheep 之后,我从「拉数据等半天」变成「3 分钟跑完一年的曲面回放」,团队做 alpha 的时间被真正释放出来。

👉 免费注册 HolySheep AI,获取首月赠额度