Enes Berke Karaoğlan
fix: Veri çekme hatası düzeltildi, hata kontrolleri geliştirildi
a8b14d1
raw
history blame
4.86 kB
import streamlit as st
import pandas as pd
import numpy as np
import yfinance as yf
import plotly.express as px
# Başlık
st.title('Portföy Yönetim Aracı')
# Kullanıcıdan hisse senedi sembollerini alın
st.sidebar.header("Portföy Bilgileri")
symbols = st.sidebar.text_input("Hisse Senedi Sembolleri (Virgülle Ayırın)", "AAPL, MSFT, TSLA")
symbols = [sym.strip().upper() for sym in symbols.split(',')]
# Kullanıcıdan her hisse senedi için yatırım miktarını alın
amounts = {}
for sym in symbols:
amount = st.sidebar.number_input(f'{sym} için yatırım miktarı girin:', min_value=0, value=1000)
amounts[sym] = amount
# Veri çekme fonksiyonu
def load_data(symbols):
data = {}
for sym in symbols:
try:
stock_data = yf.download(sym, start="2022-01-01", end="2024-01-01")['Close']
if not stock_data.empty:
data[sym] = stock_data
else:
st.warning(f"⚠️ {sym} için veri bulunamadı! Lütfen doğru bir hisse senedi sembolü girdiğinizden emin olun.")
except Exception as e:
st.error(f"❌ {sym} için veri çekilirken hata oluştu: {e}")
if not data:
st.warning("⚠️ Hiçbir hisse senedi verisi yüklenemedi. Lütfen sembolleri kontrol edin.")
return pd.DataFrame() # Boş DataFrame döndür
return pd.DataFrame(data)
# Veriyi yükleyin
df = load_data(symbols)
if not df.empty and not df.isnull().all().all():
# Portföy performansını hesaplayın
total_investment = sum(amounts.values())
if not df.empty:
portfolio_value = df.iloc[-1] * pd.Series(amounts)
portfolio_value_total = portfolio_value.sum()
st.write(f"💰 **Toplam yatırım miktarı:** ${total_investment:.2f}")
st.write(f"📊 **Her bir hissenin mevcut değeri:**")
st.write(portfolio_value)
st.write(f"💼 **Portföyün toplam değeri:** ${portfolio_value_total:.2f}")
# Grafikler
st.subheader("📈 Hisse Senedi Fiyatları")
fig = px.line(df, title="Hisse Senedi Fiyatları")
st.plotly_chart(fig)
st.subheader("📊 Portföy Dağılım Grafiği")
fig = px.bar(x=amounts.keys(), y=portfolio_value, labels={"x": 'Yatırım Araçları', 'y': 'Portföy Değeri'})
st.plotly_chart(fig)
# Getiri hesaplamaları
st.subheader("📅 Günlük Getiriler")
daily_returns = df.pct_change().dropna()
st.dataframe(daily_returns)
st.subheader("📅 Aylık Getiriler")
monthly_returns = df.resample('M').ffill().pct_change().dropna()
st.dataframe(monthly_returns)
st.subheader("📅 Yıllık Getiriler")
annual_returns = df.resample('Y').ffill().pct_change().dropna()
st.dataframe(annual_returns)
# Risk Analizi
st.subheader("📊 Volatilite (Yıllık)")
volatility = daily_returns.std() * np.sqrt(252)
st.dataframe(volatility)
st.subheader("📉 Beta Değeri")
if not daily_returns.empty:
beta = daily_returns.cov() / daily_returns.var()
st.dataframe(beta)
# Hareketli Ortalama
st.subheader("📊 Hareketli Ortalama")
window_size = st.sidebar.slider("Hareketli Ortalama Penceresi (Gün)", 5, 100, 20)
moving_avg = df.rolling(window=window_size).mean()
st.line_chart(moving_avg)
# Tarih Aralığı Filtreleme
st.subheader("📅 Tarih Aralığına Göre Veri Filtreleme")
start_date = st.sidebar.date_input("📅 Başlangıç Tarihi", pd.to_datetime("2023-01-01"))
end_date = st.sidebar.date_input("📅 Bitiş Tarihi", pd.to_datetime("2024-01-01"))
if start_date < end_date:
filtered_data = df[(df.index >= start_date) & (df.index <= end_date)]
st.line_chart(filtered_data)
else:
st.error("❌ Başlangıç tarihi bitiş tarihinden sonra olmamalıdır.")
# Monte Carlo Simülasyonu
st.subheader("📊 Monte Carlo Simülasyonu")
if not daily_returns.empty:
mean_returns = daily_returns.mean()
simulations = 1000
simulation_df = pd.DataFrame()
for x in range(simulations):
simulated_prices = []
for symbol in symbols:
if symbol in df.columns:
price_series = [df[symbol].iloc[-1]]
for _ in range(365): # 1 yıl
price_series.append(price_series[-1] * (1 + np.random.normal(mean_returns[symbol], volatility[symbol])))
simulated_prices.append(price_series)
if simulated_prices:
simulation_df[x] = pd.Series([np.sum(sim) for sim in zip(*simulated_prices)])
st.line_chart(simulation_df)
else:
st.warning("⚠️ Monte Carlo Simülasyonu için yeterli veri yok.")
else:
st.error("❌ Hisse senedi verisi bulunamadı. Lütfen geçerli bir sembol girin.")