Risk05.04.2026schedule3 min read

Maximum Drawdown Yönetimi — Drawdown'dan Çıkış Süresi ve Sermaye Koruma

Maximum drawdown'ı hesaplamak kolay, yönetmek zor. vectorbt ile drawdown analizi yapıyor, BIST'te recovery sürelerini ölçüyor ve sermaye koruma mekanizmalarını Python'da kuruyoruz.

Maximum drawdown teoride bir sayı, pratikte bir psikoloji testi. Kendi geliştirdiğim bir stratejide %-23 drawdown yaşadım — backteste göre %-18 bekleniyordu. O 5 puanlık fark küçük görünüyor ama stratejiyi kapatıp kapatmamak arasında titredim.

Drawdown ve Sermaye Yönetimi

Drawdown Nedir, Neden Önemli?

Maximum Drawdown (MDD) portföyün zirve değerinden en derin düşüşünü ölçer. %20 MDD, portföyün bir noktada zirveden %20 erimesi demek.

Ama MDD kadar önemli olan iki ek metrik var:

Drawdown Süresi: Zirveye ne kadar sürede ulaşıldı?

Recovery Süresi: Zirveyi geri kazanmak ne kadar sürdü?

Adım 1: Drawdown Hesaplama

!pip install vectorbt yfinance --quiet

import vectorbt as vbt
import yfinance as yf
import pandas as pd
import numpy as np
import plotly.graph_objects as go
from plotly.subplots import make_subplots

ticker = "GARAN.IS"
df = yf.download(ticker, start="2020-01-01", end="2025-01-01", progress=False)
if isinstance(df.columns, pd.MultiIndex):
    df.columns = df.columns.droplevel(1)
close = df["Close"].dropna()

pf = vbt.Portfolio.from_holding(close, init_cash=100_000, fees=0.001)
dd = pf.drawdowns

print(f"Maximum Drawdown     : %{pf.max_drawdown()*100:.1f}")
print(f"Toplam Drawdown Sayısı: {dd.count()}")

Adım 2: Drawdown Dönemlerini Detaylı İncele

def drawdown_hesapla(fiyat_serisi):
    rolling_max = fiyat_serisi.cummax()
    drawdown = (fiyat_serisi - rolling_max) / rolling_max * 100
    return drawdown, rolling_max

dd_seri, rolling_max = drawdown_hesapla(close)

print("Drawdown İstatistikleri:")
print(f"  Maximum Drawdown   : %{dd_seri.min():.1f}")
print(f"  Ortalama Drawdown  : %{dd_seri.mean():.1f}")
print(f"  DD'da geçen gün (<%5) : {(dd_seri < -5).sum()}")
print(f"  DD'da geçen gün (<%10): {(dd_seri < -10).sum()}")
print(f"  DD'da geçen gün (<%20): {(dd_seri < -20).sum()}")

Drawdown Analiz Grafiği

Adım 3: Drawdown Görselleştirme

fig = make_subplots(
    rows=2, cols=1, shared_xaxes=True,
    row_heights=[3, 1], vertical_spacing=0.04,
    subplot_titles=("Fiyat ve Zirve", "Drawdown %")
)

fig.add_trace(go.Scatter(
    x=close.index, y=close.values,
    name="Kapanış", line=dict(color="#1565c0", width=1)
), row=1, col=1)

fig.add_trace(go.Scatter(
    x=rolling_max.index, y=rolling_max.values,
    name="Zirve", line=dict(color="#43a047", width=1, dash="dot"), opacity=0.7
), row=1, col=1)

fig.add_trace(go.Scatter(
    x=dd_seri.index, y=dd_seri.values, name="Drawdown %",
    fill="tozeroy", fillcolor="rgba(229,57,53,0.2)",
    line=dict(color="#e53935", width=0.8)
), row=2, col=1)

for seviye, renk in [(-10, "orange"), (-20, "red")]:
    fig.add_hline(y=seviye, line_dash="dash", line_color=renk, line_width=1, row=2, col=1)

fig.update_layout(
    title=f"{ticker} — Drawdown Analizi (2020-2025)",
    plot_bgcolor="#fff", paper_bgcolor="#f8f9fa",
    hovermode="x unified", height=550
)
fig.show()

Adım 4: Sermaye Koruma Mekanizması — Drawdown Bazlı Pozisyon Azaltma

def drawdown_bazli_pozisyon(mevcut_dd_pct, esikler=None):
    if esikler is None:
        esikler = [
            (0, 1.00),    # Normal: tam pozisyon
            (-5, 0.75),   # %-5 DD: %75 pozisyon
            (-10, 0.50),  # %-10 DD: %50 pozisyon
            (-15, 0.25),  # %-15 DD: %25 pozisyon
            (-20, 0.00),  # %-20 DD: nakit
        ]

    pozisyon = 1.0
    for esik, oran in sorted(esikler, reverse=True):
        if mevcut_dd_pct <= esik:
            pozisyon = oran
            break
    return pozisyon

pozisyon_agirlik = dd_seri.apply(drawdown_bazli_pozisyon)

nakit_gun = (pozisyon_agirlik == 0).sum()
azaltilmis_gun = (pozisyon_agirlik < 1).sum()

print(f"Nakit kalınan gün   : {nakit_gun} ({nakit_gun/len(dd_seri)*100:.1f}%)")
print(f"Azaltılmış pozisyon : {azaltilmis_gun} ({azaltilmis_gun/len(dd_seri)*100:.1f}%)")

Sonuç

  • Drawdown rakamı backtest raporunda küçük görünür ama gerçekte yaşamak çok farklı.
  • Recovery süresi çoğu zaman drawdown kadar önemli — BIST'te bazı hisseler yıllarca önceki zirveye dönemedi.
  • Drawdown bazlı pozisyon azaltma mekanizması hem sermayeyi hem psikolojiyi koruyor.
  • Bu analizin sınırı: pozisyon azaltma gecikmeli tepki veriyor. Volatilite bazlı önceden azaltma daha proaktif bir yaklaşım.

Bu yazıdaki kodlar eğitim amaçlıdır; yatırım tavsiyesi değildir.