-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathportfolio.py
69 lines (50 loc) · 2.62 KB
/
portfolio.py
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
import pandas as pd
from pypfopt.efficient_frontier import EfficientFrontier
from pypfopt.risk_models import CovarianceShrinkage
from pypfopt.expected_returns import mean_historical_return
def prepare_data_for_portfolio(stock_prices):
"""
Uzun formattaki hisse fiyat verisini geniş forma dönüştürür, tarihleri tekilleştirir
ve eksik verileri bir önceki değerle doldurur.
Parametre:
stock_prices (pd.DataFrame): Uzun formatta tarih, kod, deger sütunları olan DataFrame.
Döndürür:
pd.DataFrame: Geniş formatta, hisse fiyatlarının sütunlarda yer aldığı DataFrame.
"""
# Tarih sütununu datetime formatına çevir
stock_prices['tarih'] = pd.to_datetime(stock_prices['tarih'])
# Aynı tarih ve kod kombinasyonu için değerleri ortalama alarak birleştir
stock_prices_grouped = stock_prices.groupby(['tarih', 'kod'], as_index=False)['deger'].mean()
# Pivot ederek kod değerlerini sütun isimleri haline getir
stock_prices_pivot = stock_prices_grouped.pivot(index='tarih', columns='kod', values='deger')
# Eksik verileri bir önceki değerle doldur
stock_prices_pivot.fillna(method='ffill', inplace=True)
# Eğer hala eksik veri varsa ilk satırlarda, onları sıfırla doldurabiliriz
stock_prices_pivot.fillna(0, inplace=True)
return stock_prices_pivot
def optimize_portfolio(stock_data):
"""
Portföy optimizasyonu yaparak optimal ağırlıkları ve performans ölçümlerini döner.
Parametre:
stock_data (pd.DataFrame): Hisse senetleri fiyat verisi, sütunlar hisse isimleri, index tarih.
Döndürür:
dict: Optimal portföy ağırlıkları
tuple: (Beklenen Getiri, Risk (Volatilite), Sharpe Oranı)
"""
# Tüm sütunlardaki verileri sayısal formata dönüştür
stock_data = stock_data.apply(pd.to_numeric, errors='coerce')
# NaN değerleri kontrol et ve doldur
if stock_data.isna().any().any():
print("Uyarı: Eksik değerler tespit edildi, bunlar bir önceki değerle dolduruluyor...")
stock_data.fillna(method='ffill', inplace=True)
# Beklenen getiriler ve risk matrisi hesaplama
mu = mean_historical_return(stock_data)
S = CovarianceShrinkage(stock_data).ledoit_wolf()
# Efficient Frontier (Sharpe oranını maksimize eden portföy)
ef = EfficientFrontier(mu, S)
weights = ef.max_sharpe()
cleaned_weights = ef.clean_weights()
# Portföy performans ölçümleri
expected_return, volatility, sharpe_ratio = ef.portfolio_performance(verbose=True)
# Sonuçları döndür
return cleaned_weights, (expected_return, volatility, sharpe_ratio)