Update app.py
Browse files
app.py
CHANGED
@@ -48,12 +48,11 @@ default_end_date = datetime.today().date()
|
|
48 |
default_start_date = default_end_date - timedelta(days=365)
|
49 |
|
50 |
# Abstand nach unten hinzufügen, damit der Titel nicht direkt unter dem fixierten Logo ist
|
51 |
-
st.markdown("<br><br><br>", unsafe_allow_html=True)
|
52 |
|
53 |
# Titel der App
|
54 |
st.title("📈 Interaktive Analyse von Aktienindizes")
|
55 |
|
56 |
-
|
57 |
# Liste der wichtigsten Aktien-Indizes mit Yahoo Finance Ticker
|
58 |
indices = {
|
59 |
"S&P 500 (USA)": "^GSPC",
|
@@ -74,8 +73,12 @@ ticker2 = indices[ticker2_name]
|
|
74 |
start_date = st.date_input("Startdatum", default_start_date)
|
75 |
end_date = st.date_input("Enddatum", default_end_date)
|
76 |
|
|
|
|
|
|
|
|
|
77 |
# Button zum Laden der Daten
|
78 |
-
if st.button("
|
79 |
|
80 |
# Daten abrufen
|
81 |
data = {}
|
@@ -95,12 +98,14 @@ if st.button("Daten abrufen & Diagramme anzeigen"):
|
|
95 |
fig1 = go.Figure()
|
96 |
|
97 |
# Linke Achse (Ticker 1)
|
98 |
-
fig1.add_trace(go.Scatter(
|
99 |
-
|
|
|
100 |
|
101 |
# Rechte Achse (Ticker 2)
|
102 |
-
fig1.add_trace(go.Scatter(
|
103 |
-
|
|
|
104 |
|
105 |
# Layout mit zwei Achsen definieren
|
106 |
fig1.update_layout(
|
@@ -118,10 +123,76 @@ if st.button("Daten abrufen & Diagramme anzeigen"):
|
|
118 |
# --------- 2. INTERAKTIVER CHART: Normierter Vergleich ---------
|
119 |
df_normalized = df_indices / df_indices.iloc[0] * 100
|
120 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
fig2 = px.line(df_normalized, x=df_normalized.index, y=df_normalized.columns,
|
122 |
-
title=
|
123 |
labels={"value": "Index (Startwert = 100)", "variable": "Index"},
|
124 |
-
template="plotly_white"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
125 |
|
126 |
# Streamlit: Interaktives Chart anzeigen
|
127 |
st.plotly_chart(fig2, use_container_width=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
48 |
default_start_date = default_end_date - timedelta(days=365)
|
49 |
|
50 |
# Abstand nach unten hinzufügen, damit der Titel nicht direkt unter dem fixierten Logo ist
|
51 |
+
st.markdown("<br><br><br>", unsafe_allow_html=True)
|
52 |
|
53 |
# Titel der App
|
54 |
st.title("📈 Interaktive Analyse von Aktienindizes")
|
55 |
|
|
|
56 |
# Liste der wichtigsten Aktien-Indizes mit Yahoo Finance Ticker
|
57 |
indices = {
|
58 |
"S&P 500 (USA)": "^GSPC",
|
|
|
73 |
start_date = st.date_input("Startdatum", default_start_date)
|
74 |
end_date = st.date_input("Enddatum", default_end_date)
|
75 |
|
76 |
+
# Farben für die Linien (fixe Farben für Konsistenz)
|
77 |
+
color_ticker1 = "#1f77b4" # Blau
|
78 |
+
color_ticker2 = "#ff7f0e" # Orange
|
79 |
+
|
80 |
# Button zum Laden der Daten
|
81 |
+
if st.button("GO"):
|
82 |
|
83 |
# Daten abrufen
|
84 |
data = {}
|
|
|
98 |
fig1 = go.Figure()
|
99 |
|
100 |
# Linke Achse (Ticker 1)
|
101 |
+
fig1.add_trace(go.Scatter(
|
102 |
+
x=df_indices.index, y=df_indices[ticker1_name], mode='lines',
|
103 |
+
name=ticker1_name, yaxis='y1', line=dict(color=color_ticker1)))
|
104 |
|
105 |
# Rechte Achse (Ticker 2)
|
106 |
+
fig1.add_trace(go.Scatter(
|
107 |
+
x=df_indices.index, y=df_indices[ticker2_name], mode='lines',
|
108 |
+
name=ticker2_name, yaxis='y2', line=dict(color=color_ticker2)))
|
109 |
|
110 |
# Layout mit zwei Achsen definieren
|
111 |
fig1.update_layout(
|
|
|
123 |
# --------- 2. INTERAKTIVER CHART: Normierter Vergleich ---------
|
124 |
df_normalized = df_indices / df_indices.iloc[0] * 100
|
125 |
|
126 |
+
# Rendite berechnen (% Veränderung von Start bis Ende)
|
127 |
+
start_price_ticker1 = df_indices[ticker1_name].iloc[0]
|
128 |
+
end_price_ticker1 = df_indices[ticker1_name].iloc[-1]
|
129 |
+
return_ticker1 = ((end_price_ticker1 - start_price_ticker1) / start_price_ticker1) * 100
|
130 |
+
|
131 |
+
start_price_ticker2 = df_indices[ticker2_name].iloc[0]
|
132 |
+
end_price_ticker2 = df_indices[ticker2_name].iloc[-1]
|
133 |
+
return_ticker2 = ((end_price_ticker2 - start_price_ticker2) / start_price_ticker2) * 100
|
134 |
+
|
135 |
+
# Rundung auf 2 Nachkommastellen
|
136 |
+
return_ticker1 = round(return_ticker1, 2)
|
137 |
+
return_ticker2 = round(return_ticker2, 2)
|
138 |
+
|
139 |
+
# Namen mit Rendite für die Legende anpassen
|
140 |
+
legend_ticker1 = f"{ticker1_name} = {return_ticker1}%"
|
141 |
+
legend_ticker2 = f"{ticker2_name} = {return_ticker2}%"
|
142 |
+
|
143 |
+
# Diagramm 2 mit Renditen in der Legende anzeigen
|
144 |
fig2 = px.line(df_normalized, x=df_normalized.index, y=df_normalized.columns,
|
145 |
+
title="Normierter Vergleich der Close-Preise",
|
146 |
labels={"value": "Index (Startwert = 100)", "variable": "Index"},
|
147 |
+
template="plotly_white",
|
148 |
+
color_discrete_map={ticker1_name: color_ticker1, ticker2_name: color_ticker2})
|
149 |
+
|
150 |
+
# Legenden-Namen ändern
|
151 |
+
fig2.for_each_trace(lambda t: t.update(name=legend_ticker1 if t.name == ticker1_name else legend_ticker2))
|
152 |
+
|
153 |
+
# Legendenposition anpassen (oben rechts, wie in Chart 1)
|
154 |
+
fig2.update_layout(legend=dict(x=0, y=1))
|
155 |
+
|
156 |
|
157 |
# Streamlit: Interaktives Chart anzeigen
|
158 |
st.plotly_chart(fig2, use_container_width=True)
|
159 |
+
|
160 |
+
# --------- 3. INTERAKTIVER CHART: Relative Performance (Differenz der normierten Werte) ---------
|
161 |
+
df_relative_performance = df_normalized[ticker1_name] - df_normalized[ticker2_name]
|
162 |
+
|
163 |
+
# Berechnung der Gesamtrendite der relativen Performance von Start bis Ende
|
164 |
+
start_relative = df_relative_performance.iloc[0]
|
165 |
+
end_relative = df_relative_performance.iloc[-1]
|
166 |
+
relative_performance_change = end_relative - start_relative # Direkte Differenz
|
167 |
+
|
168 |
+
# Rundung auf 2 Nachkommastellen
|
169 |
+
relative_performance_change = round(relative_performance_change, 2)
|
170 |
+
|
171 |
+
# Legenden-Text mit relativer Performance
|
172 |
+
legend_relative = f"{ticker1_name} - {ticker2_name} = {relative_performance_change} Punkte"
|
173 |
+
|
174 |
+
# Chart für relative Performance erstellen
|
175 |
+
fig3 = px.line(x=df_relative_performance.index, y=df_relative_performance,
|
176 |
+
title=f"Relative Performance: {ticker1_name} vs. {ticker2_name}",
|
177 |
+
labels={"x": "Datum", "y": "Relative Performance"},
|
178 |
+
template="plotly_white")
|
179 |
+
|
180 |
+
# Farbe der Linie auf die gleiche wie Index 1 setzen
|
181 |
+
fig3.update_traces(line=dict(color=color_ticker1), name=legend_relative)
|
182 |
+
|
183 |
+
# Legendenposition anpassen (oben rechts, wie in Chart 1 und 2)
|
184 |
+
fig3.update_layout(legend=dict(x=0, y=1))
|
185 |
+
|
186 |
+
# Letzten Wert als Text direkt ins Chart einfügen
|
187 |
+
fig3.add_annotation(
|
188 |
+
x=df_relative_performance.index[-1], # Letztes Datum
|
189 |
+
y=df_relative_performance.iloc[-1], # Letzter Wert der Performance
|
190 |
+
text=f"{df_relative_performance.iloc[-1]:.2f}%", # Formatierte Anzeige
|
191 |
+
showarrow=True,
|
192 |
+
arrowhead=2,
|
193 |
+
font=dict(size=14, color=color_ticker1),
|
194 |
+
ax=20, ay=-40 # Position der Anzeige leicht anpassen
|
195 |
+
)
|
196 |
+
|
197 |
+
# Streamlit: Chart anzeigen
|
198 |
+
st.plotly_chart(fig3, use_container_width=True)
|