Spaces:
Sleeping
Sleeping
| 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 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) | |