JQ87 commited on
Commit
798da31
·
verified ·
1 Parent(s): e68aa7e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +80 -9
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) # Fügt 3 Zeilen Abstand hinzu
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("Daten abrufen & Diagramme anzeigen"):
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(x=df_indices.index, y=df_indices[ticker1_name], mode='lines',
99
- name=ticker1_name, yaxis='y1'))
 
100
 
101
  # Rechte Achse (Ticker 2)
102
- fig1.add_trace(go.Scatter(x=df_indices.index, y=df_indices[ticker2_name], mode='lines',
103
- name=ticker2_name, yaxis='y2'))
 
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=f"Normierter Vergleich der Close-Preise: {ticker1_name} vs. {ticker2_name}",
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)