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)