Model aramada brute force yaklaşımı (Bölüm III): Yeni ufuklar
İçindekiler
- Giriş
- Yeni fikirler
- Örneklem segmentasyonu ve örneklemlerin tahmin edilebilirliği
- Arama algoritmasında yapılan son değişiklikler
- Şablonların ve yardımcı Uzman Danışmanın optimizasyonu
- Global modellerin analizi
- Sonuç çıkarma
- Sonuç
- Referanslar
Giriş
Bir önceki makalede, basit brute force mekanizmasını kullanarak kârlı Uzman Danışmanlar oluşturmanın mümkün olduğunu göstermiştim, çünkü bu yaklaşım diğerlerinden daha kötü değildir. Bu konu aslında "Ticaret sistemlerinin geliştirilmesi ve analizi için optimum yaklaşım" başlıklı makaleme ve özellikle onun "Optimal aramanın arkasındaki matematik" bölümüne çok yakındır. Bu yazılımı oluştururken, esas olarak o makalede formüle edilen fikirleri kullandım. Genel olarak makale, bulunan varyantların kalitesini artırmak ve haftanın farklı günlerinde ve farklı zaman koridorlarında daha ayrıntılı bir piyasa araştırması yapmak amacıyla program algoritmalarının daha da modernleştirilmesini sağlamayı amaçlamaktadır.
Uzman Danışmanlarımdan bazıları bu yaklaşımın uygulanabilirliğini kanıtlamaktadır. Farklı döviz çiftlerinde farklı modeller mevcuttur. Ayrıca, tüm döviz çiftleri üzerinde çalışan dar zaman koridorları vardır. Yapmamız gereken şey derinlemesine bir analiz yapmaktır. Bu makalede ele alacağımız konu işte budur. Böylesine kapsamlı bir analiz ek bir yazılım olmadan gerçekleştirilemez. Ayrıca, yazılımımın türünün en iyisi olduğunu düşünmediğimi de belirtmek isterim.
Program, bir araştırma yazılımı olarak ortaya çıkmış ve çeşitli enstrümanların analizi için yardımcı bir araç seti olarak hizmet vermiştir. Ancak şimdi yetenekleri çok daha genişlemiştir. Dolayısıyla, bu yaklaşımdan en iyi şekilde yararlanmaya çalışabiliriz. Bunu yapmaya çalışalım. Dürüst olmak gerekirse, sinir ağları, yapay zeka ve gradyan artırma gibi yaklaşımların çok daha gelişmeye açık olduğunu düşünüyorum. Bununla birlikte, brute force yaklaşımının bu analiz yöntemleriyle rekabet edebileceği ortaya çıkmıştır. Unutmayın ki bu yaklaşım şimdilik çok basit bir matematiğe dayanmaktadır. Algoritmanın daha iyi performans gösterebileceğini düşünüyorum.
Yeni fikirler
Program prototip aşamasındaydı ve bu kadar basit bir brute force yönteminin neler yapabileceğini görmek için programdan maksimum verimi almak istedim. Temel sorun, güvenilir bir global model aramasının büyük fiyat aralıklarının analizini gerektirmesi ve geçmiş üzerindeki bir geçişin kapasitesinin çok küçük olmasıydı. Örneğin, 10 yıllık bir süre boyunca herhangi bir döviz çifti için M5 fiyatlarını analiz ederken, program iyi bir çekirdekte saatte yaklaşık 700-2000 varyant üretti (hafif ayarlarla bile).
Diyelim ki 30 çekirdekli bir sunucuya sahipsiniz, bu durumda bile günlerce beklemeniz gerekecektir. Tek çözüm, analiz için veri miktarını azaltmaktır. Bu, tüm dönemi eşit aralıklara bölerek ve bazılarını hesaplama yapmadan atlayarak yapılabilir. Bu aralıklar dakikalar, saatler, günler, aylar ve yıllardır. Ek olarak, bu koşullu alanlar belirli ticaret parametrelerini karakterize eder. Başka bir deyişle, ivmelenmenin yanı sıra, haftanın her gününü, saatini ve dakikasını modeller açısından ayrıntılı olarak inceleyebiliriz. Bu modelin neyle bağlantılı olduğu konusunda endişelenmemize gerek kalmayacaktır.
Genel olarak, tüm modelleri sınıflandırmak imkansızdır, çünkü sayıları sonsuzdur ve insan beyni hepsini anlayamaz ve tanımlayamaz (eğer çalışan bir formülünüz varsa, bu gerçekten gerekli değildir). Bu matematiktir. Sabit bir zaman dilimini ve sabit günleri keşfetmek veya tüm verileri tek seferde keşfetmek mümkündür. Bu şu durumla karşılaştırılabilir: tek değişkenli bir fonksiyonumuz var ve daha sonra bunun çok değişkenli bir fonksiyonun özel bir durumu olduğu ortaya çıkıyor, bunu bilmiyorduk.
Örneklem segmentasyonu ve örneklemlerin tahmin edilebilirliği
Model arama modları, farklı uzunluklardaki örneklemlerin analiz edilmesi nedeniyle üst yeteneklerinde çok farklılık gösterdiğinden, bu seçeneği analiz etmenin ilginç olacağını düşünüyorum. Hesaplamaların önemli ölçüde hızlandırılmasının yanı sıra, başlangıç örneklemine göre daha kullanışlı (daha küçük) bir örneklem elde edilebilir. Elde edilen bu örneklem basit formüller veya polinomlar kullanılarak analiz edilebilir. Mesele şu ki, piyasa dünya saatine sıkı sıkıya bağlıdır.
Ticaret faaliyeti büyük ölçüde yatırımcıların günlük faaliyetlerine göre şekillenir. Uzman Danışmanlar da bu kategoriye dahil edilebilir. Birçok Uzman Danışman öngörülebilir piyasa katılımcıları olarak kabul edilebilir, ancak hepsi değildir. Örneğin, birçok geliştirici zamana dayalı gece scalper’ları oluşturur. Fiyat hareketinin doğasının sadece geçmiş fiyatlar tarafından değil, aynı zamanda belirli günler, haftalar, aylar, hatta muhtemelen yıllar tarafından da belirlendiği ortaya çıkmaktadır. Bu değerlerin her biri nicelleştirilmiştir, yani belirli sabit değerlere sahiptir.
Elbette bu değerler bölünebilir. Örneğin, zaman penceresi saat ve dakika olarak değil, yeni bir günün başlangıcından bu yana geçen saniye olarak ölçülebilir. Her şey hangi miktarların ölçülmesinin daha kolay olduğuna bağlıdır. Genel olarak konuşmak gerekirse, tüm bu nicelikler sonsuza kadar bölümlere ayrılabilir. Benim programımda segmentasyon yalnızca günler ve haftalar dahilinde gerçekleşir. Yıllara göre segmentasyonun çok verimli olmadığını düşünüyorum. Aylara gelince, belki ilgili işlevselliği daha sonra ekleyeceğim. Aşağıdaki diyagram yukarıdaki fikirleri göstermektedir:
Orijinal örneklem segmentasyonu için iki keyfi seçenek gösterdim. Aşağıda, brute force süresiz olarak devam ederse ne olacağı gösterilmektedir. İlk durum, tanımlama için tüm olası matematiksel modelleri uyguladığımızda ne olduğunu, ikinci durum ise uygulanan tek brute force yönteminden (çok boyutlu Taylor polinomu) ne elde ettiğimizi göstermektedir. Her zaman en öngörülebilir ve en öngörülemez bir örneklem olacaktır. Ayrıca, her polinom türü için en uygun bölümlenmiş kısım mevcuttur. Bu tür segmentler sayısız olabilir, ancak onları dakika hassasiyetiyle tespit edebiliriz. Çubukları analiz ettiğimizden burada saniyeleri dikkate almıyorum.
Böylece, segmentasyon parametrelerinin her bir kombinasyonu için, tam geliştirme döngüsünün çıktısında elde edebileceğimiz her bir ticaret parametresi için bir fonksiyon oluşturabiliriz. Örneğin, beklenen getiri ve kâr faktörü:
- Ma = Ma(M,D,Ts,Te)
- PrF = PrF(M,D,Ts,Te)
- M - yılın ayı
- D - haftanın günü
- Ts - koridor başlangıç zamanı
- Te - koridor bitiş zamanı (0:00 üzerinden (yani ertesi güne) bir geçiş olabilir)
Fonksiyonlar ayrıktır. Dolayısıyla, argümanlar katı bir şekilde sabit değerler alabilir. Aylar ve haftanın günleri ile ilgili değişkenleri sabitleyerek, bu iki fonksiyonun nasıl görüneceğini kabaca hayal edebiliriz. Görselleştirebileceğimiz maksimum boyut sayısı üçtür, bu nedenle bilgilendirici bir grafik yalnızca iki serbest değişkenle çizilebilir. Ben "Ts" ve "Te"yi seçtim:
Geleceği tahmin etmeye çalışacağımız her formül veya algoritma, gelecekteki ticaret sisteminin tüm nicel özellikleri için bu tür benzersiz grafiklere sahip olacaktır. Maksimum kâr faktörünün olduğu yerde, mutlaka maksimum beklenen getiri olmayacağını göstermek için bunlardan sadece ikisini gösterdim. Çoğu durumda, beklenen getiri ile kâr faktörü arasında denge kurmanız gerekecektir, çünkü makas, komisyon ve swap vardır. Bu ekstremumların sayısı ve değerleri her formül için farklıdır. Çok boyutlu bir ekstremum aramasını manuel olarak gerçekleştiremeyiz, ancak programımızı kullanarak yapabiliriz.
Bir şeyden bahsetmek istiyorum. Yazılımımı kullanarak piyasayı araştırırken, birçok döviz çiftinin tahmin edilebilirlik değerlerini abarttığı ilginç bir bölüm fark ettim. Yaklaşık olarak 23:30 ile 0:30 arasında bir aralıktır. Bu kesinlikle günün değişimiyle ilgilidir. Ancak, MetaTrader 4'te mükemmel kâr faktörleri gösteren stratejilerin kârlılığı, MetaTrader 5'te test edildiğinde ortadan kayboldu. Bunun nedeni makastır. Makasın içerisine düşen modelleri her zaman iki kez kontrol edin. Bulunan modellerin çoğu makasın içerisinde olacaktır.
Arama algoritmasında yapılan son değişiklikler
Son değişikliklerin amacı, programın çalışmasını hızlandırmanın yanı sıra arama değişkenliğini ve verimliliğini en üst düzeye çıkarmaktı. Değişikliklerin listesi:
- Sabit bir zaman aralığında model arama özelliği eklendi
- Yalnızca belirli günlerde ticaret yapma özelliği eklendi
- Seçilen günlere bağlı olarak her yeni varyant için rastgele gün setleri oluşturma özelliği eklendi
- Dakika cinsinden olası minimum ve maksimum pencere süresini belirterek rastgele sunucu zaman pencereleri oluşturma özelliği eklendi
- Bu ayarlardan herhangi birini kombine edebilme özelliği eklendi
- İkinci optimizasyon sekmesi artık çok iş parçacıklı modda çalışabilmektedir
- Optimizasyon modu optimize edildi
Güncellenmiş pencere aşağıdaki gibi görünmektedir:
İkinci sekme değişmemiştir:
Aşağıda üçüncü sekme gösterilmektedir:
Arayüz hala çok hamdır ve ayarlar o kadar kalabalık ki program penceresine zar zor sığmaktadır. Bir sonraki makalede sunulacak olan bir sonraki program sürümünde arayüzü tamamen revize edeceğim. Ayrıca programımı kullanarak bir Uzman Danışman oluşturma sürecinin tamamını içeren bir video da kaydedeceğim. Ne kadar kolay ve hızlı olduğunu göreceksiniz. Sadece arayüz ayarlarını anlamanız ve biraz pratik yapmanız yeterli olacaktır.
Şablonların ve yardımcı Uzman Danışmanın optimizasyonu
Yeni görevi uygulamak için Uzman Danışman şablonlarını da değiştirmem gerekti. Robotlar, program tarafından rahatça okunabilen uygun formatta bir fiyat oluşturur. MetaTrader 5 için bir fiyat oluşturan Uzman Danışmanın kodu artık aşağıdaki gibidir:
string FileNameString; uint Handle0x; datetime Time0=0; double Open[]; double Close[]; double High[]; double Low[]; datetime Time[]; void WriteEnd() { FileWriteString(Handle0x,"EndBars"+"\r\n"); MqlDateTime T; TimeToStruct(Time[1],T); FileWriteString(Handle0x,IntegerToString(int(T.year))+"\r\n"); FileWriteString(Handle0x,IntegerToString(int(T.mon))+"\r\n"); FileWriteString(Handle0x,IntegerToString(int(T.day))); } void OpenAndWriteStart() { FileDelete(FileNameString); Handle0x=FileOpen(FileNameString,FILE_WRITE|FILE_TXT|FILE_COMMON|FILE_ANSI,'\t',CP_UTF8); FileSeek(Handle0x,0,SEEK_SET); FileWriteString(Handle0x,"DataXXX"+" "+Symbol()+" "+IntegerToString(Period())+"\r\n"); FileWriteString(Handle0x,DoubleToString(_Point,8)+"\r\n"); MqlDateTime T; TimeToStruct(Time[1],T); FileWriteString(Handle0x,IntegerToString(int(T.year))+"\r\n"); FileWriteString(Handle0x,IntegerToString(int(T.mon))+"\r\n"); FileWriteString(Handle0x,IntegerToString(int(T.day))+"\r\n"); } void WriteBar() { FileWriteString(Handle0x,"\r\n"); FileWriteString(Handle0x,DoubleToString(Close[1],8)+"\r\n"); FileWriteString(Handle0x,DoubleToString(Open[1],8)+"\r\n"); FileWriteString(Handle0x,DoubleToString(High[1],8)+"\r\n"); FileWriteString(Handle0x,DoubleToString(Low[1],8)+"\r\n"); FileWriteString(Handle0x,IntegerToString(int(Time[1]))+"\r\n"); MqlDateTime T; TimeToStruct(Time[1],T); FileWriteString(Handle0x,IntegerToString(int(T.hour))+"\r\n"); FileWriteString(Handle0x,IntegerToString(int(T.min))+"\r\n"); FileWriteString(Handle0x,IntegerToString(int(T.day_of_week))+"\r\n"); //FileClose(Handle0x); } void CloseFile() { FileClose(Handle0x); } bool bNewBar() { ArraySetAsSeries(Close,false); ArraySetAsSeries(Open,false); ArraySetAsSeries(High,false); ArraySetAsSeries(Low,false); CopyOpen(_Symbol,_Period,0,2,Open); CopyClose(_Symbol,_Period,0,2,Close); CopyHigh(_Symbol,_Period,0,2,High); CopyLow(_Symbol,_Period,0,2,Low); ArraySetAsSeries(Close,true); ArraySetAsSeries(Open,true); ArraySetAsSeries(High,true); ArraySetAsSeries(Low,true); if ( Time0 < Time[1] ) { if (Time0 != 0) { Time0=Time[1]; return true; } else { Time0=Time[1]; return false; } } else return false; } //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { ArrayResize(Close,2,0); ArrayResize(Open,2,0); ArrayResize(Time,2,0); ArrayResize(High,2,0); ArrayResize(Low,2,0); FileNameString="DataHistory"+" "+Symbol()+" "+IntegerToString(Period()); OpenAndWriteStart(); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { WriteEnd(); CloseFile(); } void OnTick() { ArraySetAsSeries(Time,false); CopyTime(_Symbol,_Period,0,2,Time); ArraySetAsSeries(Time,true); if ( bNewBar()) WriteBar(); }
Burada sadece birkaç basit fonksiyon vardır Bazı fonksiyonlar testin başında bir şeyler yazar, diğerleri sonunda fiyat hakkında bazı bilgiler ekler ve ana fonksiyon ise sadece göründüğünde çubuk hakkında bilgi yazar. Uzman Danışmanın girdi parametreleri yoktur. Geçmiş üzerinde çalıştırılması yeterlidir ve böylece program tarafından okunabilecek uygun formatta bir fiyat dosyası oluşturacaktır. Bu pek de iyi bir çözüm değildir. Belki gelecekte terminalden doğrudan fiyat okumayı uygulayabilirim. Ancak yukarıdaki çözüm şimdilik oldukça kullanışlıdır. En azından benim için uygundur.
datetime formatını haftanın günlerine, saatlere ve dakikalara dönüştüren zaman fonksiyonlarını kullanmak yerine, onları ek çubuk bilgisi olarak fiyata yazdım. ENUM_DAY_OF_WEEK hariç hepsi tamsayı değerlerdir. Tek yapmam gereken, C# kodu içerisinde böyle bir numaralı liste uygulamak ve şablonlarımda verilerin aynı biçimde geri döndürüleceğini sağlamaktı. Zaman fonksiyonlarından kaçınmak, C# kodu açısından gereksiz hesaplamalardan da kaçınmanıza olanak tanır. Ayrıca zaman tutarsızlıklarını da önler. Bu tür şeyler tehlikelidir, bu nedenle bunlardan kaçınmanız daha iyidir.
Ortaya çıkan fiyat dosyası herhangi bir metin düzenleyicide açılabilir. Aşağıdaki basit ve net yapıyı göreceksiniz:
Şablonun değişkenlerin belirtildiği üst bilgisi, öncesinde oluşturma sırasında otomatik doldurma için alanlar içeriyordu. Artık işlem zamanı ve işlem günleri değişkenleri de listeye eklenmiştir.
Girdi ayarları şimdi şu şekilde görünmektedir:
double C1[] = { %%%CVALUES%%% };//Brutted Values int CNum=%%%CNUMVALUE%%%;//Bars To Equation int DeepBruteX=%%%DEEPVALUE%%%;//Max Pow Of Polynomial int DatetimeStart=%%%DATETIMESTART%%%;//Help Datetime input bool bInvert=%%%INVERT%%%;//Invert Trade(or sign of values as the same) input int DaysToFuture=%%%DAYSFUTURE%%%;//Days To Future int DaysToTrade[]={ %%%DAYS%%% };//Days To Trade input double ValueOpenE=%%%OPTVALUE%%%;//Open Signal input bool bUseTimeCorridorE=%%%TIMECORRIDORVALUE%%%;//Use Time Corridor input int TradeHour=%%%HOURSTARTVALUE%%%;//Start Trading Hour input int TradeMinute=%%%MINUTESTARTVALUE%%%;//Start Trading Minute input int TradeHourEnd=%%%HOURENDVALUE%%%;//End Trading Hour input int TradeMinuteEnd=%%%MINUTEENDVALUE%%%;//End Trading Minute
Buradaki tüm değerler, robot oluşturma anında program tarafından doldurulur, böylece robot hemen varsayılan ayarlarla çalışabilir ve MetaEditor'ı açmaya gerek kalmadan terminal başlangıç anında derlenebilir. Tüm ayarlar ve diziler Uzman Danışmana gömülüdür. Bunu uygun buluyorum. Çok sayıda Uzman Danışmanınız ve farklı ayar dosyalarınız olduğunu hayal edin. MetaTrader 4 için brute force yazılım prototipi, bazen ayarları karıştırdığımı gösterdi. Bu, metin dosyalarına kıyasla olası işlevselliği azaltabilir, ancak bu yöntem daha güvenilirdir.
Ana fonksiyonda değiştirilmiştir:
bool bDay()//Day check { MqlDateTime T; TimeToStruct(Time[0],T); for ( int i=0; i<ArraySize(DaysToTrade); i++ ) { if ( T.day_of_week == DaysToTrade[i] ) return true; } return false; } void Trade()//Trade Function { double Value; Value=PolinomTrade(); MqlTick LastTick; SymbolInfoTick(Symbol(),LastTick); MqlDateTime tm; TimeToStruct(LastTick.time,tm); int MinuteEquivalent=tm.hour*60+tm.min; int BorderMinuteStartTrade=HourCorrect(TradeHour)*60+MinuteCorrect(TradeMinute); int BorderMinuteEndTrade=HourCorrect(TradeHourEnd)*60+MinuteCorrect(TradeMinuteEnd); if ( Value > ValueCloseE) { if ( !bInvert ) CloseBuyF(); else CloseSellF(); } if ( Value < -ValueCloseE) { if ( !bInvert ) CloseSellF(); else CloseBuyF(); } if ( !bUseTimeCorridorE ) { if ( double(TimeCurrent()-DatetimeStart)/86400.0 <= DaysToFuture && Value > ValueOpenE && Value <= ValueOpenEMax ) { if ( !bInvert ) SellF(); else BuyF(); } if ( double(TimeCurrent()-DatetimeStart)/86400.0 <= DaysToFuture && Value < -ValueOpenE && Value >= -ValueOpenEMax ) { if ( !bInvert ) BuyF(); else SellF(); } } else { if ( BorderMinuteStartTrade > BorderMinuteEndTrade && bDay() ) { if ( !(MinuteEquivalent>=BorderMinuteEndTrade && MinuteEquivalent<= BorderMinuteStartTrade) ) { if ( double(TimeCurrent()-DatetimeStart)/86400.0 <= DaysToFuture && Value > ValueOpenE && Value <= ValueOpenEMax ) { if ( !bInvert ) SellF(); else BuyF(); } if ( double(TimeCurrent()-DatetimeStart)/86400.0 <= DaysToFuture && Value < -ValueOpenE && Value >= -ValueOpenEMax ) { if ( !bInvert ) BuyF(); else SellF(); } } } if ( BorderMinuteStartTrade <= BorderMinuteEndTrade && bDay() ) { if ( MinuteEquivalent>=BorderMinuteStartTrade && MinuteEquivalent<= BorderMinuteEndTrade ) { if ( double(TimeCurrent()-DatetimeStart)/86400.0 <= DaysToFuture && Value > ValueOpenE && Value <= ValueOpenEMax ) { if ( !bInvert ) SellF(); else BuyF(); } if ( double(TimeCurrent()-DatetimeStart)/86400.0 <= DaysToFuture && Value < -ValueOpenE && Value >= -ValueOpenEMax ) { if ( !bInvert ) BuyF(); else SellF(); } } } } if ( bPrintValue ) Print("Value="+DoubleToString(Value)); }
Buraya sadece haftanın günlerini ve gün içerisindeki zaman aralığını kontrol etme mantığını ekledik, geri kalanı ise değişmeden kaldı. Bu arada, zaman aralığının 0-24 saat arasında olması gerekmez. Bir günde başlayıp başka bir günde bitebilir. Dolayısıyla, swap ekleme noktasını da içerebilir. Orijinal fikre göre, pozisyonlar belirli koridorlara yerleştirilebilir ve herhangi bir zamanda kapatılabilir. Belki de daha iyi bir çözüm, zamana göre zorla pozisyon kapatmayı ayrı bir operasyon olarak eklemek olacaktır. Şu ana kadar bana öyle geliyor ki mevcut yaklaşım daha istikrarlı robotlar üretmelidir, çünkü zaman koridorunun sınırlarını belirsiz hale getiriyoruz. Bu, bulunan koridorun ve formülünün performansının aniden durmadığını ancak kademeli olarak azaldığını teyit ederek rastgele bir sonuç elde etme olasılığını azaltmak için yapılır.
Global modellerin analizi
Burada sunulan tüm sonuçlar, bir önceki makalede olduğu gibi 2010.01.01-2020.01.01 aralığındaki eğitime dayalı olarak elde edilmiştir. Bu, sonuçları kontrol etmek için mevcut yılı ileri bir dönem olarak bırakmak amacıyla kasıtlı olarak yapılmıştır. İleri dönem 2020.01-2020.12.01'dir.
Sonuçların kalitesi önemli ölçüde artmıştır. İşlem sayısı azalmış olsa da, ileri dönem sonuçları daha iyi hale gelmiştir. Son makalede varsaydığım gibi, ilk testin kalitesindeki artış, ileri dönemdeki model ömründe artışa yol açmaktadır. Kanıt aşağıda sunulacaktır.
EURCHF H1 döviz çifti ile başlayalım. Önceki analiz bu sembolün iyi tahmin edilebilir olduğunu gösterdi, bu yüzden onunla başlamaya karar verdim. Optimizasyon sonuçlarına göre 3 Uzman Danışman oluşturdum. Ayrıca, bulunan modellerin performansının ne kadar arttığını göstermek için MetaTrader 4'ten birkaç test sunacağım. İlk varyanta göz atalım:
Test lotu 0.1 olarak ayarlanmıştır. Elde edilen beklenen getiriyi önceki program sürümüyle karşılaştırırsak, önceki 8 ABD dolarından şimdi 54 ABD dolarına yükseldiğini görüyoruz. Kâr faktörü de önemli ölçüde, en az 0.5 (belki daha da fazla) artmıştır. Son makalede aynı parametre 1.14 civarındaydı. Bu, elde etmeyi başardığım en yüksek kâr faktörüydü. Örneklemin haftanın günlerine ve çalışma süresine göre yapılandırılmasının sonuçları nasıl etkilediğini görebilirsiniz.
Ancak, bu mümkün olan en iyi sonuç değildir. Görevin özellikleri nedeniyle testler çok sınırlı bir süre için gerçekleştirilmiştir. Zaman çerçevesi çok dardı. Toplamda, tüm testler yaklaşık 2-3 gün sürdü. Testler 2 çekirdek üzerinde gerçekleştirilmiş ve her bir varyant yaklaşık 5-6 saat sürmüştür.
Ayrıca, test süreci sırasında, program algoritmasında sıklıkla yanlış sonuçlar üreten bazı hatalar buldum. Onları çoktan düzelttim, ancak bu, bulunan model sayısını azalttı. Yine de, bu süre kabul edilebilir varyantlar bulmak için yeterliydi. Şimdi, MetaTrader 5'te test edelim:
Bu testte daha az işlem vardı, çünkü daha yüksek kârlılık elde etmeye çalışırken istikrarlı bir test elde etmek için test makasını sınırlandırdım. Ancak görüldüğü üzere pratikte bu gerekli değildir. Nedenini makalenin sonunda açıklayacağım. Çok az sayıda işlem olmasına rağmen, bu veriler çok uzun bir örnekleme dayandığından güvenilir olarak kabul edilebilir (ilk sekmede formül katsayılarını brute force’la zorlarken elde edilmiştir). Aslında, ilk sekmede, yüklenen segmentteki tüm çubukları hesaplıyoruz, dolayısıyla bu, optimizasyon için ideal bir temeldir. Büyük bir örneklemin sonuçlarının bir kısmını daha küçük bir örnekleme aldığımızda, ilk örneklemde (emirler) ne kadar çok veri bulunursa, daha küçük model de o kadar güçlü olur.
İşte ileri dönem testi:
1 yılda sadece 2 işlem vardır, ancak sonuç pozitiftir.
İşte aynı aralık için başka bir sonuç:
Makas gereksinimleri olmadan, bu formül MetaTrader 5'te zarar oluşturur. Ancak, elde edilen beklenen getiriye dayanarak makası sınırlarsak, grafik iyi görünmese de iyi sinyaller olacaktır:
Grafik gerçekten kötü, peki gelecekte ondan nasıl faydalanabiliriz? Grafik, diğer tüm örneklemleri güçlendiren büyük bir temel örnekleme dayanmaktadır, bu nedenle böyle bir grafikte kötü bir şey yoktur. Bir miktar kâr göstermektedir. Geleceği kontrol edelim:
Gördüğünüz gibi, çok fazla işlem olmamasına rağmen sonuç çok iyidir. Aslında, test sonuçları son yıllarda daha iyidir, çünkü brokerlar yeni teknolojileri kullanarak makasları sürekli olarak düşürmektedir. Şimdiden öngörüler ve olası performanslarına ilişkin sonuç oldukça iyidir. Ancak, nihai sonuçlara varmak için yeterli veri bulunmamaktadır. Bu yüzden, farklı döviz çiftleri üzerinde birkaç test daha yaptım - daha sonra gösterilecekler. Şimdi, üçüncü robotu aynı döviz çiftinde görelim.
MetaTrader 4'ten daha fazla test olmayacaktır. Karşılaştırma için iki tam varyantın yeterli olacağını düşünüyorum. İşte üçüncü varyant:
Grafik o kadar da kötü değildir. Şimdi, geleceği kontrol edelim:
Aynı görüntüye sahiptir. Tüm ileri dönemler pozitif sonuçlar göstermiştir. Sonuçların benzer olduğu söylenebilir çünkü üç robot da aynı döviz çiftinin aynı veri aralığı üzerinde eğitilmiştir ve bu nedenle aynı modeli tanımlamaktadırlar.
Ya da döviz çifti o kadar iyidir ki robotlar pozitif sonuç göstermektedir. Öyle olsa bile, bundan faydalanabiliriz. Ancak sebepler daha geneldir. Sebebin sadece döviz çiftinde veya aralıkta olmadığını kanıtlamak için, farklı bir zaman diliminde başka bir döviz çiftini kontrol edelim.
EURUSD H4'ün test edilmesi
Burada MetaTrader 4'ten testler sunmuyorum, ancak bu döviz çifti için grafikler önceki testler kadar yumuşak ve güzel görünmektedir. Bu zaman diliminde iki farklı robot buldum. Birincisi:
Grafik çirkindir, ancak önceki varsayımlarımıza göre, bu bizi üzmemelidir çünkü bu çok büyük bir örneklemin sadece bir parçasıdır. Geleceği kontrol edelim:
Yine, bu model tüm yıl boyunca çalışmaktadır. En büyük olan ilk emri dikkate almasak bile, geri kalan kısım da pozitiftir.
Şimdi ikinci Uzman Danışmanı kontrol edelim:
Bu en yumuşak grafiktir. Gelecek 1 yıl:
Her şey beklendiği gibi çalışmaktadır. Başlangıçtaki büyük eğime rağmen grafik düz bir çizgiyi bile andırmaktadır. İki farklı döviz çifti üzerinde beş Uzman Danışmanı test ettik ve tüm ileri testler pozitif sonuçlandı. Bu iyi bir istatistiktir. Ancak, daha fazla veriye ihtiyacımız vardır. Bu yüzden, tamamen farklı bir döviz çiftini ve farklı bir zaman dilimini kontrol etmeye karar verdim.
EURJPY M5'in test edilmesi
Eğitim aralığı garip görünüyor, 2015'te belirgin bir tersine dönüş vardır, ancak genel sonuç iyi görünmektedir. İşte ileri dönem testi:
Sonuç çıkarmak zordur, ancak bunun ilk negatif ileri test olduğu açıktır. Bununla birlikte, bu sonucun tüm algoritmalarımızın istikrarına ilişkin varsayımı çürüttüğünü düşünmüyorum. Bunun nedeni, geriye dönük testte 2015 yılında net bir tersine dönüş olmasıdır. Sonuçları piyasa vizyonuma uydurmaya çalışmıyorum, ancak bu tersine dönüşün nedenini görüyorum. Aksine, 2015 yılında gerçekleşen bu tersine dönüşün devamıyla ilgileniyoruz.
Harici sonuçların bu tür etkilerinden kaçınmak için model arama algoritmasında bazı değişiklikler yapılması gerekmektedir. Bu algoritma değişikliği bir sonraki sürümde uygulanacaktır.
Sonuç çıkarma
Yukarıdaki testlerin, MetaTrader 4 ve MetaTrader 5 terminallerinde çalışan Uzman Danışmanların aranması ve test edilmesiyle ilgili birkaç önemli sonuca varmak için yeterli olduğuna inanıyorum. Bu iki terminaldeki sınayıcılar biraz farklı çalışmaktadır. MetaTrader 4'teki fiyatlar, makas verileri olmadan geçmişi depolamaktadır, böylece kullanıcının makası neredeyse "0"a eşit olan "1" olarak ayarlamasına olanak tanır. Çoğu Uzman Danışman için makas hiç önemli değilken, çok belirgin olmayan modelleri tespit edebilir ve geliştirebiliriz. MetaTrader 5'te bu mümkün değildir. Ancak MetaTrader 5 fiyatları, sistemin gerçek kârlılığını değerlendirmeye izin veren makas bilgilerini içerir.
Deneyimlerime göre, orijinal olarak MetaTrader 4 için yazılmış bir sistem MetaTrader 5 için uygun şekilde dönüştürülmediyse, böyle bir sistemin kâr gösterme şansı çok azdır, çünkü bulabileceğimiz modellerin çoğu makas içerisinde yer alır, bu yüzden işe yaramazlar. Bazı durumlarda tüm sinyaller arasında minimum makasa sahip sinyalleri bulmak mümkün olabilir. Ancak bu her zaman mümkün değildir.
Çoğu zaman, gerekli makası azaltarak sinyalleri kötüleştiririz. Bu durumda, kabul edilebilir testler elde etmek adına MetaTrader 5 testleri için makası manuel olarak seçtim, ancak bu çok uzun zaman almaktadır. Bu, program değiştirilerek otomatik olarak yapılabilir. Aşağıdaki görüntü, son aşamaya kadar mevcut model arama sürecini ve makas seçme sürecinin olası bir otomasyonunu göstermektedir:
Diyagram, en başından sonuna kadar tüm yeni Uzman Danışman geliştirme döngüsünü göstermektedir. Bu döngünün mevcut uygulanmış durumu siyah renkle gösterilmiştir. Gri, olası değişiklikler içindir. Olası iyileştirmeler 6 kategoriye ayrılmıştır:
- Çubuk verilerini işlemek için en basit matematiksel fonksiyonların kullanılması
- Global modelleri uygulayan Uzman Danışmanlar için kâr faktörünü artıran lot varyasyon mekanizmalarının eklenmesi
- Son derece kısa dönemlerde çalışmak için martingale ve ters martingale mekanizmalarının eklenmesi
- İyi Uzman Danışmanları mümkün olan en yüksek işlem sıklığına sahip tek bir robotta birleştirmek için bir mekanizmanın eklenmesi
- Fiyata makas eklenmesi ve manuel makas seçiminin önlenmesi (tüm geliştirme döngüsünün tam otomasyonu)
- Tespit edilen optimizasyon hatalarının düzeltilmesi
1, 5 ve 6. maddelerin altını çizmek istiyorum. Brute force formüllerinin değişkenliği, bir brute force optimizasyon döngüsünden daha farklı Uzman Danışman varyantları oluşturmamızı ve sonuçların ortalama kalitesini artırmamızı sağlayacaktır. Önceki makalelere yapılan yorumlarda kullanıcılar, periyodik piyasa süreçlerini tanımlamak için Fourier serilerinin kullanılmasını önermiştir. Bu görevi daha sonra yapılacak değişikliklere bırakmak istedim. Ancak yöntem o kadar da zor değildir. Herhangi bir fonksiyonu bir seriye dönüştürmemize gerek yoktur, ancak kullandığım Taylor serisine benzer şekilde sadece terimlerin katsayılarını bulmamız gerekmektedir. Ayrıca, bu yöntemin değişkenliği Taylor serisine göre çok daha yüksek olacaktır. Benim algoritmam sadece birinci dereceyi kullandı, çünkü dereceler arttıkça, hesaplamanın karmaşıklığındaki orantısız artış nedeniyle kalite düşmektedir. Makas da çok önemlidir. Otomatik olarak yapabilecekken sinyalleri neden manuel olarak filtreleyesiniz ki? Ayrıca çubuk zamanı uyumsuzlukları da vardı, ancak bu hatalar düzeltildi. Bu uyumsuzluklar, şablonların işlevselliği ile yazılımın işlevselliği arasındaki farktan kaynaklanmaktaydı.
Bu yazılımın nihai amacı, her iki platform için de Uzman Danışmanların geliştirilmesi, test edilmesi ve optimizasyonu dahil olmak üzere tüm süreci otomatikleştirmektir. Hala manuel olarak gerçekleştirdiğim eylemler de otomatikleştirilebilir. Dahası, makine uygun varyantları çok daha hızlı bulabilir. Dürüst olmak gerekirse, bu benim tembelliğimden kaynaklanıyor, makas büyüklüğü gibi temel şeyleri bile manuel olarak ayarlamak istemiyorum. Bu süreç, ticaret sistemi geliştirme döngüsünü önemli ölçüde artırmaktadır. Önemli olan, zaman birimi başına elde edilen sonuçların miktarı ve kalitesidir, çünkü bu daha fazla kârı doğrudan etkiler. Ayrıca, sistemi yapılandırmak için çok fazla zaman harcarsanız, anlamsız hale gelebilir. Bulunan Uzman Danışmanların çoğu çok sınırlı bir süre için çalışacaktır, bu nedenle her şey çok hızlı yapılmalıdır. Ya da her ay bir optimizasyon kullanabilirsiniz, ancak bu kötü bir çözümdür.
Fikrin daha da geliştirilmesinde potansiyel görürsem, onu geliştirmeye devam edeceğim. Fikir başarılı olursa, gradyan artırma için benzer bir program oluşturacağım veya veri analizinin üçüncü aşaması şeklinde yeni bir mod ekleyeceğim. Çünkü yöntemin kendisi gradyan artırma için bir öngörücü arama motoru olarak çok iyidir. Dolayısıyla, yenilerini icat etmek ve test etmek yerine bu yöntemle bulunan öngörücüleri kullanabiliriz. Ancak bu çok daha ciddi ve derin bir değişiklik gerektirir. O yüzden şu anda bunu yapmayacağım. Ancak yukarıda bahsettiğim birkaç değişiklik halihazırda uygulandı ve şimdi onları test ediyorum ve bir sonraki makale için veri topluyorum. Yani, "TO BE CONTINUED".
Daha önceki tüm makaleler esas olarak MetaTrader 4'e odaklanmıştı, ancak pratiğin gösterdiği gibi, otomasyon MetaTrader 5'e geçmeye izin vermektedir. Bu yaklaşım bir sonraki makalede tam olarak uygulanacaktır.
MetaTrader 5, gerçek tik geçmişi ve makas verileri sağlayan çok daha gelişmiş bir platformdur, bu da herhangi bir ticaret sisteminin gerçek kârlılığını değerlendirmeyi mümkün kılar, bu nedenle bu platforma odaklanmak daha iyidir.
Test süreci sırasında, hem oluşturulan Uzman Danışmanların kalitesini hem de MetaTrader 5'te gerçek tik verileri üzerinde test edildikten sonra seçime dayanabilen Uzman Danışmanların yüzdesini düşüren çok önemli bir faktör buldum. Bu faktör yalnızca makine öğrenimi tabanlı sistemler için değil, aynı zamanda orijinal olarak MetaTrader 4'te oluşturulan diğer Uzman Danışmanlar için de çok önemlidir. Makas ve onun eğitim için nihai veri örneklemini nasıl etkilediği ile bağlantılıdır. Birçok kullanıcı makası görmezden gelir veya yalnızca ticaret yaparken dikkate alır. Ancak makine öğrenimi süreci üzerinde çok olumsuz bir etkiye sahip olan görünmez ama çok önemli bir bileşen içerir. Bunun detaylarını bir sonraki makalede açıklayacağım.
Sonuç
Bu makaleden çıkan en önemli sonuç, programınızın gerçek performans şansını artırmak istiyorsanız, ticaret robotlarınızın MQL5'te uygulanması gerektiğidir. MQL5 programları gerçeğe çok yakın koşullarda test edilebilir. Derinlemesine analiz, MetaTrader 5'te testler olmadan gerçekten güvenilir sonuçlar alamayacağınızı göstermiştir.
Makalenin ortaya koyduğu gibi, doğrusal polinomlar ve yüksek dereceli polinomlar gibi çok basit matematiksel formüller kullanırsak, sınırlı hesaplama gücü bile bir sonuç üretebilir. Basit matematiksel fonksiyonların uygulanması için zemin oluşturulmuştur. En basit fonksiyonun doğrusal ve kuvvet kombinasyonunun ticaret için mükemmel bir sinyal sağlayabileceği sonuçlardan anlaşılmaktadır.
Sonuçlar, herhangi bir mantıksal koşul kümesinin bir fonksiyon biçiminde tek bir nicel ölçüme indirgenebileceğini göstermektedir. Aslında formül, ticaret sinyali olarak kullanılabilecek simetrik pozitif ve negatif değerler üreten bir gösterge oluşturur. Gösterge formülü her zaman farklıdır ve bu da yöntemin değişkenliğini sağlar. Bence birçok yatırımcı tam olarak ne zaman alacağını ve ne zaman satacağını söyleyebilecek bir gösterge hayal ediyor. Bu yöntem, piyasanın izin verdiği ölçüde bu olasılığı gerçekleştirir. Bir sonraki makale çok daha iyi sonuçlar sağlayacaktır. Bu makale serisi boyunca varılan tüm sonuçları bir araya getirmeye çalışacağım. Ayrıca, hem ticaret sistemlerinin manuel olarak oluşturulması hem de makine öğrenimi süreçleri için yararlı olacak bazı ayrıntılar da vereceğim.
Referanslar
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/8661
- Ücretsiz ticaret uygulamaları
- 24 saat boyunca ücretsiz Forex VPS
- Ticaret kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Web sitesi politikasını ve kullanım şartlarını kabul edersiniz