File size: 4,569 Bytes
b6fe7cb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import streamlit as st
import yfinance as yf
import pandas as pd
import plotly.graph_objects as go
import plotly.express as px
from datetime import datetime, timedelta
import base64

# === Grundlegendes Design & Titel ===
st.set_page_config(page_title="JQuant - Marktanalyse", page_icon="📊", layout="wide")

# Funktion zum Konvertieren des Bildes in Base64
def get_base64_image(image_path):
    with open(image_path, "rb") as img_file:
        return base64.b64encode(img_file.read()).decode()

# Logo als Base64 einlesen
image_base64 = get_base64_image("/Users/jagdipsingh/JQ.png")

# CSS für fixiertes Logo OHNE Hintergrund & kleinerer Text
st.markdown(
    f"""
    <style>
        .fixed-logo {{
            position: fixed;
            top: 10px;
            left: 50%;
            transform: translateX(-50%);
            z-index: 1000;
            text-align: center;
        }}
        .small-text {{
            font-size: 14px; /* Kleinere Schriftgröße */
            margin-top: 30px; /* Abstand nach unten */
            text-align: center;
            color: gray; /* Dezente graue Farbe */
        }}
    </style>
    <div class="fixed-logo">
        <img src="data:image/png;base64,{image_base64}" width="250">
    </div>
    """,
    unsafe_allow_html=True
)

# Standardwerte für das Datum: heute und ein Jahr davor
default_end_date = datetime.today().date()
default_start_date = default_end_date - timedelta(days=365)

# Abstand nach unten hinzufügen, damit der Titel nicht direkt unter dem fixierten Logo ist
st.markdown("<br><br><br>", unsafe_allow_html=True)  # Fügt 3 Zeilen Abstand hinzu

# Titel der App
st.title("📈 Interaktive Analyse von Aktienindizes")


# Liste der wichtigsten Aktien-Indizes mit Yahoo Finance Ticker
indices = {
    "S&P 500 (USA)": "^GSPC",
    "Nasdaq 100 (USA)": "^NDX",
    "Dow Jones (USA)": "^DJI",
    "Russell 2000 (USA)": "^RUT",
}

# Dropdown für Ticker 1 & Ticker 2
ticker1_name = st.selectbox("📈 Wähle Index 1:", list(indices.keys()), index=0)
ticker2_name = st.selectbox("📈 Wähle Index 2:", list(indices.keys()), index=1)

# Die zugehörigen Ticker aus dem Dictionary holen
ticker1 = indices[ticker1_name]
ticker2 = indices[ticker2_name]

# Benutzer kann das Datum weiterhin anpassen
start_date = st.date_input("Startdatum", default_start_date)
end_date = st.date_input("Enddatum", default_end_date)

# Button zum Laden der Daten
if st.button("Daten abrufen & Diagramme anzeigen"):

    # Daten abrufen
    data = {}
    for name, symbol in [(ticker1_name, ticker1), (ticker2_name, ticker2)]:
        ticker = yf.Ticker(symbol)
        df = ticker.history(start=start_date, end=end_date)
        data[name] = df["Close"]

    # In DataFrame umwandeln
    df_indices = pd.DataFrame(data)

    # Falls keine Daten geladen wurden, abbrechen
    if df_indices.empty:
        st.error("❌ Keine Daten für die gewählten Indizes gefunden!")
    else:
        # --------- 1. INTERAKTIVER CHART: Vergleich mit zwei Achsen ---------
        fig1 = go.Figure()

        # Linke Achse (Ticker 1)
        fig1.add_trace(go.Scatter(x=df_indices.index, y=df_indices[ticker1_name], mode='lines',
                                  name=ticker1_name, yaxis='y1'))

        # Rechte Achse (Ticker 2)
        fig1.add_trace(go.Scatter(x=df_indices.index, y=df_indices[ticker2_name], mode='lines',
                                  name=ticker2_name, yaxis='y2'))

        # Layout mit zwei Achsen definieren
        fig1.update_layout(
            title=f"Vergleich der Close-Preise: {ticker1_name} vs. {ticker2_name}",
            xaxis=dict(title="Datum"),
            yaxis=dict(title=f"{ticker1_name} Preis (USD)", side='left', showgrid=False),
            yaxis2=dict(title=f"{ticker2_name} Preis (USD)", side='right', overlaying='y', showgrid=False),
            legend=dict(x=0, y=1),
            hovermode="x"
        )

        # Streamlit: Interaktives Chart anzeigen
        st.plotly_chart(fig1, use_container_width=True)

        # --------- 2. INTERAKTIVER CHART: Normierter Vergleich ---------
        df_normalized = df_indices / df_indices.iloc[0] * 100

        fig2 = px.line(df_normalized, x=df_normalized.index, y=df_normalized.columns,
                       title=f"Normierter Vergleich der Close-Preise: {ticker1_name} vs. {ticker2_name}",
                       labels={"value": "Index (Startwert = 100)", "variable": "Index"},
                       template="plotly_white")

        # Streamlit: Interaktives Chart anzeigen
        st.plotly_chart(fig2, use_container_width=True)