Files
CrumbCharts_v0.2_OSX/examples.py

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()