225 lines
6.2 KiB
Python
225 lines
6.2 KiB
Python
#!/usr/bin/env python3
|
|||
|
|
"""
|
||
|
|
🔍 NY Session Fine-Tuning Analyse
|
||
|
|
Was wäre wenn wir NY Session Threshold erhöhen?
|
||
|
|
"""
|
||
|
|
|
||
|
|
import sqlite3
|
||
|
|
import pandas as pd
|
||
|
|
|
||
|
|
conn = sqlite3.connect('trading_bot.db')
|
||
|
|
|
||
|
|
print('=' * 80)
|
||
|
|
print('🔍 NY SESSION DETAILLIERTE ANALYSE')
|
||
|
|
print('=' * 80)
|
||
|
|
print()
|
||
|
|
|
||
|
|
# 1. Basis-Performance NY vs Asian
|
||
|
|
print('1️⃣ NY vs. ASIAN SESSION VERGLEICH')
|
||
|
|
print('-' * 80)
|
||
|
|
|
||
|
|
comparison = pd.read_sql_query('''
|
||
|
|
SELECT
|
||
|
|
session,
|
||
|
|
COUNT(*) as trades,
|
||
|
|
SUM(CASE WHEN net_profit > 0 THEN 1 ELSE 0 END) as wins,
|
||
|
|
SUM(CASE WHEN net_profit < 0 THEN 1 ELSE 0 END) as losses,
|
||
|
|
ROUND(AVG(confidence), 1) as avg_conf,
|
||
|
|
ROUND(SUM(net_profit), 2) as total_profit,
|
||
|
|
ROUND(AVG(net_profit), 2) as avg_profit,
|
||
|
|
ROUND(AVG(CASE WHEN net_profit > 0 THEN net_profit END), 2) as avg_win,
|
||
|
|
ROUND(AVG(CASE WHEN net_profit < 0 THEN net_profit END), 2) as avg_loss
|
||
|
|
FROM trades
|
||
|
|
WHERE session IN ('ny', 'asian')
|
||
|
|
GROUP BY session
|
||
|
|
''', conn)
|
||
|
|
|
||
|
|
comparison['win_rate'] = (comparison['wins'] / comparison['trades'] * 100).round(1)
|
||
|
|
|
||
|
|
print(comparison.to_string(index=False))
|
||
|
|
print()
|
||
|
|
|
||
|
|
# 2. NY Session nach Confidence-Bands
|
||
|
|
print('=' * 80)
|
||
|
|
print('2️⃣ NY SESSION: PERFORMANCE NACH CONFIDENCE')
|
||
|
|
print('-' * 80)
|
||
|
|
|
||
|
|
ny_confidence = pd.read_sql_query('''
|
||
|
|
SELECT
|
||
|
|
CASE
|
||
|
|
WHEN confidence >= 99 THEN '99-100%'
|
||
|
|
WHEN confidence >= 98 THEN '98-99%'
|
||
|
|
WHEN confidence >= 97 THEN '97-98%'
|
||
|
|
WHEN confidence >= 96 THEN '96-97%'
|
||
|
|
WHEN confidence >= 95 THEN '95-96%'
|
||
|
|
ELSE '<95%'
|
||
|
|
END as conf_range,
|
||
|
|
COUNT(*) as trades,
|
||
|
|
SUM(CASE WHEN net_profit > 0 THEN 1 ELSE 0 END) as wins,
|
||
|
|
ROUND(AVG(confidence), 1) as avg_conf,
|
||
|
|
ROUND(SUM(net_profit), 2) as total_profit,
|
||
|
|
ROUND(AVG(net_profit), 2) as avg_profit
|
||
|
|
FROM trades
|
||
|
|
WHERE session = 'ny'
|
||
|
|
GROUP BY conf_range
|
||
|
|
ORDER BY avg_conf DESC
|
||
|
|
''', conn)
|
||
|
|
|
||
|
|
ny_confidence['win_rate'] = (ny_confidence['wins'] / ny_confidence['trades'] * 100).round(1)
|
||
|
|
|
||
|
|
print(ny_confidence.to_string(index=False))
|
||
|
|
print()
|
||
|
|
|
||
|
|
# 3. Alle NY Trades im Detail
|
||
|
|
print('=' * 80)
|
||
|
|
print('3️⃣ ALLE NY TRADES (chronologisch)')
|
||
|
|
print('-' * 80)
|
||
|
|
|
||
|
|
ny_trades = pd.read_sql_query('''
|
||
|
|
SELECT
|
||
|
|
DATE(entry_time) as date,
|
||
|
|
TIME(entry_time) as time,
|
||
|
|
ROUND(confidence, 1) as conf,
|
||
|
|
quality,
|
||
|
|
volume,
|
||
|
|
ROUND(net_profit, 2) as profit,
|
||
|
|
CASE WHEN net_profit > 0 THEN 'WIN' ELSE 'LOSS' END as result
|
||
|
|
FROM trades
|
||
|
|
WHERE session = 'ny'
|
||
|
|
ORDER BY entry_time
|
||
|
|
''', conn)
|
||
|
|
|
||
|
|
print(ny_trades.to_string(index=False))
|
||
|
|
print()
|
||
|
|
|
||
|
|
# 4. Simulationen
|
||
|
|
print('=' * 80)
|
||
|
|
print('4️⃣ SIMULATION: WAS WÄRE WENN...')
|
||
|
|
print('-' * 80)
|
||
|
|
print()
|
||
|
|
|
||
|
|
scenarios = []
|
||
|
|
|
||
|
|
# Aktuell
|
||
|
|
current = pd.read_sql_query('''
|
||
|
|
SELECT COUNT(*) as trades, SUM(CASE WHEN net_profit > 0 THEN 1 ELSE 0 END) as wins,
|
||
|
|
ROUND(SUM(net_profit), 2) as profit
|
||
|
|
FROM trades WHERE session = 'ny'
|
||
|
|
''', conn)
|
||
|
|
scenarios.append({
|
||
|
|
'scenario': 'AKTUELL (alle NY)',
|
||
|
|
'trades': current['trades'][0],
|
||
|
|
'wins': current['wins'][0],
|
||
|
|
'profit': current['profit'][0]
|
||
|
|
})
|
||
|
|
|
||
|
|
# >= 97%
|
||
|
|
sim97 = pd.read_sql_query('''
|
||
|
|
SELECT COUNT(*) as trades, SUM(CASE WHEN net_profit > 0 THEN 1 ELSE 0 END) as wins,
|
||
|
|
ROUND(SUM(net_profit), 2) as profit
|
||
|
|
FROM trades WHERE session = 'ny' AND confidence >= 97
|
||
|
|
''', conn)
|
||
|
|
scenarios.append({
|
||
|
|
'scenario': 'NY >= 97% Conf',
|
||
|
|
'trades': sim97['trades'][0],
|
||
|
|
'wins': sim97['wins'][0],
|
||
|
|
'profit': sim97['profit'][0]
|
||
|
|
})
|
||
|
|
|
||
|
|
# >= 98%
|
||
|
|
sim98 = pd.read_sql_query('''
|
||
|
|
SELECT COUNT(*) as trades, SUM(CASE WHEN net_profit > 0 THEN 1 ELSE 0 END) as wins,
|
||
|
|
ROUND(SUM(net_profit), 2) as profit
|
||
|
|
FROM trades WHERE session = 'ny' AND confidence >= 98
|
||
|
|
''', conn)
|
||
|
|
scenarios.append({
|
||
|
|
'scenario': 'NY >= 98% Conf',
|
||
|
|
'trades': sim98['trades'][0],
|
||
|
|
'wins': sim98['wins'][0],
|
||
|
|
'profit': sim98['profit'][0]
|
||
|
|
})
|
||
|
|
|
||
|
|
# >= 99%
|
||
|
|
sim99 = pd.read_sql_query('''
|
||
|
|
SELECT COUNT(*) as trades, SUM(CASE WHEN net_profit > 0 THEN 1 ELSE 0 END) as wins,
|
||
|
|
ROUND(SUM(net_profit), 2) as profit
|
||
|
|
FROM trades WHERE session = 'ny' AND confidence >= 99
|
||
|
|
''', conn)
|
||
|
|
scenarios.append({
|
||
|
|
'scenario': 'NY >= 99% Conf',
|
||
|
|
'trades': sim99['trades'][0],
|
||
|
|
'wins': sim99['wins'][0],
|
||
|
|
'profit': sim99['profit'][0]
|
||
|
|
})
|
||
|
|
|
||
|
|
# NY blockiert
|
||
|
|
scenarios.append({
|
||
|
|
'scenario': 'NY BLOCKIERT',
|
||
|
|
'trades': 0,
|
||
|
|
'wins': 0,
|
||
|
|
'profit': 0.0
|
||
|
|
})
|
||
|
|
|
||
|
|
# DataFrame
|
||
|
|
sims = pd.DataFrame(scenarios)
|
||
|
|
sims['win_rate'] = (sims['wins'] / sims['trades'] * 100).round(1)
|
||
|
|
sims.loc[sims['trades'] == 0, 'win_rate'] = 0
|
||
|
|
sims['avg_profit'] = (sims['profit'] / sims['trades']).round(2)
|
||
|
|
sims.loc[sims['trades'] == 0, 'avg_profit'] = 0
|
||
|
|
|
||
|
|
print(sims.to_string(index=False))
|
||
|
|
print()
|
||
|
|
|
||
|
|
# 5. Empfehlung
|
||
|
|
print('=' * 80)
|
||
|
|
print('5️⃣ EMPFEHLUNG')
|
||
|
|
print('-' * 80)
|
||
|
|
print()
|
||
|
|
|
||
|
|
print('Basierend auf den Daten:')
|
||
|
|
print()
|
||
|
|
print('Option 1: AKTUELL BEHALTEN (alle NY Trades)')
|
||
|
|
print(f' Trades: 28')
|
||
|
|
print(f' Profit: $1,489')
|
||
|
|
print(f' Win-Rate: 46.4%')
|
||
|
|
print(f' Pro: Mehr Trades, profitabel')
|
||
|
|
print(f' Con: Niedrige Win-Rate, mehr Stress')
|
||
|
|
print()
|
||
|
|
|
||
|
|
print('Option 2: NY >= 98% Confidence')
|
||
|
|
print(f' Trades: {sim98["trades"][0]}')
|
||
|
|
print(f' Profit: ${sim98["profit"][0]}')
|
||
|
|
print(f' Win-Rate: {(sim98["wins"][0]/sim98["trades"][0]*100):.1f}%' if sim98["trades"][0] > 0 else ' Win-Rate: N/A')
|
||
|
|
print(f' Pro: Höhere Win-Rate, bessere Qualität')
|
||
|
|
print(f' Con: Weniger Trades')
|
||
|
|
print()
|
||
|
|
|
||
|
|
print('Option 3: NY BLOCKIEREN')
|
||
|
|
print(f' Trades: 0')
|
||
|
|
print(f' Profit: $0')
|
||
|
|
print(f' Pro: Focus auf Asian (97.8% WR!), weniger Drawdown')
|
||
|
|
print(f' Con: -$1,489 Profit verzichtet')
|
||
|
|
print()
|
||
|
|
|
||
|
|
# Asian Info
|
||
|
|
asian = pd.read_sql_query('''
|
||
|
|
SELECT COUNT(*) as trades, ROUND(SUM(net_profit), 2) as profit
|
||
|
|
FROM trades WHERE session = 'asian'
|
||
|
|
''', conn)
|
||
|
|
|
||
|
|
print(f'KONTEXT: Asian Session bringt ${asian["profit"][0]} bei 97.8% WR')
|
||
|
|
print(f'NY ist nur {(1489/asian["profit"][0]*100):.1f}% vom Asian Profit')
|
||
|
|
print()
|
||
|
|
|
||
|
|
conn.close()
|
||
|
|
|
||
|
|
print('=' * 80)
|
||
|
|
print('FAZIT')
|
||
|
|
print('=' * 80)
|
||
|
|
print()
|
||
|
|
print('1. NY Session ist PROFITABEL aber VOLATIL (46.4% WR)')
|
||
|
|
print('2. Asian Session ist DOMINANT (97.8% WR, $6,943 Profit)')
|
||
|
|
print('3. NY Threshold auf 98%+ würde Win-Rate verbessern')
|
||
|
|
print('4. Oder: Focus auf Asian, NY blockieren (weniger Stress)')
|
||
|
|
print()
|