Spaces:
Sleeping
Sleeping
Enes Berke Karaoğlan
fix: DataFrame hatası düzeltildi, Code_1.txt eklendi ve demo video yüklendi.
6a2e1f1
| import streamlit as st | |
| import pandas as pd | |
| import numpy as np | |
| import matplotlib.pyplot as plt | |
| import yfinance as yf | |
| # 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 | |
| def load_data(symbols): | |
| data = {} | |
| for sym in symbols: | |
| # Verileri indirin ve sadece 'Close' (kapanış) fiyatlarını alın | |
| data[sym] = yf.download(sym, start="2022-01-01", end="2024-01-01")['Close'] | |
| # Eğer data sözlüğü boştur veya yanlışsa, uygun hata mesajı döndür | |
| if not data: | |
| raise ValueError("Veri çekilmedi. Lütfen hisse senedi sembollerini kontrol edin.") | |
| # Her bir sembol için kapanış fiyatlarını içeren DataFrame'i oluşturun | |
| df = pd.DataFrame(data) | |
| # Eğer df içeriği eksikse veya bir sorun varsa, uygun hata mesajı döndür | |
| if df.empty: | |
| raise ValueError("Oluşturulan DataFrame boş.") | |
| return df | |
| # Veriyi yükleyin | |
| df = load_data(symbols) | |
| # Portföy performansını hesaplayın | |
| total_investment = sum(amounts.values()) # Toplam yatırım miktarını hesaplayın | |
| portfolio_value = df.iloc[-1] * pd.Series(amounts) # Her bir hissenin mevcut değerini hesaplayın | |
| portfolio_value_total = portfolio_value.sum() # Portföyün toplam değerini hesaplayın | |
| 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}") | |
| # Plotly ile Etkileşimli Grafikler | |
| import plotly.express as px | |
| # Interaktif Hisse Fiyat Grafiği | |
| fig = px.line(df, title = "Hisse Senedi Fiyatları") | |
| st.plotly_chart(fig) | |
| # 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 Hesaplama | |
| daily_returns = df.pct_change().dropna() | |
| st.write("Günlük Getiriler:") | |
| st.dataframe(daily_returns) | |
| # Aylık ve Yıllık Getiriler | |
| monthly_returns = df.resample('M').ffill().pct_change().dropna() | |
| annual_returns = df.resample('Y').ffill().pct_change().dropna() | |
| st.write("Aylık Getiriler:") | |
| st.dataframe(monthly_returns) | |
| st.write("Yıllık Getiriler:") | |
| st.dataframe(annual_returns) | |
| # Risk Analizi # | |
| # Volatilite Hesaplama | |
| volatility = daily_returns.std() * np.sqrt(252) # Yıllık Volatilite | |
| st.write("Volatilite (Yıllık) : " , "Volatilite, bir varlığın fiyatındaki dalgalanmaların büyüklüğünü ifade eder. Bu kod, günlük volatiliteyi yıllık volatiliteye çevirir ve bunu gösterir.", | |
| "Volatilite 0.29, yıllık bazda bir varlığın fiyatında %29'luk bir dalgalanma bekleyebileceğinizi ifade eder. Bu, varlığın yıllık getirisinin ortalamadan %29 sapma gösterebileceği anlamına gelir.") | |
| st.dataframe(volatility) | |
| # Portföyün beta değeri | |
| beta = daily_returns.cov() / daily_returns.var() | |
| st.write("Beta Değeri :" , " bir varlığın veya portföyün piyasa ile olan ilişkisini ölçer. Piyasa riskine karşı duyarlılığı anlamak için kullanılır.", | |
| "Özetle, beta değeri 0,70 olan bir varlık, piyasa hareketlerine kıyasla daha az dalgalanma gösterir." , | |
| "Yani, bu varlık, piyasanın genel hareketlerinden daha az etkilenir ve daha stabil bir performans sergiler. Bu durum, yatırımcılar için daha düşük riskli bir yatırım anlamına gelir.") | |
| st.dataframe(beta) | |
| # Hareketli Ortalama | |
| window_size = st.sidebar.slider("Hareketli Ortalama Penceresi (Gün)", 5, 100, 20) | |
| moving_avg = df.rolling(window=window_size).mean() | |
| st.write(f"{window_size} Günlük Hareketli Ortalama:") | |
| st.line_chart(moving_avg) | |
| # Filtreler | |
| 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")) | |
| # Tarih aralığına göre veriyi filtrele | |
| start_date = pd.to_datetime(start_date) | |
| end_date = pd.to_datetime(end_date) | |
| z | |
| 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 | |
| mean_returns = daily_returns.mean() # Ortalama günlük getiriler | |
| simulations = 1000 | |
| simulation_df = pd.DataFrame() | |
| for x in range(simulations): | |
| simulated_prices = [] | |
| for symbol in symbols: | |
| 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) | |
| simulation_df[x] = pd.Series([np.sum(sim) for sim in zip(*simulated_prices)]) | |
| st.line_chart(simulation_df) | |