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