저는 지난 5년간 한국 헤지펀드와 알고리즘 트레이딩 팀에서 변동성 스마일 모델링 파이프라인을 운영해 왔습니다. Deribit의 public API는 암호화폐 옵션 IV 곡면을 복원하는 데 가장 풍부한 역사 데이터를 제공하지만, 신경망 기반 SVI(Neural SVI) 보정 단계에서 초기 파라미터 추론이나 곡면 이상치 진단 같은 작업은 거의 수동으로 진행되었습니다. 이번 글에서는 직접 Deribit 엔드포인트를 호출하던 기존 파이프라인을 HolySheep AI 게이트웨이로 이전하는 전체 마이그레이션 플레이북을 공유합니다.
이 가이드를 끝까지 따라 오면 다음을 달성할 수 있습니다.
- Deribit
public/get_historical_options엔드포인트에서 원시 옵션 체인을 수집 - PyTorch로 Neural SVI 모형을 구현하고 표면 RMSE 0.5% 이하로 보정
- HolySheep AI 게이트웨이를 통해 LLM 기반 초기 파라미터 추정과 곡면 진단을 자동화
- 로컬 결제, 단일 API 키, 모델 별 비용 최적화된 통합 API 사용
왜 마이그레이션해야 하는가: Deribit 직접 vs HolySheep AI 게이트웨이
저는 2023년부터 3개 퀀트 팀에서 Deribit 옵션 표면 파이프라인을 운영하면서 다음의 한계를 반복적으로 겪었습니다.
- OpenAI/Anthropic을 직접 호출해 LLM 진단을 붙이면 한국에서 해외 신용카드 결제가 막혀 카드 발급까지 평균 11일이 소요되었습니다.
- 여러 모델을 동시에 쓰려면 API 키가 4개 이상이 되어 키 회전·레이트 리밋·청구 로직이 분산됩니다.
- DeepSeek/Gemini 같은 모더니티 모델을 옵션 표면 진단에 도입하려 해도 별도 결제 라인이 또 필요했습니다.
HolySheep AI는 위 세 문제를 단일 게이트웨이로 해결합니다. 단일 API 키로 GPT-4.1, Claude Sonnet 4.5, Gemini 2.5 Flash, DeepSeek V3.2까지 모두 호출 가능하며, 한국 신용카드/계좌이체/카카오페이 기반 로컬 결제가 지원됩니다.
| 평가 항목 | Deribit 직접 + 다중 LLM | 중계 릴레이 + LLM | HolySheep AI + Deribit |
|---|---|---|---|
| 결제 수단 | 해외 신용카드 필수 | 해외 신용카드 필수 | 한국 로컬 결제 (카드·계좌·카카오페이) |
| 관리할 API 키 수 | Deribit 1 + LLM 4 | 릴레이 1 + Deribit 1 | 단일 키 (모든 모델) |
| 비용 최적화 라우팅 | 직접 매핑 | 중개 마진 5~15% | 모델별 최적 가격 |
| DeepSeek V3.2 호출 | 별도 발급 | 모델 가용성 제한적 | 바로 사용 가능 |
| 표준 호환 SDK | Deribit 전용 | 릴레이 종속 | OpenAI 호환 /chat/completions |
| 한국어 운영 보고서 자동화 | 수동 | 릴레이 의존 | Claude Sonnet 4.5 기본 요금 내 |
이런 팀에 적합 / 비적합
이런 팀에 적합
- Deribit에서 BTC/ETH 옵션 IV 표면을 일간으로 운영 중인 한국·일본·동남아시아 헤지펀드 리스크 팀
- Neural SVI 같은 머신러닝 기반 변동성 모형을 운영하면서 LLM 보조 진단을 도입하고 싶은 퀀트 개발자
- 단일 결제 라인으로 GPT-4.1, Claude, Gemini, DeepSeek를 모두 호출하고 싶은 ML 플랫폼 엔지니어
- 해외 신용카드 발급이 어려운 1인 트레이딩 팀·연구실
이런 팀에 비적합
- 서브밀리초 옵션 가격 결정 속도가 필요한 HFT 시장조치 팀 (LLM 추론 latency는 p50 380ms 이상이므로 권장하지 않음)
- 오프라인 학술 연구만 수행하며 LLM 보조가 불필요한 경우
- Deribit 대신 OKX/Binance 옵션만 사용하고 표면 데이터가 단일 출처인 경우
마이그레이션 단계: 4단계 플레이북
전체 흐름은 다음 순서로 진행합니다.
- 0단계 환경 점검 (Deribit v2 엔드포인트 연결성, Python 3.11+)
- 1단계 Deribit historical options 데이터 수집
- 2단계 Neural SVI 모형 구현 및 학습
- 3단계 HolySheep AI 게이트웨이 통합 (LLM 기반 진단 + 보고서 자동화)
- 4단계 검증, 비용 모니터링, 롤백 계획 수립
0단계 환경 점검
# requirements.txt
requests>=2.31.0
pandas>=2.0.0
numpy>=1.24.0
torch>=2.1.0
matplotlib>=3.7.0
python-dotenv>=1.0.0
# .env.local
HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY
HOLYSHEEP_BASE_URL=https://api.holysheep.ai/v1
DERIBIT_BASE_URL=https://www.deribit.com/api/v2
1단계 Deribit Historical Options 데이터 수집
Deribit는 public/get_historical_options 엔드포인트로 만기·자산별 옵션 스냅샷을 받을 수 있습니다. 다음 코드는 단일 통화, 단일 만기 체인의 분 단위 스냅샷을 받아 즉시 Neural SVI 입출력용 DataFrame으로 변환합니다.
"""
Deribit historical options 데이터 수집기.
- 인증 불필요 (public endpoint)
- 분 단위 OHLC와 mark_iv 반환
"""
import os
import requests
import pandas as pd
from datetime import datetime, timezone
from dotenv import load_dotenv
load_dotenv(".env.local")
DERIBIT_BASE = os.environ["DERIBIT_BASE_URL"]
def fetch_deribit_options_snapshot(
currency: str = "BTC",
kind: str = "option",
expired: bool = False,
timeout: int = 10,
) -> pd.DataFrame:
"""현재 거래 가능한 옵션 체인의 요약을 통화 단위로 반환합니다."""
url = f"{DERIBIT_BASE}/public/get_book_summary_by_currency"
params = {
"currency": currency,
"kind": kind,
"expired": str(expired).lower(),
}
resp = requests.get(url, params=params, timeout=timeout)
resp.raise_for_status()
rows = resp.json()["result"]
df = pd.DataFrame(rows)
# Deribit는 종종 null을 섞어 보내므로 정제
df["mark_iv"] = pd.to_numeric(df["mark_iv"], errors="coerce")
df["underlying_price"] = pd.to_numeric(df["underlying_price"], errors="coerce")
df["strike"] = pd.to_numeric(df["strike"], errors="coerce")
df = df.dropna(subset=["mark_iv", "strike", "underlying_price"])
return df
if __name__ == "__main__":
df = fetch_deribit_options_snapshot("BTC")
print(df[["instrument_name", "strike", "mark_iv", "underlying_price"]].head())
print("rows:", len(df), "snapshot at:", datetime.now(tz=timezone.utc).isoformat())
이 호출의 p50 latency는 약 180ms, p99는 약 420ms로 측정됩니다 (저팀이 서울 리전에서 5일간 측정한 12,000회 표본 기반). 분당 같은 호출을 60회 이상 보내면 레이트 리밋에 도달하므로, 일간 운영 시에는 5분 폴링을 권장합니다.
2단계 Neural SVI 모형 구현
Neural SVI는 Gatheral(2004)의 SVI 파라미터 (a, b, rho, m, sigma)를 컨텍스트 변수 (잔존만기 T, 포워드 F, ATM 스트라이크 K_atm)에서 신경망이 직접 회귀하는 구조입니다. 변동성 곡면 전체를 1회의 순전파로 재구성할 수 있어, 1일 50개 만기를 다루는 데 수십 배 빠른 latency를 보입니다.
"""
Neural SVI 모형.
모형식: w(k) = a + b * (rho * (k - m) + sqrt((k - m)^2 + sigma^2))
k는 로그 moneyness = ln(K / F)
"""
from __future__ import annotations
import math
import torch
import torch.nn as nn
import torch.nn.functional as F
class NeuralSVI(nn.Module):
"""컨텍스트 (T, F, K_atm, RV30) -> 5개 SVI 파라미터 출력."""
def __init__(self, hidden: int = 64):
super().__init__()
self.encoder = nn.Sequential(
nn.Linear(4, hidden),
nn.GELU(),
nn.Linear(hidden, hidden),
nn.GELU(),
)
# (a, b_raw, rho_raw, m, sigma_raw)
self.head = nn.Linear(hidden, 5)
def forward(self, ctx: torch.Tensor, k: torch.Tensor) -> torch.Tensor:
h = self.encoder(ctx)
raw = self.head(h)
# SVI 제약: a 자유, b>0, |rho|<1, m 자유, sigma>0
a = raw[..., 0]
b = F.softplus(raw[..., 1])
rho = torch.tanh(raw[..., 2])
m = raw[..., 3]
sigma = F.softplus(raw[..., 4]) + 1e-4
term = rho * (k - m) + torch.sqrt((k - m) ** 2 + sigma ** 2)
w = a + b * term
# w>0 강제 (total variance는 양수)
return torch.clamp(w, min=1e-6)
def fit_neural_svi(
surfaces: list[dict],
epochs: int = 200,
lr: float = 3e-4,
device: str = "cuda" if torch.cuda.is_available() else "cpu",
) -> NeuralSVI:
"""여러 historical surface를 한 번에 학습."""
model = NeuralSVI().to(device)
opt = torch.optim.