Bu örnekte BIST için beklentilerime göre belirli hisselerde ideal portfoyü elde etmeye çalışacağım. [isyatirimhisse](https://pypi.org/project/isyatirimhisse/)ve [PyPortfolioOpt](https://pypi.org/project/pyportfolioopt/) kütüphanelerini kullanacak ve bazı verileri çekecek, kovaryansları hesaplayacak ve ideal portföye ulaşmaya çalışacağım.
Tabii ki türev ürünler, açığa satış vs. varken pratikte ideal olmayacak ama olsun. Temel değişkenler vb. ilgili sayfalarda mevcut.
Modeli kullanmak için bazı farklılıklarla [şuradan](https://pyquantnews.com/how-to-make-winning-portfolio-black-litterman/) yararlandım.
## Varlık Tahsisinin Önemi ve Black-Litterman Modeli
Önce ufak bir giriş, DeepL ile Wikipedia'dan çeviri;
Portföy dağılımı, portföyünü bir dizi varlık sınıfı arasında nasıl çeşitlendireceğini seçmesi gereken bir yatırımcının karşılaştığı karardır. Örneğin, küresel olarak yatırım yapan bir emeklilik fonu her bir büyük ülke veya bölgeye ne kadar tahsis edeceğini seçmelidir.
Prensip olarak modern portföy teorisi (Markowitz'in ortalama-varyans yaklaşımı), varlıkların beklenen getirileri ve kovaryansları bilindiğinde bu soruna bir çözüm sunar. Modern portföy teorisi önemli bir teorik ilerleme olsa da, uygulamada evrensel olarak bir sorunla karşılaşılmıştır: birkaç varlığın kovaryansları yeterli düzeyde tahmin edilebilse de, beklenen getirilerin makul tahminlerini bulmak zordur.
Black-Litterman, yatırımcının beklenen getiri tahminlerini girmesini gerektirmeyerek bu sorunun üstesinden gelmiştir. Bunun yerine, denge varlık dağılımının piyasalarda gözlemlediklerimize eşit olması için başlangıçta beklenen getirilerin ne düzeyde olması gerekiyorsa o olduğunu varsayar. Yatırımcının sadece beklenen getiriler hakkındaki varsayımlarının piyasalardan ne kadar farklı olduğunu ve alternatif varsayımlara olan güven derecesini belirtmesi gerekmektedir. Black-Litterman yöntemi buradan hareketle istenen (ortalama-varyans etkin) varlık dağılımını hesaplar.
## Python Kodu
Öncelikle ilgili kütüphaneleri yüklüyorum. isyatirimhisse çok sorun değil ama diğeri MacOS'ta çok fazla sorun çıkartabiliyor. Sayfasında biraz bilgi vermişler ama ben çok debelendim, eğer olmuyorsa [homebrew](https://homebrew.sh) ile "gcc"'yi kurmayı deneyin. temelde çalışması için C++ lazım, nedense benim debelenmem ve birçok paket kurmam gerekti. yine de ilk etapta PyPortfolioOpt için en alttaki pip komutunu deneyin.
ilgili kütüphaneler için;
```python
pip install isyatirimhisse # sorunsuz şekilde yüklenebiliyor
pip install ecos
pip install scs
pip install qdldl
pip install cvxpy
pip install PyPortfolioOpt # bunu ilk çalıştırdığınızda yüklenirse şanslınız sanırım
```
ilk olarak isyatirimhisse ile THY, ASTOR, Ereğli, Şişecam ve BİM'in yılbaşından itibaren ortalama fiyatlarını günlük olarak çekiyorum.
```python
symbol=['THYAO', 'ASTOR', 'EREGL', 'SISE', 'BIMAS']
start_date='03-01-2023'
frequency='1d'
observation='mean'
data=fetch_data(
symbol=symbol,
start_date=start_date,
frequency=frequency,
observation=observation
)
```
Aşağı yukarı şöyle bir şey dataframe:
![[Pasted image 20230814195805.png]]
Üstteki gibi görünmediyse ki bu süreçte ben çok kurcaladım, şu komut fiyatların olduğu dataframe'i analiz için hazır hale getirmek için yeterli olacaktır. sadece tarihi bırakıp kalan kısmı atıyoruz.
```python
data['Date']=data['Date'].apply(lambda x: str(x).replace("T",""))
data = data.rename(columns={'Date': 'date'})
data.set_index("date", inplace = True)
```
Modeli kurmak için öncelikle hisse bazında beklentilerimi giriyorum. Aşağıdaki rakamlar bunu ifade ediyor. Örneğin burada THY %30'luk bir getiri sağlayacak. Aşağıdaki özet bağlantıda farklı ifadelerin nasıl kullanılacağı da var, göreli olarak da bir hissenin diğerine karşı nasıl hareket edeceğine dair beklenti girilebiliyor fakat şimdilik komplike, belki ilerisi için lazım olur.
```python
viewdict = {
"THYAO": 0.30,
"ASTOR": 0.40,
"EREGL": 0.01,
"SISE": 0.20,
"BIMAS": 0.30
}
```
Burada bir de üstteki fiyat verilerine dayanarak hisselere ait kovaryansı, matrislerini hesaplamak gerekiyor. Sanırım bunu isyatirimhisse de yapıyor ama ben elim değmişken aynı kütüphaneyi, PyPortfolioOpt'u kullandım. yine burada matris için farklı matematiksel yaklaşımlar kullanılabilir.
```python
from pypfopt import risk_models
cov_matrix = risk_models.sample_cov(data)
```
Bu da şöyle bir şey;
![[Pasted image 20230814200658.png]]
Modele gelecek olursak aşağıdaki komutta "pi" herhangi bir bilgiye sahip olmadan piyasadaki hisselerin sahip oldukları mevcut piyasa değerlerinin istatistiksel olarak açıklayıcı olduğu ve ilerideki getiriyi tahmin ettiği varsayımına dayanıyor. "equal" burada eşit ağırlığı ifade ediyor. Mevcut fiyatlar yerine geçmiş getiriler de burada alınabiliyor fakat pek de açıklama gücü yokmuş.
Modeli de güzel [özetlemişler](https://pyportfolioopt.readthedocs.io/en/latest/BlackLitterman.html). Farklı tahminleyicilerin farklı yönleri de var. Aşağıda kısaca piyasadaki mevcut dağılım değerleri yansıtan bir gösterge olarak kabul ediliyor ve bireysel yatırımcı olarak işlerin nasıl değişeceğine dair beklentilerimizi modele dahil ediyoruz. Mevcut durumun geçmişteki getirilerle olan ilişkisinin devam edeceği (üstteki paragraftaki) varsayımı altında yatırımcının bu subjektif görüşü eklenerek portföyün nasıl dağılması gerektiğini belirliyor.
```python
bl = BlackLittermanModel(
cov_matrix,
absolute_views=viewdict,
pi="equal"
)
rets = bl.bl_returns()
ef = EfficientFrontier(rets, cov_matrix)
weights = bl.bl_weights()
plotting.plot_efficient_frontier(ef, show_tickers=True)
```
Bu ağırlıklara göre de ideal portföy ağırlığını ve risk getiri ilişkisini ortaya çıkarıyor. Markowitz'in yaklaşımındaki "efficient frontier".
![[Pasted image 20230814201248.png]]
Henüz sayısal değerleri çok incelemedim, üstteki çok temel bir yaklaşım olduğu için tahminleyiciyi daha derinlemesine belirlemek teorik bir uygulamanın yanında pratiğe de katkı sağlayacaktır. PyPortfolioOpt sayfasında modele dair matematiksel yaklaşımı ve alternatif yolları görünce bu çok temel gibi geldi, gerçek hayatın derinliğini yeterince yansıtmasa da başlangıç olarak iyi bir nokta olabilir. Dışarıdan çeşitli makro değişkenlerle beklentilerin derinleştirilmesi ilginç olur.