Stellen Sie sich vor: Sie sind ein Indie-Entwickler, der seit drei Monaten an einer Bitcoin-Trading-Strategie arbeitet. Ihre Hypothese basiert auf volumengewichteten Durchschnittspreisen und Momentum-Indikatoren. Bevor Sie echtes Kapital riskieren, möchten Sie die Strategie gegen zwei Jahre historischer Daten validieren. Das Problem? Rohdaten von Börsen sind unstrukturiert, die Verarbeitung kostspielig, und herkömmliche Backtesting-Frameworks liefern keine Einblicke in die semantische Bedeutung von Marktmustern.
In diesem Tutorial zeige ich Ihnen, wie Sie Tardis.dev Historical Ticker Data mit KI-gestützter Analyse kombinieren, um robuste Strategie-Backtests durchzuführen. Sie lernen, wie Sie historische Marktdaten abrufen, mit Large Language Models analysieren und so zu fundierten Trading-Entscheidungen gelangen.
Was ist Tardis.dev und warum eignet es sich für Backtesting?
Tardis.dev ist ein Dienstleister für historische Marktdaten im Kryptobereich. Im Gegensatz zu vielen Konkurrenten bietet Tardis.dev:
- Millisekunden-genaue Timestamps für präzises Backtesting
- WebSocket-Streaming für Echtzeit-Daten und Batch-Downloads
- Tick-Daten statt nur aggregierter Candlesticks
- 100+ Börsen abgedeckt, inklusive Binance, Coinbase, Kraken
- RESTful API mit einfachem Python-Zugriff
Für unser Backtesting-Projekt nutzen wir speziell die Ticker-Daten, die individuelle Handelsaufträge mit Preis, Volumen und Timestamp erfassen – ideal für volumengewichtete Strategien.
Voraussetzungen und Setup
Bevor wir beginnen, benötigen Sie:
- Python 3.9+ mit
pip - Ein HolySheep AI Konto für die KI-Analyse (¥1=$1, 85%+ Ersparnis gegenüber Alternativen)
- Ein Tardis.dev API-Token (kostenlose Testversion verfügbar)
# Installation der erforderlichen Pakete
pip install requests pandas numpy python-dateutil
Für fortgeschrittene Visualisierung (optional)
pip install matplotlib plotly
Überprüfung der Installation
python -c "import requests, pandas; print('Setup erfolgreich!')"
Schritt 1: Historische Daten von Tardis.dev abrufen
Der erste Schritt besteht darin, relevante historische Ticker-Daten zu beschaffen. Tardis.dev bietet verschiedene Endpunkte für unterschiedliche Datentypen. Für unser Backtesting konzentrieren wir uns auf aggregierte Ticker-Daten, die Preisbewegungen über Zeitintervalle zusammenfassen.
import requests
import pandas as pd
from datetime import datetime, timedelta
import time
class TardisClient:
"""
Client für Tardis.dev Historical Data API
Ermöglicht das Abrufen von Ticker-Daten für Backtesting
"""
BASE_URL = "https://api.tardis.dev/v1"
def __init__(self, api_token: str):
self.api_token = api_token
self.session = requests.Session()
self.session.headers.update({
'Authorization': f'Bearer {api_token}'
})
def get_symbols(self, exchange: str) -> list:
"""
Listet alle verfügbaren Symbole einer Börse auf
"""
url = f"{self.BASE_URL}/exchanges/{exchange}/symbols"
response = self.session.get(url)
response.raise_for_status()
return response.json()
def get_ticker_data(self, exchange: str, symbol: str,
start_date: str, end_date: str,
limit: int = 10000) -> pd.DataFrame:
"""
Ruft historische Ticker-Daten für ein Symbol ab
Args:
exchange: Börsenname (z.B. 'binance', 'coinbase')
symbol: Trading-Paar (z.B. 'BTC-USDT')
start_date: Startdatum im Format 'YYYY-MM-DD'
end_date: Enddatum im Format 'YYYY-MM-DD'
limit: Maximale Anzahl an Datensätzen pro Anfrage
Returns:
DataFrame mit Ticker-Daten
"""
url = f"{self.BASE_URL}/feeds/{exchange}:{symbol}"
params = {
'from': start_date,
'to': end_date,
'limit': limit
}
all_tickers = []
last_id = None
while True:
if last_id:
params['after'] = last_id
response = self.session.get(url, params=params)
response.raise_for_status()
data = response.json()
if not data or 'tickers' not in data:
break
all_tickers.extend(data['tickers'])
# Pagination: Tardis.dev limitiert Antworten
if len(data['tickers']) < limit:
break
last_id = data['tickers'][-1].get('id')
time.sleep(0.1) # Rate Limiting respektieren
print(f"Abgerufen: {len(all_tickers)} Ticker...")
# DataFrame erstellen
df = pd.DataFrame(all_tickers)
if not df.empty:
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
df = df.sort_values('timestamp')
return df
Beispiel-Nutzung
TARDIS_API_KEY = "ihr_tardis_api_token" # Ersetzen Sie mit Ihrem Token
client = TardisClient(TARDIS_API_KEY)
BTC/USDT Daten von Binance für Januar 2024 abrufen
btc_data = client.get_ticker_data(
exchange='binance',
symbol='BTC-USDT',
start_date='2024-01-01',
end_date='2024-01-31'
)
print(f"\nAbgerufene Datensätze: {len(btc_data)}")
print(btc_data.head())
Schritt 2: Strategie-Signale aus Marktdaten extrahieren
Mit den rohen Ticker-Daten können wir nun technische Indikatoren berechnen und Trading-Signale generieren. Für unser Beispiel implementieren wir eine Mean-Reversion-Strategie mit Volumenbestätigung.
import numpy as np
class TradingStrategy:
"""
Mean-Reversion Strategie mit Volumenanalyse
Generiert Kauf-/Verkaufssignale basierend auf:
- Bollinger Bands für Preisanomalien
- Volumenveränderungen zur Bestätigung
"""
def __init__(self, window: int = 20, std_dev: float = 2.0,
volume_threshold: float = 1.5):
self.window = window
self.std_dev = std_dev
self.volume_threshold = volume_threshold
def calculate_bollinger_bands(self, df: pd.DataFrame) -> pd.DataFrame:
"""
Berechnet Bollinger Bands
"""
df = df.copy()
df['SMA'] = df['price'].rolling(window=self.window).mean()
df['STD'] = df['price'].rolling(window=self.window).std()
df['Upper_Band'] = df['SMA'] + (df['STD'] * self.std_dev)
df['Lower_Band'] = df['SMA'] - (df['STD'] * self.std_dev)
return df
def calculate_volume_ma(self, df: pd.DataFrame) -> pd.DataFrame:
"""
Berechnet gleitenden Volumendurchschnitt
"""
df = df.copy()
df['Volume_MA'] = df['volume'].rolling(window=self.window).mean()
df['Volume_Ratio'] = df['volume'] / df['Volume_MA']
return df
def generate_signals(self, df: pd.DataFrame) -> pd.DataFrame:
"""
Generiert Trading-Signale
BUY: Preis unter unterem Bollinger Band + hohes Volumen
SELL: Preis über oberem Bollinger Band + hohes Volumen
"""
df = self.calculate_bollinger_bands(df)
df = self.calculate_volume_ma(df)
# Signale definieren
df['Signal'] = 'HOLD'
# Kaufsignal: Preis unter unterem Band UND Volumen bestätigt
buy_condition = (
(df['price'] < df['Lower_Band']) &
(df['Volume_Ratio'] > self.volume_threshold)
)
df.loc[buy_condition, 'Signal'] = 'BUY'
# Verkaufssignal: Preis über oberem Band UND Volumen bestätigt
sell_condition = (
(df['price'] > df['Upper_Band']) &
(df['Volume_Ratio'] > self.volume_threshold)
)
df.loc[sell_condition, 'Signal'] = 'SELL'
return df
def backtest(self, df: pd.DataFrame, initial_capital: float = 10000) -> dict:
"""
Führt Backtest der Strategie durch
Returns:
Dictionary mit Performance-Metriken
"""
df = self.generate_signals(df)
capital = initial_capital
position = 0 # Anzahl BTC
trades = []
for idx, row in df.iterrows():
if row['Signal'] == 'BUY' and position == 0:
# All-in kaufen
position = capital / row['price']
trades.append({
'type': 'BUY',
'price': row['price'],
'timestamp': row['timestamp'],
'capital': capital
})
capital = 0
elif row['Signal'] == 'SELL' and position > 0:
# Alles verkaufen
capital = position * row['price']
trades.append({
'type': 'SELL',
'price': row['price'],
'timestamp': row['timestamp'],
'capital': capital
})
position = 0
# Finale Bewertung
final_value = capital + (position * df.iloc[-1]['price'])
total_return = ((final_value - initial_capital) / initial_capital) * 100
# Buy & Hold Vergleich
first_price = df.iloc[0]['price']
last_price = df.iloc[-1]['price']
buy_hold_return = ((last_price - first_price) / first_price) * 100
return {
'initial_capital': initial_capital,
'final_value': final_value,
'total_return_pct': total_return,
'buy_hold_return_pct': buy_hold_return,
'num_trades': len(trades),
'win_rate': self._calculate_win_rate(trades),
'trades': trades
}
def _calculate_win_rate(self, trades: list) -> float:
"""
Berechnet Trefferquote aus Trades
"""
if len(trades) < 2:
return 0.0
wins = 0
buy_price = None
for trade in trades:
if trade['type'] == 'BUY':
buy_price = trade['price']
elif trade['type'] == 'SELL' and buy_price:
if trade['price'] > buy_price:
wins += 1
buy_price = None
sell_trades = sum(1 for t in trades if t['type'] == 'SELL')
return (wins / sell_trades * 100) if sell_trades > 0 else 0
Backtest ausführen
strategy = TradingStrategy(window=20, std_dev=2.0, volume_threshold=1.5)
results = strategy.backtest(btc_data, initial_capital=10000)
print("=" * 50)
print("BACKTEST ERGEBNISSE")
print("=" * 50)
print(f"Startkapital: ${results['initial_capital']:,.2f}")
print(f"Endwert: ${results['final_value']:,.2f}")
print(f"Rendite Strategie: {results['total_return_pct']:.2f}%")
print(f"Rendite Buy&Hold: {results['buy_hold_return_pct']:.2f}")
print(f"Anzahl Trades: {results['num_trades']}")
print(f"Win Rate: {results['win_rate']:.1f}%")
Schritt 3: KI-gestützte Marktanalyse mit HolySheep AI
Der Backtest liefert quantitative Ergebnisse. Aber was bedeuten diese Muster semantisch? Hier kommt HolySheep AI ins Spiel. Mit DeepSeek V3.2 für nur $0.42 pro Million Tokens (85%+ günstiger als OpenAI) können wir die Marktdaten intelligent analysieren lassen.
Integration von HolySheep AI für Sentiment-Analyse
import requests
import json
class HolySheepAnalyzer:
"""
KI-gestützte Marktanalyse mit HolySheep AI API
Nutzt DeepSeek V3.2 für kostengünstige und schnelle Analyse
"""
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = "https://api.holysheep.ai/v1"
self.model = "deepseek-v3.2"
def analyze_market_pattern(self, df: pd.DataFrame,
strategy_results: dict) -> dict:
"""
Analysiert Marktdaten und Backtest-Ergebnisse mit KI
Args:
df: DataFrame mit Marktdaten
strategy_results: Dictionary mit Backtest-Ergebnissen
Returns:
KI-gestützte Analyse als Dictionary
"""
# Zusammenfassung der Daten erstellen
summary = self._create_data_summary(df, strategy_results)
prompt = f"""Analysiere die folgenden Krypto-Marktdaten und Backtest-Ergebnisse:
DATENZUSAMMENFASSUNG:
{summary}
AUFGABE:
1. Identifiziere die wichtigsten Muster in den Daten
2. Erkläre mögliche Gründe für Gewinne/Verluste der Strategie
3. Gibt Verbesserungsvorschläge für die Strategie?
4. Welche externen Faktoren könnten die Ergebnisse beeinflusst haben?
Antworte auf Deutsch in strukturiertem Format."""
response = self._call_llm(prompt)
return response
def generate_trading_insights(self, df: pd.DataFrame) -> dict:
"""
Generiert Trading-Einblicke basierend auf historischen Daten
"""
# Die letzten 100 Datenpunkte für Analyse
recent_data = df.tail(100)
prompt = f"""Analysiere die folgenden recenten Bitcoin-Kursdaten:
Letzte Kurse:
{recent_data[['timestamp', 'price', 'volume']].to_string()}
Volatilität der letzten 20 Perioden: {df['price'].tail(20).std():.2f}
Durchschnittsvolumen: {df['volume'].tail(20).mean():.2f}
Erkläre:
1. Kurzfristige Preistrends
2. Volumenmuster und deren Bedeutung
3. Mögliche Unterstützungs-/Widerstandsniveaus
4. Risikoeinschätzung für kurzfristige Positionen
Antworte auf Deutsch mit klaren Handlungsempfehlungen."""
return self._call_llm(prompt)
def _create_data_summary(self, df: pd.DataFrame,
strategy_results: dict) -> str:
"""Erstellt eine文本liche Zusammenfassung der Daten"""
return f"""
Zeitraum: {df['timestamp'].min()} bis {df['timestamp'].max()}
Anzahl Datenpunkte: {len(df)}
Preisrange: ${df['price'].min():,.2f} - ${df['price'].max():,.2f}
Volatilität (StdAbw): ${df['price'].std():,.2f}
Durchschnittsvolumen: {df['volume'].mean():,.2f}
BACKTEST ERGEBNISSE:
- Strategie-Rendite: {strategy_results['total_return_pct']:.2f}%
- Buy&Hold-Rendite: {strategy_results['buy_hold_return_pct']:.2f}%
- Anzahl Trades: {strategy_results['num_trades']}
- Win Rate: {strategy_results['win_rate']:.1f}%
"""
def _call_llm(self, prompt: str, max_tokens: int = 1000) -> dict:
"""
Ruft die HolySheep AI API auf
"""
url = f"{self.base_url}/chat/completions"
headers = {
'Authorization': f'Bearer {self.api_key}',
'Content-Type': 'application/json'
}
payload = {
'model': self.model,
'messages': [
{
'role': 'system',
'content': 'Du bist ein erfahrener Krypto-Trading-Analyst mit Fokus auf quantitative Analyse und Sentiment-Erkennung.'
},
{
'role': 'user',
'content': prompt
}
],
'max_tokens': max_tokens,
'temperature': 0.7
}
response = requests.post(url, headers=headers, json=payload)
if response.status_code != 200:
raise Exception(f"API Fehler: {response.status_code} - {response.text}")
result = response.json()
return {
'content': result['choices'][0]['message']['content'],
'usage': result.get('usage', {}),
'model': result.get('model', self.model)
}
HolySheep AI Analyzer initialisieren
HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY"
analyzer = HolySheepAnalyzer(HOLYSHEEP_API_KEY)
Marktanalyse durchführen
print("Führe KI-gestützte Analyse durch...")
print("Modell: DeepSeek V3.2 ($0.42/MTok bei HolySheep)")
print("-" * 50)
market_analysis = analyzer.analyze_market_pattern(btc_data, results)
print("\n📊 KI-ANALYSE ERGEBNIS:")
print(market_analysis['content'])
Token-Verbrauch anzeigen
if 'usage' in market_analysis:
usage = market_analysis['usage']
input_tokens = usage.get('prompt_tokens', 0)
output_tokens = usage.get('completion_tokens', 0)
total_tokens = usage.get('total_tokens', 0)
# Kosten berechnen (DeepSeek V3.2: $0.42/MTok Input, $0.42/MTok Output)
cost_per_mtok = 0.42
estimated_cost = (total_tokens / 1_000_000) * cost_per_mtok
print("\n💰 TOKEN-VERBRAUCH:")
print(f"Input Tokens: {input_tokens:,}")
print(f"Output Tokens: {output_tokens:,}")
print(f"Gesamt Tokens: {total_tokens:,}")
print(f"Geschätzte Kosten: ${estimated_cost:.4f}")
Schritt 4: Vollständige Backtesting-Pipeline
Lassen Sie uns alle Komponenten in einer vollständigen Pipeline zusammenführen, die Sie direkt in Ihrem Projekt verwenden können.
Dict:
"""
Führt vollständigen Backtest mit KI-Analyse durch
"""
print(f"\n🚀 STARTE BACKTEST")
print(f"Börse: {exchange}, Symbol: {symbol}")
print(f"Zeitraum: {start_date} bis {end_date}")
print("-" * 40)
# 1. Daten abrufen
print("📥 Lade historische Daten von Tardis.dev...")
df = self.tardis.get_ticker_data(exchange, symbol, start_date, end_date)
print(f" ✓ {len(df)} Datenpunkte geladen")
# 2. Strategie initialisieren
print("📈 Initialisiere Trading-Strategie...")
strategy = TradingStrategy(**strategy_params)
# 3. Backtest durchführen
print("🔄 Führe Backtest durch...")
results = strategy.backtest(df)
print(f" ✓ Backtest abgeschlossen")
# 4. KI-Analyse (nur wenn HolySheep Key vorhanden)
print("🤖 Starte KI-gestützte Analyse mit HolySheep AI...")
print(" Modell: DeepSeek V3.2 ($0.42/MTok)")
try:
analysis = self.holysheep.analyze_market_pattern(df, results)
results['ki_analyse'] = analysis['content']
results['token_usage'] = analysis.get('usage', {})
except Exception as e:
print(f" ⚠ KI-Analyse fehlgeschlagen: {e}")
results['ki_analyse'] = None
# 5. Zusammenfassung
self._print_summary(results)
return results
def _print_summary(self, results: Dict):
"""Gibt eine formatierte Zusammenfassung aus"""
print("\n" + "=" * 50)
print("📊 BACKTEST ZUSAMMENFASSUNG")
print("=" * 50)
print(f"Startkapital: ${results['initial_capital']:,.2f}")
print(f"Endwert: ${results['final_value']:,.2f}")
print(f"Rendite: {results['total_return_pct']:+.2f}%")
print(f"Buy & Hold: {results['buy_hold_return_pct']:+.2f}%")
print(f"Überrendite: {results['total_return_pct'] - results['buy_hold_return_pct']:+.2f}%")
print(f"Trades: {results['num_trades']}")
print(f"Win Rate: {results['win_rate']:.1f}%")
if results.get('token_usage'):
tokens = results['token_usage'].get('total_tokens', 0)
cost = (tokens / 1_000_000) * 0.42
print(f"KI-Kosten: ${cost:.4f}")
print("=" * 50)
============== HAUPTPROGRAMM ==============
if __name__ == "__main__":
# API Keys (durch Ihre eigenen ersetzen)
HOLYSHEEP_KEY = "YOUR_HOLYSHEEP_API_KEY"
TARDIS_KEY = "ihr_tardis_token"
# Initialize Backtester
backtester = CryptoBacktester(HOLYSHEEP_KEY, TARDIS_KEY)
# Parameter für Strategie
strategy_params = {
'window': 20,
'std_dev': 2.0,
'volume_threshold': 1.5
}
# Backtest ausführen
results = backtester.run_full_backtest(
exchange='binance',
symbol='BTC-USDT',
start_date='2024-01-01',
end_date='2024-03-31',
strategy_params=strategy_params
)
# KI-Analyse anzeigen
if results.get('ki_analyse'):
print("\n🤖 KI-ANALYSE:")
print("-" * 50)
print(results['ki_analyse'])
Häufige Fehler und Lösungen
1. Tardis.dev API Rate Limiting
Problem: Bei zu vielen Anfragen erhalten Sie einen 429 Too Many Requests Fehler.
# Lösung: Implementieren Sie Exponential Backoff
import time
import requests
def fetch_with_retry(url: str, max_retries: int = 5,
base_delay: float = 1.0) -> requests.Response:
"""
Ruft Daten mit automatischem Retry und Exponential Backoff ab
"""
for attempt in range(max_retries):
try:
response = requests.get(url)
if response.status_code == 200:
return response
elif response.status_code == 429:
# Rate Limited - warten mit Exponential Backoff
wait_time = base_delay * (2 ** attempt)
print(f"Rate Limited. Warte {wait_time:.1f}s...")
time.sleep(wait_time)
else:
response.raise_for_status()
except requests.exceptions.RequestException as e:
if attempt == max_retries - 1:
raise
wait_time = base_delay * (2 ** attempt)
print(f"Fehler: {e}. Retry in {wait_time:.1f}s...")
time.sleep(wait_time)
raise Exception(f"Max retries ({max_retries}) erreicht")
2. HeilSheep API Authentifizierungsfehler
Problem: 401 Unauthorized bei HolySheep API-Aufrufen.
# Lösung: Prüfen Sie den API-Key und Header-Format
import os
def validate_holysheep_key(api_key: str) -> bool:
"""
Validiert den HolySheep API Key vor der Nutzung
"""
if not api_key or api_key == "YOUR_HOLYSHEEP_API_KEY":
print("❌ Fehler: Bitte setzen Sie Ihren HolySheep API Key")
print(" Erstellen Sie einen Key unter: https://www.holysheep.ai/register")
return False
if len(api_key) < 20:
print("❌ Fehler: API Key scheint zu kurz zu sein")
return False
return True
Verwendung vor API-Aufruf
HOLYSHEEP_KEY = os.environ.get('HOLYSHEEP_API_KEY', 'YOUR_HOLYSHEEP_API_KEY')
if validate_holysheep_key(HOLYSHEEP_KEY):
analyzer = HolySheepAnalyzer(HOLYSHEEP_KEY)
# ... weiter mit Analyse
else:
print("Fallback: Nur quantitativer Backtest ohne KI-Analyse")
3. Datenqualitätsprobleme bei Backtesting
Problem: Fehlende Datenpunkte oder Outliers verfälschen Backtest-Ergebnisse.
import pandas as pd
import numpy as np
def clean_backtest_data(df: pd.DataFrame) -> pd.DataFrame:
"""
Bereinigt Daten für zuverlässige Backtests
Behandelt:
- Fehlende Werte
- Extreme Outliers
- Unregelmäßige Zeitabstände
"""
df = df.copy()
original_len = len(df)
# 1. Fehlende Werte behandeln
df = df.dropna(subset=['price', 'volume', 'timestamp'])
# 2. Null- und Negativpreise entfernen
df = df[df['price'] > 0]
df = df[df['volume'] >= 0]
# 3. Extreme Outliers mit IQR-Methode entfernen
Q1 = df['price'].quantile(0.25)
Q3 = df['price'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 3 * IQR # 3-facher IQR für extreme Outliers
upper_bound = Q3 + 3 * IQR
df = df[(df['price'] >= lower_bound) & (df['price'] <= upper_bound)]
# 4. Zeitliche Lücken identifizieren (> 1 Stunde)
df = df.sort_values('timestamp')
df['time_diff'] = df['timestamp'].diff()
large_gaps = df[df['time_diff'] > pd.Timedelta(hours=1)]
if len(large_gaps) > 0:
print(f"⚠️ Warnung: {len(large_gaps)} große Zeitlücken gefunden")
print(f" Erste Lücke: {large_gaps.iloc[0]['timestamp']}")
# 5. Nach Zeit sortieren und Index zurücksetzen
df = df.sort_values('timestamp').reset_index(drop=True)
removed = original_len - len(df)
if removed > 0:
print(f"✓ Bereinigt: {removed} Datensätze entfernt ({removed/original_len*100:.1f}%)")
return df
Verwendung im Backtest
cleaned_data = clean_backtest_data(btc_data)
print(f"Bereinigte Daten: {len(cleaned_data)} Punkte")
4. Falsche Periodenberechnung bei Strategien
Problem: Look-ahead Bias oder unberücksichtigte Transaktionskosten.
from dataclasses import dataclass
@dataclass
class BacktestConfig:
"""Konfiguration für realistischen Backtest"""
initial_capital: float = 10000.0
transaction_fee_pct: float = 0.1 # Binance: 0.1% Maker Fee
slippage_pct: float = 0.05 # 0.05% Slippage
min_trade_value: float = 10.0 # Mindestorderwert
class RealisticBacktester(TradingStrategy):
"""
Erweiterter Backtester mit realistischen Kosten
Beugt Look-ahead Bias vor
"""
def __init__(self, config: BacktestConfig, **strategy_params):
super().__init__(**strategy_params)
self.config = config
def backtest(self, df: pd.DataFrame) -> dict:
"""
Führt Backtest mit realistischen Annahmen durch
"""
df = self.generate_signals(df)
capital = self.config.initial_capital
position = 0
trades = []
# Track Einstiegszeitpunkt für Look-ahead Vermeidung
last_signal_time = None
for idx, row in df.iterrows():
# Signale werden erst im NÄCHSTEN Zeitraum umgesetzt
# (verhindert Look-ahead Bias)
if last_signal_time is not None:
current_time = row['timestamp']
time_diff = current_time - last_signal_time
if last_signal == 'BUY' and position == 0:
# Kaufordersimulation mit Gebühren
effective_price = row['price'] * (1 + self.config.slippage_pct/100)
fee = effective_price * self.config.transaction_fee_pct / 100
total_cost = effective_price + fee
if capital >= total_cost:
position = capital / total_cost
capital = 0
trades.append({
'type': 'BUY',
'price': effective_price,
'fee': fee,
'timestamp': current_time,
'capital': capital
})
elif last_signal == 'SELL' and position > 0:
# Verkaufordersimulation
effective_price = row['price'] * (1 - self.config.slippage_pct/100)
fee = effective_price * self.config.transaction_fee_pct / 100
net_proceeds = (position * effective_price) - fee
capital = net_proceeds
position = 0
trades.append({
'type': 'SELL',
'price': effective_price,
'fee': fee,
'timestamp': current_time,
'capital': capital
})
# Aktuelles Signal