Olay nasıl başladı
Borsa verileriyle uğraşırken kendimi bir anda mükemmel bir strateji bulmuş gibi hissettim. Python kullanarak geçmiş veriler üzerinde bir tarama yaptım ve kendi yazdığım basit bir algoritmayı çalıştırdım. Elimdeki veriler bist üzerinden aldığım kısa vadeli hareketlerdi. Algoritmam o kadar güzel çalışıyordu ki kendi kendime neden daha önce bunu yapmadım diye sordum. Tam 9 saat boyunca kağıt üzerinde test yaptım. Bu süreç içinde tam 15 işlem gerçekleştirdim. İşin ilginç yanı şu ki 15 işlemin 15 tanesi de artıda kapandı. Toplam kazanç küçüktü ama tutarlılık beni resmen büyülemişti. Sanki para basan bir makine yapmıştım. Kağıt üzerinde her şey kusursuz görünüyordu. Hiç zarar etmeden günü kapatmak insana büyük bir özgüven veriyor. Ancak bu durumun sadece bir hayal olduğunu anlamam uzun sürmedi. Canlı veriye geçtiğim anda işler tamamen değişti. Kağıt üzerindeki o büyülü başarı bir anda toz olup gitti. Nerede hata yaptığımı anlamak için verileri tekrar incelemeye başladım. Meğerki o 9 saatlik test sürecinde kendimi kandırmışım. Geriye dönük testin ne kadar tehlikeli olabileceğini o an anladım. Başarılı gibi görünen stratejim aslında sadece veriyi doğru okuyamadığım için öyle görünüyormuş.
Bu nerede karşına çıkar
Bu problem genelde trading stratejileri geliştiren herkesin karşısına çıkar. Veri analizi yaparken veya bir ajan yazarken geçmiş verileri kullanmak çok caziptir. Çünkü elinizde bitmiş bir olaylar zinciri vardır ve siz bu zinciri istediğiniz gibi bükebilirsiniz. Özellikle bist gibi piyasalarda yüksek frekanslı veriyle uğraşırken bu tuzağa düşmek çok kolaydır. Bir mumun kapanışını beklemek yerine o mumun içindeki veriyi sanki mum kapanmış gibi kullanmaya başlarsınız. Bu durum sadece borsa verilerinde değil aslında zaman serisi analizi yapan her alanda karşınıza çıkabilir. Bir modelin eğitim verisiyle test verisi birbirine karıştığında veya geleceğe ait bilgi geçmiş verinin içine sızdığında benzer sonuçlar alırsınız. Kod yazarken her şeyin yolunda gittiğini sanırsınız ancak gerçek hayatta sistem hiçbir şey tahmin edemez hale gelir. Ben de tam olarak bu noktada takıldım. Kendi yazdığım ajan modeli geçmişin güvenli limanında harikalar yaratıyordu ama piyasanın belirsizliğine çıktığı an savunmasız kaldı. Bu durum sadece benim başıma gelmiyor. Profesyonel traderlar bile bazen bu hatayı yaparak büyük kayıver veriyor. Veriyle uğraşırken her zaman tetikte olmanız gerekiyor.
Kök neden
Asıl sorun geleceğe sızan veri meselesi. Bir mumun kapanış değerini o mum kapanmadan kullanırsan strateji geleceği bilir hale gelir. Benim kodumda yaptığım hata tam olarak buydu. Kod şu şekildeydi:
def strateji_kontrol(mum_verisi):
if mum_verisi.kapanis > mum_verisi.acilis:
return alim_yap
return bekle
Bu küçük kod parçası mumun kapanış değerini o anki veri içinde okuyor. Aslında mum henüz kapanmamışken ben kapanış fiyatını biliyormuşum gibi işlem yaptırıyordum. Bu durum algoritmanın geleceği görmesini sağlıyor. Tabii ki geriye dönük testte her şey mükemmel görünür. Çünkü algoritma aslında o fiyat seviyesine gelindiğinde ne olacağını zaten biliyor. Bu bir analiz değil sadece veriyi kopyalamak oluyor. Geleceğe sızan veri, stratejinizin performansını yapay bir şekilde yükseltir. Siz de bu yapay yükselişe kanıp canlı piyasaya girersiniz. Ancak canlı piyasada mum kapanmadan kapanış fiyatını bilme şansınız yok. Bu yüzden stratejiniz anında başarısız olur. Kök neden bu kadar basit ama bir o kadar da yıkıcı. Veriyle oynarken zaman akışını bozmamak gerekir. Her adımda sadece o ana kadar olan bilgiyi kullanmalısınız. Geleceğe sızan veri, testinizin güvenilirliğini tamamen yok eder. Bu yüzden geriye dönük testin güzel görünmesi stratejinin iyi olduğunu değil, testin çok kolay olduğunu gösterir.
Çözüm
Çözüm için yaklaşımımı tamamen değiştirdim. Önce ileriye dönük kağıt testi yapmaya karar verdim. Yani sistemi çalıştırıp piyasa verisini gerçek zamanlı olarak izledim ama gerçek para kullanmadım. Bu yöntem geleceğe sızan veriyi tamamen ortadan kaldırıyor. Çünkü sistem sadece o anki veriyi görüyor. Ardından küçük bir tutarla canlıya geçtim. Küçük tutar dedim çünkü kaybetme ihtimalini göze alarak sistemi test etmem gerekiyordu. Kademeli büyütme ise en sağlıklı yol oldu. Her aşamada aynı ölçümleri tekrar aldım. Başarıyı sadece kağıt üzerindeki sayılarda değil, canlı piyasadaki tepkilerde aradım. Kodumu şu şekilde güncelledim:
def kontrollu_strateji(gecmis_veriler):
bitmis_mumlar = gecmis_veriler[:-1]
if bitmis_mumlar[-1].kapanis > bitmis_mumlar[-1].acilis:
return alim_yap
Bu kod ile sadece kapanmış olan mumlara bakarak karar veriyorum. Geleceğe dair hiçbir veri içermiyor. Bu şekilde test ettiğimde kağıt üzerindeki o 15te 15 başarısı yerini daha gerçekçi sonuçlara bıraktı. Bazen zarar ettim ama en azından sistemin gerçekten nasıl çalıştığını öğrendim. Kademeli büyütme sayesinde riskimi kontrol altında tuttum. Her aşamada verileri kaydedip bir önceki testle kıyasladım. Böylece stratejimin gerçekten çalışıp çalışmadığını anladım. Çözüm sadece kod değil, aynı zamanda disiplinli bir test süreciydi.
[[GÖRSEL2]]
Yolda çıkan hatalar
Bu süreçte çok fazla hata yaptım. En büyük hatam acele etmekti. Kağıt üzerindeki ilk test sonuçlarını görünce hemen zengin olacağımı düşündüm. Canlıya geçerken sistemi yeterince stres testine sokmadım. Piyasanın ani hareketlerinde kodumun nasıl tepki vereceğini hiç düşünmedim. Bir başka hata ise veri gecikmesi oldu. Kağıt üzerinde test ederken verinin anlık geldiğini varsaymıştım ama canlı piyasada veri gelişi bazen gecikiyor. Bu gecikme stratejimin yanlış zamanda işlem yapmasına neden oldu. Hatalarımı gidermek için her işlemi günlük olarak not ettim. Hangi işlem neden başarılı oldu veya neden başarısız oldu diye tek tek baktım. Kodumda yaptığım hataları ayıklamak için bol bol log dosyası tuttum. Loglar sayesinde nerede yanlış karar verdiğimi görebildim. Bir hata daha yaptım: sadece tek bir varlık üzerinde test yaptım. Bu da stratejimin sadece o varlığa özel olduğunu gösterdi. Farklı varlıklarda denediğimde stratejimin hiç de o kadar iyi olmadığını gördüm. Tüm bu hatalar bana testin sadece sayılardan ibaret olmadığını, sistemin her koşulda dayanıklı olması gerektiğini öğretti. Hatalarımı kabullenmek ve onlardan ders çıkarmak süreci daha sağlıklı hale getirdi.
Alternatifler
Alternatif olarak farklı kütüphaneler kullanabilirdim ama ben kendi basit yapımı tercih ettim. Başka insanlar daha karmaşık makine öğrenmesi modelleri kullanıyor. Ancak ben sistemin içinde ne olup bittiğini anlamak istedim. Karmaşık modeller bazen neden o kararı verdiğini açıklayamıyor. Benim yöntemim ise tamamen şeffaf. Alternatif yöntemlerden biri de tamamen veriye dayalı olmayan teknik analiz göstergeleri kullanmaktı. Fakat ben verinin kendisiyle uğraşmayı seviyorum. Bir diğer alternatif ise başkalarının hazır stratejilerini kullanmaktı. Bunu hiç denemedim çünkü kendi sistemimi kurmanın daha öğretici olduğunu düşündüm. Neden bu yöntemi seçtim? Çünkü bu yöntem bana kontrol sağlıyor. Sistemi tamamen ben kurdum ve nerede hata yapabileceğini biliyorum. Diğer yöntemler belki daha hızlı sonuç verebilirdi ama ben öğrenme sürecini daha önemli buldum. Karşılaştırma yaptığımda benim yöntemimin en büyük avantajı anlaşılabilirlik oldu. Herhangi bir kütüphaneye bağımlı kalmadan sadece saf mantıkla ilerlemek bana güven verdi. Alternatif yöntemleri denemeye devam ediyorum ama temel mantığımı değiştirmedim. Çünkü en iyi strateji, içinde ne olduğunu bildiğiniz stratejidir.
Bundan sonra ne yapmalı
Bundan sonra yapılacak ilk şey sistemi daha fazla veriyle beslemek. Tek bir varlık yerine daha geniş bir yelpazede testlerimi sürdüreceğim. Kodumu daha modüler hale getirip farklı piyasa koşullarında test etmek istiyorum. Sadece yükselen piyasada değil, düşen veya yatay seyreden piyasalarda da sistemin nasıl tepki vereceğini görmem gerekiyor. Bir sonraki adım olarak otomatik raporlama sistemi kurmayı planlıyorum. Böylece her işlemden sonra sistem bana kendi performansını raporlayacak. Bu sayede hatalarımı daha hızlı görebileceğim. Ayrıca küçük tutarlarla başladığım canlı testi yavaş yavaş artırırken risk yönetimi kurallarımı daha sert hale getireceğim. Her zaman en kötü senaryoyu düşünerek hareket etmek artık kuralım oldu. Bundan sonraki süreçte sadece kazanca değil, kaybetme durumundaki tepkime de odaklanacağım. Sistemi geliştirmek bir sonu olmayan bir yolculuk. Her gün yeni bir şey öğreniyorum ve kodumu biraz daha iyileştiriyorum. Siz de kendi stratejilerinizi kurarken acele etmeyin. Kağıt üzerindeki başarıya kanmayın ve her zaman gerçek piyasa koşullarını göz önünde bulundurun. Sabırlı olun ve her adımınızı verilerle destekleyin. Başarı, sistemin her koşulda ayakta kalabilmesidir.


Top comments (0)