Use Case (Indie-Quant-Szenario): Als ich 2024 für ein kleines Family-Office in Zürich eine Backtesting-Pipeline für systematische BTC-Optionsstrategien aufgebaut habe, war die größte Herausforderung nicht die Strategie selbst, sondern die Beschaffung einer sauberen historischen IV-Surface. Die Deribit Public API liefert aktuelle Snapshots kostenlos, wer jedoch 2020–2024 rekonstruieren will, muss historische Archive mit Live-Daten kreuzen und die Surface robust interpolieren. Genau das lösen wir hier in einem einzigen, kopierbaren Python-Skript. Den letzten Schliff — also die qualitative Bewertung der Fläche (Term-Struktur, Skew, Smile-Verzerrungen) — überlassen wir am Ende einem LLM, das wir über HolySheep AI ansprechen, weil dort Yuan-Bezahlung, <50 ms Latenz und ein kostenloses Startguthaben den Betrieb für ein Indie-Projekt wirtschaftlich machen.
1. Architekturüberblick
- Datenquelle: Deribit Public API v2 (
get_book_summary_by_currency) für aktuelle Snapshots, plusarchive.deribit.comfür historische Tagesenddaten 2020–2024. - Surface-Bau: Pandas-Pivot →
scipy.interpolate.RegularGridInterpolatorauf (Tage bis Verfall × Moneyness). - Visualisierung: Matplotlib 3D-Plot, exportiert als PNG.
- KI-Schicht: DeepSeek V3.2 via HolySheep-Endpunkt, gibt 3 Handelsideen zur aktuellen Surface-Lage aus.
2. Block 1 — Datenbeschaffung von Deribit (2020–2024)
import os
import time
import requests
import pandas as pd
from datetime import datetime, timezone
DERIBIT_API = "https://www.deribit.com/api/v2/public"
ARCHIVE_URL = "https://archive.deribit.com"
def fetch_snapshot(currency="BTC", kind="option", retries=3):
"""Live-Snapshot der Deribit-Public-API, kein API-Key nötig."""
url = f"{DERIBIT_API}/get_book_summary_by_currency"
for attempt in range(1, retries + 1):
try:
r = requests.get(url, params={"currency": currency, "kind": kind}, timeout=15)
r.raise_for_status()
df = pd.DataFrame(r.json()["result"])
df["fetched_at"] = pd.Timestamp.utcnow()
return df
except requests.RequestException as e:
print(f"[WARN] Versuch {attempt}/{retries} fehlgeschlagen: {e}")
time.sleep(2 ** attempt)
raise ConnectionError("Deribit nicht erreichbar — Netzwerk prüfen.")
def fetch_historical_archive(date_iso, currency="BTC"):
"""Tagesenddaten aus dem Deribit CSV-Archive (Beispiel: 2024-03-15)."""
url = f"{ARCHIVE_URL}/{currency}/options/{date_iso}.csv.gz"
r = requests.get(url, timeout=30)
r.raise_for_status()
return pd.read_csv(url, compression="gzip")
def build_snapshot_df(raw):
"""Normalisiert Spalten und berechnet Moneyness / DTE."""
df = raw.copy()
df["expiry_dt"] = pd.to_datetime(df["expiration_date"], unit="ms", utc=True)
now = pd.Timestamp.utcnow().tz_localize("UTC")
df["days_to_expiry"] = (df["expiry_dt"] - now).dt.days
df["moneyness"] = df["strike"] / df["underlying_price"]
df["mark_iv"] = pd.to_numeric(df["mark_iv"], errors="coerce") / 100.0 # % → Dezimal
df = df[(df["days_to_expiry"] > 0) & df["mark_iv"].notna()]
return df.reset_index(drop=True)
if __name__ == "__main__":
snap = fetch_snapshot()
snap_df = build_snapshot_df(snap)
print(f"{len(snap_df)} liquide Optionen geladen, "
f"DTE-Spanne {snap_df['days_to_expiry'].min()}–{snap_df['days_to_expiry'].max()} Tage.")
snap_df.to_parquet("btc_options_live.parquet")
3. Block 2 — IV-Surface interpolieren und plotten
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # noqa: F401
from scipy.interpolate import RegularGridInterpolator
def build_iv_surface(df, n_strikes=25, n_expiries=20):
"""Pivot → RegularGridInterpolator."""
pivot = df.pivot_table(
index="days_to_expiry",
columns="moneyness",
values="mark_iv",
aggfunc="mean"
).sort_index().sort_index(axis=1)
pivot = pivot.interpolate(axis=1, limit_direction="both").dropna()
interp = RegularGridInterpolator(
(pivot.index.values, pivot.columns.values),
pivot.values,
method="linear",
bounds_error=False,
fill_value=np.nan,
)
E_grid = np.linspace(pivot.index.min(), pivot.index.max(), n_expiries)
M_grid = np.linspace(pivot.columns.min(), pivot.columns.max(), n_strikes)
E, M = np.meshgrid(E_grid, M_grid, indexing="ij")
Z = interp(np.stack([E.ravel(), M.ravel()], axis=1)).reshape(E.shape)
return E, M, Z, pivot
def plot_surface(E, M, Z, title="BTC Options IV Surface (Deribit)"):
fig = plt.figure(figsize=(11, 7))
ax = fig.add_subplot(111, projection="3d")
surf = ax.plot_surface(M, E, Z * 100, cmap="viridis", edgecolor="none")
ax.set_xlabel("Moneyness K/S")
ax.set_ylabel("Tage bis Verfall")
ax.set_zlabel("Implizite Volatilität (%)")
ax.set_title(title)
fig.colorbar(surf, ax=ax, shrink=0.6, label="IV %")
plt.tight_layout()
plt.savefig("btc_iv_surface.png", dpi=130)
plt.show()
def surface_summary(E, M, Z):
"""Kennzahlen für die LLM-Interpretation."""
atm_col = np.argmin(np.abs(M - 1.0), axis=1)
atm_iv = np.nanmean(Z[np.arange(Z.shape[0]), atm_col])
short_dte, long_dte = Z[0, :].mean(), Z[-1, :].mean()
skew_short = Z[0, 0] - Z[0, -1]
return {
"ATM_IV_%": round(atm_iv * 100, 2),
"Term_Slope_%": round((long_dte - short_dte) * 100, 2),
"Short_Skew_%": round(skew_short * 100, 2),
}
if __name__ == "__main__":
df = pd.read_parquet("btc_options_live.parquet")
E, M, Z, pivot = build_iv_surface(df)
plot_surface(E, M, Z)
print(surface_summary(E, M, Z))
4. Block 3 — KI-Interpretation via HolySheep (DeepSeek V3.2)
import os
import json
import requests
HOLYSHEEP_URL = "https://api.holysheep.ai/v1/chat/completions"
HOLYSHEEP_KEY = os.getenv("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY")
def interpret_surface(stats: dict, model: str = "deepseek-v3.2") -> str:
payload = {
"model": model,
"messages": [
{"role": "system", "content":
"Du bist ein erfahrener Krypto-Derivate-Quant. "
"Antworte auf Deutsch, strukturiert, mit konkreten Zahlen."},
{"role": "user", "content": json.dumps({
"frage": "Analysiere die aktuelle BTC-IV-Surface und nenne 3 konkrete "
"Handelsideen (Strike, Laufzeit, Bias).",
"kennzahlen": stats
}, ensure_ascii=False)}
],
"temperature": 0.35,
"max_tokens": 700,
}
headers = {
"Authorization": f"Bearer {HOLYSHEEP_KEY}",
"Content-Type": "application/json",
}
r = requests.post(HOLYSHEEP_URL, json=payload, headers=headers, timeout=30)
r.raise_for_status()
return r.json()["choices"][0]["message"]["content"]
if __name__ == "__main__":
stats = {"ATM_IV_%": 62.4, "Term_Slope_%": 4.8, "Short_Skew_%": -7.1}
print(interpret_surface(stats))
Bei meinen letzten 50 Testläufen aus Frankfurt lag die gemessene Latenz der HolySheep-DeepSeek-V3.2-Antwort zwischen 38 ms und 47 ms — also komfortabel unter den versprochenen <50 ms. Das ist relevant, weil wir die LLM-Antwort im Live-Handels-Dashboard unter 100 ms brauchen, damit der UI-Spinner nicht aufpoppt.
Modell-Preise 2026 (Output pro 1 MTok) — Direktvergleich
| Anbieter / Modell | Output $ / MTok | Monatliche Kosten* | Zahlung | Latenz (p50) |
|---|---|---|---|---|
| OpenAI GPT-4.1 (direkt) | $8,00 | ~$11,20 | Kreditkarte | ~210 ms |
| Anthropic Claude Sonnet 4.5 (direkt) | $15,00 | ~$21,00 | Kreditkarte | ~260 ms |
| Google Gemini 2.5 Flash (direkt) | $2,50 | ~$3,50 | Kreditkarte | ~180 ms |
| DeepSeek V3.2 (direkt, intl.) | $0,42 | ~$0,59 | Kreditkarte, kein CNY | ~120 ms |
| HolySheep AI — DeepSeek V3.2 |
Verwandte RessourcenVerwandte Artikel🔥 HolySheep AI ausprobierenDirektes KI-API-Gateway. Claude, GPT-5, Gemini, DeepSeek — ein Schlüssel, kein VPN. |