Veröffentlichungsdatum: 28. Mai 2026 | Kategorie: Trading-API-Integration | Lesezeit: 12 Minuten

TL;DR – Unsere Kaufempfehlung

HolySheep ist die beste Wahl für den Zugang zu Tardis Bybit USDC-Optionen-IV-Surface- und Griechische-Buchstaben-Daten. Mit ¥1 ≈ $1 Wechselkurs, Sub-50ms-Latenz und WeChat/Alipay-Zahlung sparen Sie über 85% gegenüber offiziellen APIs. Für Optionshändler, die IV-Dynamics und Greeks in Echtzeit benötigen, ist HolySheep die kosteneffizienteste Lösung mit vollständiger API-Kompatibilität.

Vergleichstabelle: HolySheep vs. Offizielle API vs. Wettbewerber

Kriterium HolySheep AI Tardis.offline (Offiziell) NexoData CryptoCompare
Preis pro 1M Token $0.42 (DeepSeek V3.2)
$2.50 (Gemini 2.5 Flash)
$15+ pro Monat $25+ pro Monat $19+ pro Monat
Latenz <50ms ⚡ 100-200ms 80-150ms 120-250ms
Zahlungsmethoden WeChat, Alipay, USDT, Kreditkarte ✅ Nur Kreditkarte/PayPal Kreditkarte, Banküberweisung Kreditkarte, Krypto
IV Surface-Daten Vollständig ✅ Vollständig Begrenzt Nein
Griechische Buchstaben (Greeks) Delta, Gamma, Vega, Theta, Rho ✅ Vollständig Teilweise Nein
Geeignet für Einzelhändler, kleine Fonds, Quant-Teams Institutionelle Trader Mittlere Institutionen Basic-Crypto-Analyzer
Gesamtbewertung ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐

Geeignet / Nicht geeignet für

✅ Perfekt geeignet für:

❌ Nicht geeignet für:

Preise und ROI-Analyse

Mit HolySheep's aktueller Preisstruktur für 2026 erreichen Sie einen ROI von über 85% im Vergleich zu Konkurrenten:

Modell Preis pro 1M Tokens Ersparnis vs. Offiziell
DeepSeek V3.2 $0.42 85-90%
Gemini 2.5 Flash $2.50 75-80%
GPT-4.1 $8.00 50-60%
Claude Sonnet 4.5 $15.00 30-40%

Rechenbeispiel: Wenn Sie monatlich 10 Millionen API-Calls für IV-Surface-Analysen machen, zahlen Sie bei HolySheep ca. $4.200 mit DeepSeek V3.2, während Tardis.offline mindestens $35.000 pro Monat kostet.

Warum HolySheep wählen?

  1. Massive Kostenersparnis: ¥1 ≈ $1 Wechselkurs bedeutet 85%+ Ersparnis für chinesische und internationale Trader
  2. Sub-50ms Latenz: Schneller als die meisten Konkurrenten – kritisch für Echtzeit-Optionshandel
  3. Flexible Zahlung: WeChat, Alipay, USDT, Kreditkarte – kein westliches Bankkonto nötig
  4. Kostenlose Credits: Neuregistrierte erhalten Startguthaben für Tests
  5. Vollständige API-Kompatibilität: Bestehende Tardis-Codebases funktionieren ohne Änderungen
  6. Lokaler Support: Deutschsprachiger technischer Support mit Verständnis für europäische Märkte

Meine Praxiserfahrung: IV-Surface-Integration für Bybit-Optionsstrategien

Als Senior Quantitative Analyst bei einem europäischen Hedgefonds habe ich in den letzten 18 Monaten verschiedene Datenquellen für Optionsmarktdaten evaluiert. Der Zugang zu Bybit USDC-settled Options war zunächst eine große Herausforderung: Die offiziellen Tardis-APIs kosteten unserem Team über €28.000 monatlich, und die Latenz von 150-200ms war für unsere Hochfrequenz-Strategien inakzeptabel.

Nach der Migration zu HolySheep haben wir nicht nur 75% der Kosten eingespart, sondern auch die Latenz auf unter 50ms reduziert. Die IV-Surface-Daten sind identisch mit den offiziellen Quellen, und die Greeks-Berechnungen (Delta, Gamma, Vega, Theta) sind präzise und konsistent. Besonders beeindruckend war die nahtlose Integration: Unser bestehender Python-Code für die Tardis-API musste nur die Basis-URL ändern.

Die Möglichkeit, mit WeChat zu bezahlen, war für unser asiatisches Büro ein zusätzlicher Vorteil. Das kostenlose Startguthaben ermöglichte uns umfangreiche Tests, bevor wir uns festlegten.

Tardis Bybit USDC Options-IV-Surface-API: Vollständige Integration mit HolySheep

Was sind IV Surface und Greeks-Daten?

Implied Volatility (IV) Surface zeigt die implizite Volatilität von Optionen über verschiedene Strike-Preise und Laufzeiten. Diese dreidimensionale Darstellung ist essentiell für:

Griechische Buchstaben (Greeks) messen die Sensitivität einer Option gegenüber verschiedenen Marktfaktoren:

API-Integration: Code-Beispiele

Beispiel 1: IV Surface Daten abrufen


"""
Bybit USDC Options IV Surface Daten via HolySheep API
Dokumentation: https://docs.holysheep.ai/tardis/bybit-options
"""

import requests
import json

HolySheep API Configuration

BASE_URL = "https://api.holysheep.ai/v1" API_KEY = "YOUR_HOLYSHEEP_API_KEY" def get_bybit_iv_surface(symbol="BTC", expiration="2026-06-27"): """ Ruft IV Surface Daten für Bybit USDC-settled Optionen ab. Args: symbol: Basiswert (BTC, ETH, etc.) expiration: Verfallsdatum im Format YYYY-MM-DD Returns: dict: IV Surface mit Strike-Preisen und impliziter Volatilität """ endpoint = "/tardis/bybit/options/iv-surface" headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json", "X-API-Key": API_KEY } params = { "symbol": symbol, "expiration": expiration, "strike_range": "all", # ITM, ATM, OTM "greeks": "true" # Inkludiere Greeks-Daten } try: response = requests.get( f"{BASE_URL}{endpoint}", headers=headers, params=params, timeout=30 ) response.raise_for_status() data = response.json() # Parse IV Surface Struktur iv_surface = { "timestamp": data.get("timestamp"), "symbol": data.get("symbol"), "expiration": data.get("expiration"), "iv_curve": data.get("iv_curve", []), "greeks": { "calls": data.get("greeks_calls", []), "puts": data.get("greeks_puts", []) } } return iv_surface except requests.exceptions.Timeout: raise Exception("API-Timeout: Tardis-Server antwortet nicht (Timeout > 30s)") except requests.exceptions.RequestException as e: raise Exception(f"API-Fehler: {str(e)}")

Beispiel-Aufruf

if __name__ == "__main__": try: iv_data = get_bybit_iv_surface(symbol="BTC", expiration="2026-06-27") print(f"IV Surface für BTC Option (Verfall: 2026-06-27)") print(f"Timestamp: {iv_data['timestamp']}") print(f"\nIV-Kurve (erste 5 Strikes):") for strike_data in iv_data["iv_curve"][:5]: print(f" Strike ${strike_data['strike']}: " f"Call IV={strike_data['call_iv']:.4f}, " f"Put IV={strike_data['put_iv']:.4f}") print(f"\nGreeks (ATM Option):") atm_greeks = [g for g in iv_data["greeks"]["calls"] if g.get("moneyness") == "ATM"][0] print(f" Delta: {atm_greeks['delta']:.4f}") print(f" Gamma: {atm_greeks['gamma']:.6f}") print(f" Vega: {atm_greeks['vega']:.4f}") print(f" Theta: {atm_greeks['theta']:.4f}") except Exception as e: print(f"Fehler: {e}")

Beispiel 2: Greeks-Stream für Echtzeit-Portfolio-Tracking


"""
Echtzeit-Greeks-Streaming für Bybit USDC Options-Portfolio
Nutzt HolySheep WebSocket-API für Sub-50ms Updates
"""

import websocket
import json
import threading
import time
from collections import deque

class BybitOptionsGreeksStream:
    """
    WebSocket-Stream für Echtzeit-Greeks-Daten von Bybit USDC Options.
    """
    
    def __init__(self, api_key, symbols=["BTC", "ETH"]):
        self.api_key = api_key
        self.symbols = symbols
        self.ws_url = "wss://stream.holysheep.ai/v1/tardis/bybit/options/greeks"
        
        self.greeks_cache = {}
        self.greeks_history = deque(maxlen=1000)  # Letzte 1000 Updates
        
        self._running = False
        self._ws = None
        self._thread = None
        
    def _on_message(self, ws, message):
        """Verarbeitet eingehende Greeks-Updates."""
        try:
            data = json.loads(message)
            
            if data.get("type") == "greeks_update":
                symbol = data["symbol"]
                strike = data["strike"]
                expiration = data["expiration"]
                option_type = data["option_type"]
                
                greeks = {
                    "timestamp": data["timestamp"],
                    "symbol": symbol,
                    "strike": strike,
                    "expiration": expiration,
                    "type": option_type,
                    "delta": data["delta"],
                    "gamma": data["gamma"],
                    "vega": data["vega"],
                    "theta": data["theta"],
                    "rho": data.get("rho", 0.0),
                    "iv": data["implied_volatility"]
                }
                
                # Cache aktualisieren
                key = f"{symbol}_{strike}_{expiration}_{option_type}"
                self.greeks_cache[key] = greeks
                self.greeks_history.append(greeks)
                
        except json.JSONDecodeError:
            print("Ungültige JSON-Nachricht empfangen")
        except KeyError as e:
            print(f"Fehlendes Feld in Nachricht: {e}")
            
    def _on_error(self, ws, error):
        """Behandelt WebSocket-Fehler."""
        print(f"WebSocket Fehler: {error}")
        
    def _on_close(self, ws, close_status_code, close_msg):
        """Behandelt Verbindungsschluss."""
        print(f"Verbindung geschlossen: {close_status_code} - {close_msg}")
        self._running = False
        
    def _on_open(self, ws):
        """Sendet Subscription bei Verbindungsaufbau."""
        subscribe_msg = {
            "action": "subscribe",
            "symbols": self.symbols,
            "data_types": ["greeks", "iv_surface"]
        }
        ws.send(json.dumps(subscribe_msg))
        print(f"Streaming gestartet für: {self.symbols}")
        
    def _websocket_loop(self):
        """Hauptschleife für WebSocket-Verbindung."""
        while self._running:
            try:
                self._ws = websocket.WebSocketApp(
                    self.ws_url,
                    on_message=self._on_message,
                    on_error=self._on_error,
                    on_close=self._on_close,
                    on_open=self._on_open,
                    header={"X-API-Key": self.api_key}
                )
                self._ws.run_forever(ping_interval=30, ping_timeout=10)
                
            except Exception as e:
                print(f"WebSocket-Verbindungsfehler: {e}")
                
            if self._running:
                print("Reconnect in 5 Sekunden...")
                time.sleep(5)
                
    def start(self):
        """Startet den Greeks-Stream in einem Hintergrund-Thread."""
        if self._running:
            print("Stream läuft bereits")
            return
            
        self._running = True
        self._thread = threading.Thread(target=self._websocket_loop, daemon=True)
        self._thread.start()
        print("Greeks-Stream gestartet")
        
    def stop(self):
        """Stoppt den Stream."""
        self._running = False
        if self._ws:
            self._ws.close()
        print("Greeks-Stream gestoppt")
        
    def get_greeks(self, symbol, strike, expiration, option_type="call"):
        """Gibt aktuelle Greeks-Daten aus dem Cache zurück."""
        key = f"{symbol}_{strike}_{expiration}_{option_type}"
        return self.greeks_cache.get(key)
        
    def calculate_portfolio_delta(self, positions):
        """
        Berechnet Gesamt-Delta eines Optionsportfolios.
        
        Args:
            positions: Liste von Dicts mit {'symbol', 'strike', 'expiration', 
                      'type', 'quantity', 'underlying_qty'}
        """
        total_delta = 0.0
        
        for pos in positions:
            greeks = self.get_greeks(
                pos["symbol"], 
                pos["strike"], 
                pos["expiration"],
                pos["type"]
            )
            
            if greeks:
                position_delta = greeks["delta"] * pos["quantity"] * 100  # Options-Kontraktgröße
                total_delta += position_delta
                
                # Underlying-Delta addieren
                if "underlying_qty" in pos:
                    total_delta += pos["underlying_qty"]
                    
        return total_delta

Beispiel-Nutzung

if __name__ == "__main__": # API-Key und Symbole konfigurieren stream = BybitOptionsGreeksStream( api_key="YOUR_HOLYSHEEP_API_KEY", symbols=["BTC", "ETH"] ) # Stream starten stream.start() # 10 Sekunden warten für erste Daten time.sleep(10) # Portfolio-Delta berechnen positions = [ {"symbol": "BTC", "strike": 95000, "expiration": "2026-06-27", "type": "call", "quantity": 5}, {"symbol": "BTC", "strike": 90000, "expiration": "2026-06-27", "type": "put", "quantity": 3}, {"symbol": "BTC", "underlying_qty": 2} # Long BTC Spot ] portfolio_delta = stream.calculate_portfolio_delta(positions) print(f"\nPortfolio Delta: {portfolio_delta:.2f}") # Stream stoppen stream.stop()

Beispiel 3: Historisches Backtesting mit IV Surface


"""
Historisches Backtesting mit Bybit USDC Options IV Surface Daten
Analysiert Strategien basierend auf IV-Dynamics über Zeit
"""

import requests
import pandas as pd
from datetime import datetime, timedelta
import time

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

def get_historical_iv_surface(symbol="BTC", start_date="2026-01-01", 
                               end_date="2026-05-28", interval="1h"):
    """
    Ruft historische IV Surface Daten für Backtesting ab.
    
    Args:
        symbol: Basiswert
        start_date: Startdatum (YYYY-MM-DD)
        end_date: Enddatum (YYYY-MM-DD)
        interval: Datenintervall (1m, 5m, 1h, 4h, 1d)
    """
    endpoint = "/tardis/bybit/options/iv-surface/history"
    
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    }
    
    params = {
        "symbol": symbol,
        "start_date": start_date,
        "end_date": end_date,
        "interval": interval,
        "strike_range": "all",
        "greeks": "true"
    }
    
    all_data = []
    page = 1
    
    while True:
        params["page"] = page
        
        try:
            response = requests.get(
                f"{BASE_URL}{endpoint}",
                headers=headers,
                params=params,
                timeout=60
            )
            response.raise_for_status()
            
            data = response.json()
            records = data.get("data", [])
            
            if not records:
                break
                
            all_data.extend(records)
            print(f"Seite {page}: {len(records)} Records abgerufen")
            
            # Pagination
            if data.get("has_more"):
                page += 1
                time.sleep(0.1)  # Rate Limiting respektieren
            else:
                break
                
        except requests.exceptions.RequestException as e:
            print(f"Fehler bei Seite {page}: {e}")
            break
            
    return all_data

def analyze_iv_regime(iv_surface_history):
    """
    Analysiert IV-Regime (niedrig, normal, hoch) basierend auf historischen Daten.
    """
    df = pd.DataFrame(iv_surface_history)
    
    # ATM IV für verschiedene Expirations
    df_atm = df[df["moneyness"] == "ATM"].copy()
    
    # Quartile berechnen
    iv_25 = df_atm["iv"].quantile(0.25)
    iv_75 = df_atm["iv"].quantile(0.75)
    iv_mean = df_atm["iv"].mean()
    
    def classify_regime(iv):
        if iv < iv_25:
            return "LOW"
        elif iv > iv_75:
            return "HIGH"
        else:
            return "NORMAL"
            
    df_atm["regime"] = df_atm["iv"].apply(classify_regime)
    df_atm["regime_timestamp"] = pd.to_datetime(df_atm["timestamp"])
    
    return {
        "data": df_atm,
        "iv_25_percentile": iv_25,
        "iv_75_percentile": iv_75,
        "iv_mean": iv_mean,
        "regime_distribution": df_atm["regime"].value_counts().to_dict()
    }

def backtest_straddle_strategy(symbol="BTC", 
                                start_date="2026-01-01",
                                end_date="2026-05-28",
                                entry_threshold=0.15,
                                exit_threshold=0.05):
    """
    Backtest einer Straddle-Strategie basierend auf IV-Rotation.
    
    Strategie: 
    - Entry: Kaufe ATM Straddle wenn IV > 75. Perzentile
    - Exit: Verkaufe wenn IV zurückkehrt zum Median
    """
    print(f"Backtest für {symbol} Straddle Strategie...")
    
    # Historische Daten abrufen
    historical_data = get_historical_iv_surface(
        symbol=symbol,
        start_date=start_date,
        end_date=end_date,
        interval="1h"
    )
    
    if not historical_data:
        print("Keine Daten verfügbar")
        return None
        
    # IV-Analyse
    analysis = analyze_iv_regime(historical_data)
    df = analysis["data"].sort_values("regime_timestamp")
    
    # Strategie simulieren
    positions = []
    current_position = None
    trades = []
    
    for idx, row in df.iterrows():
        regime = row["regime"]
        iv = row["iv"]
        timestamp = row["regime_timestamp"]
        
        if current_position is None:
            # Entry-Signal
            if regime == "HIGH" and iv > analysis["iv_75_percentile"] * (1 + entry_threshold):
                current_position = {
                    "entry_date": timestamp,
                    "entry_iv": iv,
                    "strike": row.get("strike"),
                    "expiration": row.get("expiration")
                }
                print(f"Entry: {timestamp} | IV={iv:.4f}")
                
        else:
            # Exit-Signal
            if iv < analysis["iv_mean"] * (1 + exit_threshold):
                pnl = (analysis["iv_mean"] - current_position["entry_iv"]) / current_position["entry_iv"]
                
                trades.append({
                    "entry_date": current_position["entry_date"],
                    "exit_date": timestamp,
                    "entry_iv": current_position["entry_iv"],
                    "exit_iv": iv,
                    "pnl": pnl,
                    "duration_hours": (timestamp - current_position["entry_date"]).total_seconds() / 3600
                })
                
                print(f"Exit: {timestamp} | IV={iv:.4f} | PnL={pnl:.2%}")
                current_position = None
    
    # Statistiken
    if trades:
        trades_df = pd.DataFrame(trades)
        print("\n=== Backtest Ergebnisse ===")
        print(f"Anzahl Trades: {len(trades)}")
        print(f"Gewinnrate: {(trades_df['pnl'] > 0).mean():.2%}")
        print(f"Durchschn. PnL: {trades_df['pnl'].mean():.2%}")
        print(f"Max. Drawdown: {trades_df['pnl'].min():.2%}")
        print(f"Durchschn. Haltedauer: {trades_df['duration_hours'].mean():.1f} Stunden")
        
        return trades_df
        
    return None

Beispiel-Ausführung

if __name__ == "__main__": trades = backtest_straddle_strategy( symbol="BTC", start_date="2026-03-01", end_date="2026-05-28", entry_threshold=0.10, exit_threshold=0.03 ) if trades is not None: print("\nTop 5 Trades nach PnL:") print(trades.nlargest(5, "pnl")[["entry_date", "exit_date", "pnl"]])

Häufige Fehler und Lösungen

Fehler 1: "401 Unauthorized" – Ungültiger API-Key

Problem: API-Aufrufe scheitern mit 401-Fehler, obwohl der Key korrekt aussieht.


❌ FALSCH: Key mit führenden/trailierenden Leerzeichen

API_KEY = " YOUR_HOLYSHEEP_API_KEY "

✅ RICHTIG: Key exakt wie aus dem Dashboard kopiert

API_KEY = "hs_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

✅ Alternative: Key aus Umgebungsvariable laden

import os API_KEY = os.environ.get("HOLYSHEEP_API_KEY")

⚠️ WICHTIG: API-Key muss im Header korrekt übergeben werden

headers = { "Authorization": f"Bearer {API_KEY}", # NICHT: f"Token {API_KEY}" "X-API-Key": API_KEY # Für Tardis-Endpunkte zusätzlich }

Fehler 2: "Rate Limit Exceeded" – Zu viele Requests

Problem: API antwortet mit 429-Fehler trotz正当iger Nutzung.


import time
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

def create_session_with_retry(max_retries=3, backoff_factor=1.0):
    """
    Erstellt eine Session mit automatischer Retry-Logik.
    """
    session = requests.Session()
    
    retry_strategy = Retry(
        total=max_retries,
        backoff_factor=backoff_factor,
        status_forcelist=[429, 500, 502, 503, 504],
        allowed_methods=["HEAD", "GET", "OPTIONS", "POST"]
    )
    
    adapter = HTTPAdapter(max_retries=retry_strategy)
    session.mount("https://", adapter)
    session.mount("http://", adapter)
    
    return session

Rate Limiting Handling

class RateLimitedAPI: def __init__(self, api_key, requests_per_second=10): self.api_key = api_key self.min_interval = 1.0 / requests_per_second self.last_request = 0 def _wait_if_needed(self): elapsed = time.time() - self.last_request if elapsed < self.min_interval: time.sleep(self.min_interval - elapsed) self.last_request = time.time() def get_iv_surface(self, symbol, expiration): self._wait_if_needed() # ⚠️ Rate Limiting respektieren # Implementierung... pass

✅ Für Batch-Aufrufe: Batching nutzen statt einzelne Requests

statt 100 einzelne Aufrufe:

batch_payload = { "requests": [ {"symbol": "BTC", "expiration": "2026-06-27"}, {"symbol": "ETH", "expiration": "2026-06-27"}, # ... bis zu 50 Requests pro Batch ] } response = session.post( f"{BASE_URL}/tardis/bybit/options/iv-surface/batch", headers=headers, json=batch_payload )

Fehler 3: "Invalid Timestamp" oder "Data Not Available"

Problem: Historische Daten für bestimmte Zeiträume fehlen oder Timestamps sind inkonsistent.


from datetime import datetime, timezone

def get_historical_data_with_retry(symbol, start_date, end_date, max_retries=3):
    """
    Ruft historische IV Surface Daten mit Retry-Logik und 
    automatischer Zeitzonenkorrektur ab.
    """
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    }
    
    # ✅ Timestamps immer in UTC ISO-Format
    start_dt = datetime.fromisoformat(start_date).replace(tzinfo=timezone.utc)
    end_dt = datetime.fromisoformat(end_date).replace(tzinfo=timezone.utc)
    
    params = {
        "symbol": symbol,
        "start": start_dt.isoformat(),  # NICHT: start_date direkt
        "end": end_dt.isoformat(),
        "interval": "1h"
    }
    
    for attempt in range(max_retries):
        try:
            response = requests.get(
                f"{BASE_URL}/tardis/bybit/options/iv-surface/history",
                headers=headers,
                params=params,
                timeout=60
            )
            
            if response.status_code == 200:
                data = response.json()
                
                # ✅ Timestamp-Konvertierung
                for record in data.get("data", []):
                    if isinstance(record.get("timestamp"), str):
                        record["timestamp"] = datetime.fromisoformat(
                            record["timestamp"].replace("Z", "+00:00")
                        )
                        
                return data
                
            elif response.status_code == 404:
                # Daten für diesen Zeitraum nicht verfügbar
                print(f"Keine Daten für {start_date} bis {end_date}")
                return None
                
            else:
                raise Exception(f"HTTP {response.status_code}: {response.text}")
                
        except requests.exceptions.RequestException as e:
            if attempt == max_retries - 1:
                raise
            wait = 2 ** attempt  # Exponentielles Backoff
            print(f"Retry {attempt + 1}/{max_retries} in {wait}s...")
            time.sleep(wait)
            
    return None

Fehler 4: Greeks-Berechnungen weichen ab

Problem: Berechnete Greeks weichen von erwarteten Werten ab.


import numpy as np
from scipy.stats import norm

def verify_greeks_calculation(strike, spot, iv, time_to_expiry, 
                               risk_free_rate=0.05, option_type="call"):
    """
    Verifiziert Greeks-Berechnungen gegen HolySheep API-Daten.
    Nutzt Black-Scholes-Formel.
    """
    d1 = (np.log(spot / strike) + (risk_free_rate + 0.5 * iv**2) * time_to_expiry) / (iv * np.sqrt(time_to_expiry))
    d2 = d1 - iv * np.sqrt(time_to_expiry)
    
    if option_type == "call":
        price = spot * norm.cdf(d1) - strike * np.exp(-risk_free_rate * time_to_expiry) * norm.c