4 Eylül 2026 · geri test

Hem stop seviyeniz hem hedefiniz aynı mumun içindeydi. Backtestiniz hangisini seçti?

Hem stop seviyeniz hem hedefiniz aynı mumun içindeydi. Backtestiniz hangisini seçti?

84,120 seviyesinden long pozisyon. Stop 84,036'da, hedef 84,271'de. Sonraki dakikanın mumu geliyor: açılış 84,118, tepe 84,290, dip 84,010, kapanış 84,240.

Her iki seviye de bu mumun içinde. Stop da hedef de görüldü ve OHLC'nin dört sayısı hangisinin önce olduğunu söyleyen tam olarak sıfır bilgi içeriyor. Backtestiniz yine de bir sonuç verdi. Döngünün bir yerinde bir satır karar verdi — muhtemelen yazarken modelleme varsayımı olarak görmediğiniz bir satır.

Kısa vadeli stratejilerde gördüğüm sahte performansın en büyük tek kaynağı bu; komisyonlardan ve kaymadan da önce geliyor, çünkü varsayım gibi görünmüyor. Altyapı kodu gibi görünüyor.

Yanlış yol 1: kararı if zincirine bırakmak

Yaygın biçimi şöyle:

if bar.high >= target:
    exit(target, "tp")
elif bar.low <= stop:
    exit(stop, "sl")

Kimse "hedefler stoplardan önce sonuçlanır" diye seçim yapmadı. Hedef kontrolü önce yazıldı; çünkü olumlu senaryo buydu ve aklınızda olan da buydu. İki dalın yerini değiştirin, özsermaye eğrisi değişir; bu bile stratejinizin K&Z'sinin kısmen editörünüzün bir özelliği olduğunu göstermeli.

BTCUSDT sürekli vadeli işleminde, 3 aylık 1 dakikalık mumlarla, 4,812 işlemde, girişten itibaren %0.10 stop ve %0.18 hedef kullanan sıradan bir ortalamaya dönüş scalper'ı özellikle seçip çalıştırdım. Sinyaller aynı, komisyonlar aynı; yalnızca eşitlik bozma kuralı değişti.

12.6%işlemlerin iki seviyeye de tek mumda ulaştığı oran
2.31Sharpe, önce hedef sonuçlanır
0.18Sharpe, önce stop sonuçlanır
0.94Sharpe, 1 saniyelik mumlarda çözümlenmiş

İşlemlerin sekizde biri sonucun tamamını belirliyor. Dar stop-hedef ikilisinin aritmetiği böyle: belirsiz işlemler, fiyatın iki yönde de gittiği işlemler; yani en ilginç olanların çoğu. Her biri, yazı tura atışına bağlı olarak stop ile hedef arasındaki mesafenin tamamı kadar değer taşıyor. İşlemlerin %12.6'sı × %0.28'lik aralık, örneklem birimi başına brüt nominal işlem hacminin %3.5'ine denk geliyor; bu da stratejinin gerçek avantajını gölgede bırakıyor.

Bu oran, mum aralığınızın seviye mesafesine oranına bağlıdır ve mumları büyüttükçe hızla kötüleşir. Aynı stop ve hedef, aynı sinyaller, farklı zaman aralıklarına yeniden örneklenmiş hali:

Mum aralığıİki seviyenin de tek mumun içinde olduğu işlemlerSharpe (önce hedef)
1s0.3%0.91
1m12.6%2.31
5m34%3.60
15m49%4.42
1h71%5.88

Tablonun aslında ne söylediğine bakın. Daha kaba mumlar backtesti iyileştirmiş. Her araştırmacının sezgisi saatlik mumların daha temkinli seçenek olduğu yönündedir: daha az gürültü, mikro yapıya daha az aşırı uyum. Ama lehinize sonuçlanan bir mum içi kuralıyla, kaba mum yalnızca şanslı olduğunuzu varsayabileceğiniz daha büyük bir kutudur. 1h mumlarda, her 10 işlemin 7'si tamamen kurala bağlı. Bu backtest bir stratejiyi sınamıyor; 3,400 kez iki `if` ifadesinin sıralamasını sınıyor.

Yanlış yol 2: stopun stop fiyatından gerçekleştiğini varsaymak

Diyelim ki sıralamayı düzelttiniz. Önce stop sonuçlanıyor, tam olarak %0.10 kayıp ve taker komisyonu yazıyorsunuz, kendinizi titiz hissediyorsunuz. Yine de iki ayrı şey yanlış.

İlki, stopun bir gerçekleşme değil tetikleyici olması. Binance USDⓈ-M'de STOP_MARKET emri, tetikleme koşulu karşılanır karşılanmaz piyasa emrine dönüşür ve o anda emir defterinde ne varsa onu tüketir. Sakin bir dakikada bu, bir iki tik kayma demektir. Stopunuzu gerçekten tetikleyen dakikada — 40 puanlık mum gövdesi ve altında bir likidasyon zinciri olan dakikada — geçtiğiniz tarafın emir defteri tam da o sırada sığdır. Örneklemimde stop tetiklerini tik verisiyle eşleştirdiğimde, gerçekleşme fiyatı tetik seviyesinin medyan 1.4 baz puan, 95. yüzdelikte ise 11 baz puan ötesindeydi. 10 baz puanlık bir stopta bu kuyruk, tanımladığınızı sandığınız riskin onda biri kadar ek maliyete yol açıyor.

İkincisi daha incelikli ve sürekli vadeli işlemlere özgü: hangi fiyatın tetiklediği. Binance stop emirlerinde varsayılan olarak mark fiyatını kullanır; mark fiyatı son işlem fiyatından değil, endeks ve yumuşatılmış bazdan oluşturulur. OHLC seriniz son işlem fiyatıdır. Bunlar farklı serilerdir ve stopları tetikleyen olaylar sırasında en fazla ayrışırlar.

Son fiyat (kline veriniz)Mark fiyatı (varsayılan tetikleyici)
Kaynakbu platformdaki işlemlerbirkaç platformun endeksi + baz
Fitil davranışıtam hareketbüyük ölçüde yumuşatılmış
Tipik ayrışmasakin piyasada 1–3 baz puan, zincirleme likidasyon dakikasında 20–35 baz puan
Backtest sonucutetiklenmemesi gerekirken tetiklenen stoplar ve bunun tersi

Yani son fiyat verisindeki 25 baz puanlık bir fitil backtestte stopunuzu tetiklerken canlı mark fiyatı tetik seviyenize 10 baz puan bile yaklaşmamış olabilir. Ya da endeksin hareket ettiği ve platformunuzun geride kaldığı gün bunun tersi yaşanır. workingType değerini CONTRACT_PRICE olarak ayarlarsanız canlı davranışı en azından verinizle eşleştirirsiniz. Araştırmacılar için bu genellikle doğru seçimdir; mark fiyatı tetikleyicisini dürüstçe simüle etmek, tüm gerçekleşme motorunuz boyunca ikinci bir seri taşımayı gerektirir.

En iyi hatırladığım örnek şu: ekibimizden biri take-profit seviyesini %0.18'den %0.21'e taşıyarak bir stratejiyi "iyileştirdi". Sharpe 2.3'ten 3.1'e çıktı. Yeni bir avantaj yoktu. Hedef, 1 dakikalık fitil dağılımının yoğun bölümünün dışına çıkmıştı; böylece işlemlerin daha azı kodun sessizce kazanç yazdığı belirsiz gruba giriyordu. Eşitlik bozma kuralını optimize etmişlerdi.

Yanlış yol 3: her zaman en kötüsünü varsayıp buna temkinlilik demek

İlk akla gelen çözüm kötümserliktir. İki seviyeye de ulaşılırsa stopu al. Tamam, artık iyimserlik yok, gönder.

Eskiden ben de böyle yapardım. Diğer seçenekten iyidir ama yine de yanlıştır; iki nedeni var.

İyi durumdaki stratejileri eler. İşlemlerin %12.6'sında kötümser çözüm uygulamak, bu stratejiye tik verisiyle çözümlenmiş 0.94'e kıyasla 2.1 Sharpe puanına mal oldu. Gerçek değer 0.94 iken kuralınız 0.18 gösteriyorsa fikri çöpe atıp daha kötü bir şey üzerinde çalışırsınız. 2 Sharpe puanı yanılan bir temkinlilik, temkinlilik değil; ahlaki bir duruş takınmış gürültüdür.

Daha kötüsü, optimizasyonu bozar. Parametre taramasına kötümser bir eşitlik bozma kuralı verirseniz, belirsizlik artık saf bir cezaya dönüştüğü için optimizer belirsizlikten kaçınmayı öğrenir. Geniş stoplara ve yakın hedeflere ya da iki seviyenin nadiren aynı anda görüldüğü yavaş mumlara yönelir; sonunda size piyasaya göre değil, gerçekleşme kuralınıza göre seçilmiş parametreleri sunar. Cömert yorumdaki hatanın aynısı, işareti ters; sonuç tablosunda aynı ölçüde görünmez.

Her şeyden önce kullandığımız pratik kural: stop_distance + target_distance, mum aralığınızın 75. yüzdelik aralığından küçükse, mum içi varsayımınız K&Z'de sinyalinizden daha büyük bir kalemdir. İki sayıyı da hesaplayın. Dört satır sürer ve diğer tüm tekil kontrollerden daha fazla strateji incelemesini sona erdirmiştir.

Gerçekten işe yarayanlar

Mumun içindeki fiyat yolu veridir. Gidip alın ya da elde edemediklerinizin sınırlarını belirleyin.

  1. Elinizdeki en ayrıntılı seride çözümleyin. İlgili dakikalar için Binance aggTrades birkaç yüz satırdan oluşur ve soruyu doğrudan yanıtlar: önce hangi seviyeye ulaşıldı ve süpürme hangi fiyattan gerçekleşti. Tüm backtest için tik verisine ihtiyacınız yok; yalnızca belirsiz mumlar için gerekir. Örneklemimde bu, 129,600 dakikanın 606'sıydı. Bu küçük bir indirme, altyapı projesi değil.
  2. Tik verisi yoksa yalnızca çözümleme için bir veya iki zaman dilimi seviyesini küçültün. Sinyaller 15m'de, çıkışlar 1s veya 1m mumlarda çözümlensin. Belirsizlik %49'dan yüzde birin altındaki bir orana düşer; kalan kısım dürüstçe göz ardı edilebilecek kadar küçüktür.
  3. Aralığı her zaman raporlayın. Her backtesti iyimser ve kötümser çözümlemeyle iki kez çalıştırın ve her iki Sharpe değerini çözümlenmiş olanın yanında yazdırın. Bu fark, mum içi belirsizliğinizdir ve Sharpe'ın kendisi için koyacağınız güven aralığının yanında sonuç tablosunda yer almalıdır. Aralık 0.2–2.3 olduğunda içindeki hiçbir sonuç gerçek değildir.
  4. Belirsizlik oranını temel bir metrik olarak izleyin. Bizimki her strateji kartının en üstünde, işlem sayısı ve işlem hacminin yanında yer alıyor. Yaklaşık %5'in üzerindeki bir oran, sınanan şeyin giriş mantığı değil çıkış mantığı olduğu anlamına gelir.
  5. Tetikleyiciyi gerçekleşmeden ayrı modelleyin. Platformun gerçekten kullandığı fiyat serisini tetikleyici olarak alın; tetik fiyatından değil, veriye göre kalibre edilmiş bir kayma dağılımından çekilen örnekle tetik seviyesinin ötesinde gerçekleşme varsayın.

Hisse senetlerinde de aynı sorun farklı kılıklarda karşımıza çıkar. Gece boyunca 58.40'a gap yapan bir hissede 62.00'deki stop 62.00'den gerçekleşmez; açılış fiyatının altında bir yerden gerçekleşir. Gap geçişlerinde −$0.00 kayma yazan günlük mum backtesti, stop-loss katmanının düşüşünüzü azalttığını memnuniyetle söyler. Azaltmadı. Önemli günlerde hiç sınanmadı. İşlem durdurmaları da aynı etkiyi yaratır: stopunuzun gerçekten karşılandığı fiyat, mumun dibinde görünmeyen açılış müzayedesindeki fiyattır.

Bunların hiçbiri sıra dışı değil. Mumun bir özet, stop-hedef stratejisinin ise bu özetin attığı olay sırasına dair bir bahis olduğunu kabul etmekten ibaret. Kağıt üzerinde işlem motoru nihayet stratejiyi canlı veride çalıştırdığında, bu sırayla ilgili söyleyecek bir şeyi olan canlı veridir; hangi if dalını önce yazdığınız ise onu hiçbir zaman ilgilendirmemiştir.

mum içi gerçekleşmelerstop emirlerigeri testkripto vadeli işlemleripiyasa mikro yapısı
← Tüm yazılar