Spaces:
Sleeping
Sleeping
File size: 6,574 Bytes
ac47c35 abf2ca2 ac47c35 abf2ca2 ac47c35 abf2ca2 ac47c35 abf2ca2 ac47c35 abf2ca2 ac47c35 abf2ca2 6a2e1f1 abf2ca2 6a2e1f1 abf2ca2 6a2e1f1 abf2ca2 6a2e1f1 abf2ca2 |
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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
import streamlit as st
import pandas as pd
import numpy as np
import yfinance as yf
import plotly.graph_objects as go
import plotly.express as px
from datetime import datetime
st.title("Portföy Yönetim Aracı")
# Yan panel girdileri
st.sidebar.header("Kullanıcı Girdileri")
symbols_input = st.sidebar.text_input("Hisse Senedi Sembolleri (virgülle ayrılmış)", value="AAPL, MSFT, TSLA")
symbols = [sym.strip().upper() for sym in symbols_input.split(",") if sym.strip()]
investment_amounts = {}
st.sidebar.subheader("Yatırım Miktarları (Adet)")
for sym in symbols:
amount = st.sidebar.number_input(f"{sym} için adet", min_value=0.0, value=0.0, step=1.0)
investment_amounts[sym] = amount
st.sidebar.header("Tarih Aralığı")
start_date = st.sidebar.date_input("Başlangıç Tarihi", value=datetime(2022, 1, 3))
end_date = st.sidebar.date_input("Bitiş Tarihi", value=datetime(2024, 1, 1))
st.sidebar.header("Hareketli Ortalama")
ma_window = st.sidebar.number_input("Hareketli Ortalama Pencere Boyutu (gün)", min_value=1, value=20, step=1)
@st.cache_data # st.cache yerine st.cache_data kullanılması önerilir
def load_data(symbol, start_date, end_date):
try:
data = yf.download(symbol, start=start_date, end=end_date)
if data.empty:
st.warning(f"{symbol} için veri bulunamadı veya boş döndü.")
return data
except Exception as e:
st.error(f"{symbol} verisi çekilirken hata oluştu: {e}")
return None
data_dict = {}
for sym in symbols:
df = load_data(sym, start_date, end_date)
if df is not None:
data_dict[sym] = df
st.header("Hisse Senedi Fiyatları")
for sym, df in data_dict.items():
if not df.empty:
fig = go.Figure()
fig.add_trace(go.Scatter(x=df.index, y=df['Close'], mode='lines', name='Kapanış Fiyatı'))
fig.add_trace(go.Scatter(x=df.index,
y=df['Close'].rolling(window=int(ma_window)).mean(),
mode='lines',
name=f'{ma_window} Günlük MA'))
fig.update_layout(title=f"{sym} Fiyat Grafiği", xaxis_title="Tarih", yaxis_title="Fiyat (USD)")
st.plotly_chart(fig)
else:
st.warning(f"{sym} için çizilecek veri yok.")
st.header("Portföy Performansı")
portfolio_value = 0
portfolio_values = {}
for sym, df in data_dict.items():
# Eğer df boş değilse hesaplamaları yap
if df is not None and not df.empty:
latest_price = df['Close'].iloc[-1]
value = latest_price * investment_amounts[sym]
portfolio_values[sym] = value
portfolio_value += value
else:
st.warning(f"{sym} veri seti boş veya None, hesaplamalar atlanıyor.")
st.write("Güncel Portföy Değeri: $", round(portfolio_value, 2))
portfolio_df = pd.DataFrame({
"Sembol": list(portfolio_values.keys()),
"Değer": list(portfolio_values.values())
})
fig_bar = px.bar(portfolio_df, x="Sembol", y="Değer", title="Portföy Dağılım Grafiği", labels={"Değer": "Değer ($)"})
st.plotly_chart(fig_bar)
# Getiri Hesaplamaları
st.header("Getiri Hesaplamaları")
returns_data = {}
for sym, df in data_dict.items():
df = df.copy()
df['Daily Return'] = df['Close'].pct_change()
returns_data[sym] = df['Daily Return']
# Günlük Getiri Tablosu
st.subheader("Günlük Getiriler")
daily_returns_df = pd.DataFrame({sym: data['Daily Return'] for sym, data in data_dict.items()})
st.dataframe(daily_returns_df.tail())
# Aylık Getiri Hesaplaması
st.subheader("Aylık Getiriler")
monthly_returns = {}
for sym, df in data_dict.items():
df = df.copy()
df['Monthly Return'] = df['Close'].resample('M').ffill().pct_change()
monthly_returns[sym] = df['Monthly Return']
monthly_returns_df = pd.DataFrame(monthly_returns)
st.dataframe(monthly_returns_df.tail())
# Yıllık Getiri Hesaplaması
st.subheader("Yıllık Getiriler")
annual_returns = {}
for sym, df in data_dict.items():
df = df.copy()
df['Annual Return'] = df['Close'].resample('Y').ffill().pct_change()
annual_returns[sym] = df['Annual Return']
annual_returns_df = pd.DataFrame(annual_returns)
st.dataframe(annual_returns_df.tail())
# Risk Analizi
st.header("Risk Analizi")
risk_metrics = {}
for sym, df in data_dict.items():
df = df.copy()
daily_vol = df['Daily Return'].std()
annual_vol = daily_vol * np.sqrt(252)
risk_metrics[sym] = {"Günlük Volatilite": daily_vol, "Yıllık Volatilite": annual_vol}
risk_df = pd.DataFrame(risk_metrics).T
st.dataframe(risk_df)
# Portföyün Günlük Getirilerinin Hesaplanması (Yatırım miktarlarına göre ağırlıklandırma)
portfolio_daily_returns = pd.Series(0, index=list(data_dict.values())[0].index)
total_investment = sum(investment_amounts[sym] for sym in symbols if sym in investment_amounts and investment_amounts[sym] > 0)
for sym, df in data_dict.items():
weight = investment_amounts[sym] / total_investment if total_investment > 0 else 0
portfolio_daily_returns += df['Daily Return'] * weight
# Beta Hesaplaması: Her hisse için, portföy getirisine göre beta = cov(ha, portföy)/var(portföy)
beta_values = {}
for sym, df in data_dict.items():
covariance = np.cov(df['Daily Return'].dropna(), portfolio_daily_returns.dropna())[0, 1]
variance = np.var(portfolio_daily_returns.dropna())
beta = covariance / variance if variance != 0 else np.nan
beta_values[sym] = beta
beta_df = pd.DataFrame.from_dict(beta_values, orient='index', columns=["Beta"])
st.subheader("Beta Değerleri")
st.dataframe(beta_df)
# Monte Carlo Simülasyonu: Portföyün 1 yıl sonraki değeri için 1000 simülasyon
st.header("Monte Carlo Simülasyonu ile Gelecek Portföy Değeri Tahmini")
simulations = 1000
days = 365
last_portfolio_value = portfolio_value
# Portföy günlük getirilerinin ortalama ve standart sapması
portfolio_daily_mean = portfolio_daily_returns.mean()
portfolio_daily_std = portfolio_daily_returns.std()
simulation_results = []
for i in range(simulations):
simulated_value = last_portfolio_value
for d in range(days):
simulated_return = np.random.normal(portfolio_daily_mean, portfolio_daily_std)
simulated_value *= (1 + simulated_return)
simulation_results.append(simulated_value)
fig_hist = px.histogram(simulation_results, nbins=50,
title="Monte Carlo Simülasyonu Sonuçları (1 Yıl Sonra Portföy Değeri Dağılımı)",
labels={"value": "Portföy Değeri", "count": "Frekans"})
st.plotly_chart(fig_hist)
|