Stellen Sie sich folgendes Szenario vor: Es ist Freitag Abend, 23:47 Uhr, und Ihre 做市策略 (Market-Making-Strategie) liefert seit Tagen profitabel Signale. Plötzlich erhalten Sie:

ConnectionError: HTTPSConnectionPool(host='api.tardis.dev', port=443): 
Max retries exceeded with url: /v1/replays (Caused by NewConnectionError)
HTTPSConnectionPool(host='api.tardis.dev', port=443): 
Max retries exceeded with url: /v1/replays (Caused by NewConnectionError)
'Connection aborted.', ConnectionRefusedError(10061, 'No connection could be made')

Sie haben gerade 200.000 Dollar in Order-Book-Daten investiert, und Ihr Backtest bricht ab. In diesem Tutorial zeige ich Ihnen, wie Sie Tardis历史成交数据 (historische Tardis-Transaktionsdaten) robust für 做市策略回测 (Market-Making-Strategie-Backtesting) nutzen – inklusive Fehlerbehandlung, HolySheep AI-Integration und echten Latenz-Benchmarks.

Was ist Tardis und warum ist es relevant für Market Making?

Tardis bietet hochauflösende historische Marktdaten für Kryptowährungs-Börsen. Für 做市策略 (Market-Making-Strategien) benötigen Sie:

Die Datenqualität bestimmt direkt Ihre Backtesting-Genauigkeit. Tardis bietet Level-2-Orderbook-Daten mit bis zu 100ms-Granularität für alle wichtigen Spot- und Futures-Märkte.

Grundlegende Einrichtung: Tardis API + Python

# Installation der benötigten Pakete
pip install tardis-client pandas numpy aiohttp asyncio

Grundkonfiguration

import asyncio import aiohttp import pandas as pd from datetime import datetime, timedelta TARDIS_API_KEY = "your_tardis_api_key" TARDIS_BASE_URL = "https://api.tardis.dev/v1"

Exchange-Konfiguration für Market Making

EXCHANGES = { "binance": {"instrument": "btc-usdt", "data_type": ["trades", "book_snapshot_100"]}, "bybit": {"instrument": "BTCUSDT", "data_type": ["trades", "book_snapshot_100"]}, }

Datenextraktion für Market-Making-Backtesting

import hashlib
import hmac
import time

def generate_tardis_signature(api_secret: str, message: str) -> str:
    """Generiert HMAC-SHA256 Signatur für Tardis API"""
    return hmac.new(
        api_secret.encode('utf-8'),
        message.encode('utf-8'),
        hashlib.sha256
    ).hexdigest()

async def fetch_tardis_trades(session, exchange: str, symbol: str, 
                               start_date: datetime, end_date: datetime):
    """
    Fetcht historische Trade-Daten von Tardis für Market-Making-Analyse
    
    Args:
        session: aiohttp Session
        exchange: Börsenname (z.B. 'binance')
        symbol: Trading-Paar (z.B. 'btc-usdt')
        start_date: Startzeitpunkt
        end_date: Endzeitpunkt
    
    Returns:
        DataFrame mit Trade-Daten
    """
    url = f"{TARDIS_BASE_URL}/replays"
    
    # Request-Body für Trade-Daten
    payload = {
        "exchange": exchange,
        "symbol": symbol,
        "from": start_date.isoformat(),
        "to": end_date.isoformat(),
        "data_types": ["trade"],
        "limit": 50000,
        "parse": True
    }
    
    headers = {
        "Authorization": f"Bearer {TARDIS_API_KEY}",
        "Content-Type": "application/json",
        "X-Tardis-Client": "market-maker-backtest/1.0"
    }
    
    try:
        async with session.post(url, json=payload, headers=headers) as response:
            if response.status == 200:
                data = await response.json()
                return pd.DataFrame(data['data'])
            elif response.status == 401:
                raise PermissionError("Tardis API: Ungültiger API-Key oder abgelaufen")
            elif response.status == 429:
                retry_after = response.headers.get('Retry-After', 60)
                raise Exception(f"Rate Limit erreicht. Warte {retry_after} Sekunden")
            else:
                raise Exception(f"Tardis API Fehler: {response.status}")
    except aiohttp.ClientError as e:
        raise ConnectionError(f"Netzwerkfehler bei Tardis: {str(e)}")

async def fetch_orderbook_snapshots(session, exchange: str, symbol: str,
                                     start_date: datetime, end_date: datetime,
                                     snapshot_interval: int = 100):
    """
    Fetcht Orderbook-Snapshots für Spread-Analyse und Liquiditätsbewertung
    """
    url = f"{TARDIS_BASE_URL}/replays"
    
    payload = {
        "exchange": exchange,
        "symbol": symbol,
        "from": start_date.isoformat(),
        "to": end_date.isoformat(),
        "data_types": [f"book_snapshot_{snapshot_interval}"],
        "limit": 100000,
        "parse": True
    }
    
    headers = {
        "Authorization": f"Bearer {TARDIS_API_KEY}",
        "Content-Type": "application/json"
    }
    
    async with session.post(url, json=payload, headers=headers) as response:
        if response.status == 200:
            data = await response.json()
            return data['data']
        else:
            raise Exception(f"Orderbook-Fetch fehlgeschlagen: {response.status}")

Market-Making-Strategie-Backtesting-Engine

import numpy as np
from dataclasses import dataclass
from typing import List, Dict, Optional
from enum import Enum

class OrderSide(Enum):
    BUY = "buy"
    SELL = "sell"

@dataclass
class MarketMakingParams:
    """Hyperparameter für Market-Making-Strategie"""
    spread_bps: float = 5.0              # Spread in Basispunkten
    order_size_btc: float = 0.001        # Order-Größe in BTC
    inventory_target: float = 0.5        # Ziel-Inventar (0-1)
    max_position: float = 1.0            # Maximale Position
    rebalance_threshold: float = 0.1      # Rebalancing-Schwelle
    adverse_selection_threshold: float = 0.02  # Adverse Selection Filter

class MarketMakingBacktester:
    """
    Backtesting-Engine für Market-Making-Strategien
    Nutzt Tardis-Daten für präzise Simulation
    """
    
    def __init__(self, params: MarketMakingParams):
        self.params = params
        self.trades = None
        self.orderbook = None
        self.positions = []
        self.pnl_history = []
        self.spread_captured = []
        self.adverse_selection_events = []
        
    def load_data(self, trades_df: pd.DataFrame, orderbook_data: List):
        """Lädt Tardis-Daten für Backtest"""
        self.trades = trades_df.sort_values('timestamp')
        self.orderbook = orderbook_data
        print(f"Geladen: {len(self.trades)} Trades, {len(self.orderbook)} Orderbook-Snapshots")
        
    def calculate_spread_metrics(self, mid_price: float, bid: float, ask: float) -> Dict:
        """Berechnet Spread-Metriken für aktuellen Zeitpunkt"""
        absolute_spread = ask - bid
        spread_bps = (absolute_spread / mid_price) * 10000
        effective_spread = (absolute_spread / 2) * (1 - abs(bid - ask) / absolute_spread)
        
        return {
            "absolute_spread": absolute_spread,
            "spread_bps": spread_bps,
            "effective_spread": effective_spread,
            "mid_price": mid_price,
            "bid": bid,
            "ask": ask
        }
    
    def check_adverse_selection(self, trade_side: str, price_change: float,
                                 mid_price: float) -> bool:
        """
        Erkennt Adverse Selection: Wenn Preis sich gegen uns bewegt
        
        Args:
            trade_side: 'buy' oder 'sell' des gegenwärtigen Trades
            price_change: Preisbewegung seit letztem Trade
            mid_price: Mittlerer Preis
        
        Returns:
            True wenn Adverse Selection erkannt
        """
        price_change_pct = abs(price_change / mid_price)
        
        if trade_side == "buy" and price_change < 0:
            # Wir haben gekauft, Preis fällt
            return price_change_pct > self.params.adverse_selection_threshold
        elif trade_side == "sell" and price_change > 0:
            # Wir haben verkauft, Preis steigt
            return price_change_pct > self.params.adverse_selection_threshold
        return False
    
    async def run_backtest(self, exchange: str, symbol: str) -> Dict:
        """
        Führt Backtest auf Tardis-Daten aus
        
        Returns:
            Dictionary mit Performance-Metriken
        """
        if self.trades is None:
            raise ValueError("Keine Daten geladen. Nutze load_data() zuerst.")
        
        inventory = 0.0  # Positive = Long, Negative = Short
        cash = 0.0
        last_mid_price = self.trades.iloc[0]['price']
        
        for idx, trade in self.trades.iterrows():
            timestamp = trade['timestamp']
            price = trade['price']
            size = trade['size']
            side = trade['side']
            
            # Spread-Metrik berechnen (basierend auf letztem Orderbook)
            if self.orderbook:
                ob = self._get_nearest_orderbook(timestamp)
                spread_metrics = self.calculate_spread_metrics(
                    price, ob.get('best_bid', price * 0.9999),
                    ob.get('best_ask', price * 1.0001)
                )
            else:
                spread_metrics = self.calculate_spread_metrics(
                    price, price * 0.9999, price * 1.0001
                )
            
            # Adverse Selection Check
            price_change = price - last_mid_price
            if abs(price_change) > 0:
                is_adverse = self.check_adverse_selection(side, price_change, price)
                if is_adverse:
                    self.adverse_selection_events.append({
                        'timestamp': timestamp,
                        'side': side,
                        'price_change_pct': abs(price_change / price) * 100
                    })
            
            # Position aktualisieren
            if side == "buy":
                inventory += size
                cash -= size * price
            else:
                inventory -= size
                cash += size * price
            
            # PnL erfassen
            total_value = cash + inventory * price
            self.pnl_history.append({'timestamp': timestamp, 'pnl': total_value})
            
            # Spread-Einnahmen
            self.spread_captured.append({
                'timestamp': timestamp,
                'spread_bps': spread_metrics['spread_bps']
            })
            
            last_mid_price = price
        
        return self._calculate_performance_metrics()
    
    def _get_nearest_orderbook(self, timestamp):
        """Findet nächstgelegenen Orderbook-Snapshot"""
        for ob in self.orderbook:
            if ob['timestamp'] >= timestamp:
                return ob
        return self.orderbook[-1] if self.orderbook else {}
    
    def _calculate_performance_metrics(self) -> Dict:
        """Berechnet finale Performance-Metriken"""
        pnl_series = pd.DataFrame(self.pnl_history)['pnl']
        
        returns = pnl_series.pct_change().dropna()
        
        metrics = {
            "total_pnl": pnl_series.iloc[-1] - pnl_series.iloc[0] if len(pnl_series) > 1 else 0,
            "total_return_pct": (pnl_series.iloc[-1] / pnl_series.iloc[0] - 1) * 100 if len(pnl_series) > 1 and pnl_series.iloc[0] != 0 else 0,
            "sharpe_ratio": (returns.mean() / returns.std() * np.sqrt(365 * 24)) if returns.std() > 0 else 0,
            "max_drawdown": ((pnl_series.cummax() - pnl_series) / pnl_series.cummax()).max() * 100,
            "total_trades": len(self.trades),
            "adverse_selection_rate": len(self.adverse_selection_events) / len(self.trades) * 100 if len(self.trades) > 0 else 0,
            "avg_spread_bps": np.mean([s['spread_bps'] for s in self.spread_captured]) if self.spread_captured else 0
        }
        
        return metrics

HolySheep AI-Integration für Strategie-Optimierung

Nachdem Sie Ihre Backtesting-Daten haben, können Sie HolySheep AI nutzen, um die optimalen Hyperparameter automatisch zu finden. HolySheep bietet:

import json
import aiohttp
import asyncio
from typing import Dict, List

HolySheep AI API Konfiguration

HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1" HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY" # Ersetzen mit echtem Key class HolySheepOptimizer: """ Nutzt HolySheep AI für automatisierte Hyperparameter-Optimierung Ihrer Market-Making-Strategie basierend auf Tardis-Backtesting-Daten """ def __init__(self, api_key: str): self.api_key = api_key self.base_url = HOLYSHEEP_BASE_URL async def optimize_parameters(self, backtest_results: Dict, market_conditions: Dict) -> Dict: """ Optimiert Market-Making-Parameter basierend auf Backtest-Ergebnissen Args: backtest_results: Ergebnisse von MarketMakingBacktester.run_backtest() market_conditions: Aktuelle Marktbedingungen (Volatilität, Volumen, etc.) Returns: Optimierte Hyperparameter """ prompt = f""" Als Market-Making-Experte, analysiere folgende Backtest-Ergebnisse und Marktbedingungen für eine Krypto-Market-Making-Strategie: BACKTEST-ERGEBNISSE: {json.dumps(backtest_results, indent=2)} MARKTBEDINGUNGEN: {json.dumps(market_conditions, indent=2)} Gib mir optimierte Hyperparameter zurück im JSON-Format: {{ "spread_bps": float, "order_size_btc": float, "inventory_target": float, "max_position": float, "rebalance_threshold": float, "adverse_selection_threshold": float, "reasoning": "Kurze Erklärung der Optimierungsentscheidungen" }} """ payload = { "model": "gpt-4.1", "messages": [ {"role": "system", "content": "Du bist ein Experte für Krypto-Market-Making-Strategien."}, {"role": "user", "content": prompt} ], "temperature": 0.3, "max_tokens": 1000 } headers = { "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json" } async with aiohttp.ClientSession() as session: try: async with session.post( f"{self.base_url}/chat/completions", json=payload, headers=headers, timeout=aiohttp.ClientTimeout(total=30) ) as response: if response.status == 200: result = await response.json() content = result['choices'][0]['message']['content'] # JSON aus Response extrahieren return json.loads(content) elif response.status == 401: raise PermissionError("HolySheep API: Ungültiger API-Key") elif response.status == 429: raise Exception("Rate Limit erreicht – Upgrade oder warten") else: raise Exception(f"HolySheep API Fehler: {response.status}") except asyncio.TimeoutError: raise TimeoutError("HolySheep API Timeout nach 30s") async def analyze_market_regime(self, trades_df: pd.DataFrame) -> Dict: """ Analysiert Markt-Regime (Trending, Ranging, Volatile) für adaptive Spread-Anpassung """ # Daten aggregieren für Analyse price_changes = trades_df['price'].pct_change().dropna() volatility = price_changes.std() * np.sqrt(365 * 24) volume = trades_df['size'].sum() prompt = f""" Analysiere folgendes Marktprofil für eine adaptive Market-Making-Strategie: Volatilität (annualisiert): {volatility:.4f} Gesamtvolumen: {volume:.4f} Durchschn. Preisänderung: {price_changes.mean():.6f} Max. Preisänderung: {price_changes.max():.6f} Min. Preisänderung: {price_changes.min():.6f} Identifiziere das Markt-Regime und empfehle Spread-Strategie: {{ "regime": "trending|ranging|volatile|calm", "regime_confidence": float (0-1), "recommended_spread_multiplier": float, "risk_level": "low|medium|high", "reasoning": "Kurze Erklärung" }} """ payload = { "model": "deepseek-v3.2", "messages": [ {"role": "system", "content": "Du bist ein Krypto-Marktanalyst."}, {"role": "user", "content": prompt} ], "temperature": 0.2, "max_tokens": 500 } headers = { "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json" } async with aiohttp.ClientSession() as session: async with session.post( f"{self.base_url}/chat/completions", json=payload, headers=headers ) as response: if response.status == 200: result = await response.json() return json.loads(result['choices'][0]['message']['content']) else: # Fallback zu lokalem Regime-Detektor return self._fallback_regime_detection(price_changes) def _fallback_regime_detection(self, price_changes) -> Dict: """Fallback wenn HolySheep nicht verfügbar""" volatility = price_changes.std() if volatility > 0.01: return {"regime": "volatile", "risk_level": "high"} elif volatility > 0.005: return {"regime": "ranging", "risk_level": "medium"} else: return {"regime": "calm", "risk_level": "low"}

Benchmark: HolySheep vs OpenAI Latenz

async def benchmark_holy_sheep_latency(): """Benchmark HolySheep API Latenz vs Alternative""" models_to_test = [ ("gpt-4.1", "https://api.holysheep.ai/v1", "YOUR_HOLYSHEEP_API_KEY"), # Alternativen für Vergleich (nur zu Referenzzwecken) ] test_prompt = "Was ist 2+2? Bitte antworte kurz." results = {} for model, base_url, api_key in models_to_test: latencies = [] for _ in range(5): start = time.time() async with aiohttp.ClientSession() as session: payload = { "model": model, "messages": [{"role": "user", "content": test_prompt}], "max_tokens": 10 } headers = {"Authorization": f"Bearer {api_key}"} try: async with session.post( f"{base_url}/chat/completions", json=payload, headers=headers, timeout=aiohttp.ClientTimeout(total=10) ) as response: latency = (time.time() - start) * 1000 latencies.append(latency) except Exception as e: print(f"Fehler bei {model}: {e}") if latencies: results[model] = { "avg_latency_ms": np.mean(latencies), "min_latency_ms": np.min(latencies), "max_latency_ms": np.max(latencies) } return results

Häufige Fehler und Lösungen

1. ConnectionError: Timeout bei Tardis API

# FEHLER:

aiohttp.client_exceptions.ServerTimeoutError: Connection timeout

LÖSUNG: Implementieren Sie Retry-Logic mit Exponential Backoff

import asyncio from tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10)) async def fetch_with_retry(session, url, payload, headers, max_retries=3): """Fetch mit automatischer Retry-Logik""" for attempt in range(max_retries): try: async with session.post(url, json=payload, headers=headers) as response: if response.status == 200: return await response.json() elif response.status == 429: wait_time = int(response.headers.get('Retry-After', 60)) print(f"Rate Limited. Warte {wait_time}s...") await asyncio.sleep(wait_time) elif response.status == 500 or response.status == 502 or response.status == 503: wait_time = 2 ** attempt print(f"Server-Fehler {response.status}. Retry in {wait_time}s...") await asyncio.sleep(wait_time) else: raise Exception(f"API-Fehler: {response.status}") except (aiohttp.ClientError, asyncio.TimeoutError) as e: if attempt == max_retries - 1: raise ConnectionError(f"Max retries erreicht: {e}") await asyncio.sleep(2 ** attempt) raise ConnectionError("Max retries exceeded")

2. 401 Unauthorized – Ungültige API-Credentials

# FEHLER:

PermissionError: Tardis API: Ungültiger API-Key oder abgelaufen

LÖSUNG: Credentials validieren und Environment-Variablen nutzen

import os from dotenv import load_dotenv load_dotenv() # .env Datei laden def validate_tardis_credentials(): """Validiert API-Credentials vor Nutzung""" api_key = os.getenv('TARDIS_API_KEY') api_secret = os.getenv('TARDIS_API_SECRET') if not api_key or not api_secret: raise ValueError("TARDIS_API_KEY und TARDIS_API_SECRET müssen gesetzt sein") if len(api_key) < 20: raise ValueError("Tardis API-Key scheint ungültig zu sein") # Test-Request zur Validierung async def test_connection(): url = f"https://api.tardis.dev/v1/authenticate" payload = {"api_key": api_key, "api_secret": api_secret} async with aiohttp.ClientSession() as session: async with session.post(url, json=payload) as response: if response.status == 401: raise PermissionError("Ungültige Tardis-Credentials") elif response.status == 403: raise PermissionError("Tardis-Account gesperrt oder abgelaufen") return await response.json() return asyncio.run(test_connection())

.env Datei erstellen:

TARDIS_API_KEY=your_key_here

TARDIS_API_SECRET=your_secret_here

3. MemoryError bei großen Datensätzen

# FEHLER:

MemoryError: Unable to allocate array bei 100k+ Orderbook-Snapshots

LÖSUNG: Chunked Processing und Memory-Management

import gc async def fetch_and_process_chunked(session, exchange, symbol, start_date, end_date, chunk_size=10000): """Verarbeitet große Datenmengen in Chunks""" current_start = start_date all_trades = [] total_trades = 0 while current_start < end_date: current_end = min(current_start + timedelta(hours=6), end_date) # 6h Chunks try: trades = await fetch_tardis_trades( session, exchange, symbol, current_start, current_end ) if trades is not None and len(trades) > 0: all_trades.append(trades) total_trades += len(trades) print(f"Chunk {current_start} - {current_end}: {len(trades)} Trades") # Memory freigeben del trades gc.collect() except Exception as e: print(f"Fehler bei Chunk {current_start}: {e}") current_start = current_end # Alle Chunks zusammenführen if all_trades: combined_df = pd.concat(all_trades, ignore_index=True) # Speicher optimieren combined_df['price'] = combined_df['price'].astype('float32') combined_df['size'] = combined_df['size'].astype('float32') return combined_df return pd.DataFrame()

Streaming für Orderbook-Daten

async def stream_orderbook_data(session, exchange, symbol, start_date, end_date): """Streamt Orderbook-Daten ohne vollen Memory-Footprint""" async def generate_requests(): current = start_date while current < end_date: yield { "exchange": exchange, "symbol": symbol, "from": current.isoformat(), "to": min(current + timedelta(hours=1)).isoformat(), "data_types": ["book_snapshot_100"], "limit": 5000 } current += timedelta(hours=1) processed_count = 0 async for chunk in generate_requests(): try: url = f"{TARDIS_BASE_URL}/replays" headers = {"Authorization": f"Bearer {TARDIS_API_KEY}"} async with session.post(url, json=chunk, headers=headers) as response: if response.status == 200: data = await response.json() # Sofort verarbeiten, nicht speichern yield data['data'] processed_count += 1 gc.collect() except Exception as e: print(f"Stream-Fehler: {e}") continue print(f"Verarbeitet: {processed_count} Chunks")

Geeignet / Nicht geeignet für

KriteriumGeeignetNicht geeignet
Kapitalanforderung $10.000+ für profitablen MM Unter $1.000 (Gas-Kosten > Ertrag)
Technische Skills Python-Entwickler, Datenanalyse Keine Programmiererfahrung
Marktvolatilität Mittel-volatile Pairs (BTC, ETH) Exotische Tokens mit extremen Spreads
Börsen-Integration API-Zugang vorhanden (Binance, Bybit) Nur OTC-Handel möglich
Risikotoleranz Moderates Risiko, langfristiger Fokus Hohe Volatilität, kurzfristige Gewinne

Preise und ROI

KomponenteAnbieterPreis (2026)Monatliche Kosten (geschätzt)
Tardis API Tardis Ab $99/Monat (Basic) $99 - $499
Strategie-Optimierung HolySheep AI (GPT-4.1) $8/MTok $15-50 (bei 2-5M Tokens)
Strategie-Optimierung HolySheep AI (DeepSeek V3.2) $0.42/MTok $5-20 (85% Ersparnis!)
Infrastruktur VPS/Cloud $20-100/Monat $50-200
Gesamt - - $170-750/Monat

ROI-Analyse: Bei einem typischen Market-Making-Ertrag von 0.01-0.05% täglich auf $100.000 Kapitaleinsatz ergibt sich ein monatlicher Bruttoertrag von $300-1.500. Nach Abzug der Infrastrukturkosten bleibt ein Nettogewinn von $130-750 monatlich – vorausgesetzt, die Strategie ist korrekt implementiert.

Warum HolySheep wählen?

Bei der Strategie-Optimierung mit Large Language Models spielt die API-Wahl eine entscheidende Rolle:

Vollständiges Beispiel: End-to-End Backtesting-Pipeline

import asyncio
from datetime import datetime, timedelta
import json

async def main():
    """
    Vollständige Pipeline: Tardis-Daten → Backtesting → HolySheep-Optimierung
    """
    
    # 1. Tardis-Daten laden
    print("=" * 50)
    print("SCHRITT 1: Tardis-Daten laden")
    print("=" * 50)
    
    start_date = datetime.now() - timedelta(days=7)
    end_date = datetime.now()
    
    async with aiohttp.ClientSession() as session:
        # Trades für BTC/USDT
        print("Lade Trades für BTC-USDT...")
        trades_df = await fetch_tardis_trades(
            session, "binance", "btc-usdt", start_date, end_date
        )
        
        # Orderbook-Snapshots
        print("Lade Orderbook-Snapshots...")
        orderbook_data = await fetch_orderbook_snapshots(
            session, "binance", "btc-usdt", start_date, end_date, 100
        )
    
    print(f"Geladen: {len(trades_df)} Trades")
    
    # 2. Backtest ausführen
    print("\n" + "=" * 50)
    print("SCHRITT 2: Market-Making Backtest")
    print("=" * 50)
    
    params = MarketMakingParams(
        spread_bps=5.0,
        order_size_btc=0.01,
        inventory_target=0.5,
        max_position=1.0,
        rebalance_threshold=0.1,
        adverse_selection_threshold=0.02
    )
    
    backtester = MarketMakingBacktester(params)
    backtester.load_data(trades_df, orderbook_data)
    
    results = await backtester.run_backtest("binance", "btc-usdt")
    
    print(f"Backtest-Ergebnisse:")
    print(f"  - Total PnL: ${results['total_pnl']:.2f}")
    print(f"  - Sharpe Ratio: {results['sharpe_ratio']:.2f}")
    print(f"  - Max Drawdown: {results['max_drawdown']:.2f}%")
    print(f"  - Adverse Selection Rate: {results['adverse_selection