Strateji05.04.2026schedule3 min read

Breakout Stratejisi: Destek-Direnç Kırılım Sistemi

Hacim onaylı breakout modelini Python'da kuruyor, BIST'e özgü false breakout problemini ve nasıl filtreleneceğini anlatıyoruz.

Breakout stratejilerinde beni en çok zorlayan şey şuydu: grafikte mükemmel görünen bir kırılım, pozisyon açtıktan sonra anında geri çekiliyor. "False breakout" ya da Türkçesiyle sahte kırılım. BIST'te bu çok yaygın ve kendine özgü bir acısı var — hem yanlış okudunuz hem de stop'a takılmadan önce biraz daha düşüyor.

Breakout Stratejisi

Breakout Nedir?

Breakout, fiyatın belirli bir süre içinde oluşturduğu destek veya direnç seviyesini hacimle beraber kırması anlamına gelir. Bu kırılım, yeni bir trendin başlangıcına işaret edebilir.

Python Kodu

import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def breakout_sistemi(df, pencere=20, hacim_carpan=1.8):
    df = df.copy()

    df["Direnc"] = df["High"].rolling(pencere).max().shift(1)
    df["Destek"] = df["Low"].rolling(pencere).min().shift(1)

    df["HacimOrt"] = df["Volume"].rolling(20).mean()
    df["HacimGuc"]  = df["Volume"] / df["HacimOrt"]

    df["BreakoutAL"] = (
        (df["Close"] > df["Direnc"]) &
        (df["HacimGuc"] >= hacim_carpan)
    )

    df["BreakoutSAT"] = (
        (df["Close"] < df["Destek"]) &
        (df["HacimGuc"] >= hacim_carpan)
    )

    return df

ticker = "KOZAL.IS"
df = yf.download(ticker, start="2022-01-01", end="2025-01-01", progress=False)
df.columns = df.columns.droplevel(1) if isinstance(df.columns, pd.MultiIndex) else df.columns

df = breakout_sistemi(df, pencere=20, hacim_carpan=1.8)

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 9), sharex=True)

ax1.plot(df["Close"],  color="black", linewidth=0.8, label="Kapanış")
ax1.plot(df["Direnc"], color="red",   linewidth=1,   linestyle="--", label="Direnç (20G max)", alpha=0.7)
ax1.plot(df["Destek"], color="green", linewidth=1,   linestyle="--", label="Destek (20G min)", alpha=0.7)

al  = df[df["BreakoutAL"]]
sat = df[df["BreakoutSAT"]]
ax1.scatter(al.index,  al["Close"],  marker="^", color="green", s=120, zorder=5, label="Breakout AL")
ax1.scatter(sat.index, sat["Close"], marker="v", color="red",   s=120, zorder=5, label="Breakdown SAT")
ax1.set_title(f"{ticker} — Hacim Onaylı Breakout Sistemi")
ax1.legend(fontsize=8); ax1.grid(alpha=0.3)

renkler = ["green" if g >= 1.8 else "gray" for g in df["HacimGuc"]]
ax2.bar(df.index, df["Volume"], color=renkler, alpha=0.7)
ax2.plot(df["HacimOrt"], color="orange", linewidth=1, label="Ortalama Hacim")
ax2.set_ylabel("Hacim"); ax2.legend(); ax2.grid(alpha=0.3)

plt.tight_layout()
plt.show()

Destek Direnç Seviyeleri

False Breakout Problemi ve Çözüm Yolları

BIST'te false breakout özellikle şu koşullarda yaygın:

Sabah gap'leri: Bir haber gece geliyor, sabah gapli açılıyor, direnç kırılmış gibi görünüyor — ama gün içinde geri doluyor. Gün kapanışını beklemek çok daha güvenli.

İnce piyasa: Günlük hacmi 1-2 milyon TL olan hisselerde büyük bir lot girişiyle anlık fiyat kaymasıyla "kırılım" görünebilir. Hacim şartını 2.5x'e çıkarıyorum.

# Kapanış onayı
df["KapanisOnay"] = df["Close"] > df["Direnc"] * 0.99

# ATR bazlı güç filtresi
df["ATR"] = (df["High"] - df["Low"]).rolling(14).mean()
df["BreakoutGucu"] = (df["Close"] - df["Direnc"]) / df["ATR"]

Sonuç

  • Hacim onayı olmadan breakout sinyali değersiz.
  • False breakout riskini azaltmak için kapanış onayı ve ATR güç filtresi eklemek faydalı.
  • Strateji en iyi konsolidasyon sonrası çalışır: fiyat uzun süre dar bantta sıkışmış, sonra volümlü kırılım.
  • BIST'te direnç kırılımlarını "teyit etmek" için ertesi gün açılışın direncin üzerinde kalmasını beklemek ek güvence sağlar.

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