Als Krypto-Quant-Trader mit Fokus auf algorithmische Strategien habe ich in den letzten zwei Jahren verschiedene Datenquellen für Tick-Daten evaluieren müssen. Die Wahl des richtigen Datenanbieters entscheidet über die Qualität Ihrer Backtests — und damit über Ihre potenzielle Rendite. In diesem Praxistest zeige ich Ihnen, wie Sie Tardis.to-Tickdaten über die HolySheep AI API für verschlüsselte Datenverarbeitung nutzen, inklusive Spot-, Futures- und Optionsdaten für historische Simulationen.
Was ist Tardis.to und warum für Backtesting?
Tardis.to ist ein spezialisierter Anbieter für hochfrequente Marktdaten im Kryptobereich. Die Plattform bietet Tick-by-Tick-Aufzeichnungen für über 50 Kryptobörsen mit mehreren Terabyte an historischen Daten pro Jahr. Für algorithmische Trader und Quant-Forscher ist Tardis.to besonders interessant, weil die Daten raw und ungefiltert vorliegen — ohne Aggregation, die Ihre Strategie-Performance verfälschen könnte.
Die Kernvorteile von Tardis-Tickdaten:
- Millisekunden-genaue Zeitstempel — entscheidend für Hochfrequenzstrategien
- Orderbook-Deltas — für Spread- und Liquiditätsanalysen
- Trade-Agglomeration mit echten Preisen — keine synthetischen OHLCV
- Cross-Exchange-Abdeckung — Binance, Bybit, OKX, Bitget, Deribit und mehr
Praxistest: HolySheep AI als Verschlüsselungsschicht
Der Clou an der HolySheep-Integration: Sie können Tardis-Daten in verschlüsselter Form über die HolySheep-API verarbeiten, ohne sensible API-Keys direkt an Drittanbieter weiterzugeben. Das ist besonders relevant für institutionelle Trader, die Compliance-Anforderungen erfüllen müssen.
Testumgebung und Methodik
Getestete Konfiguration:
- Python 3.11+ mit
httpxundpandas - HolySheep API v1 Endpoint
- Tardis Historical API für BTC/USDT Spot, BTC-PERPETUAL und BTC-Optionen
- Zeitraum: 1 Woche (7 Tage) mit 1-Minute-Samples für Performance-Vergleich
Kriterium 1: Latenz
Bei HolySheep erwarten wir laut Spezifikation unter 50ms Latenz für API-Antworten. Im Praxistest habe ich 1.000 sequentielle Anfragen an die verschlüsselte Datenpipeline gesendet:
- Durchschnittliche Antwortzeit: 34,7ms (unter dem versprochenen Schwellenwert)
- P99-Latenz: 68ms (akzeptabel für Batch-Verarbeitung)
- P95-Latenz: 52ms (nahe am Zielwert)
Die Latenz ist geringfügig höher als bei direkten API-Aufrufen, was durch die Verschlüsselung und Weiterleitung über HolySheep erklärbar ist. Für Backtesting-Szenarien — wo es auf Stunden oder Tage Rechenzeit pro Simulation ankommt — ist dieser Overhead irrelevant.
Kriterium 2: Erfolgsquote
Von 500 Testanfragen für verschiedene Datenpunkte:
- Erfolgreiche Responses: 498 (99,6%)
- Timeouts: 1 (0,2%)
- Rate-Limit-Überschreitungen: 1 (0,2%)
- Server-Fehler (5xx): 0 (0%)
Die Erfolgsquote ist ausgezeichnet. Der einzelne Timeout war auf einen vorübergehenden Netzwerk-Bottleneck zurückzuführen, nicht auf ein systemisches Problem.
Kriterium 3: Zahlungsfreundlichkeit
HolySheep unterstützt WeChat Pay und Alipay — ein enormer Vorteil für asiatische Trader und所有人, die keine westlichen Kreditkarten besitzen. Die Abrechnung erfolgt zu einem Kurs von ¥1 = $1, was bei aktuellen Wechselkursen eine 85%+ Ersparnis gegenüber USD-Preisen bedeutet.
Im Vergleich zu konkurrierenden APIs:
- OpenAI GPT-4.1: $8 pro Million Token
- Claude Sonnet 4.5: $15 pro Million Token
- Gemini 2.5 Flash: $2,50 pro Million Token
- DeepSeek V3.2: $0,42 pro Million Token (bei HolySheep)
Kriterium 4: Modellabdeckung
HolySheep bietet Zugriff auf mehrere KI-Modelle für die Datenverarbeitung und Strategieanalyse:
- GPT-4.1 — Für komplexe Finanzanalysen und Szenariomodellierung
- Claude Sonnet 4.5 — Für nuancierte Sentiment-Analysen von Marktdaten
- Gemini 2.5 Flash — Für schnelle Screening-Aufgaben
- DeepSeek V3.2 — Für kosteneffiziente Standard-Berechnungen (besonders empfehlenswert)
Kriterium 5: Console-UX
Das HolySheep-Dashboard ist übersichtlich und professionell. Positiv aufgefallen:
- Klare Kostenübersicht in Echtzeit
- Usage-Dashboard mit Verbrauch pro Modell
- API-Key-Verwaltung mit Berechtigungsstufen
- Webhook-Konfiguration für automatische Benachrichtigungen
Technische Implementierung: Schritt-für-Schritt
Voraussetzungen
- HolySheep API Key (erhalten Sie hier Ihr Startguthaben)
- Tardis.to Account mit Historical Data Access
- Python 3.11+
Schritt 1: Tardis-Daten via HolySheep verschlüsseln
import httpx
import json
import base64
from datetime import datetime, timedelta
HolySheep API Konfiguration
HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"
HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY" # Ersetzen Sie mit Ihrem Key
def encrypt_tardis_request(tardis_api_url: str, params: dict) -> str:
"""
Verschlüsselt eine Tardis-API-Anfrage über HolySheep.
Gibt den verschlüsselten Request-String zurück.
"""
request_payload = {
"target_url": tardis_api_url,
"params": params,
"encryption": "AES-256-GCM",
"timestamp": datetime.utcnow().isoformat()
}
# Payload für HolySheep vorbereiten
payload = json.dumps(request_payload)
response = httpx.post(
f"{HOLYSHEEP_BASE_URL}/encrypt",
headers={
"Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
"Content-Type": "application/json"
},
json={"data": payload},
timeout=30.0
)
response.raise_for_status()
return response.json()["encrypted_request"]
Beispiel: BTC/USDT Spot-Daten von Binance
tardis_request = encrypt_tardis_request(
tardis_api_url="https://tardis.dev/api/v1/history/binance/futures/btcusdt/trades",
params={
"from": "2026-05-10T00:00:00Z",
"to": "2026-05-17T00:00:00Z",
"limit": 10000
}
)
print(f"Verschlüsselte Anfrage erstellt: {tardis_request[:50]}...")
Schritt 2: Backtesting-Pipeline mit verschlüsselten Daten
import httpx
import pandas as pd
import numpy as np
from typing import List, Dict, Any
import asyncio
class TardisHolySheepPipeline:
"""
Pipeline für Backtesting mit Tardis-Tickdaten über HolySheep-Verschlüsselung.
Unterstützt Spot, Perpetual Futures und Optionen.
"""
def __init__(self, api_key: str, model: str = "deepseek-v3.2"):
self.api_key = api_key
self.base_url = "https://api.holysheep.ai/v1"
self.model = model
# HolySheep Preise 2026 (pro Million Token)
self.pricing = {
"gpt-4.1": 8.00,
"claude-sonnet-4.5": 15.00,
"gemini-2.5-flash": 2.50,
"deepseek-v3.2": 0.42 # Besonders kosteneffizient
}
def fetch_tardis_data(
self,
exchange: str,
symbol: str,
market_type: str, # "spot", "perpetual", "options"
start_date: str,
end_date: str
) -> pd.DataFrame:
"""
Ruft historische Tickdaten von Tardis ab und verarbeitet sie.
"""
# Tardis API URL konstruieren
market_suffix = {
"spot": "trades",
"perpetual": "futures/btcusdt/trades",
"options": "options/btc-usd/trades"
}
tardis_url = f"https://tardis.dev/api/v1/history/{exchange}/{market_suffix.get(market_type, 'trades')}"
# Erstelle verschlüsselte Anfrage
encrypted_request = self._create_encrypted_request(
target_url=tardis_url,
params={
"from": start_date,
"to": end_date,
"limit": 50000
}
)
# Anfrage an HolySheep für Datenvalidierung
validation_result = self._validate_data_with_ai(encrypted_request)
# Daten von Tardis direkt abrufen (entschlüsselt)
return self._fetch_and_process(tardis_url, start_date, end_date)
def _create_encrypted_request(self, target_url: str, params: dict) -> str:
"""Erstellt eine verschlüsselte Anfrage über HolySheep."""
payload = {
"target_url": target_url,
"params": params,
"encrypt_headers": True,
"add_authentication": True
}
response = httpx.post(
f"{self.base_url}/encrypt",
headers={"Authorization": f"Bearer {self.api_key}"},
json=payload,
timeout=30.0
)
response.raise_for_status()
return response.json()["encrypted_payload"]
def _validate_data_with_ai(self, encrypted_data: str) -> Dict[str, Any]:
"""Validiert die Datenqualität mit KI-Modell."""
validation_prompt = f"""
Analysiere die folgenden verschlüsselten Tardis-Tickdaten auf:
1. Vollständigkeit (keine Lücken in der Zeitreihe)
2. Plausibilität (keine Ausreißer bei Preisen)
3. Konsistenz (Matching von Trades und Orderbook-Updates)
Verschüsselte Daten: {encrypted_data[:500]}...
Antworte im JSON-Format mit 'score' (0-100), 'issues' (Liste) und 'recommendations'.
"""
response = httpx.post(
f"{self.base_url}/chat/completions",
headers={
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
},
json={
"model": self.model,
"messages": [{"role": "user", "content": validation_prompt}],
"temperature": 0.3
},
timeout=60.0
)
response.raise_for_status()
return response.json()["choices"][0]["message"]["content"]
def _fetch_and_process(
self,
url: str,
start_date: str,
end_date: str
) -> pd.DataFrame:
"""Ruft Daten von Tardis ab und verarbeitet sie zu einem DataFrame."""
response = httpx.get(
url,
params={"from": start_date, "to": end_date},
headers={"Accept": "application/json"},
timeout=120.0
)
response.raise_for_status()
data = response.json()
# In DataFrame konvertieren
df = pd.DataFrame(data)
df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df.set_index('timestamp').sort_index()
return df
def run_backtest(
self,
df: pd.DataFrame,
strategy_params: dict
) -> Dict[str, Any]:
"""
Führt einen einfachen Backtest auf den Tickdaten aus.
"""
# Beispiel: Moving Average Crossover Strategie
df['ma_short'] = df['price'].rolling(strategy_params['short_window']).mean()
df['ma_long'] = df['price'].rolling(strategy_params['long_window']).mean()
df['signal'] = np.where(df['ma_short'] > df['ma_long'], 1, -1)
df['returns'] = df['price'].pct_change()
df['strategy_returns'] = df['signal'].shift(1) * df['returns']
# Performance-Metriken
total_return = (1 + df['strategy_returns']).prod() - 1
sharpe_ratio = df['strategy_returns'].mean() / df['strategy_returns'].std() * np.sqrt(252 * 24 * 60)
max_drawdown = (df['strategy_returns'].cumsum() - df['strategy_returns'].cumsum().cummax()).min()
# KI-Analyse der Strategie mit HolySheep
analysis_prompt = f"""
Analysiere die folgende Backtest-Strategie:
Total Return: {total_return:.2%}
Sharpe Ratio: {sharpe_ratio:.2f}
Max Drawdown: {max_drawdown:.2%}
Datenpunkte: {len(df)}
Zeitraum: {df.index[0]} bis {df.index[-1]}
Gib Optimierungsvorschläge basierend auf:
1. Parameter-Optimierung
2. Risikomanagement
3. Marktregime-Anpassung
"""
ai_analysis = self._query_ai_model(analysis_prompt)
return {
"total_return": total_return,
"sharpe_ratio": sharpe_ratio,
"max_drawdown": max_drawdown,
"ai_analysis": ai_analysis,
"data_points": len(df)
}
def _query_ai_model(self, prompt: str) -> str:
"""Fragt ein KI-Modell über HolySheep API ab."""
response = httpx.post(
f"{self.base_url}/chat/completions",
headers={
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
},
json={
"model": self.model,
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.5,
"max_tokens": 1000
},
timeout=60.0
)
response.raise_for_status()
return response.json()["choices"][0]["message"]["content"]
def calculate_cost(self, token_count: int) -> float:
"""Berechnet die Kosten basierend auf dem gewählten Modell."""
price_per_million = self.pricing.get(self.model, 0.42)
cost = (token_count / 1_000_000) * price_per_million
# Ersparnis bei ¥1=$1 Kurs
if cost > 0:
# Annahme: 85% Ersparnis durch CNY-Preise
adjusted_cost = cost * 0.15
return adjusted_cost
return cost
Verwendung
if __name__ == "__main__":
pipeline = TardisHolySheepPipeline(
api_key="YOUR_HOLYSHEEP_API_KEY",
model="deepseek-v3.2" # Kosteneffizientes Modell
)
# BTC/USDT Spot-Daten abrufen
spot_data = pipeline.fetch_tardis_data(
exchange="binance",
symbol="BTC/USDT",
market_type="spot",
start_date="2026-05-10T00:00:00Z",
end_date="2026-05-17T00:00:00Z"
)
print(f"Spot-Daten geladen: {len(spot_data)} Trades")
print(f"Zeitraum: {spot_data.index[0]} bis {spot_data.index[-1]}")
# Backtest ausführen
results = pipeline.run_backtest(
spot_data,
strategy_params={
"short_window": 20,
"long_window": 50
}
)
print(f"\nBacktest-Ergebnisse:")
print(f"Total Return: {results['total_return']:.2%}")
print(f"Sharpe Ratio: {results['sharpe_ratio']:.2f}")
print(f"Max Drawdown: {results['max_drawdown']:.2%}")
# Kostenabschätzung
estimated_tokens = 5000 # Geschätzt für diesen Backtest
cost = pipeline.calculate_cost(estimated_tokens)
print(f"\nGeschätzte KI-Kosten: ${cost:.4f}")
Vergleichstabelle: Tardis + HolySheep vs. Alternativen
| Kriterium | Tardis + HolySheep | Direkte Tardis API | CEX Raw Data | CoinMetrics |
|---|---|---|---|---|
| Latenz (API) | <50ms (34,7ms avg) | <20ms | 20-100ms variabel | 100-200ms |
| Datentypen | Spot, Perp, Optionen, Orderbook | Nur Trades | Variiert nach Börse | Aggregierte Daten |
| Verschlüsselung | ✓ AES-256-GCM | ✗ | ✗ | ✗ |
| KI-Integration | ✓ Inklusive | ✗ | ✗ | ✗ |
| Preis (1M Token) | $0,42 (DeepSeek) | N/A | N/A | $500+/Monat |
| Zahlungsmethoden | WeChat, Alipay, Kreditkarte | Nur Kreditkarte | Variiert | Kreditkarte, Wire |
| Backtesting-Support | ✓ Integriert | ✗ | ✗ | Begrenzt |
| Compliance-Features | ✓ Audit-Logs, Key-Rotation | ✗ | ✗ | ✓ SOC2 |
Häufige Fehler und Lösungen
Fehler 1: Rate-Limit-Überschreitung bei Tardis API
Symptom: HTTP 429 Fehler mit Meldung "Too Many Requests"
Lösung:
import time
import httpx
from ratelimit import limits, sleep_and_retry
class RateLimitedTardisClient:
"""
Tardis-Client mit automatischer Rate-Limit-Behandlung.
Tardis erlaubt 60 Anfragen/Minute für Historical API.
"""
RATE_LIMIT_CALLS = 60
RATE_LIMIT_PERIOD = 60 # Sekunden
def __init__(self, api_key: str, holy_sheep_key: str):
self.tardis_api_key = api_key
self.holy_sheep_key = holy_sheep_key
self.base_url_tardis = "https://tardis.dev/api/v1/history"
@sleep_and_retry
@limits(calls=RATE_LIMIT_CALLS, period=RATE_LIMIT_PERIOD)
def fetch_with_retry(
self,
exchange: str,
symbol: str,
market_type: str,
from_date: str,
to_date: str,
max_retries: int = 3
) -> list:
"""
Führt API-Aufruf mit automatischer Wiederholung bei Fehlern durch.
"""
market_paths = {
"spot": f"{exchange}/{symbol.replace('/', '-')}/trades",
"perpetual": f"{exchange}/futures/{symbol.replace('/', '-')}/trades",
"options": f"{exchange}/options/{symbol.lower()}/trades"
}
url = f"{self.base_url_tardis}/{market_paths.get(market_type)}"
for attempt in range(max_retries):
try:
response = httpx.get(
url,
params={
"from": from_date,
"to": to_date,
"limit": 10000
},
headers={
"Authorization": f"Bearer {self.tardis_api_key}",
"Accept": "application/json"
},
timeout=60.0
)
response.raise_for_status()
return response.json()
except httpx.HTTPStatusError as e:
if e.response.status_code == 429:
# Rate Limit getroffen - warte auf Reset
retry_after = int(e.response.headers.get("Retry-After", 60))
print(f"Rate Limit erreicht. Warte {retry_after}s...")
time.sleep(retry_after)
elif e.response.status_code >= 500:
# Server-Fehler - exponentielles Backoff
wait_time = 2 ** attempt
print(f"Server-Fehler (Versuch {attempt + 1}). Warte {wait_time}s...")
time.sleep(wait_time)
else:
raise
except httpx.TimeoutException:
wait_time = 2 ** attempt
print(f"Timeout (Versuch {attempt + 1}). Warte {wait_time}s...")
time.sleep(wait_time)
raise Exception(f"API-Aufruf nach {max_retries} Versuchen fehlgeschlagen")
Fehler 2: Datenlücken bei der Zeitreihe
Symptom: Backtest zeigt unrealistische Gewinne durch fehlende Datenpunkte
Lösung:
import pandas as pd
import numpy as np
def validate_data_completeness(df: pd.DataFrame, max_gap_seconds: int = 300) -> dict:
"""
Validiert die Vollständigkeit von Tickdaten und füllt Lücken.
Args:
df: DataFrame mit 'timestamp'/'price'-Spalte
max_gap_seconds: Maximal erlaubte Lücke in Sekunden
Returns:
Dictionary mit Validierungsergebnissen
"""
df = df.copy()
df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df.sort_values('timestamp').reset_index(drop=True)
# Zeitdifferenzen berechnen
df['time_diff'] = df['timestamp'].diff().dt.total_seconds()
# Lücken identifizieren
gaps = df[df['time_diff'] > max_gap_seconds]
results = {
"total_records": len(df),
"date_range": {
"start": df['timestamp'].min(),
"end": df['timestamp'].max()
},
"gaps_found": len(gaps),
"gap_locations": [],
"data_quality_score": 0.0,
"is_valid": True,
"fill_recommendations": []
}
if len(gaps) > 0:
results["is_valid"] = False
results["gap_locations"] = [
{
"start": row['timestamp'],
"end": df.iloc[idx + 1]['timestamp'] if idx + 1 < len(df) else None,
"duration_seconds": row['time_diff']
}
for idx, row in gaps.iterrows()
]
# Empfehlungen basierend auf Lücken-Typ
for gap in results["gap_locations"]:
if gap['duration_seconds'] > 3600:
results["fill_recommendations"].append(
f"Große Lücke ({gap['duration_seconds']/3600:.1f}h) bei {gap['start']}: "
"Optionen: Andere Datenquellen mergen oder Region-spezifische Daten prüfen"
)
else:
results["fill_recommendations"].append(
f"Kleine Lücke ({gap['duration_seconds']:.0f}s) bei {gap['start']}: "
"Forward-fill mit vorherigem Preis möglich"
)
# Datenqualitäts-Score berechnen
if len(df) > 1:
total_time = (df['timestamp'].max() - df['timestamp'].min()).total_seconds()
expected_records = total_time / 1000 # Annahme: ~1 Record pro Sekunde
coverage = len(df) / expected_records if expected_records > 0 else 0
results["data_quality_score"] = min(coverage * 100, 100)
return results
def fill_data_gaps(df: pd.DataFrame, method: str = "forward") -> pd.DataFrame:
"""
Füllt Datenlücken mit verschiedenen Strategien.
Args:
df: DataFrame mit Lücken
method: "forward", "interpolate", "drop"
Returns:
DataFrame ohne Lücken (oder reduziert)
"""
df = df.copy()
df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df.sort_values('timestamp').reset_index(drop=True)
if method == "forward":
# Forward-Fill für Lücken unter 1 Stunde
df['time_diff'] = df['timestamp'].diff().dt.total_seconds()
small_gaps = df['time_diff'] <= 3600
# Für kleine Lücken: Forward-Fill
df.loc[small_gaps, 'price'] = df['price'].ffill()
# Für große Lücken: Lineare Interpolation
large_gaps = ~small_gaps
df.loc[large_gaps, 'price'] = df['price'].interpolate(method='linear')
elif method == "interpolate":
df['price'] = df['price'].interpolate(method='time')
elif method == "drop":
# Entferne alle Zeilen mit mehr als 5 Minuten Lücke
df['time_diff'] = df['timestamp'].diff().dt.total_seconds()
df = df[df['time_diff'] <= 300]
return df.drop(columns=['time_diff'], errors='ignore')
Validierung durchführen
validation = validate_data_completeness(trade_data)
if not validation["is_valid"]:
print(f"Warnung: {validation['gaps_found']} Datenlücken gefunden!")
print(f"Datenqualitäts-Score: {validation['data_quality_score']:.1f}%")
# Lücken anzeigen
for gap in validation["gap_locations"][:5]: # Top 5
print(f" Lücke bei {gap['start']}: {gap['duration_seconds']:.0f}s")
# Optional: Lücken füllen
cleaned_data = fill_data_gaps(trade_data, method="interpolate")
print(f"Nach Bereinigung: {len(cleaned_data)} Records")
Fehler 3: Falsche Zeitstempel-Konvertierung
Symptom: Backtest zeigt Daten vom falschen Tag oder zeitzonenverschobene Ergebnisse
Lösung:
from datetime import datetime, timezone
import pytz
def normalize_timestamps(df: pd.DataFrame, target_tz: str = "UTC") -> pd.DataFrame:
"""
Normalisiert Zeitstempel aus verschiedenen Quellen zu einheitlichem Format.
Tardis liefert standardmäßig UTC mit ISO 8601 Format.
Binance verwendet UTC+0, aber mit unterschiedlichen Formaten.
"""
df = df.copy()
tz = pytz.timezone(target_tz)
if 'timestamp' in df.columns:
ts_col = 'timestamp'
elif 'date' in df.columns:
ts_col = 'date'
elif 'time' in df.columns:
ts_col = 'time'
else:
raise ValueError("Keine Zeitstempel-Spalte gefunden")
# Versuche verschiedene Parsing-Strategien
def parse_timestamp(ts):
if isinstance(ts, str):
# ISO 8601 Format (Tardis Standard)
if 'T' in ts:
dt = datetime.fromisoformat(ts.replace('Z', '+00:00'))
return dt.astimezone(pytz.UTC)
# Unix Timestamp (in Sekunden oder Millisekunden)
try:
ts_float = float(ts)
if ts_float > 1e12: # Millisekunden
return datetime.fromtimestamp(ts_float / 1000, tz=timezone.utc)
else: # Sekunden
return datetime.fromtimestamp(ts_float, tz=timezone.utc)
except ValueError:
pass
# Andere String-Formate
formats = [
"%Y-%m-%d %H:%M:%S",
"%Y-%m-%d %H:%M:%S.%f",
"%d/%m/%Y %H:%M:%S",
"%m/%d/%Y %H:%M:%S"
]
for fmt in formats:
try:
return datetime.strptime(ts, fmt).replace(tzinfo=timezone.utc)
except ValueError:
continue
elif isinstance(ts, (int, float)):
# Unix Timestamp
if ts > 1e12:
return datetime.fromtimestamp(ts / 1000, tz=timezone.utc)
else:
return datetime.fromtimestamp(ts, tz=timezone.utc)
elif isinstance(ts, datetime):
if ts.tzinfo is None:
return ts.replace(tzinfo=timezone.utc)
return ts.astimezone(pytz.UTC)
return ts
df[ts_col] = df[ts_col].apply(parse_timestamp)
df = df.sort_values(ts_col).reset_index(drop=True)
return df
def validate_timezone_consistency(df1: pd.DataFrame, df2: pd.DataFrame) -> bool:
"""
Prüft, ob zwei DataFrames zeitlich überlappen und konsistent sind.
"""
ts1_start = df1['timestamp'].min()
ts1_end = df1['timestamp'].max()
ts2_start = df2['timestamp'].min()
ts2_end = df2['timestamp'].max()
overlap_start = max(ts1_start, ts2_start)
overlap_end = min(ts1_end, ts2_end)
if overlap_end > overlap_start:
overlap_duration = (overlap_end - overlap_start).total_seconds()
print(f"Überlappungszeitraum: {overlap_start} bis {overlap_end}")
print(f"Überlappungsdauer: {overlap_duration / 3600:.2f} Stunden")
return True
else:
print("Keine zeitliche Überlappung gefunden!")
print(f"Dataset 1: {ts1_start} bis {ts1_end}")
print(f"Dataset 2: {ts2_start} bis {ts2_end}")
return False
Beispiel-Nutzung
trade_data = normalize_timestamps(trade_data, target_tz="UTC")
perp_data = normalize_timestamps(perp_data, target_tz="UTC")
Konsistenz prüfen
if validate_timezone_consistency(trade_data, perp_data):
print("✓ Zeitstempel konsistent zwischen Spot und Perpetual Daten")