343 lines
13 KiB
Python
343 lines
13 KiB
Python
"""
|
|
Beispiel-Skript für Gold Market Analysis System
|
|
Demonstriert typische Anwendungsfälle mit GC=F (Gold Futures)
|
|
"""
|
|
import logging
|
|
import time
|
|
from datetime import datetime, timedelta
|
|
from rich.console import Console
|
|
from rich.panel import Panel
|
|
from rich.table import Table
|
|
from rich.layout import Layout
|
|
from rich import print as rprint
|
|
from rich.text import Text
|
|
|
|
from main import GoldMarketAnalysisSystem
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
# Rich Console initialisieren
|
|
console = Console()
|
|
|
|
def header(text: str, style: str = "bold gold1"):
|
|
console.print(Panel(Text(text, justify="center"), style=style, expand=False))
|
|
|
|
def section(text: str):
|
|
console.print(f"\n[bold cyan]>>> {text}[/bold cyan]")
|
|
|
|
def beispiel_1_historische_daten_sammeln():
|
|
header("BEISPIEL 1: Historische Daten sammeln (GC=F Gold Futures)")
|
|
|
|
system = GoldMarketAnalysisSystem()
|
|
|
|
with console.status("[bold green]Sammle Daten für die letzten 30 Tage...[/bold green]"):
|
|
count = system.collect_and_store_market_data(
|
|
ticker_key="GC", # Gold Futures
|
|
period="1mo",
|
|
interval="1h"
|
|
)
|
|
|
|
console.print(f"\n[bold green]✓ {count} Datenpunkte gesammelt und gespeichert[/bold green]")
|
|
|
|
|
|
def beispiel_2_aehnliche_marktbedingungen():
|
|
header("BEISPIEL 2: Ähnliche Marktbedingungen finden")
|
|
|
|
system = GoldMarketAnalysisSystem()
|
|
|
|
szenarien = [
|
|
"hohe Volatilität mit steigendem Gold-Preis und positiver News-Stimmung",
|
|
"RSI über 70 zeigt überkaufte Bedingungen während London Session",
|
|
"starker Preisanstieg mit hohem Volumen während COMEX Handelszeit",
|
|
"MACD bullischer Crossover mit Bollinger Band Breakout"
|
|
]
|
|
|
|
for szenario in szenarien:
|
|
section(f"Suche nach Szenario: '{szenario}'")
|
|
|
|
with console.status("[bold blue]Suche in Vektor-Datenbank...[/"):
|
|
results = system.analyze_market_conditions(
|
|
query=szenario,
|
|
limit=3
|
|
)
|
|
|
|
if results:
|
|
table = Table(title=f"Gefundene Situationen für: {szenario}", border_style="blue")
|
|
table.add_column("Rank", style="dim", width=4)
|
|
table.add_column("Score", justify="right", style="magenta")
|
|
table.add_column("Datum", style="cyan")
|
|
table.add_column("Preis", justify="right", style="green")
|
|
table.add_column("Session", style="yellow")
|
|
table.add_column("RSI", justify="right")
|
|
|
|
for i, result in enumerate(results, 1):
|
|
payload = result["payload"]
|
|
rsi_val = payload.get('indicators', {}).get('RSI_14', 'N/A')
|
|
if isinstance(rsi_val, (int, float)):
|
|
rsi_str = f"{rsi_val:.1f}"
|
|
else:
|
|
rsi_str = str(rsi_val)
|
|
|
|
table.add_row(
|
|
str(i),
|
|
f"{result['score']:.3f}",
|
|
payload.get('timestamp', 'N/A'),
|
|
f"${payload.get('close', 0):.2f}",
|
|
payload.get('trading_session', 'N/A'),
|
|
rsi_str
|
|
)
|
|
console.print(table)
|
|
else:
|
|
console.print("[yellow]Keine ähnlichen Situationen gefunden[/yellow]")
|
|
|
|
|
|
def beispiel_3_session_vergleich():
|
|
header("BEISPIEL 3: Trading Session Vergleich")
|
|
|
|
system = GoldMarketAnalysisSystem()
|
|
|
|
with console.status("[bold green]Sammle frische Daten (5 Tage)...[/]"):
|
|
system.collect_and_store_market_data(
|
|
ticker_key="GC",
|
|
period="5d",
|
|
interval="1h"
|
|
)
|
|
|
|
# Analysiere verschiedene Tage
|
|
for i in range(5):
|
|
date = datetime.now() - timedelta(days=i)
|
|
console.print(f"\n[bold]📅 Datum: {date.date()}[/bold]")
|
|
|
|
session_data = system.get_session_analysis(ticker_key="GC", date=date)
|
|
|
|
if session_data:
|
|
table = Table(border_style="cyan")
|
|
table.add_column("Session", style="bold yellow")
|
|
table.add_column("Avg Preis", justify="right", style="green")
|
|
table.add_column("Volumen", justify="right")
|
|
table.add_column("Änderung", justify="right")
|
|
table.add_column("Volatilität", justify="right", style="red")
|
|
|
|
for session_name, stats in session_data.items():
|
|
change_color = "green" if stats['price_change'] >= 0 else "red"
|
|
table.add_row(
|
|
session_name,
|
|
f"${stats['avg_price']:.2f}",
|
|
f"{stats['total_volume']:,.0f}",
|
|
f"[{change_color}]${stats['price_change']:+.2f}[/{change_color}]",
|
|
f"{stats['volatility']:.2f}"
|
|
)
|
|
console.print(table)
|
|
|
|
# Max Volatility
|
|
max_vol_session = max(session_data.items(), key=lambda x: x[1]['volatility'])
|
|
console.print(f"[bold red]🔥 Höchste Volatilität: {max_vol_session[0]} ({max_vol_session[1]['volatility']:.2f})[/bold red]")
|
|
|
|
|
|
def beispiel_4_news_und_sentiment():
|
|
header("BEISPIEL 4: News & Sentiment Analyse")
|
|
|
|
system = GoldMarketAnalysisSystem()
|
|
|
|
with console.status("[bold yellow]Lade News und analysiere Sentiment...[/]"):
|
|
news_articles = system.news_collector.get_all_news(hours_back=24)
|
|
|
|
console.print(f"\n[bold]📰 {len(news_articles)} relevante News-Artikel gefunden[/bold]")
|
|
|
|
if news_articles:
|
|
# Sentiment anzeigen
|
|
sentiment = system.news_collector.aggregate_sentiment(news_articles)
|
|
|
|
sent_color = "green" if sentiment['sentiment_label'] == "Positive" else "red" if sentiment['sentiment_label'] == "Negative" else "yellow"
|
|
|
|
panel = Panel(
|
|
f"[bold {sent_color}]Label: {sentiment['sentiment_label']}[/]\n"
|
|
f"Score: {sentiment['average_score']:+.2f}\n"
|
|
f"Artikel: {sentiment['article_count']}\n"
|
|
f"Positiv: {sentiment['positive_count']} | Negativ: {sentiment['negative_count']} | Neutral: {sentiment['neutral_count']}",
|
|
title="Aggregiertes Sentiment",
|
|
border_style=sent_color
|
|
)
|
|
console.print(panel)
|
|
|
|
# Top Artikel
|
|
section("Top 5 Artikel")
|
|
for i, article in enumerate(news_articles[:5], 1):
|
|
sent_score = article['sentiment_score']
|
|
color = "green" if sent_score > 0 else "red" if sent_score < 0 else "yellow"
|
|
|
|
console.print(f"[bold]{i}. {article['title']}[/bold]")
|
|
console.print(f" Quelle: [italic]{article['source']}[/italic] | Relevanz: {article['relevance_score']:.2f}")
|
|
console.print(f" Sentiment: [{color}]{article['sentiment_label']} ({sent_score:+.2f})[/{color}]")
|
|
console.print("")
|
|
|
|
# Events
|
|
events = system.news_collector.extract_events_from_news(news_articles)
|
|
if events:
|
|
section(f"Extrahierte Events ({len(events)})")
|
|
for event in events[:5]:
|
|
console.print(f" • {event}")
|
|
else:
|
|
console.print("[yellow]⚠️ Keine News verfügbar[/yellow]")
|
|
|
|
|
|
def beispiel_5_technische_signale():
|
|
header("BEISPIEL 5: Technische Trading-Signale (GC=F)")
|
|
|
|
system = GoldMarketAnalysisSystem()
|
|
from yahoo_collector import YahooFinanceGoldCollector
|
|
collector = YahooFinanceGoldCollector()
|
|
|
|
with console.status("[bold cyan]Analysiere Charts...[/]"):
|
|
df = collector.get_historical_data(ticker_key="GC", period="5d", interval="1h")
|
|
|
|
if df.empty:
|
|
console.print("[bold red]❌ Keine Daten verfügbar[/bold red]")
|
|
return
|
|
|
|
df_with_indicators = system.indicator_calculator.calculate_all_indicators(df)
|
|
signals = system.indicator_calculator.detect_signals(df_with_indicators)
|
|
|
|
if signals:
|
|
console.print(f"\n[bold red]🚨 {len(signals)} Trading-Signale erkannt:[/bold red]")
|
|
|
|
table = Table(border_style="red")
|
|
table.add_column("Type", style="bold")
|
|
table.add_column("Indikator", style="cyan")
|
|
table.add_column("Wert", justify="right")
|
|
table.add_column("Nachricht", style="white")
|
|
|
|
for signal in signals:
|
|
sig_color = "green" if "BUY" in signal['type'] or "BULLISH" in signal['type'] else "red"
|
|
table.add_row(
|
|
f"[{sig_color}]{signal['type']}[/{sig_color}]",
|
|
signal['indicator'],
|
|
f"{signal['value']:.2f}",
|
|
signal['message']
|
|
)
|
|
console.print(table)
|
|
else:
|
|
console.print("\n[bold green]✓ Keine kritischen Signale - normaler Markt[/bold green]")
|
|
|
|
# Indikatoren Übersicht
|
|
section("Indikatoren Snapshot")
|
|
indicators = system.indicator_calculator.get_indicators_summary(df_with_indicators)
|
|
|
|
ind_table = Table(show_header=False, box=None)
|
|
ind_table.add_column("Name", style="bold white")
|
|
ind_table.add_column("Value", style="cyan")
|
|
|
|
key_indicators = ['RSI_14', 'MACD_12_26', 'SMA_20', 'SMA_50', 'BB_upper_20', 'BB_lower_20']
|
|
for ind in key_indicators:
|
|
if ind in indicators:
|
|
ind_table.add_row(ind, f"{indicators[ind]:.2f}")
|
|
|
|
console.print(Panel(ind_table, title="Aktuelle Werte", expand=False))
|
|
|
|
|
|
def beispiel_6_zeitreihen_analyse():
|
|
header("BEISPIEL 6: Zeitreihen-Analyse")
|
|
|
|
system = GoldMarketAnalysisSystem()
|
|
|
|
zeitfenster = [
|
|
("24h", datetime.now() - timedelta(hours=24), "Letzten 24 Stunden"),
|
|
("7d", datetime.now() - timedelta(days=7), "Letzten 7 Tage"),
|
|
("30d", datetime.now() - timedelta(days=30), "Letzten 30 Tage"),
|
|
]
|
|
|
|
for name, start_time, beschreibung in zeitfenster:
|
|
section(beschreibung)
|
|
|
|
data_points = system.db.search_by_time_range(
|
|
start_time=start_time,
|
|
end_time=datetime.now(),
|
|
ticker="GC",
|
|
limit=1000
|
|
)
|
|
|
|
if data_points:
|
|
prices = [dp.get('close', 0) for dp in data_points]
|
|
|
|
if not prices:
|
|
console.print("[dim]Keine Preisdaten gefunden.[/dim]")
|
|
continue
|
|
|
|
start_price = prices[0]
|
|
end_price = prices[-1]
|
|
change_pct = ((end_price / start_price) - 1) * 100
|
|
color = "green" if change_pct >= 0 else "red"
|
|
|
|
table = Table(show_header=False)
|
|
table.add_row("Datenpunkte", str(len(data_points)))
|
|
table.add_row("Preisspanne", f"${min(prices):.2f} - ${max(prices):.2f}")
|
|
table.add_row("Performance", f"[{color}]${end_price - start_price:+.2f} ({change_pct:+.2f}%)[/{color}]")
|
|
|
|
console.print(table)
|
|
|
|
# Session Verteilung
|
|
sessions = {}
|
|
for dp in data_points:
|
|
session = dp.get('trading_session', 'UNKNOWN')
|
|
sessions[session] = sessions.get(session, 0) + 1
|
|
|
|
sess_text = []
|
|
for session, count in sorted(sessions.items(), key=lambda x: x[1], reverse=True):
|
|
sess_text.append(f"{session}: [bold]{count}[/bold] ({count/len(data_points)*100:.1f}%)")
|
|
|
|
console.print(Panel("\n".join(sess_text), title="Session Verteilung", border_style="dim"))
|
|
|
|
else:
|
|
console.print("[yellow]⚠️ Keine Daten verfügbar[/yellow]")
|
|
|
|
|
|
def main():
|
|
console.print()
|
|
console.print(Panel.fit(
|
|
"[bold gold1]Gold Market Analysis - Beispiele (GC=F Futures)[/bold gold1]\n"
|
|
"[dim]Powered by Qdrant & Rich[/dim]",
|
|
border_style="gold1"
|
|
))
|
|
|
|
beispiele = {
|
|
"1": ("Historische Daten sammeln", beispiel_1_historische_daten_sammeln),
|
|
"2": ("Ähnliche Marktbedingungen finden", beispiel_2_aehnliche_marktbedingungen),
|
|
"3": ("Trading Session Vergleich", beispiel_3_session_vergleich),
|
|
"4": ("News & Sentiment Analyse", beispiel_4_news_und_sentiment),
|
|
"5": ("Technische Trading-Signale", beispiel_5_technische_signale),
|
|
"6": ("Zeitreihen-Analyse", beispiel_6_zeitreihen_analyse),
|
|
}
|
|
|
|
while True:
|
|
console.print("\n[bold underline]Verfügbare Beispiele:[/bold underline]")
|
|
for key, (desc, _) in beispiele.items():
|
|
console.print(f" [cyan]{key}[/cyan]. {desc}")
|
|
console.print(" [cyan]7[/cyan]. Alle Beispiele durchlaufen")
|
|
console.print(" [dim]0. Beenden[/dim]")
|
|
|
|
try:
|
|
wahl = console.input("\n[bold]Wählen Sie ein Beispiel (0-7): [/bold]").strip()
|
|
|
|
if wahl == "0":
|
|
console.print("[bold green]Auf Wiedersehen![/bold green]")
|
|
break
|
|
elif wahl == "7":
|
|
for key, (_, func) in beispiele.items():
|
|
func()
|
|
console.input("\n[dim]Enter drücken für nächstes Beispiel...[/dim]")
|
|
elif wahl in beispiele:
|
|
beispiele[wahl][1]()
|
|
else:
|
|
console.print("[bold red]Ungültige Auswahl![/bold red]")
|
|
|
|
except KeyboardInterrupt:
|
|
console.print("\n\n[bold red]Beendet durch Benutzer.[/bold red]")
|
|
break
|
|
except Exception as e:
|
|
logger.error(f"Fehler: {e}", exc_info=True)
|
|
console.print(f"[bold red]Ein Fehler ist aufgetreten: {e}[/bold red]")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|