File size: 6,574 Bytes
ac47c35
 
 
 
abf2ca2
ac47c35
abf2ca2
ac47c35
abf2ca2
ac47c35
abf2ca2
 
 
 
ac47c35
abf2ca2
 
ac47c35
abf2ca2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6a2e1f1
abf2ca2
 
6a2e1f1
abf2ca2
 
 
 
 
 
 
 
6a2e1f1
abf2ca2
 
 
 
 
 
 
 
 
 
 
 
 
6a2e1f1
abf2ca2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
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)