⚠ 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 6 / 13 · Ücretsiz

Kodla Göstergeler: Vektörleştirilmiş SMA, EMA, RSI, ATR ve Bollinger Bantları ve Bir Grafik Platformuna Karşı Doğrulama

En çok kullanılan beş gösterge için vektörleştirilmiş pandas fonksiyonları yazın ve değerlerinin bir grafik platformundan neden farklı olabileceğini ve bu farkların nasıl giderileceğini öğrenin.

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

Neler öğreneceksiniz

  • rolling ve ewm'in SMA, EMA, Wilder yumuşatması, ATR ve Bollinger Bantlarını her biri için birkaç satırda nasıl uyguladığı.
  • Hangi parametrelerin (adjust, alpha, ddof) sayıları fark ettirmeden değiştirdiği.
  • RSI veya EMA değerinizin ilk çubuklarda neden grafik platformundan farklı olduğu ve ikisinin nasıl doğru şekilde karşılaştırılacağı.
  • Göstergelerin yeniden kullanım ve test için src/indicators.py içinde saf fonksiyonlar olarak nasıl düzenleneceği.

Açıklama

"Derinlemesine Teknik Analiz" kursu bu göstergelerin ne anlama geldiğini açıklamıştı; burada amaç doğru, hızlı ve test edilebilir koddur. Her fonksiyon bir Series alır ve aynı indekse sahip bir Series döndürür.

SMA (simple moving average, basit hareketli ortalama): def sma(s, n): return s.rolling(n).mean().

EMA (exponential moving average, üstel hareketli ortalama): def ema(s, n): return s.ewm(span=n, adjust=False).mean(). span=n ile yumuşatma sabiti α = 2 ÷ (n + 1) olur; n = 20 için α = 0.0952. adjust=False, platformların kullandığı EMAt = α × Pt + (1 − α) × EMAt−1 özyinelemeli formülünü verir; varsayılan adjust=True ise ilk birkaç düzine çubukta farklı ağırlıklandırma yapar. pandas başlangıç değeri olarak ilk fiyatı kullanır; çoğu platform ise ilk n çubuğun SMA'sını kullanır. Her iki başlangıç değerinin etkisi de söner; yaklaşık 3n çubuktan sonra seriler birbirine çok yakın sonuçlar verir.

RSI (relative strength index, göreceli güç endeksi), Wilder'ın versiyonu:

delta = s.diff()

gain = delta.clip(lower=0); loss = -delta.clip(upper=0)

avg_gain = gain.ewm(alpha=1/n, adjust=False).mean()

avg_loss = loss.ewm(alpha=1/n, adjust=False).mean()

rsi = 100 - 100 / (1 + avg_gain / avg_loss)

Wilder yumuşatması, α = 2 ÷ (n + 1) değil α = 1 ÷ n olan bir EMA'dır; burada span=14 kullanmak en yaygın RSI hatasıdır. avg_loss sıfır olduğunda RSI doğru şekilde 100 olur.

ATR (average true range, ortalama gerçek aralık): Gerçek aralık, en yüksek − en düşük, |en yüksek − önceki kapanış| ve |en düşük − önceki kapanış| değerlerinin en büyüğüdür:

pc = close.shift(1)

tr = pd.concat([high - low, (high - pc).abs(), (low - pc).abs()], axis=1).max(axis=1)

atr = tr.ewm(alpha=1/n, adjust=False).mean()

Bazı platformlar bunun yerine SMA tabanlı bir ATR gösterir; karşılaştırmadan önce kontrol edin. 8. ders ATR'yi stoplar ve pozisyon büyüklüğü için kullanıyor.

Bollinger Bantları: orta bant = SMA(n), üst ve alt bant = orta bant ± k × aynı n çubuk üzerindeki standart sapma; tipik olarak n = 20, k = 2. Tuzak ddof'tur: pandas rolling(n).std() n − 1'e böler (örneklem), platformlar ise genellikle n'e böler (popülasyon). Eşleştirmek için std(ddof=0) yazın. Örneklem değeri daha büyüktür; bir bant "temasını" "temas yok"a çevirecek kadar büyük olabilir.

Bir platforma karşı doğrulama. Platformla aynı düzeltilmiş seriyi kullanın, göstergenizi hesaplayın ve son 100 değeri karşılaştırın, çünkü başlangıç değeri farkları zamanla söner. Küçük bir toleransla np.allclose kullanın. Kalıcı farklar beş olağan kaynaktan gelir: düzeltilmiş ve düzeltilmemiş veri, başlangıç değeri, span ile alpha farkı, ddof veya farklı bir girdi fiyatı. Uyumsuzluğu düzeltin veya belgeleyin; sayılar tutana kadar bir parametreyi asla "ayarlamayın".

Çözümlü örnek

Varsayımsal örnek: euro cinsinden on günlük kapanış: 20.00, 20.50, 21.00, 20.80, 21.40, 21.00, 21.60, 22.00, 21.80, 22.40.

Son çubukta SMA(5): (21.00 + 21.60 + 22.00 + 21.80 + 22.40) ÷ 5 = 108.80 ÷ 5 = €21.76.

Son çubukta Bollinger(5, 2). 21.76'dan sapmalar: −0.76, −0.16, 0.24, 0.04, 0.64; kareler toplamı 1.0720. Popülasyon varyansı = 1.0720 ÷ 5 = 0.2144, standart sapma 0.4630, üst bant = 21.76 + 2 × 0.4630 = €22.69, alt bant €20.83. Örneklem formülü: 1.0720 ÷ 4 = 0.2680, standart sapma 0.5177, üst bant €22.80, alt bant €20.72.

EMA(5), α = 2 ÷ 6 = 0.3333 ve adjust=False ile: EMA1 = 20.00 (başlangıç değeri), EMA2 = 0.3333 × 20.50 + 0.6667 × 20.00 = 20.1667, EMA3 = 0.3333 × 21.00 + 0.6667 × 20.1667 = 20.4444 ve bu şekilde son çubukta 21.8310'a kadar devam eder.

En yüksek €21.20, en düşük €20.60 ve önceki kapanış €20.80 olan bir çubuğun gerçek aralığı: max(0.60, |21.20 − 20.80| = 0.40, |20.60 − 20.80| = 0.20) = €0.60.

Sık yapılan hata

ewm'de span ile alpha'yı karıştırmakewm(span=14) α = 2 ÷ 15 = 0.133 kullanır; Wilder'ın RSI ve ATR'si ise ewm(alpha=1/14), yani α = 0.0714 gerektirir. span versiyonu neredeyse iki kat hızlı tepki verir ve hiçbir standart platformla eşleşmez. Kastettiğiniz α'yı açıkça yazın ve fonksiyonun docstring'ine kaydedin.

Uygulama etkinliği

Kâğıt üzerinde, yalnızca örnekleme amacıyla 3 dönemlik bir Wilder RSI kullanarak (gerçek kullanımda 14'tür): kapanışlar 50.00, 50.50, 51.00, 50.80. (a) Çubuk başına kazançları ve kayıpları listeleyin. (b) pandas ewm(alpha=1/3, adjust=False) başlangıç değeri olarak ilk gözlemi kullanır; son çubukta avg_gain ve avg_loss değerlerini ve RSI'ı hesaplayın. (c) İlk üç değişimin basit ortalamasını başlangıç değeri olarak kullanan bir platformun burada neden farklı bir değer göstereceğini tek cümleyle açıklayın ve kodunuzun yanlış olduğu sonucuna varmadan önce ne yapacağınızı belirtin.

Çözümü göster

(a) Değişimler: +0.50, +0.50, −0.20. Kazançlar: 0.50, 0.50, 0.00. Kayıplar: 0.00, 0.00, 0.20.

(b) α = 1/3. avg_gain: 0.50 (başlangıç) → (1/3)(0.50) + (2/3)(0.50) = 0.50 → (1/3)(0) + (2/3)(0.50) = 0.3333. avg_loss: 0 → 0 → (1/3)(0.20) + (2/3)(0) = 0.0667. RS = 0.3333 ÷ 0.0667 = 5.0; RSI = 100 − 100 ÷ (1 + 5) = 83.33.

(c) Burada basit ortalama başlangıç değeri (kazançlar 0.3333, kayıplar 0.0667) tesadüfen aynı 83.33 sonucunu verir; ancak genel olarak iki başlangıç değeri ilk birkaç düzine çubukta farklı sonuç verir, bu yüzden koda dokunmadan önce uzun bir serinin en son 100 değerini karşılaştırın.

Sınırlamalar: 3 dönemlik bir RSI bir öğretim aracıdır; dört çubuk, pratikte önemli olan yakınsama davranışını gösteremez.

Önemli çıkarımlar

  • SMA rolling(n).mean()'dir; EMA ewm(span=n, adjust=False)'dir; RSI ve ATR için Wilder yumuşatması ewm(alpha=1/n, adjust=False)'dir.
  • Çoğu platformdaki Bollinger Bantları popülasyon standart sapmasını kullanır: ddof=0 verin.
  • Başlangıç değeri farkları söner; son 100 çubuğu bir toleransla karşılaştırın ve kodu değiştirmeden önce uyumsuzluğun beş olağan nedenini arayın.
  • Göstergeleri belgelenmiş saf fonksiyonlar olarak tutun; böylece birim testleriyle doğrulanabilir ve her geriye dönük testte yeniden kullanılabilirler.

Sonraki adım

7. ders parçaları vektörleştirilmiş bir geriye dönük testte bir araya getiriyor: sinyaller, pozisyonlar, ileriye bakma yanlılığını önleyen kaydırma, işlem maliyetleri ve sermaye eğrisi.

Öz değerlendirme

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

1. 14 dönemlik bir RSI veya ATR için Wilder yumuşatmasını hangi pandas çağrısı uygular?

2. Beş kapanışın ortalaması €40.00 ve sapmalarının kareleri toplamı 2.00'dır. Popülasyon formülü ve örneklem formülü kullanıldığında üst Bollinger Bandı (k = 2) nerededir?

3. EMA(20) değeriniz son 200 çubukta platformla 0.01 hassasiyetle eşleşiyor, ancak ilk 30 çubukta €0.40'a kadar farklılık gösteriyor. Doğru sonuç 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.