Veri Odaklı Yatırım: Python ile Markowitz Portföy Optimizasyonu
“Yumurtaları aynı sepete koyma” tavsiyesinin matematiksel kanıtı: Modern Portföy Teorisi’ni (MPT) teoriden pratiğe nasıl dökeriz? Adım adım…
Veri Odaklı Yatırım: Python ile Markowitz Portföy Optimizasyonu
“Yumurtaları aynı sepete koyma” tavsiyesinin matematiksel kanıtı: Modern Portföy Teorisi’ni (MPT) teoriden pratiğe nasıl dökeriz? Adım adım uygulama rehberi.

Yatırım dünyasında herkesin dilinde aynı tavsiye var: “Sepeti çeşitlendir.”
Ancak finansal okuryazarlığın tıkandığı nokta genellikle şurasıdır: “Hangi oranda?”
Portföyümün %50’si hisse senedi mi olmalı? Yoksa %30 Altın, %70 Teknoloji hissesi mi? Geleneksel yatırımcılar bunu genellikle sezgilerine veya kulaktan dolma bilgilere göre yapar. Ancak bir Finansal Teknoloji (Fintech) uzmanı veya Veri Analisti için cevap duygularda değil, verilerdedir.
Bu yazıda, Nobel ödüllü Harry Markowitz’in Modern Portföy Teorisi’ni (MPT) kullanarak, Python üzerinde nasıl kendi “Robo-Advisor” mantığımızı kurabileceğimizi ve “Etkin Sınır” (Efficient Frontier) analizini nasıl yapabileceğimizi inceleyeceğiz.
Teori: Markowitz Bize Ne Söylüyor?
Markowitz Modeli (Mean-Variance Optimization), temel olarak şunu savunur:
“Bir yatırımcı, belirli bir risk seviyesi için mümkün olan en yüksek getiriyi hedefler.”
Buradaki kilit nokta, varlıkların tek başına getirileri değil, birbirleriyle olan ilişkileridir (Korelasyon). Eğer portföyünüze birbiriyle zıt hareket eden (korelasyonu düşük veya negatif) varlıklar eklerseniz, toplam getiriniz düşmeden riskinizi (varyansınızı) düşürebilirsiniz.
Hadi teoriyi bir kenara bırakalım ve Python ile işin mutfağına girelim.
Adım 1: Kütüphaneler ve Veri Çekme
Bu analizde finansal verileri çekmek için yfinance, veri manipülasyonu için pandas ve matematiksel işlemler için numpy kullanacağız. Görselleştirme için ise matplotlib vazgeçilmezimiz.
(Not: Bu projede örnek olarak BIST 30 içerisinden farklı sektörlere ait 5 hisse seçtim: THY, Garanti, Ereğli, Aselsan ve Şişecam.)
import numpy as np
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
# BIST hisselerinin sonuna '.IS' eklemeyi unutmayın
hisseler = ['THYAO.IS', 'GARAN.IS', 'EREGL.IS', 'ASELS.IS', 'SISE.IS']
# Son 1 yıllık kapanış verilerini çekiyoruz
# Güncelleme Notu: yfinance kütüphanesi artık verileri otomatik düzelttiği için
# doğrudan 'Close' sütununu kullanıyoruz.
veri = yf.download(hisseler, start='2023-01-01', end='2024-01-01')['Close']
print(veri.head())
Adım 2: Logaritmik Getirilerin Hesaplanması
Finansal serilerde fiyatlardan ziyade “getiriler” (returns) ile çalışmak istatistiksel olarak daha sağlıklıdır. Burada basit getiri yerine logaritmik getiri kullanacağız çünkü zaman serilerinde toplanabilirlik özelliği sağlar.
log_getiri = np.log(veri / veri.shift(1))
Adım 3: Monte Carlo Simülasyonu
İşte sihrin gerçekleştiği yer burası. “En iyi” portföyü bulmak için binlerce farklı senaryo deneyeceğiz. Buna Monte Carlo Simülasyonu denir. Bilgisayara şunu söylüyoruz: “Rastgele ağırlıklar ver (örneğin %10 THY, %50 GARAN…), bu portföyün riskini ve getirisini hesapla, bunu 5000 kere tekrar et.”
num_portfolios = 5000
all_weights = np.zeros((num_portfolios, len(hisseler)))
ret_arr = np.zeros(num_portfolios)
vol_arr = np.zeros(num_portfolios)
sharpe_arr = np.zeros(num_portfolios)
for ind in range(num_portfolios):
# 1. Rastgele Ağırlıklar Ata
weights = np.array(np.random.random(len(hisseler)))
weights = weights / np.sum(weights) # Ağırlıklar toplamı 1 olmalı
all_weights[ind, :] = weights
# 2. Beklenen Getiri (Yıllıklandırılmış)
# 252: Bir yıldaki ortalama işlem günü sayısı
ret_arr[ind] = np.sum((log_getiri.mean() * weights) * 252)
# 3. Volatilite (Risk) Hesapla
vol_arr[ind] = np.sqrt(np.dot(weights.T, np.dot(log_getiri.cov() * 252, weights)))
# 4. Sharpe Oranı (Risk Başına Getiri)
# Sharpe = Getiri / Volatilite
sharpe_arr[ind] = ret_arr[ind] / vol_arr[ind]
Adım 4: Veriyi Görselleştirme (Efficient Frontier)
5000 farklı portföyü bir grafik üzerine döktüğümüzde, sol üst tarafta bir sınır oluştuğunu göreceksiniz. İşte burası ”Etkin Sınır”dır. Bu sınırın üzerindeki portföyler, alınan riske değen en iyi portföylerdir.
Grafikte Kırmızı Nokta, Sharpe Oranı en yüksek olan (yani risk başına en iyi getiriyi sunan) optimal portföyü temsil eder.
plt.figure(figsize=(12, 8))
plt.scatter(vol_arr, ret_arr, c=sharpe_arr, cmap='viridis')
plt.colorbar(label='Sharpe Oranı')
plt.xlabel('Volatilite (Risk)')
plt.ylabel('Beklenen Getiri')
# En iyi Sharpe oranına sahip noktayı bul ve işaretle
max_sr_idx = sharpe_arr.argmax()
plt.scatter(vol_arr[max_sr_idx], ret_arr[max_sr_idx], c='red', s=100, edgecolors='black', label='Maksimum Sharpe')
plt.title('Markowitz Portföy Optimizasyonu ve Etkin Sınır')
plt.legend()
plt.show()

Modelimizin Çıktısı
Sonuç: Hangi Hisseden Ne Kadar Almalı?
Simülasyon sonucunda “Maksimum Sharpe” noktasına denk gelen ağırlıkları yazdırdığımızda, model bize matematiksel olarak optimize edilmiş bir reçete sunar:
print("En İyi Portföy Dağılımı:")
en_iyi_agirliklar = all_weights[max_sr_idx,:]
for i in range(len(hisseler)):
print(f"{hisseler[i]}: %{en_iyi_agirliklar[i]*100:.2f}")
— — OPTİMAL PORTFÖY DAĞILIMI — -
Maksimum Sharpe Oranı: 1.25
Beklenen Yıllık Getiri: %60.83
Yıllık Risk (Volatilite): %48.73
— — — — — — — — — — — — — — —
EREGL.IS: %67.51
SISE.IS: %24.31
GARAN.IS: %5.15
THYAO.IS: %2.36
ASELS.IS: %0.67
Kapanış Notları
Bu çalışma, günümüzde milyonlarca dolar yöneten Robo-Advisor (Robot Danışman) sistemlerinin temel çalışma prensibidir. Elbette gerçek dünyada işlem maliyetleri, vergiler ve piyasa dinamikleri gibi başka parametreler de vardır. Ancak bir Yönetim Bilişim Sistemleri uzmanı veya Finans Mühendisi adayı için bu model, veriye dayalı karar almanın ilk adımıdır.
Finansal teknolojiler, sadece parayı transfer etmek değil, onu en akıllı şekilde yönetmek üzerine kuruludur.

Siz yatırımlarınızı çeşitlendirirken hangi yöntemleri kullanıyorsunuz? Yorumlarda buluşalım.
Projelere yönelik yardımcı bir örnek uygulamasıdır. Yatırım tavsiye olarak kullanmayınız.
메타데이터
- post_id
- f76fe2a6729a
- slug
- veri-odaklı-yatırım-python-ile-markowitz-portföy-optimizasyonu-f76fe2a6729a
- url
- https://medium.com/@ybsdeu232/veri-odakl%C4%B1-yat%C4%B1r%C4%B1m-python-ile-markowitz-portf%C3%B6y-optimizasyonu-f76fe2a6729a
- canonical_url
- https://medium.com/@ybsdeu232/veri-odakl%C4%B1-yat%C4%B1r%C4%B1m-python-ile-markowitz-portf%C3%B6y-optimizasyonu-f76fe2a6729a
- author_url
- https://medium.com/@ybsdeu232
- status
- ok
- fetched_at
- 2026-07-14 07:02:06