Spaces:
Sleeping
Sleeping
Enes Berke Karaoğlan
commited on
Commit
·
6a2e1f1
1
Parent(s):
ac47c35
fix: DataFrame hatası düzeltildi, Code_1.txt eklendi ve demo video yüklendi.
Browse files- Code_1.txt +162 -0
- app.py +103 -95
Code_1.txt
ADDED
@@ -0,0 +1,162 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import pandas as pd
|
3 |
+
import numpy as np
|
4 |
+
import matplotlib.pyplot as plt
|
5 |
+
import yfinance as yf
|
6 |
+
|
7 |
+
|
8 |
+
# Başlık
|
9 |
+
st.title('Portföy Yönetim Aracı')
|
10 |
+
|
11 |
+
# Kullanıcıdan hisse senedi sembollerini alın
|
12 |
+
|
13 |
+
st.sidebar.header("Portföy Bilgileri")
|
14 |
+
symbols = st.sidebar.text_input("Hisse Senedi Sembolleri (Virgülle Ayırın)", "AAPL, MSFT, TSLA")
|
15 |
+
symbols = [sym.strip().upper() for sym in symbols.split(',')]
|
16 |
+
|
17 |
+
|
18 |
+
|
19 |
+
|
20 |
+
# Kullanıcıdan her hisse senedi için yatırım miktarını alın
|
21 |
+
|
22 |
+
amounts = {}
|
23 |
+
|
24 |
+
for sym in symbols:
|
25 |
+
amount = st.sidebar.number_input(f'{sym} için yatırım miktarı girin :', min_value=0, value=1000)
|
26 |
+
amounts[sym] = amount
|
27 |
+
|
28 |
+
|
29 |
+
def load_data(symbols):
|
30 |
+
data = {}
|
31 |
+
|
32 |
+
for sym in symbols:
|
33 |
+
# Verileri indirin ve sadece 'Close' (kapanış) fiyatlarını alın
|
34 |
+
data[sym] = yf.download(sym, start="2022-01-01", end="2024-01-01")['Close']
|
35 |
+
|
36 |
+
# Eğer data sözlüğü boştur veya yanlışsa, uygun hata mesajı döndür
|
37 |
+
if not data:
|
38 |
+
raise ValueError("Veri çekilmedi. Lütfen hisse senedi sembollerini kontrol edin.")
|
39 |
+
|
40 |
+
# Her bir sembol için kapanış fiyatlarını içeren DataFrame'i oluşturun
|
41 |
+
df = pd.DataFrame(data)
|
42 |
+
|
43 |
+
# Eğer df içeriği eksikse veya bir sorun varsa, uygun hata mesajı döndür
|
44 |
+
if df.empty:
|
45 |
+
raise ValueError("Oluşturulan DataFrame boş.")
|
46 |
+
|
47 |
+
return df
|
48 |
+
|
49 |
+
|
50 |
+
|
51 |
+
# Veriyi yükleyin
|
52 |
+
df = load_data(symbols)
|
53 |
+
|
54 |
+
|
55 |
+
# Portföy performansını hesaplayın
|
56 |
+
total_investment = sum(amounts.values()) # Toplam yatırım miktarını hesaplayın
|
57 |
+
portfolio_value = df.iloc[-1] * pd.Series(amounts) # Her bir hissenin mevcut değerini hesaplayın
|
58 |
+
portfolio_value_total = portfolio_value.sum() # Portföyün toplam değerini hesaplayın
|
59 |
+
|
60 |
+
|
61 |
+
|
62 |
+
st.write(f"Toplam yatırım miktarı: ${total_investment:.2f}")
|
63 |
+
st.write(f"Her bir hissenin mevcut değeri:")
|
64 |
+
st.write(portfolio_value)
|
65 |
+
st.write(f"Portföyün toplam değeri: ${portfolio_value_total:.2f}")
|
66 |
+
|
67 |
+
|
68 |
+
|
69 |
+
# Plotly ile Etkileşimli Grafikler
|
70 |
+
|
71 |
+
import plotly.express as px
|
72 |
+
|
73 |
+
# Interaktif Hisse Fiyat Grafiği
|
74 |
+
fig = px.line(df, title = "Hisse Senedi Fiyatları")
|
75 |
+
st.plotly_chart(fig)
|
76 |
+
|
77 |
+
# Portföy Dağıılım Grafiği
|
78 |
+
fig = px.bar(x = amounts.keys(), y = portfolio_value, labels = {"x" : 'Yatırım Araçları', 'y' : 'Portföy Değeri' })
|
79 |
+
st.plotly_chart(fig)
|
80 |
+
|
81 |
+
|
82 |
+
# Getiri Hesaplama
|
83 |
+
daily_returns = df.pct_change().dropna()
|
84 |
+
st.write("Günlük Getiriler:")
|
85 |
+
st.dataframe(daily_returns)
|
86 |
+
|
87 |
+
|
88 |
+
|
89 |
+
# Aylık ve Yıllık Getiriler
|
90 |
+
monthly_returns = df.resample('M').ffill().pct_change().dropna()
|
91 |
+
annual_returns = df.resample('Y').ffill().pct_change().dropna()
|
92 |
+
|
93 |
+
st.write("Aylık Getiriler:")
|
94 |
+
st.dataframe(monthly_returns)
|
95 |
+
|
96 |
+
st.write("Yıllık Getiriler:")
|
97 |
+
st.dataframe(annual_returns)
|
98 |
+
|
99 |
+
|
100 |
+
|
101 |
+
# Risk Analizi #
|
102 |
+
|
103 |
+
# Volatilite Hesaplama
|
104 |
+
|
105 |
+
volatility = daily_returns.std() * np.sqrt(252) # Yıllık Volatilite
|
106 |
+
st.write("Volatilite (Yıllık) : " , "Volatilite, bir varlığın fiyatındaki dalgalanmaların büyüklüğünü ifade eder. Bu kod, günlük volatiliteyi yıllık volatiliteye çevirir ve bunu gösterir.",
|
107 |
+
"Volatilite 0.29, yıllık bazda bir varlığın fiyatında %29'luk bir dalgalanma bekleyebileceğinizi ifade eder. Bu, varlığın yıllık getirisinin ortalamadan %29 sapma gösterebileceği anlamına gelir.")
|
108 |
+
|
109 |
+
st.dataframe(volatility)
|
110 |
+
|
111 |
+
|
112 |
+
# Portföyün beta değeri
|
113 |
+
|
114 |
+
beta = daily_returns.cov() / daily_returns.var()
|
115 |
+
st.write("Beta Değeri :" , " bir varlığın veya portföyün piyasa ile olan ilişkisini ölçer. Piyasa riskine karşı duyarlılığı anlamak için kullanılır.",
|
116 |
+
"Özetle, beta değeri 0,70 olan bir varlık, piyasa hareketlerine kıyasla daha az dalgalanma gösterir." ,
|
117 |
+
"Yani, bu varlık, piyasanın genel hareketlerinden daha az etkilenir ve daha stabil bir performans sergiler. Bu durum, yatırımcılar için daha düşük riskli bir yatırım anlamına gelir.")
|
118 |
+
st.dataframe(beta)
|
119 |
+
|
120 |
+
|
121 |
+
# Hareketli Ortalama
|
122 |
+
|
123 |
+
window_size = st.sidebar.slider("Hareketli Ortalama Penceresi (Gün)", 5, 100, 20)
|
124 |
+
moving_avg = df.rolling(window=window_size).mean()
|
125 |
+
|
126 |
+
|
127 |
+
st.write(f"{window_size} Günlük Hareketli Ortalama:")
|
128 |
+
st.line_chart(moving_avg)
|
129 |
+
|
130 |
+
|
131 |
+
# Filtreler
|
132 |
+
start_date = st.sidebar.date_input("Başlangıç Tarihi", pd.to_datetime("2023-01-01"))
|
133 |
+
end_date = st.sidebar.date_input("Bitiş Tarihi", pd.to_datetime("2024-01-01"))
|
134 |
+
|
135 |
+
# Tarih aralığına göre veriyi filtrele
|
136 |
+
start_date = pd.to_datetime(start_date)
|
137 |
+
end_date = pd.to_datetime(end_date)
|
138 |
+
z
|
139 |
+
if start_date < end_date:
|
140 |
+
filtered_data = df[(df.index >= start_date) & (df.index <= end_date)]
|
141 |
+
st.line_chart(filtered_data)
|
142 |
+
else:
|
143 |
+
st.error("Başlangıç tarihi bitiş tarihinden sonra olmamalıdır.")
|
144 |
+
|
145 |
+
|
146 |
+
# Monte Carlo Simülasyonu
|
147 |
+
mean_returns = daily_returns.mean() # Ortalama günlük getiriler
|
148 |
+
simulations = 1000
|
149 |
+
simulation_df = pd.DataFrame()
|
150 |
+
|
151 |
+
for x in range(simulations):
|
152 |
+
simulated_prices = []
|
153 |
+
|
154 |
+
for symbol in symbols:
|
155 |
+
price_series = [df[symbol].iloc[-1]]
|
156 |
+
for _ in range(365): # 1 yıl
|
157 |
+
price_series.append(price_series[-1] * (1 + np.random.normal(mean_returns[symbol], volatility[symbol])))
|
158 |
+
simulated_prices.append(price_series)
|
159 |
+
|
160 |
+
simulation_df[x] = pd.Series([np.sum(sim) for sim in zip(*simulated_prices)])
|
161 |
+
|
162 |
+
st.line_chart(simulation_df)
|
app.py
CHANGED
@@ -15,109 +15,117 @@ symbols = [sym.strip().upper() for sym in symbols.split(',')]
|
|
15 |
# Kullanıcıdan her hisse senedi için yatırım miktarını alın
|
16 |
amounts = {}
|
17 |
for sym in symbols:
|
18 |
-
amount = st.sidebar.number_input(f'{sym} için yatırım miktarı girin
|
19 |
amounts[sym] = amount
|
20 |
|
|
|
21 |
def load_data(symbols):
|
22 |
data = {}
|
|
|
23 |
for sym in symbols:
|
24 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
if not data:
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
return df
|
31 |
|
32 |
# Veriyi yükleyin
|
33 |
df = load_data(symbols)
|
34 |
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
st.write(f"
|
44 |
-
|
45 |
-
|
46 |
-
st.
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
st.
|
63 |
-
|
64 |
-
st.
|
65 |
-
|
66 |
-
st.
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
st.dataframe(volatility)
|
74 |
-
|
75 |
-
st.subheader("Beta Değeri")
|
76 |
-
|
77 |
-
|
78 |
-
st.dataframe(beta)
|
79 |
-
|
80 |
-
# Hareketli Ortalama
|
81 |
-
st.subheader("Hareketli Ortalama")
|
82 |
-
window_size = st.sidebar.slider("Hareketli Ortalama Penceresi (Gün)", 5, 100, 20)
|
83 |
-
moving_avg = df.rolling(window=window_size).mean()
|
84 |
-
st.
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
st.
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
st.
|
99 |
-
else:
|
100 |
-
st.error("Başlangıç tarihi bitiş tarihinden sonra olmamalıdır.")
|
101 |
-
|
102 |
-
# Monte Carlo Simülasyonu
|
103 |
-
mean_returns = daily_returns.mean() # Ortalama günlük getiriler
|
104 |
-
simulations = 1000
|
105 |
-
simulation_df = pd.DataFrame()
|
106 |
-
|
107 |
-
for x in range(simulations):
|
108 |
-
simulated_prices = []
|
109 |
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
)
|
123 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
# Kullanıcıdan her hisse senedi için yatırım miktarını alın
|
16 |
amounts = {}
|
17 |
for sym in symbols:
|
18 |
+
amount = st.sidebar.number_input(f'{sym} için yatırım miktarı girin:', min_value=0, value=1000)
|
19 |
amounts[sym] = amount
|
20 |
|
21 |
+
# Veri çekme fonksiyonu
|
22 |
def load_data(symbols):
|
23 |
data = {}
|
24 |
+
|
25 |
for sym in symbols:
|
26 |
+
try:
|
27 |
+
stock_data = yf.download(sym, start="2022-01-01", end="2024-01-01")['Close']
|
28 |
+
if not stock_data.empty:
|
29 |
+
data[sym] = stock_data
|
30 |
+
else:
|
31 |
+
st.warning(f"{sym} için veri bulunamadı!")
|
32 |
+
|
33 |
+
except Exception as e:
|
34 |
+
st.error(f"{sym} için veri çekilirken hata oluştu: {e}")
|
35 |
+
|
36 |
if not data:
|
37 |
+
st.error("Hiçbir hisse senedi verisi yüklenemedi. Lütfen sembolleri kontrol edin.")
|
38 |
+
return pd.DataFrame() # Boş DataFrame döndür
|
39 |
+
|
40 |
+
return pd.DataFrame(data)
|
|
|
41 |
|
42 |
# Veriyi yükleyin
|
43 |
df = load_data(symbols)
|
44 |
|
45 |
+
if not df.empty:
|
46 |
+
# Portföy performansını hesaplayın
|
47 |
+
total_investment = sum(amounts.values())
|
48 |
+
|
49 |
+
if not df.empty:
|
50 |
+
portfolio_value = df.iloc[-1] * pd.Series(amounts)
|
51 |
+
portfolio_value_total = portfolio_value.sum()
|
52 |
+
|
53 |
+
st.write(f"Toplam yatırım miktarı: ${total_investment:.2f}")
|
54 |
+
st.write(f"Her bir hissenin mevcut değeri:")
|
55 |
+
st.write(portfolio_value)
|
56 |
+
st.write(f"Portföyün toplam değeri: ${portfolio_value_total:.2f}")
|
57 |
+
|
58 |
+
# Grafikler
|
59 |
+
st.subheader("Hisse Senedi Fiyatları")
|
60 |
+
fig = px.line(df, title="Hisse Senedi Fiyatları")
|
61 |
+
st.plotly_chart(fig)
|
62 |
+
|
63 |
+
st.subheader("Portföy Dağılım Grafiği")
|
64 |
+
fig = px.bar(x=amounts.keys(), y=portfolio_value, labels={"x": 'Yatırım Araçları', 'y': 'Portföy Değeri'})
|
65 |
+
st.plotly_chart(fig)
|
66 |
+
|
67 |
+
# Getiri hesaplamaları
|
68 |
+
st.subheader("Günlük Getiriler")
|
69 |
+
daily_returns = df.pct_change().dropna()
|
70 |
+
st.dataframe(daily_returns)
|
71 |
+
|
72 |
+
st.subheader("Aylık Getiriler")
|
73 |
+
monthly_returns = df.resample('M').ffill().pct_change().dropna()
|
74 |
+
st.dataframe(monthly_returns)
|
75 |
+
|
76 |
+
st.subheader("Yıllık Getiriler")
|
77 |
+
annual_returns = df.resample('Y').ffill().pct_change().dropna()
|
78 |
+
st.dataframe(annual_returns)
|
79 |
+
|
80 |
+
# Risk Analizi
|
81 |
+
st.subheader("Volatilite (Yıllık)")
|
82 |
+
volatility = daily_returns.std() * np.sqrt(252)
|
83 |
+
st.dataframe(volatility)
|
84 |
+
|
85 |
+
st.subheader("Beta Değeri")
|
86 |
+
if not daily_returns.empty:
|
87 |
+
beta = daily_returns.cov() / daily_returns.var()
|
88 |
+
st.dataframe(beta)
|
89 |
+
|
90 |
+
# Hareketli Ortalama
|
91 |
+
st.subheader("Hareketli Ortalama")
|
92 |
+
window_size = st.sidebar.slider("Hareketli Ortalama Penceresi (Gün)", 5, 100, 20)
|
93 |
+
moving_avg = df.rolling(window=window_size).mean()
|
94 |
+
st.line_chart(moving_avg)
|
95 |
+
|
96 |
+
# Tarih Aralığı Filtreleme
|
97 |
+
st.subheader("Tarih Aralığına Göre Veri Filtreleme")
|
98 |
+
start_date = st.sidebar.date_input("Başlangıç Tarihi", pd.to_datetime("2023-01-01"))
|
99 |
+
end_date = st.sidebar.date_input("Bitiş Tarihi", pd.to_datetime("2024-01-01"))
|
100 |
+
|
101 |
+
if start_date < end_date:
|
102 |
+
filtered_data = df[(df.index >= start_date) & (df.index <= end_date)]
|
103 |
+
st.line_chart(filtered_data)
|
104 |
+
else:
|
105 |
+
st.error("Başlangıç tarihi bitiş tarihinden sonra olmamalıdır.")
|
106 |
+
|
107 |
+
# Monte Carlo Simülasyonu
|
108 |
+
st.subheader("Monte Carlo Simülasyonu")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
109 |
|
110 |
+
if not daily_returns.empty:
|
111 |
+
mean_returns = daily_returns.mean()
|
112 |
+
simulations = 1000
|
113 |
+
simulation_df = pd.DataFrame()
|
114 |
+
|
115 |
+
for x in range(simulations):
|
116 |
+
simulated_prices = []
|
117 |
+
|
118 |
+
for symbol in symbols:
|
119 |
+
if symbol in df.columns:
|
120 |
+
price_series = [df[symbol].iloc[-1]]
|
121 |
+
for _ in range(365): # 1 yıl
|
122 |
+
price_series.append(price_series[-1] * (1 + np.random.normal(mean_returns[symbol], volatility[symbol])))
|
123 |
+
simulated_prices.append(price_series)
|
124 |
+
|
125 |
+
if simulated_prices:
|
126 |
+
simulation_df[x] = pd.Series([np.sum(sim) for sim in zip(*simulated_prices)])
|
127 |
+
|
128 |
+
st.line_chart(simulation_df)
|
129 |
+
else:
|
130 |
+
st.warning("Monte Carlo Simülasyonu için yeterli veri yok.")
|
131 |
+
|