Intraday Long Strateji Çalışmaları - 3
Algotrading yolunda yaptığım çalışmalarla ilgili 3. bülten. Henüz okumadıysanız, önceki 2 bülteni okumayı ihmal etmeyin.
Bir önceki hafta kodlama ile yoğun geçtiği için maalesef bültensiz kaldı. Konu tazeyken trading plan serisine tekrar ara verip algotrading kullanarak oluşturmaya çalıştığım intraday long stratejisi ile ilgili yeni gelişmeleri bu bültende paylaşıyorum. Bundan önceki 2 bültene aşağıdaki linklerden ulaşabilirsiniz;
Backtest sonrası Forward Test
Daha önce de açıkladığım gibi backtest mevcut strateji kurallarının geçmiş verilere uygulanarak sonuçların değerlendirmesiydi. Genellikle strateji kuralları öncelikle, geçmiş verilerle test edilir. Backtest sonuçlarının iyi çıkıyor olması stratejinin iyi çalışacağının garantisini vermez. Stratejiyi gerçek canlı verilerle de test etmek gerekir. Bu da stratejiyi market açıkken uygulamak anlamına gelir ve buna forward test de denir. Market kapandıktan sonra artık veriler geçmiş veri olacağı için, geene bu verilerle backtest yapıp forward test ile karşılaştırılır. Eğer forward testte backtest ile aynı sonuçlar alınmazsa geçmiş verilerle yapılmış backtestin güvenilirliği sorgulanır.
Örnekle açıklamak gerekirse, strateji market açıldığı zaman uygulanmaya başlanıp gün sonuna kadar açılıp kapanan pozisyonlar kaydedililir. Market kapandıktan sonra aynı gün için backtest yapılır, ve buradaki tradelerle forward testteki pozisyonlar karşılaştırılır ve sonuçların aynı olması beklenir.
Önceki bültenlerde yeni intraday long stratejisinin backtest sonuçlarını paylaşmıştım. Bir sonraki adım da forward testing idi. Forward testing sonuçları ile aynı zaman dilimindeki verilerin backtest sonuçlarını karşılaştırdığımda çeşitli uyuşmazlıklar ve eksikler tespit ettim. Bunlar kısaca;
canlı data akışındaki eksikler,
hisse senedi filtrelemedeki farklılıklar,
bir hisse senedinde yanlızca bir pozisyon açılma durumu ve
fiyattaki kaymanın (slippage) engellenememesi
idi. Şimdi bu sorunları biraz daha ayrıntılı ele alayım.
Canlı Data Akışı
Backtest yaparken hali hazırda mevcut geçmiş data ile işlem yapıldığı için data akışına önem verilmez. Ancak canlı markette işlem yaparken; bu datanın varlığı, ulaşılabilirliği ve sürekliliği önemlidir. Veriler çoğunlukla bir veri sağlayıcı kuruluştan gelir. Buradan verilerin sürekli bir şekilde geldiğinden emin olunmalıdır.
Benim veri sağladığım kuruluştan saniyelik veri akışı oluyor. Her gelen hisse senedinin fiyatı önceki kapanışın %20 veya daha fazlası kadar üstündeyse ve o günün toplam hacmi en az 100 000 hisse senedi ise, ilk filtrelerden geçmiş oluyor. Backtest yaparken bütün günün verisi kolaylıkla kontrol edilebileceği için bu 2 filtre ile ilgili herhangi bir sorun yaşanmıyordu. Canlı veri ile ilgili şu şekilde bir sorun yaşanabiliyordu:
XYZ hisse senedinin fiyatının önceki gün 100 dolardan kapandığını ve bu hisse senedinin veri sağlayıcı tarafından fiyat akışının devam ettirildiğini varsayalım. Fiyat en az 120 dolar olduğunda ve o günkü toplam hacim 100 000 hisse senedini geçtiğinde filtrelerden geçmiş oluyor. Bu hisse senedinin fiyatı 121 dolara çıkıp, kısa sürede 120 doların altına düştüğünü varsayalım. Veri akışında aksama olur, 119 dolardayken veri gelir, 121 dolardaykenki veri ulaşmaz ve bir sonraki veri tekrar 120 doların altındayken gelir ise, sistem %20 artışı algılanmaz ve bu hisse senedi göz ardı edilir. Oysa backtest yapılırken bu hisse senedi sonuçlara dahil edilecektir, zira fiyat gün içersinde bir önceki günün kapanışından %20 daha fazla artmıştı.
Bu sorun çok likit olmayan hisse senetlerinde yaşanabilen bir sorun. Strateji uzun vadede, çok hisse senedi ile karlı ise arada gözden kaçmış hisse senetlerinin sonuca çok bir etkisi olmayacaktır. Ancak bu gözden kaçma seviyesi büyük ise, veri sağlayıcıyu değiştirmek gerekebilir.
Backtestte olan ama forward testte olmayan hisse senetlerinin olduğu buna benzer başka durumlar da ortaya çıkabilir. O nedenle forward test yaparken, backtestte filtrelenmiş hisse senetlerinin hepsinin mevcut olduğu kontrol edilmelidir.
Hisse Senedi Filtrelemedeki Farklılıklar
Önceki günün datası ile backtest yaparken, forward testte çıkan bir çok hisse senedinin backtestte çıkan pozisyonlarda olmadığını farkettim. Backtest filtrelerinden biri o günün göreceli hacminin (relative volume) 3 ve daha büyük olmasıydı. Ancak bu tüm günün hacmini baz alıyordu. Canlı veri ile test yaparken, henüz tüm günün göreceli hacmi belli olmadığı için bu kontrolü forward testte yapmak mümkün değil. Göreceli hacmin 3’ü geçtikten sonra pozisyon açmasına izin verilebilir, ancak bu da backtest yapılan stratejinin kuralları dahilinde değil.
Bu durumu farkettikten sonra bu filtreyi kaldırıp tekrar aynı zaman dilimleri için aylık backtest yaptım. Trade sayısı artmış oldu ancak sonuçlar pozitif ve geri dönüşteki artan grafik sabit kaldığı için başka bir değişikliğe gitmedim. Yeni sonuçlar konuyu ve araştırmaları etkilemeyeceği için burada paylaşamaya gerek duymadım.
Burada öğrenilmesi ve dikkat edilmesi gereken, backtest kurallarını koyarken canlı data akışına uygululanabilir olmasıdır.
Bir Hisse Senedinde Tek Pozisyon Açılma Hatası
Backtest sonuçlarında aynı gün içerisinde aynı hisse senedinde birden fazla pozisyon açıldığı görülüyordu. Ancak forward testte bir hisse senedinde sadece bir pozisyon açılıyordu. Bu da gene backtest ve forward test karşılaştırması sonrası farkedilen uyumsuzluklardan biriydi. Kodlama hatası düzeltildikten sonra bu sorun ortadan kalktı. Sorun forward testte olduğu için, yapılan değişiklik backtest sonuçlarını etkilemedi.
Fiyattaki Kaymanın (Slippage) Engelenememesi
Backtestte fiyatta kaymayı devre dışı bırakmak için şu kuralı entegre etmiştim;
pozisyona giriş mumunun açılış fiyatının bir önceki mum yükseğinden daha düşük olması.
Yani, bir mumun açılış fiyatı bir önceki mumum en yüksek fiyatından yüksekse, giriş şartlarının hepsini sağlıyor olsa bile, pozisyon açılmıyordu.
Bu şekilde fiyattaki kayma backtestte engellenmiş olmuştu, ancak canlı test yaparken ne yazık ki bunu engellemek mümkün olmuyor. Bu nedenle backtestte bu kuralı kaldırdım.
Sonuç
Bu tespitler sonucunda, hem backtest hem de forward test kodunda değişiklikler yapmak gerekti. Backtest kodundaki değişiklikler haliyle backtest sonuçlarını etkiledi. Bu sonuçları, forward test ile karşılaştırdıktan sonra ilerideki bültenlerde paylaşacağım.
Bunlar sonucunda çıkarttığım ders, backtest sonuçlarının iyi çıkması iyi bir strateji bulunduğunun garantisi olmadığıdır. Hangi strateji olursa olsun, canlı verilere uygulandıktan sonra backtest ile aynı sonuçları vermelidir. Ancak bu sağlanabilirse backtest sonuçlarına benzer sonuçlar beklenebilir.
Backtest ve forward test ile uyum sağlandıktan sonra broker ile bağlantı kurulup giriş ve çıkış emirlerinin doğru çalıştığından emin olunmalıdır. Bunlar strateji çalışmalarındaki bir sonraki adımlar. Bu adımların sonuçlarını paylaşmaya devam edeceğim.