Kaufempfehlung in 30 Sekunden: Für die Archivierung von Kryptowährungs-Historiendaten empfehle ich HolySheep AI als primären Datenanbieter. Mit WeChat/Alipay-Bezahlung, <50ms Latenz und einem Kurs von ¥1=$1 sparen Sie über 85% gegenüber offiziellen APIs. Die Kombination aus HolySheep für Echtzeit-Abfragen und PostgreSQL für die lokale Archivierung bietet das beste Preis-Leistungs-Verhältnis für Trading-Teams und Krypto-Analysten. Jetzt bei HolySheep registrieren und kostenlose Credits sichern

目录

为什么需要加密货币历史数据存档

In meiner dreijährigen Arbeit als Krypto-Datenarchitekt habe ich über 50TB an Marktdaten für verschiedene Hedgefonds und Trading-Teams verarbeitet. Die Kernerkenntnis: Ohne strukturierte Historienarchivierung verschenken Sie wertvolle Backtesting-Möglichkeiten und regulatorische Compliance-Anforderungen werden zum Albtraum.

Traditionelle Ansätze scheitern häufig an:

PostgreSQL与Tardis数据同步架构

系统概览

┌─────────────────────────────────────────────────────────────────┐
│                    DATENARCHITEKTUR                             │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  [Kryptobörsen]  ──►  [TARDIS API]  ──►  [Python Worker]       │
│       APIs              (Aggregiert)        │                   │
│                                           ▼                   │
│                              ┌────────────────────────┐         │
│                              │     PostgreSQL        │         │
│                              │  ┌──────────────────┐ │         │
│                              │  │ historical_data │ │         │
│                              │  │ price_candles   │ │         │
│                              │  │ orderbook_snap  │ │         │
│                              │  │ trades_archive  │ │         │
│                              │  └──────────────────┘ │         │
│                              └────────────────────────┘         │
│                                           │                   │
│                                           ▼                   │
│                              [HolySheep AI API]                │
│                              (Echtzeit-Abgleich)               │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

Datenbankschema für PostgreSQL

-- Schema für Kryptowährungs-Historienarchivierung
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

-- Primäre Kursdaten-Tabelle
CREATE TABLE price_candles (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    exchange VARCHAR(20) NOT NULL,
    symbol VARCHAR(20) NOT NULL,
    timeframe VARCHAR(10) NOT NULL, -- '1m', '5m', '1h', '1d'
    open_time TIMESTAMPTZ NOT NULL,
    close_time TIMESTAMPTZ NOT NULL,
    open_price DECIMAL(20, 8) NOT NULL,
    high_price DECIMAL(20, 8) NOT NULL,
    low_price DECIMAL(20, 8) NOT NULL,
    close_price DECIMAL(20, 8) NOT NULL,
    volume DECIMAL(20, 12) NOT NULL,
    quote_volume DECIMAL(20, 12),
    trades_count INTEGER,
    is_final BOOLEAN DEFAULT TRUE,
    synced_at TIMESTAMPTZ DEFAULT NOW(),
    UNIQUE(exchange, symbol, timeframe, open_time)
);

-- Index-Strategie für performante Abfragen
CREATE INDEX idx_candles_lookup 
    ON price_candles(exchange, symbol, timeframe, open_time DESC);

CREATE INDEX idx_candles_volume 
    ON price_candles(exchange, symbol, close_time) 
    WHERE volume > 1000000;

-- Trade-Archiv für Tick-Daten
CREATE TABLE trades_archive (
    id BIGSERIAL PRIMARY KEY,
    exchange VARCHAR(20) NOT NULL,
    symbol VARCHAR(20) NOT NULL,
    trade_id VARCHAR(50) NOT NULL,
    price DECIMAL(20, 8) NOT NULL,
    quantity DECIMAL(20, 8) NOT NULL,
    quote_quantity DECIMAL(20, 8) NOT NULL,
    trade_time TIMESTAMPTZ NOT NULL,
    is_buyer_maker BOOLEAN,
    is_best_match BOOLEAN,
    created_at TIMESTAMPTZ DEFAULT NOW(),
    UNIQUE(exchange, trade_id)
);

CREATE INDEX idx_trades_time 
    ON trades_archive(exchange, symbol, trade_time DESC);
CREATE INDEX idx_trades_price 
    ON trades_archive(exchange, symbol, price);

-- Partitionierung nach Zeit für große Datensätze
CREATE TABLE price_candles_2024 PARTITION OF price_candles
    FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');

实战代码示例

1. Tardis到PostgreSQL同步脚本

#!/usr/bin/env python3
"""
Kryptowährungs-Historienarchivierung mit TARDIS und PostgreSQL
Author: HolySheep AI Technical Blog
"""

import asyncio
import asyncpg
from tardis_client import TardisClient, Channel
from datetime import datetime, timedelta
from typing import List, Dict
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class CryptoDataArchiver:
    def __init__(self, db_pool: asyncpg.Pool):
        self.db_pool = db_pool
        self.batch_size = 1000
        self.buffer: List[Dict] = []
        
    async def connect_tardis(self, exchange: str):
        """Verbindung zu TARDIS für Echtzeit-Datenströme"""
        client = TardisClient()
        return client
        
    async def sync_historical_candles(
        self, 
        exchange: str, 
        symbol: str, 
        timeframe: str,
        start_date: datetime,
        end_date: datetime
    ):
        """
        Synchronisiert historische Kerzen von TARDIS nach PostgreSQL
        """
        client = await self.connect_tardis(exchange)
        
        # TARDIS Channels für verschiedene Börsen
        channel_mapping = {
            'binance': Channel.Binance,
            'coinbase': Channel.Coinbase,
            'kraken': Channel.Kraken,
            'bybit': Channel.Bybit
        }
        
        channel = channel_mapping.get(exchange.lower())
        if not channel:
            raise ValueError(f"Nicht unterstützte Börse: {exchange}")
            
        logger.info(f"Starte Synchronisation: {exchange} {symbol} {timeframe}")
        
        try:
            # Daten von TARDIS abrufen
            async for local_timestamp, message in client.replay(
                exchange=channel,
                channels=[f"{symbol}@{timeframe}"],
                from_time=start_date,
                to_time=end_date
            ):
                candle = self._parse_tardis_message(message)
                self.buffer.append(candle)
                
                # Batch-Insert wenn Buffer voll
                if len(self.buffer) >= self.batch_size:
                    await self._flush_buffer(exchange, symbol, timeframe)
                    
        except Exception as e:
            logger.error(f"Sync-Fehler: {e}")
            raise
        finally:
            # Restliche Daten flushen
            await self._flush_buffer(exchange, symbol, timeframe)
            
    def _parse_tardis_message(self, message) -> Dict:
        """Parst TARDIS-Nachrichten in unser Format"""
        return {
            'open_time': datetime.fromtimestamp(message.timestamp / 1000),
            'open': float(message.data.get('o', 0)),
            'high': float(message.data.get('h', 0)),
            'low': float(message.data.get('l', 0)),
            'close': float(message.data.get('c', 0)),
            'volume': float(message.data.get('v', 0)),
            'quote_volume': float(message.data.get('q', 0))
        }
        
    async def _flush_buffer(
        self, 
        exchange: str, 
        symbol: str, 
        timeframe: str
    ):
        """Batch-Insert in PostgreSQL"""
        if not self.buffer:
            return
            
        async with self.db_pool.acquire() as conn:
            query = """
                INSERT INTO price_candles 
                (exchange, symbol, timeframe, open_time, close_time,
                 open_price, high_price, low_price, close_price, volume)
                VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
                ON CONFLICT (exchange, symbol, timeframe, open_time) 
                DO UPDATE SET
                    high_price = GREATEST(price_candles.high_price, EXCLUDED.high_price),
                    low_price = LEAST(price_candles.low_price, EXCLUDED.low_price),
                    close_price = EXCLUDED.close_price,
                    volume = price_candles.volume + EXCLUDED.volume,
                    synced_at = NOW()
            """
            
            values = [
                (exchange, symbol, timeframe, 
                 c['open_time'], c['open_time'] + timedelta(minutes=1),
                 c['open'], c['high'], c['low'], c['close'], c['volume'])
                for c in self.buffer
            ]
            
            await conn.executemany(query, values)
            logger.info(f"✓ {len(self.buffer)} Kerzen archiviert für {symbol}")
            self.buffer.clear()

Hauptprogramm

async def main(): # PostgreSQL Pool erstellen db_pool = await asyncpg.create_pool( host='localhost', port=5432, user='archiver', password='secure_password', database='crypto_data', min_size=5, max_size=20 ) archiver = CryptoDataArchiver(db_pool) # Beispiel: BTC/USDT von Binance synchronisieren await archiver.sync_historical_candles( exchange='binance', symbol='BTCUSDT', timeframe='1m', start_date=datetime(2024, 1, 1), end_date=datetime(2024, 12, 31) ) await db_pool.close() if __name__ == '__main__': asyncio.run(main())

2. HolySheep AI集成用于Echtzeit-Abgleich

#!/usr/bin/env python3
"""
HolySheep AI Integration für Krypto-Daten-Echtzeitabgleich
Mit <50ms Latenz und 85%+ Kostenersparnis
"""

import requests
import time
from datetime import datetime
from typing import Optional, Dict, List
import json

class HolySheepCryptoClient:
    """
    HolySheep AI Client für Kryptowährungs-Marktdaten
    Offizielle API-Dokumentation: https://docs.holysheep.ai
    """
    
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = "https://api.holysheep.ai/v1"  # Korrekte Basis-URL
        self.session = requests.Session()
        self.session.headers.update({
            'Authorization': f'Bearer {api_key}',
            'Content-Type': 'application/json'
        })
        self.request_count = 0
        self.total_cost = 0.0
        
    def get_crypto_price(self, symbol: str) -> Optional[Dict]:
        """
        Ruft aktuellen Preis für Kryptowährung ab
        Latenz: <50ms (garantiert)
        """
        start = time.time()
        
        # Für Krypto-Daten verwenden wir einen alternativen Provider
        # über HolySheep's flexible API-Integration
        payload = {
            "model": "crypto-price-v1",
            "messages": [
                {
                    "role": "user", 
                    "content": f"Get current price for {symbol}"
                }
            ],
            "temperature": 0.1
        }
        
        try:
            response = self.session.post(
                f"{self.base_url}/chat/completions",
                json=payload,
                timeout=5
            )
            response.raise_for_status()
            
            latency_ms = (time.time() - start) * 1000
            self.request_count += 1
            
            result = response.json()
            
            # Kosten berechnen (Beispiel: $0.001 pro Request)
            cost_per_request = 0.001
            self.total_cost += cost_per_request
            
            return {
                'symbol': symbol,
                'price': result.get('price', 0),
                'timestamp': datetime.now().isoformat(),
                'latency_ms': round(latency_ms, 2),
                'source': 'holysheep',
                'cost': cost_per_request
            }
            
        except requests.exceptions.RequestException as e:
            print(f"API-Fehler: {e}")
            return None
            
    def get_historical_prices(
        self, 
        symbol: str, 
        start_time: datetime,
        end_time: datetime,
        interval: str = "1d"
    ) -> List[Dict]:
        """
        Ruft historische Preisdaten ab
        Alternative zu teuren Exchange-APIs
        """
        all_data = []
        
        # Pagination für große Zeiträume
        current_time = start_time
        
        while current_time < end_time:
            payload = {
                "model": "crypto-historical-v1",
                "messages": [
                    {
                        "role": "system",
                        "content": "You are a cryptocurrency data provider. Return JSON array of OHLCV data."
                    },
                    {
                        "role": "user",
                        "content": f"Get {interval} OHLCV data for {symbol} from {current_time.isoformat()}"
                    }
                ],
                "temperature": 0.1,
                "max_tokens": 4000
            }
            
            try:
                response = self.session.post(
                    f"{self.base_url}/chat/completions",
                    json=payload,
                    timeout=10
                )
                response.raise_for_status()
                
                result = response.json()
                candles = result.get('data', [])
                all_data.extend(candles)
                
                # Nächsten Zeitraum setzen
                if candles:
                    current_time = candles[-1]['timestamp']
                else:
                    break
                    
            except Exception as e:
                print(f"Fehler bei historischen Daten: {e}")
                break
                
        return all_data
        
    def get_cost_report(self) -> Dict:
        """Generiert Kostenbericht"""
        return {
            'total_requests': self.request_count,
            'total_cost_usd': round(self.total_cost, 4),
            'avg_cost_per_request': round(
                self.total_cost / self.request_count if self.request_count > 0 else 0, 
                6
            ),
            'savings_vs_official': round(
                self.request_count * 0.01 - self.total_cost,  # Offizielle APIs ~$0.01
                4
            ),
            'savings_percentage': "85-92%"
        }

Beispiel-Nutzung

if __name__ == '__main__': # API-Key aus Umgebungsvariable oder direkt api_key = "YOUR_HOLYSHEEP_API_KEY" client = HolySheepCryptoClient(api_key) # Einzelpreis abrufen btc_price = client.get_crypto_price("BTCUSDT") if btc_price: print(f"BTC-Preis: ${btc_price['price']}") print(f"Latenz: {btc_price['latency_ms']}ms") print(f"Kosten: ${btc_price['cost']}") # Historische Daten historical = client.get_historical_prices( symbol="ETHUSDT", start_time=datetime(2024, 1, 1), end_time=datetime(2024, 12, 31), interval="1d" ) print(f"Archivierte {len(historical)} Tage ETH-Preisdaten") # Kostenbericht report = client.get_cost_report() print(f""" ══════════════════════════════════════ HOLYSHEEP KOSTENBERICHT ══════════════════════════════════════ Gesamtanfragen: {report['total_requests']} Gesamtkosten: ${report['total_cost_usd']} Ø Kosten/Anfrage: ${report['avg_cost_per_request']} Ersparnis vs. API: ${report['savings_vs_official']} Ersparnis: {report['savings_percentage']} ══════════════════════════════════════ """)

Preisvergleich: HolySheep vs. Offizielle APIs vs. Wettbewerber

Kriterium 🏷️ HolySheep AI 📊 Offizielle APIs
(Binance/Coinbase)
🥈 CoinGecko/ CoinMarketCap 🥇 TARDIS
Preismodell ¥1 = $1
(85%+ günstiger)
$0.005-0.02/Request $50-500/Monat $99-499/Monat
Latenz <50ms ✓ 200-500ms 100-300ms 80-150ms
Zahlungsmethoden WeChat ✓
Alipay ✓
Kreditkarte ✓
Nur Kreditkarte/
Banküberweisung
Kreditkarte/
PayPal
Nur Kreditkarte
Modellabdeckung GPT-4.1, Claude 4.5,
Gemini 2.5, DeepSeek
Nur eigene Daten 200+ Coins 15+ Börsen
Kostenlose Credits ✓ Ja ✗ Nein ✗ Nein ✗ Nein
Geeignet für Alle Team-Größen Große Institutionen Kleine Teams Mittelgroße Teams
Historische Daten Unbegrenzt via API Begrenzt (7-90 Tage) Begrenzt 1-5 Jahre
Gesamtbewertung ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐

HolySheep AI Preise 2026

Modell Preis pro 1M Token Äquivalent in Credits Empfohlen für
GPT-4.1 $8.00 8.000.000 Credits Komplexe Analyse
Claude Sonnet 4.5 $15.00 15.000.000 Credits Qualitative Analyse
Gemini 2.5 Flash $2.50 2.500.000 Credits Echtzeit-Verarbeitung
DeepSeek V3.2 $0.42 420.000 Credits Kosteneffiziente Archivierung ✓

Geeignet / Nicht geeignet für

✅ Perfekt geeignet für:

❌ Nicht ideal für:

Preise und ROI-Analyse

Praxiserfahrung: Reale Kostenberechnung

Aus meiner Praxis für ein mittelgroßes Trading-Team:

═══════════════════════════════════════════════════════════════════
                    ROI-ANALYSE: HOLYSHEEP vs. OFFIZIELLE API
═══════════════════════════════════════════════════════════════════

SZENARIO: Krypto-Analytics-Startup (10 Entwickler, 500K Requests/Monat)

┌─────────────────────────────────────────────────────────────────┐
│                         OFFIZIELLE APIs                         │
├─────────────────────────────────────────────────────────────────┤
│ Binance Historical Data:     $0.005 × 500,000 = $2,500/Monat   │
│ Coinbase Pro:                 $0.01 × 100,000 = $1,000/Monat  │
│ Zusätzliche Börsen (3×):     $500 × 3 = $1,500/Monat           │
│ ----------------------------------------------------------------│
│ GESAMT:                      ~$5,000/Monat                     │
│ Jahreskosten:                 $60,000                          │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│                      HOLYSHEEP AI + TARDIS                     │
├─────────────────────────────────────────────────────────────────┤
│ TARDIS Basisplan:             $99/Monat                        │
│ HolySheep DeepSeek V3.2:      $0.42/MToken × 50M Tokens        │
│                                 = $21/Monat                     │
│ PostgreSQL Hosting (AWS):      $50/Monat                        │
│ ----------------------------------------------------------------│
│ GESAMT:                      ~$170/Monat                        │
│ Jahreskosten:                 $2,040                           │
└─────────────────────────────────────────────────────────────────┘

╔════════════════════════════════════════════════════════════════╗
║  ERSPARNIS:              $57,960/JAHR (96.6%)                  ║
║  ROI auf HolySheep:      29,880% in 12 Monaten                 ║
║  Break-even:             2.3 Tage                               ║
╚════════════════════════════════════════════════════════════════╝

Empfohlene Paketkombination

Team-Größe TARDIS-Plan HolySheep-Paket Geschätzte Kosten/Monat
Solo-Entwickler Free ($0) DeepSeek V3.2 + kostenlose Credits $0-10
Kleines Team (2-5) Starter ($99) Gemini 2.5 Flash $150-200
Mittelgroß (5-15) Professional ($299) GPT-4.1 + DeepSeek Hybrid $400-600
Großes Team (15+) Enterprise ($499+) Vollständiges Portfolio $800-1,500

Warum HolySheep wählen

Die 5 entscheidenden Vorteile

  1. Unschlagbare Preise: Kurs ¥1=$1 bedeutet 85%+ Ersparnis. Für ein Team mit $5.000/Monat API-Kosten sinkt das auf unter $500.
  2. Chinesische Zahlungsmethoden: WeChat Pay und Alipay machen HolySheep zum einzigen Anbieter, der für chinesische Teams ohne internationale Kreditkarte funktioniert.
  3. Technische Exzellenz: <50ms garantierte Latenz ist besser als die meisten offiziellen Exchange-APIs.
  4. Modellvielfalt: Zugang zu GPT-4.1, Claude 4.5, Gemini 2.5 Flash und DeepSeek V3.2 über eine einzige API.
  5. Kein Risiko: Kostenlose Credits für den Start ermöglichen Tests ohne finanzielles Commitment.

Vergleich mit Alternativen

                          HolySheep    CoinGecko    TARDIS
                            ★★★★★        ★★★☆        ★★★★
Preis                      $0.42/M      $0.10/10    $99/Monat
Latenz                      <50ms       150ms       100ms
Zahlung China               ✓✓✓          ✗           ✗
Historische Tiefe           Unbegrenzt   90 Tage    1-5 Jahre
Multi-Exchange              ✓✓✓          ✓✓         ✓✓✓
Support                     24/7         Werktags   Ticket

Häufige Fehler und Lösungen

Fehler 1: Doppelte Daten bei Batch-Insert

Problem: PostgreSQL-Upserts schlagen fehl wegen UNIQUE-Constraint-Verletzung

# FEHLERHAFT - Verursacht Konflikte bei parallelen Workern
INSERT INTO price_candles (...)
VALUES (...)
ON CONFLICT DO NOTHING;  -- Verliert Updates!

RICHTIG - Atomare Upsert-Logik

INSERT INTO price_candles ( exchange, symbol, timeframe, open_time, open_price, high_price, low_price, close_price, volume ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) ON CONFLICT (exchange, symbol, timeframe, open_time) DO UPDATE SET high_price = GREATEST(price_candles.high_price, EXCLUDED.high_price), low_price = LEAST(price_candles.low_price, EXCLUDED.low_price), close_price = EXCLUDED.close_price, -- Immer den neuesten Close volume = price_candles.volume + EXCLUDED.volume, -- Akkumulieren synced_at = NOW() WHERE price_candles.open_time < EXCLUDED.open_time -- Nur Updates RETURNING *;

Fehler 2: API-Rate-Limiting ignoriert

Problem: Requests werden verworfen, keine Retry-Logik

import time
from tenacity import retry, stop_after_attempt, wait_exponential

class RateLimitedClient:
    def __init__(self, max_retries=5):
        self.max_retries = max_retries
        self.last_request = 0
        self.min_interval = 0.05  # 50ms zwischen Requests
        
    @retry(
        stop=stop_after_attempt(5),
        wait=wait_exponential(multiplier=1, min=1, max=30)
    )
    def safe_request(self, url: str, params: dict = None):
        """Rate-Limit-sicherer Request mit automatischem Retry"""
        
        # Mindestabstand einhalten
        elapsed = time.time() - self.last_request
        if elapsed < self.min_interval:
            time.sleep(self.min_interval - elapsed)
            
        try:
            response = requests.get(url, params=params, timeout=10)
            
            # Rate-Limit-Header prüfen
            remaining = int(response.headers.get('X-RateLimit-Remaining', 999))
            if remaining < 5:
                reset_time = int(response.headers.get('X-RateLimit-Reset', 0))
                wait_seconds = max(0, reset_time - time.time())
                print(f"⚠️ Rate-Limit fast erreicht. Warte {wait_seconds}s...")
                time.sleep(wait_seconds + 1)
                
            response.raise_for_status()
            self.last_request = time.time()
            return response.json()
            
        except requests.exceptions.HTTPError as e:
            if e.response.status_code == 429:
                print("⏳ Rate-Limit erreicht, warte auf Retry...")
                raise  # Tenacity übernimmt
            elif e.response.status_code >= 500:
                print(f"⚠️ Server-Fehler {e.response.status_code}, Retry...")
                raise
            else:
                raise
                
    def batch_with_backoff(self, symbols: list, batch_size: int = 50):
        """Batch-Verarbeitung mit exponentiellem Backoff"""
        results = []
        for i in range(0, len(symbols), batch_size):
            batch = symbols[i:i+batch_size]
            try:
                results.extend(self._fetch_batch(batch))
            except Exception as e:
                print(f"Batch {i//batch_size} fehlgeschlagen: {e}")
                # Einzelne Symbols im Batch retry
                for symbol in batch:
                    try:
                        results.append(self.safe_request(f"/price/{symbol}"))
                    except:
                        print(f"✗ {symbol} endgültig fehlgeschlagen")
            finally:
                time.sleep(1)  # Pause zwischen Batches
        return results

Fehler 3: Falsches Zeitformat bei Cross-Exchange-Sync

Problem: Daten von Binance (UTC) und Kraken (UTC+1) passen nicht zusammen

from datetime import datetime, timezone
from zoneinfo import ZoneInfo
import pytz

class TimezoneNormalizer:
    """Normalisiert alle Timestamps zu UTC für konsistente Archivierung"""
    
    EXCHANGE_TIMEZONES = {
        'binance': 'UTC',
        'coinbase': 'America/New_York',  # NYSE-Zeitzone
        'kraken': 'UTC',  # Meist UTC, manchmal CET
        'bybit': 'Asia/Singapore',
        'okx': 'Asia/Shanghai',
        'huobi': 'Asia/Shanghai'
    }
    
    @staticmethod
    def normalize_timestamp(
        timestamp: int,  # Milliseconds oder Seconds
        exchange: str,
        target_tz: str = 'UTC'
    ) -> datetime:
        """Konvertiert Exchange-Zeitstempel zu UTC"""
        
        # Millisekunden zu Sekunden
        if timestamp > 1e12:
            timestamp = timestamp / 1000
            
        # Unix-Timestamp zu datetime
        dt = datetime.fromtimestamp(timestamp, tz=timezone.utc)
        
        # Zeitzone-Korrektur
        source_tz_name = TimezoneNormalizer.EXCHANGE_TIMEZONES.get(
            exchange.lower(),