⚠ Trading önemli ölçüde zarar riski içerir. Bu sitedeki her şey yalnızca eğitim amaçlıdır ve finansal tavsiye değildir.
Ders 11 / 13 · Ücretsiz

pandas'ta Portföy Analizi: Korelasyon ve Kovaryans Matrisleri, Ağırlıklı Portföy Volatilitesi ve Bir Yeniden Dengeleme Simülasyonu

Getirilerden yıllıklandırılmış kovaryans ve korelasyon matrislerini hesaplayın, NumPy ile portföy volatilitesini ve risk katkılarını türetin ve kendiliğinden kayma (drift) ile takvime dayalı yeniden dengelemeyi karşılaştırmalı olarak simüle edin.

Yazar: Moustafa Hijaziİçerik gözden geçirildi: 2026-10-306 dk okumaKendi kendine öğrenme kursu

Neler öğreneceksiniz

  • Birden fazla fiyat serisinin tek bir getiri DataFrame'inde nasıl hizalanacağı ve .cov() ile .corr() değerlerinin doğru yıllıklandırılarak nasıl hesaplanacağı.
  • Portföy volatilitesi için matris formülü w.T @ Σ @ w ve her varlığın riske katkısının nasıl okunacağı.
  • Ağırlıkları kendiliğinden kayan bir al-ve-tut portföyünün, takvime göre yeniden dengelenen bir portföyle karşılaştırmalı olarak nasıl simüle edileceği.
  • Hangi sayısal tuzakların (hizalanmamış tarihler, karışık para birimleri, kovaryans penceresinde ileriye bakma) yanlış sonuçlar ürettiği.

Açıklama

Korelasyon ve portföy ısısı ("Risk ve İşlem Yönetimi", 6. ders), iki sistemi birleştirmek ("Sistematik Trading", 10. ders) ve yeniden dengeleme kuralları ("ETF'ler, Fonlar ve Uzun Vadeli Yatırım", 10. ders) başka kurslarda öğretilmişti; bu ders bunları herhangi sayıda varlık için kodla uyguluyor.

Fiyatlardan bir getiri matrisine

Her enstrümanın düzeltilmiş kapanışını (4. ders) her sembol için bir sütun olacak şekilde tek bir DataFrame'e yükleyin: prices = pd.concat(series_dict, axis=1). Piyasalar arasında farklılık gösteren tatiller NaN satırları oluşturur; prices.dropna() (yalnızca ortak günler) ile prices.ffill() (son fiyatı ileriye taşımak) arasında açıkça karar verin. Ardından rets = prices.pct_change().dropna(). Önce her şeyi tek bir para birimine dönüştürün; euro bazlı bir yatırımcının elindeki bir ABD ETF'i EUR/USD serisiyle çevrilmelidir, aksi takdirde volatilitesi ve korelasyonları yanlış şeyi tanımlar.

Kovaryans, korelasyon ve yıllıklandırma

rets.cov(), günlük getirilerin örneklem kovaryans matrisidir; yıllıklandırmak için 252 ile çarpın (varyans zamanla ölçeklenir). rets.corr() birimsizdir ve ölçeklemeye ihtiyaç duymaz. Köşegen her varlığın varyansını tutar, dolayısıyla np.sqrt(np.diag(cov_a)) yıllıklandırılmış volatiliteleri verir. Σ_ij = ρ_ij × σ_i × σ_j ilişkisi, "kriz anında korelasyonlar 0.8'e yükselir" gibi varsayımsal bir senaryoyu test etmek için volatilitelerden ve korelasyonlardan bir matris oluşturmanızı sağlar.

Portföy volatilitesi ve risk katkıları

  • w = np.array([0.5, 0.3, 0.2]) # ağırlıklar, toplamı 1
  • cov_a = rets.cov().values * 252
  • port_var = w @ cov_a @ w
  • port_vol = np.sqrt(port_var)
  • marginal = cov_a @ w # d(var)/d(w)
  • risk_contrib = w * marginal / port_var # toplamı 1 olan paylar

@ matris çarpımıdır. risk_contrib, portföy varyansının hangi oranından her varlığın sorumlu olduğunu söyler; bu oran genellikle sermaye ağırlığından çok uzaktır ve bu fark risk bütçelemesinin başlangıç noktasıdır ("Derinlemesine Portföy Oluşturma: Risk Bütçeleri, Rejimler ve Stres Testleri", 1. ders).

Bir yeniden dengeleme simülasyonu

Al-ve-tut, ağırlıkların kaymasına izin verir: kazananlar daha büyük bir paya doğru büyür. Takvime dayalı yeniden dengeleme ise sabit tarihlerde hedeflere geri döner. pandas'ta getirileri yeniden dengeleme frekansına göre yeniden örnekleyin ve dönemler üzerinde döngü kurun:

  • period_rets = (1 + rets).resample('ME').prod() - 1 # aylık getiriler
  • target = np.array([0.6, 0.4]); hold = 10_000 * target; path = []
  • for _, r in period_rets.iterrows():
  • hold = hold * (1 + r.values) # her dilimi büyüt
  • path.append(hold.sum())
  • hold = hold.sum() * target # hedeflere yeniden dengele

Kayan versiyon için son satırı silin. Üç aylık için 'QE', yıllık için 'YE' kullanın (pandas 2.2 ve sonrası; eski sürümler 'M', 'Q', 'A' kullanır). Bir yeniden dengelemenin devri abs(new_hold - old_hold).sum()'dır; 0.1 % gibi bir maliyet oranıyla çarpıp düşün. Almanya'daki vergiye tabi bir hesapta yeniden dengeleme kazançları da gerçekleştirir; vergi etkisini bir Steuerberater (vergi danışmanı) ile kontrol edin.

Çözümlü örnek

Uydurma girdilerle varsayımsal örnek; ücretler, spread'ler ve vergiler hariçtir.

1. bölüm: üç varlıklı volatilite. Yıllıklandırılmış volatiliteler 20 %, 10 %, 15 %; korelasyonlar ρ₁₂ = 0.2, ρ₁₃ = 0.6, ρ₂₃ = 0.1; ağırlıklar 50 / 30 / 20 %.

  1. Kovaryanslar: Σ₁₂ = 0.2 × 0.20 × 0.10 = 0.0040; Σ₁₃ = 0.6 × 0.20 × 0.15 = 0.0180; Σ₂₃ = 0.1 × 0.10 × 0.15 = 0.0015. Köşegen: 0.0400, 0.0100, 0.0225.
  2. Portföy varyansı = Σ wᵢ wⱼ Σᵢⱼ = 0.25 × 0.04 + 0.09 × 0.01 + 0.04 × 0.0225 + 2 × (0.5 × 0.3 × 0.004 + 0.5 × 0.2 × 0.018 + 0.3 × 0.2 × 0.0015) = 0.0100 + 0.0009 + 0.0009 + 2 × (0.0006 + 0.0018 + 0.00009) = 0.01678.
  3. Portföy volatilitesi = √0.01678 = 12.95 %; volatilitelerin ağırlıklı ortalaması ise 16.0 %'dır; aradaki fark çeşitlendirme faydasıdır.
  4. Risk katkıları: 1. varlık, sermayenin 50 %'siyle varyansın 73.9 %'unu taşır; 2. varlık 30 %'la 9.5 %'ini taşır; 3. varlık 20 %'yle 16.6 %'sını taşır.

2. bölüm: kayma ve yeniden dengeleme. €10,000, A varlığı ile B varlığı arasında 60 / 40 bölünmüş. Yıllık getiriler: A +20 %, −10 %, +15 %; B +2 %, +4 %, +1 %.

  1. Kayma: A: 6,000 × 1.20 × 0.90 × 1.15 = €7,452; B: 4,000 × 1.02 × 1.04 × 1.01 = €4,285.63. Toplam €11,737.63; A'nın ağırlığı 63.5 %'e kaymıştır.
  2. Yıllık yeniden dengeleme: 1. yıl toplamı = 7,200 + 4,080 = €11,280 → 6,768 / 4,512'ye sıfırlanır; 2. yıl = 6,091.20 + 4,692.48 = €10,783.68 → sıfırlanır; 3. yıl = 7,440.74 + 4,356.61 = €11,797.35.
  3. Yeniden dengeleme €59.72 daha yüksek sonuçlandı, çünkü A'yı +20 %'den sonra sattı ve −10 %'den sonra geri aldı. A istikrarlı bir trend izleseydi kayma kazanırdı; yeniden dengeleme riski kontrol eder, getiriyi garanti etmez.

Sık yapılan hata

Örneklemin başında başlayan bir portföyü boyutlandırmak için tüm örneklemin kovaryans matrisini kullanmak2015–2025 dönemi üzerinden rets.cov() hesaplayan ve sonucu 2015'teki ağırlıkları belirlemek için kullanan bir geriye dönük test, gelecekten gelen bilgiyi kullanıyordur. Kovaryansı kayan veya genişleyen bir pencerede tahmin edin (rets.rolling(252).cov() veya rets.loc[:date].cov()) ve yalnızca sonraki döneme uygulayın. Korelasyonlar krizlerde de yükselir; dolayısıyla sakin bir dönemin matrisi, riskin en önemli olduğu anda riski olduğundan düşük gösterir.

Uygulama etkinliği

Kâğıt üzerinde: yıllıklandırılmış volatiliteleri 18 % ve 6 %, korelasyonu 0.3 ve ağırlıkları 70 / 30 % olan iki varlık. (a) 2 × 2 kovaryans matrisini oluşturun. (b) Portföy varyansını ve volatilitesini hesaplayın. (c) Her varlığın risk katkısını varyansın bir payı olarak hesaplayın. (d) Korelasyon 0.9 iken volatiliteyi yeniden hesaplayın ve bunun neden önemli olduğunu tek cümleyle belirtin.

Çözümü göster

(a) Σ₁₁ = 0.0324; Σ₂₂ = 0.0036; Σ₁₂ = 0.3 × 0.18 × 0.06 = 0.00324.

(b) Varyans = 0.49 × 0.0324 + 0.09 × 0.0036 + 2 × 0.7 × 0.3 × 0.00324 = 0.015876 + 0.000324 + 0.0013608 = 0.0175608; volatilite = 13.25 %.

(c) Marjinal: 1. varlık: 0.7 × 0.0324 + 0.3 × 0.00324 = 0.023652; 2. varlık: 0.7 × 0.00324 + 0.3 × 0.0036 = 0.003348. Katkılar: 0.7 × 0.023652 / 0.0175608 = 94.3 %; 0.3 × 0.003348 / 0.0175608 = 5.7 %.

(d) ρ = 0.9 ile: Σ₁₂ = 0.00972; varyans = 0.015876 + 0.000324 + 0.0040824 = 0.0202824; volatilite = 14.24 %. Korelasyon yükseldiğinde "çeşitlendirici" pek az katkı sağlar ve satış dalgalarında tam olarak bu yaşanma eğilimindedir; bir portföy yalnızca tarihsel ortalamaya göre değil, stres altındaki korelasyonlara göre de değerlendirilmelidir.

Sınırlamalar: birkaç yıllık günlük veriden elde edilen örneklem kovaryansı gürültülüdür; penceredeki küçük değişiklikler korelasyonları 0.1 veya daha fazla oynatabilir.

Önemli çıkarımlar

  • Getirileri hesaplamadan önce tarihleri ve para birimlerini hizalayın; eksik günlerin nasıl ele alınacağına açıkça karar verin.
  • Kovaryansı yıllık dönem sayısıyla çarparak yıllıklandırın; korelasyon ölçeklemeye ihtiyaç duymaz.
  • Portföy volatilitesi √(wᵀ Σ w)'dir; w × (Σw) / varyans şeklindeki risk katkıları, riskin gerçekte nerede durduğunu gösterir.
  • Yeniden dengelemeyi, getirileri yeniden örnekleyip varlık dağılımını sıfırlayarak simüle edin; kovaryansı yalnızca o anda mevcut olan veriden tahmin edin.

Sonraki adım

12. ders günlük rutini otomatikleştiriyor: veriyi çeken, sinyalleri hesaplayan ve bir rapor yazan, API anahtarlarını ve istek limitlerini doğru şekilde yöneten zamanlanmış bir betik.

Öz değerlendirme

Soruları yanıtlayın, ardından yanıtlarınızı kontrol edin. İstediğiniz kadar tekrar deneyebilirsiniz.

1. İki varlığın yıllıklandırılmış volatiliteleri 20 % ve 10 %, korelasyonu 0.0 ve ağırlıkları 50 / 50 %'dir. Portföy volatilitesi nedir?

2. Günlük getirilerden oluşan bir DataFrame'in kovaryans matrisinde X varlığı için köşegende 0.0001 yer alıyor. X'in yıllıklandırılmış volatilitesi nedir (252 gün)?

3. Bir yeniden dengeleme simülasyonunda, her döngü yinelemesinde hold = hold.sum() * target satırı hold = hold * (1 + r.values) satırından önce çalıştırılıyor. Etkisi nedir?

Kendi tekrarınız için otomatik öz değerlendirme. Cevaplarınız tarayıcınızda kontrol edilir; bunları görmez ve değerlendirmeyiz. Bu bir sınav veya yeterlilik değildir.

İlerlemeniz

“Tamamlandı” yalnızca dersi bitirdiğinizi işaretlediğiniz anlamına gelir. Anlayışınızın bir sınavı değildir. İlerleme ve notlar yalnızca bu cihazdaki bu tarayıcıda saklanır — bir hesapta değil.