Bir stratejinin Monte Carlo simülasyonu — Tek bir backtestin gizlediği risk

Son doğrulama: · Uzun vadeli güncel içerik
Risk uyarısı · YMYL Bu makale yalnızca eğitim amaçlıdır ve yatırım tavsiyesi niteliği taşımaz. Forex piyasasında işlem yapmak yüksek sermaye kaybı riski içerir — ESMA verilerine göre bireysel yatırımcı hesaplarının %74–89'u zarar etmektedir. Türkiye'de kaldıraçlı döviz işlemleri SPK ve BDDK denetimine tabidir; herhangi bir yatırım kararı vermeden önce lisanslı bir mali danışmana başvurunuz.

Bir okur bana gurur duyduğu bir geriye dönük test (backtesting) göndermişti: yüzde 55 isabet oranı, ortalama kazançlı işlem 100 euro, ortalama zararlı işlem 80 euro, kâğıt üzerinde yıllık yaklaşık 3,800 euro beklenen kâr. Sayılar yeterince sağlam görünüyordu, o da canlı bir hesap açtı, işlem başına yüzde beş risk aldı ve altı ayda hesabı tüketti. Hatanın nerede olduğunu sordu. Hata stratejide değildi. Tek bir backtesti tek bir gerçek gibi görmekteydi; oysa Monte Carlo, o işlem büyüklüğünde aynı avantajın hesabı batırma olasılığının yaklaşık yüzde 25 olduğunu gösterirdi. Bu yazıyı yazma nedenim işte o konuşmadır.

Bir stratejinin Monte Carlo simülasyonu tam olarak nedir

Monte Carlo, Monako kumarhanesinden adını alan olasılıksal bir yöntemdir. Tradingde fikir şaşırtıcı derecede basit: tarihin ürettiği tek sermaye eğrisine bakmak yerine, aynı istatistiklere sahip ama farklı sırada bin yeni dizi üretirsiniz. Her biri farklı bir hesap tablosu çizer ve hep birlikte, tek bir pratik uygulama içerikleri üzerinden yapılan bir strateji backtestinin asla açığa çıkaramayacağı olasılıklar bulutunu oluşturur.

Tek bir backtest, rastgele bir sürecin tek bir gerçekleşmesidir. Etrafındaki varyans devasa olabilir — avantajı olan, tekrarlanan bir oyun böyle davranır. Monte Carlo bu varyansı, üzerinde aksiyon alabileceğiniz somut sayılara dönüştürür.

Monte Carlo gerçekte hangi soruları yanıtlar

Simülasyon, tek bir backtestin vermeyeceği üç şeyi verir. Birincisi, yüzde 95 güven düzeyinde gerçekçi bir sermaye düşüşü (drawdown) — 100 simülasyonun 95'inde aşmadığınız derinlik. İkincisi, hesabın anlamlı bir bölümünü kaybetme olasılığı, diyelim ki sermayenin yarısının altına düşme. Üçüncüsü, avantaj sabit kalırken makul yıllık sonuçların aralığı.

Örnekleyici senaryomda (açıkça varsayımsaldır), yüzde 55 isabet oranına, 100 euro ortalama kazançlı işleme, 80 euro ortalama zararlı işleme ve yılda 200 işleme sahip bir stratejinin işlem başına yaklaşık 19 euro matematiksel beklentisi (expectancy) vardır — kâğıt üzerinde 3,800 euro. Bin koşumluk bir simülasyon, 3,750 euroya yakın bir medyan üretti. Koşumların en kötü yüzde beşi yaklaşık 500 euro kârla, en kötü yüzde biri 800 euro zararla ve en iyi yüzde beşi 7,500 euroyla sonlandı. Aynı avantaj, beş kat fark.

Simülasyonu Excel'de nasıl çalıştırırsınız

Makrosuz bir sürüm, kendi stratejinizi anlamak için yeterlidir. A1'den A5'e kadar olan hücrelere parametreleri koyarsınız: isabet oranı 0.55, ortalama kazanç 100, ortalama zarar -80, işlem sayısı 200 ve başlangıç sermayesi 10,000. B1 hücresine =IF(RAND()<A1, A2, A3) girersiniz — Excel'in RAND fonksiyonu sıfır ile bir arasında bir değer döndürür ve isabet oranının altına düştüğünde kazançlı işlem, aksi halde zararlı işlem elde edersiniz.

C1 hücresinde başlangıç sermayesini B1'deki değere eklersiniz; bu, sermaye eğrisinin ilk noktasıdır. B2 aynı formülü yeniden kullanır, C2 ise C1'deki değeri B2'ye ekler. Her iki sütunu da 200. satıra kadar aşağı sürükleyin. Bu, tam bir yıllık diziyi oluşturur.

İki sütunu yana doğru bin kez kopyalamak (B–C, D–E, F–G ve böyle devam) size bin bağımsız sermaye eğrisi verir. Bitiş değerlerinden medyan için =PERCENTILE.INC(aralık, 0.5), ardından en kötü yüzde beş ve yüzde bir için 0.05 ve 0.01 okursunuz. F9'a basmak her rastgele çekimi yeniden hesaplar, böylece her basış taze bir bin koşumluk çalışmaya dönüşür. Bu gerçekten yeterlidir.

Aynı işi Python'da bootstrap ile nasıl yaparsınız

Python size Excel'in vermeyeceği iki şey sunar. Birincisi hız — binlerce koşum saniyeler sürer. İkincisi, daha da önemlisi, bootstrap yapmanıza izin verir: varsayılan parametrelerden değil, gerçek tarihsel işlem listenizden çekersiniz.

NumPy'yi içe aktarır, bir işlem günlüğünden 100 veya daha fazla gerçek kâr/zarar sayısını yükler ve new_sequence = np.random.choice(history, size=200, replace=True) yazarsınız. np.cumsum fonksiyonu kâr/zarar değerlerinin listesini bir sermaye eğrisine dönüştürür ve etrafındaki bir döngü size bin bağımsız koşum verir. Yüzdelik dilimleri np.percentile ile okur, spagetti grafiği çizmek için Matplotlib kullanırsınız — bin eğrinin tamamı, medyan ve 5 ila 95 yüzdelik bandı vurgulanmış şekilde üst üste bindirilir.

Bootstrap, dağılımınızın gerçek kuyruklarını korur — büyük zararları, kümelenmiş hareketleri, oynak bir haftadaki ara sıra gelen rekor kazancı. Parametrik varsayımlar bunu yapamaz, çünkü işlemlerinizin gerçekte sahip olduğu dağılımı varsaymazlar.

"Pozisyon büyüklüğünü denkleme katmadan getiri/risk oranlarının neredeyse hiçbir anlamı yoktur. Pozisyon büyüklüğü yönetimi sayesinde istediğiniz hemen her hedefe ulaşabilirsiniz." — Van K. Tharp, 2007

Dürüst sınırlar — Monte Carlo'nun yapmayacağı şeyler

Parametrik bir simülasyon iki varsayıma dayanır: işlemler bağımsızdır ve sonuç dağılımı durağandır. Gerçek piyasalarda ikisi de aynı anda kırılır. Zararlar kümelenir — rejim değiştiğinde, art arda birkaç işlem aynı yöne hareket eder ve bağımsız örnekler çeken bir model bunu yeniden üretemez. Gerçek sermaye düşüşleri çoğu zaman Monte Carlo'nun yüzde 1 yüzdelik diliminden daha iyi değil, daha kötü görünür.

İkinci sorun, simülasyonun beslediğiniz tarihin ta kendisini kullanmasıdır. 100 işleminiz yalnızca EUR/USD'deki bir yükseliş trendini kapsıyorsa, Monte Carlo size stratejinin uzun bir yatay seyirde ya da ABD verisinin ardından gelen sert 200 pip'lik bir harekette nasıl davrandığı hakkında hiçbir şey söylemez. Bu yüzden simülasyonu, stratejiyi kayan pencerelerde test eden ve avantaj erimesini yakalayan strateji geliştirme yaklaşımları ile eşleştirmek işe yarar.

En karanlık sermaye düşüşleri çoğu kez temiz bir Monte Carlo koşumunun yüzde 1 yüzdelik diliminden daha derine iner. Simülasyonu bir tavan değil, olasılıksal bir taban olarak ele alın ve uzun biçimli bağlam için onu daha geniş ForexMechanics'teki risk yönetimi içeriğiyle birlikte okuyun.

Bunu gerçekten kullanmak için atılacak ilk adımlar

  1. İşlem günlüğünüzden veya platform dışa aktarımınızdan en az 100 kapalı işlemlik bir geçmiş çekin. 100'ün altındaki her şey, istatistikleri Monte Carlo'nun kuyruklar hakkında yararlı bir şey söyleyemeyeceği kadar gürültülü bırakır. Daha azına sahipseniz, altı ila on iki hafta daha işlem yapın ve bu çalışmaya daha dolu bir örneklemle geri dönün.
  2. Boş bir Excel sayfası açın ve yukarıda anlatılan parametrik sürümü kurun. Kendi isabet oranınızı, ortalama kazancınızı, ortalama zararınızı ve sermayenizi girin, sütunları bin kez kopyalayın, F9'a basın ve bitiş değerlerinin yayılımını inceleyin. O bir saatlik emek, "ortalama yılınızın" arkasındaki aralığın gerçekte ne kadar geniş olduğunu açığa çıkarır.
  3. O bin simülasyondan maksimum sermaye düşüşünün yüzde 5 yüzdelik dilimini okuyun. Psikolojik toleransınız yaklaşık yüzde 15'te biterken bu yüzde 30'luk bir çöküntüye işaret ediyorsa, sorun strateji değil pozisyon büyüklüğü ve risk yönetimi ilkeleridir. İşlem başına riski yarıya indirin ve yüzde 5 tabanı acı eşiğinizin içine sığana kadar yeniden çalıştırın.
  4. Bir yıllık canlı işlemin ardından simülasyonu yeni geçmişle tekrar çalıştırın ve geçen yılınkiyle karşılaştırın. Medyan gerilemiş ve kuyruklar genişlemişse avantajınız bozuluyor demektir — bu, onu nasıl idare etmeye devam edeceğinizi değil, stratejinin hâlâ işe yarayıp yaramadığını sorma anıdır.
Jarosław Wasiński
Yazar hakkında

Jarosław Wasiński

MyBank.pl genel yayın yönetmeni · Finans ve piyasa analisti

Finans sektöründe 20 yılı aşkın deneyime sahip bağımsız analist ve uygulayıcı. 2004'ten bu yana faaliyet gösteren MyBank.pl portalının kurucusu ve genel yayın yönetmeni. 2007'den beri döviz ve makroekonomik piyasaların temel analizi. Küresel piyasalar perspektifinden yazmaktadır. Kaldıraçlı Forex işlemleri yüksek risk taşır; Türkiye'de SPK denetiminde faaliyet gösteren aracı kurumlara başvurun.

Kaynaklar ve bibliyografya

  1. Bank for International Settlements Minimum capital requirements for market risk (d457) · Bazylejski standard pokazujący, jak instytucje liczą ryzyko rynkowe za pomocą expected shortfall i historycznej symulacji — analog Monte Carlo dla portfela. www.bis.org ↗
  2. Van Tharp Institute About Van K. Tharp · Strona biograficzna potwierdzająca autorstwo książki „Trade Your Way to Financial Freedom" (McGraw-Hill) i jego pracę nad position sizingiem oraz symulacją Monte Carlo dla traderów detalicznych. www.vantharp.com ↗
  3. NumPy Developers numpy.random.choice — Random sampling · Oficjalna dokumentacja funkcji losowania z powtórzeniami; podstawowe narzędzie do bootstrap resampling listy transakcji w Pythonie. numpy.org ↗
  4. Python Software Foundation random — Generate pseudo-random numbers · Oficjalna dokumentacja biblioteki standardowej Pythona z funkcjami random.choices i random.sample, używanymi do prostych symulacji Monte Carlo bez NumPy. docs.python.org ↗

Sık sorulan sorular

Bir trading stratejisinin Monte Carlo simülasyonu nedir?

Monte Carlo, Monako kumarhanesinden adını alan olasılıksal bir yöntemdir. Tradingde tarihsel işlemlerinizin listesini ya da strateji parametrelerini — isabet oranı, ortalama kazançlı işlem, ortalama zararlı işlem — alırsınız ve tarihin ürettiği tek sermaye eğrisine bakmak yerine, rastgele sırada bin yeni dizi üretirsiniz. Her birinin istatistikleri aynıdır ama kazançlarla zararların sırası farklıdır, dolayısıyla her biri farklı bir hesap tablosu çizer. Neden uğraşmalı: tek bir backtest tek bir gerçekleşmedir. Etrafındaki varyans devasa olabilir. İşlem başına yaklaşık 19 euro matematiksel beklentiye ve yılda 200 işleme sahip aynı strateji, Monte Carlo simülasyonlarında 3,750 euroya yakın bir medyan üretebilir ama en kötü yüzde 5 yüzdelik dilimi 500 euroya düşer ve en iyi yüzde 5 dilimi 7,500 euroya fırlar. Avantaj sabit kalsa bile aralık geniştir. En yaygın yanılgı: "geçen yıl strateji 5,000 euro kazandırdı, demek bu yıl da yaklaşık aynısını kazandırmalı." Monte Carlo, avantaj sabit tutulduğunda gerçekçi aralığın 1,000 ile 10,000 euro arasında uzanabileceğini ve bunda patolojik hiçbir şey olmadığını gösterir. Bu yalnızca varyanstır.

Excel'de bir Monte Carlo simülasyonu nasıl çalıştırılır?

En basit sürüm makro ya da VBA gerektirmez. A1 ile A5 arasındaki hücrelere parametreleri girersiniz: stratejinin isabet oranı (örneğin 0.55), ortalama kazanç (örneğin 100), ortalama zarar (örneğin -80), bir dizideki işlem sayısı (örneğin 200) ve başlangıç sermayesi (örneğin 10,000). B1 hücresine bir işlemi simüle eden =IF(RAND()<A1, A2, A3) formülünü yazarsınız — RAND fonksiyonu sıfır ile bir arasında bir sayı döndürür ve isabet oranının altına düşerse kazançlı işlem, aksi halde zararlı işlem elde edersiniz. C1 hücresinde başlangıç sermayesini B1 sonucuna eklersiniz. B2 ve C2 hücreleri aynı kalıbı kullanır ama C2, C1'e başvurur. Her iki sütunu da 200. satıra kadar aşağı sürükleyin. Bu, tam bir yıllık dizi oluşturur. Bu iki sütunu yana doğru bin kez kopyalayın, böylece bin bağımsız sermaye eğriniz olur. Bitiş değerlerinden medyan için =PERCENTILE.INC(aralık, 0.5) hesaplarsınız ve en kötü yüzde beş ile yüzde biri görmek için aynısını 0.05 ve 0.01 ile yaparsınız. F9'a basmak her rastgele çekimi yeniden hesaplar, böylece her basış size taze bir bin koşumluk çalışma verir. Excel bunu rahatça yönetir ve kendi stratejinizi dürüstçe anlamak için bu yeterlidir.

Python'da Monte Carlo nasıl uygulanır?

Python aynı işi daha hızlı yapar ve yalnızca parametrelerden değil, gerçek bir işlem geçmişinden bootstrap yapmanıza izin verir. NumPy'yi içe aktarır, strateji parametrelerini tanımlar ve tek bir sonuç dizisi kuran bir fonksiyon yazarsınız — sıfır ile bir arasındaki değerlerden oluşan rastgele bir dizi isabet oranıyla karşılaştırıldığında sıfırlar ve birlerden bir vektör verir, np.where ise bu vektörü ortalama kazançlı ve zararlı işlemlere dönüştürür. np.cumsum, tek tek kâr/zarar sayılarının listesini bir sermaye eğrisine çevirir. Fonksiyonu bir döngüde bin kez çalıştırır, bitiş değerlerini toplar ve np.percentile ile yüzdelik dilimleri hesaplarsınız. 100 veya daha fazla gerçek işlemden oluşan bir listeniz varsa, bootstrap için np.random.choice(history, size=200, replace=True) kullanırsınız — kendi geçmişinizden yerine koyarak 200 işlemlik taze bir dizi çekersiniz; bu, parametrik varsayımların yeniden üretemeyeceği gerçek kuyrukları korur. Matplotlib kütüphanesi bir spagetti grafiği çizmenize olanak tanır: bin eğrinin tamamı, medyan ve 5 ila 95 yüzdelik bandı vurgulanmış şekilde üst üste bindirilir — tek bir resim, bir stratejinin riski hakkında on tablonun söyleyeceğinden daha fazlasını söyler.

Tradingde Monte Carlo'nun sınırları nelerdir?

Monte Carlo bir kehanet değildir ve bunu açıkça söylemek gerekir. Parametrik bir simülasyonun temel varsayımı, işlemlerin bağımsız ve sonuç dağılımının durağan olmasıdır. Gerçek piyasalarda her iki koşul da çoğu zaman aynı anda kırılır. Piyasa zararları kümelenme eğilimindedir — rejim değiştiğinde art arda birkaç işlem aynı yöne hareket edebilir; aynı dağılımdan bağımsız örnekler çeken bir model bunu yeniden üretemez. Bu yüzden gerçek tradingdeki en karanlık sermaye düşüşleri çoğu kez Monte Carlo'nun yüzde 1 yüzdelik diliminden daha iyi değil, daha kötü görünür. İkinci sorun, simülasyonun tarihten çıkardığınız istatistiklerin ta kendisini kullanmasıdır. Geçmişiniz yalnızca EUR/USD'deki bir yükseliş trendini kapsıyorsa, Monte Carlo size stratejinin uzun bir yatay seyirde nasıl davrandığı hakkında hiçbir şey söylemez. Pratik sonuç: Monte Carlo çıktısını bir tavan değil, olasılıksal bir taban olarak ele alın. En kötü yüzde 5 senaryosu yüzde 30'luk bir sermaye düşüşüne işaret ediyorsa, gerçek tradingin daha derine inebileceğini varsayın. Pozisyonları medyan sonuca göre değil, bu tabana göre boyutlandırın — böylece gerçek hayattaki bir aksilik sizi oyun dışı bırakmaz.

Daha derine inin · tam rehber