Ali Kemal Kaplan
Telegram'dan İletişime Geç
Teknik Analiz

İlk Otonom Botunu Yazmadan Önce: Algoritmik İşleme Giriş

Bana gelen mesajların giderek artan bir kısmı aynı soruyla başlıyor: “Hocam, bir bot yazsam, uyurken para kazansa?” Bu soruyu anlıyorum. Ekran başında saatlerce oturmak yorucu, duygular karar vermeyi zorlaştırıyor ve bir makinenin bu işi sakin sakin yapması kulağa çok cazip geliyor.

Bot yazmaya heves edince insanın aklına ilk gelen sorular genelde yanlış yerden başlar: hangi programlama dili, hangi kütüphane, hangi araç. Oysa asıl iş kodla başlamıyor. Asıl iş, ne yapmak istediğini bir makinenin anlayacağı netlikte tarif edebilmekle başlıyor.

Bir bot sadece senin kurallarını uygular

Bunu çok net söylemem lazım: Bot zeki değildir. Ona ne söylersen onu yapar. Kâr eden bir strateji vermezsen, kâr eden bir bot yazamazsın. Sadece kendi hatalarını daha hızlı ve daha disiplinli tekrarlayan bir makine yazmış olursun.

Bu yüzden ilk adım, kendi stratejini kâğıda dökmek. Ve bunu “fiyat güçlü görünürse alırım” gibi değil, ölçülebilir şekilde yapmak. “Güçlü” ne demek? Fiyat 50 günlük ortalamanın üstünde mi? RSI 50’nin üstünde mi? Son 20 günün en yükseğini mi geçti? Makine “güçlü” kelimesini anlamaz. Sayıları anlar.

Bu egzersizi botu hiç yazmasan bile yapmanı öneririm. İlk kez denediğimde, yıllardır kullandığımı sandığım stratejinin aslında bir sürü sezgisel istisnadan oluştuğunu fark ettim. “Burada almazdım çünkü hava kötüydü” gibi. Bunları kurala dökemiyorsan, aslında bir stratejin yok, bir hissiyatın var.

Bir stratejinin dört parçası

Bir işlem kuralı seti genelde dört soruya cevap verir. Ne zaman girerim? Ne kadar girerim? Yanılırsam nerede çıkarım? Haklıysam nerede çıkarım?

Çoğu insan sadece ilk soruya odaklanıyor. Giriş sinyali bulmak heyecan verici. Ama botun uzun vadede ne kadar hayatta kalacağını belirleyen şey diğer üç soru. Özellikle pozisyon büyüklüğü ve zarar kesme kuralları.

Basit bir trend takip stratejisinin sözde kodu şuna benzeyebilir. Bu bir öneri değil, sadece yapının nasıl göründüğüne dair bir örnek:

her gün kapanıştan sonra:
    hesapla: ema20, ema50, atr14

    eğer pozisyon yoksa:
        eğer ema20 > ema50 ve kapanış > son_20_gunun_en_yuksegi:
            risk_tutari = hesap_bakiyesi * 0.01
            zarar_kes   = kapanış - 2 * atr14
            adet        = risk_tutari / (kapanış - zarar_kes)
            ertesi gün açılışta al(adet)

    eğer pozisyon varsa:
        eğer fiyat <= zarar_kes:
            sat(tümü)
        eğer ema20 < ema50:
            ertesi gün açılışta sat(tümü)

Burada dikkat etmeni istediğim şey, adet hesabı. Bot “kaç lot alayım” sorusunu sezgiyle değil, hesabın yüzde 1’ini riske atacak şekilde, zarar kesme mesafesine göre hesaplıyor. Zarar kes seviyesi uzaksa daha az, yakınsa daha fazla alıyor. Böylece her işlemde kaybedilebilecek tutar aşağı yukarı sabit kalıyor. Bu, risk yönetimini koda dökmenin en temel hâli.

Bir de “ertesi gün açılışta al” ifadesine dikkat et. Kapanış fiyatına bakarak karar verip aynı kapanıştan işlem yaptığını varsaymak, gerçekte mümkün olmayan bir şey. Bu küçük detay, birazdan anlatacağım geriye dönük test hatalarının ilk örneği.

Geriye dönük test: geçmişte ne olurdu?

Kurallarını yazdıktan sonra, onları geçmiş veride çalıştırıp ne olacağını görmek istersin. Buna geriye dönük test, yaygın adıyla backtest deniyor. Kulağa basit geliyor ama bu aşamada yapılan hatalar, sahada çok pahalıya patlayabiliyor.

En sık gördüğüm hata, geleceği görmek. Test kodu farkında olmadan o gün henüz bilinmeyen bir veriyi kullanıyor. Mesela gün içinde karar verdiğini varsayıyor ama o günün kapanış fiyatını kullanıyor. Test harika sonuç veriyor, çünkü bot geleceği görüyor. Gerçekte ise bu mümkün değil.

İkinci hata, maliyetleri yok saymak. Komisyon, alış satış farkı ve kayma, yani emrin beklediğin fiyattan biraz kötü gerçekleşmesi. Bunlar tek işlemde küçük görünür. Ama sık işlem yapan bir stratejide bu küçük farklar birikir ve kâğıt üstünde kârlı görünen bir stratejiyi zarara çevirebilir.

Üçüncü hata, sadece bugün var olan hisselerle test yapmak. Geçmişte işlem görüp sonra borsadan çıkan şirketler test verisinde yoksa, sonuç olduğundan iyi görünür. Çünkü batanlar listeden düşmüş, sadece hayatta kalanlar kalmış.

Bu yüzden backtest sonucunu ilk gördüğümde sevinmiyorum. Önce şüpheleniyorum. Sonuç ne kadar iyiyse, o kadar çok hata arıyorum.

Aşırı optimizasyon tuzağı

Bu konu bence algoritmik işlemin en sinsi tarafı.

Diyelim ki stratejin 20 ve 50 günlük ortalamaları kullanıyor ve test sonucu fena değil. Sonra merak edip 18 ve 47’yi deniyorsun. Biraz daha iyi. Sonra 17 ve 43. Daha da iyi. Bir RSI filtresi ekliyorsun, sonra bir hacim filtresi, sonra “salı günleri işlem yapma” kuralı. Her eklemede geçmiş sonuç biraz daha güzelleşiyor.

Sonunda elinde geçmişe mükemmel uyan bir strateji oluyor. Sorun şu ki bu strateji piyasanın gerçek bir davranışını değil, geçmiş verinin tesadüflerini öğrenmiş olabilir. Canlıya aldığında o tesadüfler tekrar etmiyor ve sonuçlar dağılıyor.

Benim buna karşı kullandığım birkaç alışkanlık var. Veriyi baştan ikiye bölüyorum ve stratejiyi sadece ilk parçada geliştiriyorum. İkinci parçaya, bir kez ve sadece en sonda bakıyorum. Sonuç orada çökerse stratejiyi çöpe atıyorum, ikinci parçaya göre yeniden ayar yapmıyorum. Parametre sayısını az tutuyorum. Bir de parametrelerin etrafına bakıyorum: 20 günlük ortalama iyi sonuç veriyorsa 18 ve 22 de benzer sonuç vermeli. Sadece tek bir değerde çalışıp komşularında çöken bir strateji, bence büyük ihtimalle bir tesadüf.

Bu tuzak sadece botlara özgü değil. Hareketli ortalamalar ve RSI ile MACD yazılarında da değindiğim gibi, manuel işlem yapan biri de grafiğe bakarak geçmişe en iyi uyan ayarı aramaya kalkabilir. Bot sadece bu hatayı çok daha hızlı yapmanı sağlıyor.

Canlıya almadan önce

Backtest bittikten sonra hemen gerçek parayla başlamıyorum. Önce botu kâğıt üstünde, yani sanal işlemlerle bir süre çalıştırıyorum. Bu aşamada stratejinin değil, sistemin çalışıp çalışmadığını kontrol ediyorum. Veri doğru geliyor mu? Emirler doğru oluşuyor mu? Bağlantı koptuğunda ne oluyor?

Bu son soru çok önemli. Otonom bir bot, sen izlemiyorken çalışıyor. İnternet kesildiğinde, veri sağlayıcı hatalı fiyat gönderdiğinde ya da bir hata yüzünden aynı emri on kez gönderdiğinde ne olacak? Bunlar için koda ayrı güvenlik kuralları yazmak gerekiyor. Günlük toplam kayıp belirli bir tutarı geçerse botun kendini durdurması gibi. Tek seferde açılabilecek pozisyon büyüklüğüne bir üst sınır koymak gibi.

Sonra çok küçük tutarlarla başlıyorum. Bot gerçek piyasada backtest’tekinden farklı davranabilir ve bunu küçük tutarlarla öğrenmek, büyük tutarlarla öğrenmekten çok daha ucuz.

Bot seni duygularından tamamen kurtarmaz

Bu son bir gözlem. Bot yazan çoğu insan, botun kötü bir dönem geçirdiği ilk haftada onu kapatıyor ya da kurallarına müdahale ediyor. Yani duygular kapıdan çıkıp pencereden giriyor.

Her stratejinin kötü dönemleri olur. Backtest sırasında stratejinin geçmişte en kötü ne kadar geri çekildiğine bakıp, bunu gerçekte yaşamaya hazır olup olmadığını kendine dürüstçe sormak lazım. Kâğıtta yüzde 20’lik bir geri çekilme sıradan görünür. Kendi hesabında görünce hiç de sıradan değil.

Algoritmik işlem bana disiplini öğretmedi, disiplinin ne kadar zor olduğunu gösterdi. Bot yazmaya başlamadan önce sabır ve finansal okuryazarlık konusunda sağlam bir zemin kurmak, kod öğrenmekten daha önce geliyor. Teknik analizin temellerine dönmek istersen de buradan başlayabilirsin.

Bu yazı eğitim amaçlıdır, yatırım tavsiyesi değildir. İçerikte geçen kavram ve örnekler genel bilgilendirme içindir; herhangi bir sermaye piyasası aracının alım ya da satımına yönelik öneri taşımaz. Yasal uyarının tamamı

Bilgi Al / İletişime GeçTelegram üzerinden doğrudan ulaşın: @AliKemalKaplan