Veri Bilimi ve Makine Öğrenimi (Bölüm 04): Borsa Çöküşünü Öngörme

Omega J Msigwa | 28 Şubat, 2023

Giriş

Bu makale serisinin 2. bölümünde, Titanik verilerine dayanan basit bir lojistik model oluşturduk. Bugün ise borsa çöküşünü öngörmemize yardımcı olabilecek bir lojistik model oluşturacağız.

Bu makalede, lojistik modelimizin kullanışlı bir uygulamasını gerçekleştireceğiz - borsa çöküşünün bir öngörücü modelini oluşturacağız. Modelimizi test etmek için, mevcut borsa çöküşündeki test verilerini kullanacağız.

Borsa Çöküşünü Öngörme makalesi görüntüsü


Borsa Çöküşü


Borsa çöküşü, piyasanın toplam değerinin keskin ve hızlı bir şekilde azalarak fiyatların genellikle birkaç gün içerisinde %10'dan daha fazla düşmesidir. Büyük borsa çöküşlerinin ünlü örnekleri, 1987'deki kara pazartesi ve 2008'deki emlak balonudur. Bir çöküş genellikle bir fiyat balonunun patlamasından kaynaklanır. Borsa katılımcılarının çoğunun aynı anda varlıklarını satmaya çalıştığı toplu ve büyük bir satışın sonucu olarak gerçekleşir.

Konularımıza detaylı olarak girmeden önce önemli bir uyarıda bulunmak istiyorum:

Bu makale herhangi bir ticaret tavsiyesi içermemektedir. Benim Warren Buffett veya Charlie Munger olmadığımı biliyorsunuz, ayrıca profesyonel bir borsa yatırımcısı da değilim. Ben sadece bilimsel modelleri ticaretle ilişkilendirmenin bir yolunu arayan bir veri bilimciyim. Lütfen bu makaledeki görüşlere çok ciddi bir şekilde yaklaşmayın, çünkü bu görüşlerin çoğu internetteki çeşitli kaynaklardan derlenmiştir (her ne kadar güvenilir kaynaklar kullanmaya çalışmış olsam da - kaynakların linkleri makalenin sonundaki referans bölümüne eklenmiştir). Ticaret kararları vermek için bu makalede tartışılan yaklaşımlardan herhangi birini kullanmaya karar vermeden önce, kendi araştırmanızı en iyi şekilde yaptığınızdan emin olmalısınız.

Şimdi devam edebiliriz.

Öncelikle, hisse senedi fiyatlarını etkileyen faktörleri görelim. Bu faktörleri anladığımızda, nereden başlayacağımız netleşecektir. Çünkü bu faktörler, lojistik modelimizin verileri (bağımsız değişkenler) olarak kullanılabilir.


Hisse Senedi Fiyatlarını Etkileyen Faktörler


Borsayı etkileyen pek çok faktör vardır. Bunlardan sadece birkaçı aşağıda sıralanmaktadır. Piyasaların nasıl davrandığına dair hiçbir zaman tam net bir gösterge olmadığını unutmayın. Ben aşağıdaki faktörleri kullanacağım:

  1. Arz ve Talep
  2. Şirketle İlgili Faktörler
  3. Faiz Oranı
  4. Güncel Olaylar
  5. Enflasyon

1: Arz ve Talep


Borsayı etkileyen çok sayıda faktör vardır, ancak diğer her şeyi çıkarır ve en temel faktöre bakarsanız, çok basittir, arz ve talep. Arz ve talep arasındaki dengesizlik, hisse senedinin fiyatını yükseltecek ve düşürecektir.

Elma arzı aniden tükenirse, giderek daha fazla insan elma almak için sıraya girecektir ve dolayısıyla elma fiyatları fırlayacaktır.

Benzer şekilde, bir şirket iyi gidiyorsa ve herkes o şirketten hisse senedi almak istiyorsa, hisse senedi kıtlığı yaşanacak ve şirketin hisse senedi fiyatı yükselecektir. Bunun tersi şekilde de eğer çok fazla hisse senedi mevcutsa ve kimse onları almak istemiyorsa, şirketin hisse senedi fiyatı düşecektir.

Modelimizde kullanmak amacıyla tüm arz ve talep verilerini elde etmenin imkansız olduğunu söyleyebilirim. Bu nedenle, bu faktörü veri kümemize dahil edemeyeceğiz. Ama eminim ki bu verileri doğru bir şekilde elde edebilen herkes kutsal kâseyi inşa etmeye bir adım daha yaklaşacaktır.


2: Şirketle İlgili Faktörler


Şirket içerisinde olup biten her şey hisse senedi fiyatını doğrudan etkileyecektir: eğer şirket başarılı ürünler çıkarıyorsa, geliri artıyorsa, borcu azalıyorsa ve daha fazla yatırımcıyı çekiyorsa, şirketin fiyatı artacaktır çünkü herkes gittikçe büyüyen böyle bir şirketin hissesini almak isteyecektir.

Ancak şirket ürünlerinde başarısızlıklar yaşıyorsa ve borcu artıyorsa, hissedarların çoğu şirketin hissesini satmak isteyecek ve dolayısıyla hisse senedi fiyatı düşecektir.

Bu noktayı netleştirmek için iyi bir örnek Netflix ve Apple'dır.

Netflix'in 2022 yılının ilk 3 ayında hizmet aboneliklerine yönelik uyguladığı fiyat politikası nedeniyle 200.000'den fazla hizmet abonesini kaybetmesi ve şirket içerisinde meydana gelen diğer olumsuz durumlar, Netflix'in hisse senedi fiyatının düşmesine neden oldu.

Öte yandan Apple, başarılı ürün çıkışları, iyi liderlik ve şirket içerisindeki diğer olumlu durumlar nedeniyle çok uzun süredir başarılı bir şirket olmuştur ve bu da son yıllarda hisse senedi fiyatının yükselmesine yol açmıştır.

Şirketin durumunu belirlemek için fiyat/kazanç oranını kullanacağız.

Fiyat/Kazanç Oranı

Bir şirketin değerlemesinde kullanılan fiyat/kazanç (F/K) oranı, hisse senedi fiyatının hisse başına kazanca (HBK) oranıdır. Bu oran sayesinde şirketin genel sağlığı hakkında bilgi sahibi olabiliriz. Apple ve Netflix’in F/K oranı grafikleri aşağıda görüntülenmektedir:

Apple:

Apple’ın F/K oranı grafiği

Veri kaynağı: macrotrends.net


Netflix:

Netflix’in F/K oranı grafiği

Veri kaynağı: macrotrends.net

Yukarıdaki görüntülerde F/K oranı bir yıl içerisinde üç ayda bir hesaplanıyor olarak görülmektedir. Sanırım ücretsiz veri kaynaklarının sunabileceği veri miktarı bu kadar. Ücretli kaynaklarda daha fazlası olduğunu düşünüyorum. Modelimizdeki hesaplamalarımızın etkili bir şekilde çalışması için veri kümemizin tüm sütunlarında aynı sayıda satıra sahip olmamız gerektiğinden, verilerimizde bazı boşluklar ortaya çıkacaktır. İşte Apple için veriler:

Apple'ın F/K oranındaki veri boşlukları

Veriler yılın her çeyreğinde hesaplandığından, çeyreğin geri kalanındaki aylar için önceden hesaplanmış verileri aynen kullanacağız, dolayısıyla bu durumda verileri basitçe kopyalayacağız:

Apple için tekrarlı F/K oranı verileri

Aynı işlem Netflix için de gerçekleştirilecektir.


3: Faiz Oranı


Federal Rezerv Bankasının eylemleri hisse senedi fiyatlarını doğrudan etkiler. Rezerv Bankası, ekonominin istikrarını sağlamak için faiz oranını düzenli olarak değiştirir. Doğal olarak, daha yüksek faiz oranı, şirketlerin krediler için daha fazla ödeme yapmak zorunda kalacağı ve bunun sonucunda da daha az kar elde edeceği anlamına gelir. Bu da hisse senedi fiyatlarını düşürecektir. Tersine, daha düşük faiz oranı, şirketlerin bankalardan çok daha düşük maliyetle daha fazla borç alabilecekleri, böylece sermayelerini elinde tutacakları ve daha yüksek kar elde edecekleri anlamına gelir. Bu durumda da hisse senedi fiyatları yükselecektir.

FED son zamanlarda talebi azaltmak, şirketleri fiyatları indirmeye zorlamak ve nihayetinde enflasyonu düşürmek amacıyla faiz oranını artırmaktadır.

FED'in faiz oranının 2010'dan günümüze kadarki grafiği şu şekildedir:

FED'in faiz oranı

4: Güncel Olaylar


Bir ülkede veya bir bütün olarak dünyada meydana gelen olaylar da borsa üzerinde çok büyük bir etkiye sahip olabilir. COVID-19 salgınının 2019'un sonlarında ve 2020'de borsa üzerinde çok güçlü bir olumsuz etki yarattığını hatırlayın. Ayrıca yine aynı yılda ABD'de eşitlik için yapılan ayaklanmaların da borsa üzerinde olumsuz etkileri olmuştur.

Borsa fiyatını etkileyen diğer olaylar arasında savaşlar ve terör saldırıları yer almaktadır.

Tüm bu olayların piyasa volatilitesini artırarak hisse senedi fiyatlarını önemli ölçüde düşürmesi kaçınılmazdır.

Bu faktörden herhangi bir veri toplamayacağım, çünkü bu olaylar için model eğitimi çok fazla çalışma gerektirecektir. Bu, makale serisinde daha önce ele aldığımız konuların kapsamının ötesindedir.


5: Enflasyon


Enflasyon, bir para biriminin satın alma gücünün zaman içerisinde azalmasıdır. Satın alma gücündeki azalmanın hangi oranda gerçekleştiği, ekonomideki belirli mal ve hizmetlerden oluşan bir sepetin ortalama fiyat seviyesinin belirli bir zaman aralığındaki artış miktarıyla kantitatif olarak ölçülebilir. Genellikle yüzde olarak ifade edilen genel fiyat seviyesindeki artış, para biriminin önceki dönemlere kıyasla daha az mal ve hizmet satın alabileceği anlamına gelir.

Enflasyon hakkında daha fazla bilgiye buradan ulaşabilirsiniz: https://www.investopedia.com/terms/i/inflation.asp

İki ana enflasyon türü vardır - çekirdek TÜFE ve TÜFE:

Enflasyon doların değerini düşürdüğü için, şirketlerin mevcut değerlerinin anlaşılması zor olabilir. Ayrıca, malzeme, ekipman ve işçilik fiyatlarındaki artış, şirketlerin kazançlarını etkileyebilir. Sonuç olarak, volatilite artarak hisse senedi fiyatları dalgalanabilir.

İyi haber şu ki, FED’in sıkılaştırma politikası sabit getirili yatırımları olumsuz olarak etkileyebilirken, hisse senetleri tarihsel olarak bu döngüler sırasında genellikle iyi performans göstermiştir.

1970'ten bu yana ABD TÜFE grafiğine bakalım.

ABD TÜFE grafiği


Şimdi gerekli tüm verileri toplayalım ve tek bir CSV dosyasında depolayalım.

Apple ile başlayalım:

Verileri Toplama


CSV dosyamız için toplayacağımız veriler: çekirdek TÜFE, TÜFE, FED'in faiz oranı, HBK ve F/K Oranı. Tüm bu verilere sahibiz.

Veri kümemizde sadece bir eksik veri parçası kaldı, o da bağımlı değişkenimiz. Elimizde hisse senedi fiyatlarının ham değerleri var. Şimdi, belirli bir ayda borsa çöküşü olup olmadığını bize söyleyecek bir komut dosyası oluşturalım.

CrashClassifyScript.mq5 dosyasında:

void DetectCrash(double &prices[], int& out_binary[])
 {
     double prev_high = prices[0];
     
     ArrayResize(out_binary,ArraySize(prices)-1); //we reduce the size by one since we ignore the current we predict the previous one
     for (int i=1; i<ArraySize(prices); i++)
        {
           int prev = i-1;
            if (prices[i] >= prev_high)
                prev_high = prices[i]; //grab the highest price 
                
            double percent_crash = ((prev_high - prices[i]) / prev_high) * 100.0; //convert crash to percentage
            printf("crash percentage %.2f high price %.4f curr price %.4f ", percent_crash,prev_high,prices[i]);  
          
            //based on the definition of a crash; markets has to fall more than 10% percent
            if (percent_crash > 10)
                out_binary[prev] = 0; //downtrend (crash)
            else
                out_binary[prev] = 1; //uptrend (no crash )
        }
 }

İlk prev_high değerine dikkat ederseniz, onu önceki fiyata ayarladığımı fark edeceksiniz. Bunun nedeni, Apple fiyatlarını 1 Ocak 2010 yerine 1 Aralık 2009'dan başlayacak şekilde kopyalamış olmamdır. İlk hesaplamada çöküşün olup olmadığını tespit edebilmek için bir önceki ayın fiyatına sahip olmak gerekliydi, dolayısıyla 2019’un son ayını eklemek bunu mümkün hale getirdi. Ancak ilgili ayı çıktı veri kümemizde yok sayıyoruz çünkü artık ona ihtiyacımız yok. Bu nedenle, kodda önceki indeks out_binary[prev] şeklindedir, yani i-1 indeksindeki değerdir ve döngü, 1’inci indeksten başlar.

İşte yazdırdığımızda elde ettiğimiz çıktı:

CrashClassifyScript  DATE 1/1/2010 TREND 1

CrashClassifyScript  DATE 2/1/2010 TREND 1

.........

CrashClassifyScript  DATE 4/1/2022 TREND 0

CrashClassifyScript  DATE 5/1/2022 TREND 0

Tüm veri sütunlarını Excel'de tek bir csv dosyasına ekleyelim. Böylece aşağıda göründüğü şekilde tek bir csv dosyasında tüm veri kümesine sahip olacağız.

Apple veri kümesine genel bakış

Harika, her şey hazır, şimdi kod üzerinde çalışmaya başlayabiliriz.

Lojistik modelimizin arkasında bir lineer regresyon algoritması olduğunu hepimiz biliyoruz. Ve herhangi bir veriyi bir lineer modelde kullanmadan önce, bu verilerin bağımsız değişkenle korelasyon gösterip göstermediğini kontrol etmemiz gerekiyor. Bir önceki makalede oluşturduğumuz LinearRegression kütüphanemize eklediğimiz corrcoeff metodunu çağırarak bunu kontrol edelim.

TestScript.mq5 dosyasında:

m_lr = new CMatrixRegression;
      
Print("Matrix multiple regression");
m_lr.Init(8,"2,4,5,6,7",file_name,",",0.7);
      
m_lr.corrcoeff();
m_lr.MultipleMatLinearRegMain();    
delete m_lr;       

Çıktı şu şekilde olacaktır:

Matrix multiple regression

TestScript  Init, number of X columns chosen =5

TestScript  "2" "4" "5" "6" "7"

TestScript  All data Array Size 740 consuming 52 bytes of memory

TestScript  Correlation Coefficients

TestScript  Independent Var Vs Trend = 0.225

TestScript  Independent Var Vs CPI = -0.079

TestScript  Independent Var Vs Core CPI  = -0.460

TestScript  Independent Var Vs EPS($) = -0.743

TestScript  Independent Var Vs PE Ratio = -0.215

Görünüşe göre topladığımız verilerin hiçbiri hisse senedi fiyatıyla çok güçlü bir şekilde korelasyon göstermemektedir. İnternetteki birçok kişi bu faktörlerin borsayı önemli ölçüde etkilediğini iddia etse de. Verilerin sunulduğu kaynakların neden ilgili verilerin piyasaların davranışına dair net bir gösterge olmadığına dair bir sorumluluk reddi gösterdiğini anlıyorum. Sonuçlar bir lineer model için çok farklı bir hikaye anlatıyor. Örneğin, TÜFE ve Apple hisse senedi fiyatı. Çok güçlü bir negatif korelasyon görmeyi bekliyordum, ancak korelasyonun lineer regresyonda kullanılamayacak kadar zayıf olduğu ortaya çıktı. Yalnızca çekirdek TÜFE yaklaşık -0,46'lık umut verici bir negatif korelasyon gösterdi. En güçlüsü ise HBK olup, yaklaşık 0,743'lük negatif korelasyon gösterdi ve bu da -%74,3'e denk gelmektedir.

Verileri Python'da görselleştirelim. Hesaplamalarda sorun olması ve bir şey kaçırmamız ihtimalini göz önünde bulundurarak sonucu görsel olarak görmek çok önemlidir:

seaborn pairplot görselleşti̇rme

Çıktı:

Apple hi̇sse senedi̇ anali̇zi̇

Toplanan verilerin çoğu arasında güçlü bir ilişki olmadığının bu noktada oldukça açık olduğunu düşünüyorum. Verilerimizi filtreleyelim.

Modelimizi oluşturmak için sadece üç bağımsız değişken kullanacağız:

Tamam, şimdi kütüphanemizi yalnızca istediğimiz sütunlarla başlatalım:

log_reg.Init(file_name,delimiter,2,"3,5,6",0.7);

Lojistik regresyonun temel işlevselliğini kaçırdıysanız, bu makaleyi okumanızı tavsiye ederim.

Kütüphanede İleri İyileştirme

//These should be called before the Init 
                           
void    FixMissingValues(string columns);
void    LabelEncoder(string columns, string members);

Lojistik modeller eksik değerlere karşı hassastır. Sınıflandırıcı bir makine öğrenimi modeli oldukları için, eksik verileri sınıflandırılmış şekilde sıfır veriler olarak ele alırlar. Ayrıca MQL5'te dosyaları nasıl okuduğumuza bağlı olarak, NaN değerleri ve dizgeleri de sıfır olarak ele alabilirler. Bu yüzden kütüphanede bazı iyileştirmeler yaptım.

Eksik değerlerin ortalama değerlerle değiştirilmesi için ve dizgelerin etiketlere dönüştürülmesi için bir fonksiyon ekledim.

Bu fonksiyonlar Init fonksiyonundan önce çağrılmalıdır.

Artık lojistik kütüphanemiz, bir önceki makalede oluşturduğumuz MatrixRegression kütüphanemizden bileşenleri kalıtacak.

class CLogisticRegression: protected CMatrixRegression

Şimdi modelimizin ne kadar iyi olduğunu görelim.

Lojistik regresyon kütüphanesini çağırma

Çıktı şu şekilde olacaktır: 

  Confusion Matrix 
   [ 0  13 ]
    [  0  31  ] 
  Tested model accuracy =0.7045

Modelimizin test verileri üzerindeki doğruluğu %70,45. 😲 Bu noktada şaşkınım gerçekten.

Daha önce yaşadığımız veri dezavantajı nedeniyle %50’ye bile ulaşamayacağımızı düşündüm. Acaba bir yerde bir hata mı var diye Python'da da denedim - sonuç aynıydı.

Python’da model doğruluğu testi

Ta-da!

Bağımlı değişkenimizin, çöküş bulucu komut dosyamızla topladığımız trend sütunu olduğunu unutmayın. Fiyat sütunu sadece lineer modellerimiz için korelasyon katsayılarını görüntülemek amacıyla kullanıldı. Çünkü korelasyonları bulmak için sırasıyla düşüş ve yükseliş trendini ifade eden 0 ve 1 ikili değerlerini kullanamayız.

Şimdi odak noktamızı Netflix’e çevirelim.

İşte Netflix için korelasyon katsayıları:

        Correlation Coefficients
         Independent Var Vs Trend = 0.071
         Independent Var Vs  rate (FEDs rate) = 0.310
         Independent Var Vs CPI = 0.509
         Independent Var Vs Core CPI  = 0.607
         Independent Var Vs  EPS = 0.917
         Independent Var Vs PE Ratio = -0.213

Tartıştığımız faktörlerin çoğunun Netflix üzerinde olumlu bir etkisi olduğu görünüyor. Tek olumsuz etki, fiyat/kazanç oranıdır. En güçlü faktör, hisse senedi fiyatıyla yaklaşık %92'lik korelasyon gösteren hisse başına kazançtır. Netflix için bir model oluşturmak adına şu üç veriyi kullanacağız:

Verilerimizi görselleştirelim:

Netflix hi̇sse senedi̇ anali̇zi̇

Netflix verilerinde sonuç Apple'da olduğundan çok daha iyi görünüyor.

Uzun lafın kısası:

   log_reg = new CLogisticRegression();
    
    Print("NETFLIX"); 
    
    file_name =  "Netflix Dataset.csv";
    
    log_reg.Init(file_name,delimiter,2,"4,5,6",0.7);
    log_reg.LogisticRegressionMain(accuracy);
    
    printf("Tested model accuracy =%.4f",accuracy);
    delete log_reg;

Çıktı: 

FN      0       07:54:45.106    TestScript      NETFLIX
PN      0       07:54:45.108    TestScript      ==== TRAINED LINEAR REGRESSION MODEL COEFFICIENTS ====
ED      0       07:54:45.108    TestScript      [ 
RO      0       07:54:45.108    TestScript       1.43120 -0.05632 -0.54159  0.48957
EE      0       07:54:45.108    TestScript      ] 
CQ      0       07:54:45.108    TestScript      columns = 4 rows = 1
PH      0       07:54:45.108    TestScript      ========= LINEAR REGRESSION MODEL TESTING STARTED =========
QP      0       07:54:45.108    TestScript      Tested Linear Model R square is = -0.35263665822405277
GR      0       07:54:45.108    TestScript      Confusion Matrix 
EE      0       07:54:45.108    TestScript       [ 0  18 ]
HN      0       07:54:45.108    TestScript        [  0  26  ] 
MJ      0       07:54:45.108    TestScript      Tested model accuracy =0.5909

Hisse senedi fiyatıyla güçlü bir lineer korelasyonu olan verilere sahip olmasına rağmen, Netflix modeli yaklaşık %60 ile daha az doğruluk göstermiştir. Apple modeli %70'lik doğruluk göstermişti. Veri kümesinin geri kalanı üzerinde kendiniz oynamalar yapabilir ve modelin nasıl görünebileceğine bakabilirsiniz.


Gerçek Zamanlı Borsa Testi


Uzman Danışmanla canlı piyasada test yapabilmek için ana lojistik regresyon fonksiyonumuzda bazı değişiklikler yapmamız gerekiyor. Fonksiyonun, öngörülen değerleri tarihleriyle birlikte bir CSV dosyasına kaydetmesini sağlamalıyız. Bu CSV dosyasını, modelimize dayalı olarak piyasanın nereye gideceğine dair sinyaller almak için strateji sınayıcıda kullanacağız.

Verileri şu şekilde toplayıp bir csv dosyasına kaydedeceğiz:

WriteToCSV(TestPredicted,dates,"Predicted "+m_filename,m_delimiter);

Yalnızca test veri kümesinin sonuçlarını topladığımızı unutmayın.

İşte verilerin bir csv dosyasında nasıl depolandığına dair kısa bir görünüm:

NETFLIX

Predicted, date_time
1,8/1/2018
1,9/1/2018
1,10/1/2018
1,11/1/2018
1,12/1/2018
1,1/1/2019

APPLE 

Predicted, date_time
1,9/1/2018
1,10/1/2018
1,11/1/2018
1,12/1/2018
1,1/1/2019
1,2/1/2019      

Hata matrisi bölümüne dikkat ettiyseniz, modelimizin yükseliş trendi için iyi bir öngörücü olduğunu fark edeceksiniz (matristeki tüm satırlarının büyük bir kısmı gerçek pozitifti).

Gerçek Zamanlı Borsa Testi İçin Uzman Danışman

Uzman Danışmanımızı oluşturmanın ilk adımı, CSV dosyamızdan veri toplamaktır. Ancak öncesinde strateji sınayıcıya test sırasında bu dosyayı kullanacağımızı söylemeliyiz.

#property tester_file "Predicted Apple Dataset.csv"

Kodladığım ve OnInit fonksiyonunda çağırdığım fonksiyonlara genel bir bakış:

 GetColumnDatatoArray(1,Trend);
 GetColumnDatatoArray(2,dates);

Bu fonksiyonları kütüphanemizde sıklıkla kullandık. İlk sütundan verileri topluyoruz, sonra onları Trend[] dizisinde depoluyoruz. dates[] dizisi için de benzerini gerçekleştiriyoruz.

Bir sonraki önemli nokta, csv dosyasında depoladığımız zamanı MQL5'te anlaşılabilecek standart bir zaman formatına dönüştürmektir.

ConvertTimeToStandard();

İşte bu fonksiyonun içerisinde olanlar:

void ConvertTimeToStandard()
 {
// A one time attempt to convert the date to yy.mm.dd
    
    ArrayResize(date_datetime,ArraySize(dates));
    for (int i=0; i<ArraySize(dates); i++)
       {
         StringReplace(dates[i],"/","."); //replace comma with period in each and every date
         //Print(dates[i]);
         string mm_dd_yy[];
         
         ushort sep = StringGetCharacter(".",0);
         StringSplit(dates[i],sep,mm_dd_yy); //separate month, day and year 
         
         //Print("mm dd yy date format");
         //ArrayPrint(mm_dd_yy);
         
         string year = mm_dd_yy[2];
         string  day = mm_dd_yy[1];
         string month = mm_dd_yy[0];
                
         dates[i] = year+"."+month+"."+day; //store to a yy.mm.dd format
         
         date_datetime[i] = StringToTime(dates[i]); //lastly convert the string datetime to an actual date and time
       }  
 }

Init() fonksiyonunda nelerin gerçekleştiğine dair açıklamaya değer tüm fonksiyonlar bunlardır.

Bir sonraki adım, modelin öngörülerini Ontick fonksiyonunda test etmektir. İşte Uzman Danışmanımızın dayandığı temel:

    datetime today[1];
    int trend_signal = -1; //1 is buy signal 0 is sell signal
    
    CopyTime(Symbol(),PERIOD_D1,0,1,today);
    
    if (isNewBar())
     for (int i=0; i<ArraySize(date_datetime); i++)
      {
          if (today[0] == date_datetime[i]) //train in that specific day only
              {
                 
                  if ((int)Trend[i] == 1)
                    trend_signal = 1;
                  else 
                     trend_signal = 0; 
                     
                  // close all the existing positions since we are coming up with new data signals    
                  ClosePosByType(POSITION_TYPE_BUY);
                  ClosePosByType(POSITION_TYPE_SELL);
                  break;
              }
          
          if (MQLInfoInteger(MQL_TESTER) && today[0] > date_datetime[ArrayMaximum(date_datetime)])
             {
                 Print("we've run out of the testing data, Tester will be cancelled");
                 ExpertRemove();
             }
     } 
     
//--- Time to trade

      MqlTick tick;
      SymbolInfoTick(Symbol(),tick);
      double ask = tick.ask , bid = tick.bid;

//---

      if (trend_signal == 1 && PositionCounter(POSITION_TYPE_BUY)<1)
        {
           m_trade.Buy(Lots,Symbol(),ask,0,0," Buy trade ");
           ClosePosByType(POSITION_TYPE_SELL); //if the model predicts a bullish market close all sell trades if available
        }
        
      if (trend_signal == 0 && PositionCounter(POSITION_TYPE_SELL)<1)
        {
            m_trade.Sell(Lots,Symbol(),bid,0,0,"Sell trade");
            ClosePosByType(POSITION_TYPE_BUY); //vice versa if the model predicts bear market
        }
  }

Modeli belirli bir günde ve NewBar olay işleyicisiyle eğitmeyi seçmemin ana nedeni, uygulamamızı test etme maliyetini azaltmaktır. Bu maliyeti daha da azaltmak için, test veri kümesi bittiğinde strateji sınayıcının durdurulması gerektiği koşulunu da kodladım.

Hepsi bu kadar. Aşağıda linkten kodun tamamına bakabilirsiniz. Şimdi modeli strateji sınayıcıda test etme zamanı.

Apple için test sonucu

Apple test sonucu raporu

Grafik

Apple test sonucu grafiği

Netflix için test sonucu

Netflix test sonucu raporu

Grafik

Netflix test sonucu grafiği

Harika! Gördüğünüz gibi Apple modeli yaklaşık %70'lik bir doğruluk gösterdi. Netflix'e kıyasla strateji sınayıcıda güzel bir grafik sağlayarak iyi bir öngörücü model oluşturdu.


Sonuç

Lojistik modellerin avantajı, oluşturulmasının ve eğitilmesinin kolay olmasıdır. Verileri sınıflandırmak konusunda da oldukça iyi bir iş çıkarıyorlar, ancak modelde kullanılacak verileri bulmak hafife alınmamalıdır. Bu, tüm modelin verimsiz olmasına neden olabilecek en önemli adımlardan biridir.

Kütüphanemize çok sayıda ileri iyileştirmeler daha yapabilir ve verileri yeniden toplayabilirsiniz, çünkü şahsen şu anki verileri toplama ve Crashclassify komut dosyasında sınıflandırma yöntemimin borsa çöküşünü öngörmek için yeterli etkili bir yol olmadığını düşünüyorum.

Makalenin kodlarının bulunduğu Github depomun linki: https://github.com/MegaJoctan/LogisticRegression-MQL5-and-python.