Skip to content

[Belajar] Membuat Machine Learning untuk Memprediksi Harga Saham/Forex/Crypto – Part #3

<<< Part#2

Gimana…..sudah ga sabar yah menunggu hasil projek ML ini ? 😀 Sabar yah…..tunggu nanti Part#4 yah…karena ujicobanya belum selesai….hahaha :D. Tapi ada bocoran sedikit nih. Dari hasil ujicoba hingga saat ini, bisa dibilang…hmmm…..So far, So good. 🙂 🙂

OK, jadi pada artikel ini saya mau berbagi tentang [belajar] pemrograman atau coding dengan Python untuk Server side dari Machine Learning. Khan biar selaras dengan judul artikelnya…. 🙂

CODING

[Belajar] Pemrograman

Kita mulai dari membuat Class Socket Server .

class socketserver:
    def __init__(self, address = '', port = 9999):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.address = address
        self.port = port
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.sock.bind((self.address, self.port))
        self.cummdata = ''

    def recvmsg(self):
        self.sock.listen(1)
        self.conn, self.addr = self.sock.accept()
        print('connected to', self.addr)
        self.cummdata = ''

        while True:
            data = self.conn.recv(10000000)
            self.cummdata+=data.decode("utf-8")
            if not data:
                break
            self.conn.send(bytes(train_test_model(self.cummdata), "utf-8"))
            return self.cummdata

    def __del__(self):
        self.sock.close()

Berikutnya, untuk setiap Model yang akan kita kembangkan, kita akan buat masing-masing sebuah prosedur atau fungsi atau sub-program. Tujuannya agar mudah untuk proses debug dan pengembangan lebih lanjut. Jadi, misal pada projek ini kita akan menggunakan 5 model, maka masing-masing model kita akan buat fungsinya. Sebagai contoh, berikut ini adalah fungsi Training menggunakan Random Forest model.

def train_RF(training_set, trainSize, n_feature):
    if(type(training_set) == list):
        print("---------------------------------------------------------------")
        print("TRAINING with RANDOM FOREST is started...")

        print("Load training data...")
        df = pd.read_csv('./datasets/gen/OHLC_Features.csv', index_col=0, parse_dates=True, skipinitialspace=True)

        x = df.iloc[:,0:(n_feature)]        
        y = df['TargetNextClose']

        ### Splitting Data
        x_train = x[:trainSize]
        x_test= x[trainSize:]
        y_train = y[:trainSize]
        y_test = y[trainSize:]
        
        ### Scaling
        scale = MinMaxScaler(feature_range=(0,1))
        x_train = scale.fit_transform(x_train)
        x_test = scale.transform(x_test)
         
        ### Train       
        model = RandomForestRegressor(n_estimators=50, random_state=30, min_samples_split=2, min_samples_leaf=1, max_depth=15, bootstrap=True)
            
        ### Fit & Predict
        model.fit(x_train, y_train)
        predict_rf = model.predict(x_test)
        
        ### Evaluate
        MAE_RF = round(metrics.mean_absolute_error(y_test, predict_rf), 4)
        print("Mean Absolute Error:", MAE_RF)
        MSE_RF = round(metrics.mean_squared_error(y_test, predict_rf), 4)
        print("Mean Squared Error:", MSE_RF)
        RMSE = round(np.sqrt(metrics.mean_squared_error(y_test, predict_rf)), 4)
        print("Root Mean Squared Error:", RMSE)
        R2Score = round(metrics.r2_score(y_test, predict_rf), 4)
        print("(R^2) Score:", R2Score)
        print(f'Train Score : {model.score(x_train, y_train) * 100:.2f}% and Test Score : {model.score(x_test, y_test) * 100:.2f}%.')
        errors = abs(predict_rf - y_test)
        mape_rf = 100 * (errors / y_test)
        accuracy_rf = 100 - np.mean(mape_rf)
        print('Accuracy RF :', round(accuracy_rf, 2), '%.') 
        
        return predict_rf, MSE_RF, MAE_RF, accuracy_rf

Jadi pada projek ini kita akan membuat fungsi beberapa model regressor. Kenapa? Yah, untuk mengetahui performa atau kinerja suatu model, tentunya kita perlu lebih dari satu model sebagai pembanding. Sehingga kita bisa mengetahui mana model yang memiliki kinerja dan akurasi prediksi yang optimal. Adapun untuk model regressor yang lain, seperti LSTM dan SARIMAX, serta Hybrid, silahkan Anda kembangkan sendiri yah…. 😀 😀 Saya sudah berikan contoh dengan model regressor Random Forest.

Fungsi berikutnya yang bisa dkatakan fitur penting dalam projek ini adalah pendeteksi bearish/bullish candlestick.

def candlestick_pattern():
    print("--------------------------------------------------------------")
    print("Candlestick Pattern detection is started")
    ##Load new dataset with OHLC
    candles_df = pd.read_csv('./datasets/gen/_OHLC.csv', index_col=0)
    
    #### Find BEARISH
    target_bearish = 'BearishEngulfing'
    candles_df_bearish = candlestick.bearish_engulfing(candles_df.iloc[-30:], target=target_bearish)
    print(candles_df_bearish[candles_df_bearish[target_bearish] == True][[target_bearish]])

    time_df_bearish = candles_df_bearish[candles_df_bearish[target_bearish]== True]['Date'].values
    time_df_bearish = np.array([time_df_bearish], dtype='datetime64')
    if target_bearish:
        signal_BB = 'Bearish'
        return signal_BB
    else:
        print("NO BEARISH engulfing candlestick")
    
    ### Find BULLISH 
    target_bullish = 'BullishEngulfing'
    candles_df_bullish = candlestick.bullish_engulfing(candles_df.iloc[-30:], target=target_bullish)
    time_df_bullish = candles_df_bullish[candles_df_bullish[target_bullish]== True]['Date'].values
    time_df_bullish = np.array([time_df_bullish], dtype='datetime64')
    if target_bullish:
        signal_BB = 'Bullish'
        return signal_BB
    else:
        print("NO BULLISH engulfing candlestick.")    

OK, itu tadi adalah bagian dari Server Side. Sekarang kita [belajar] membuat program untuk Client Side. Kali ini kita akan menggunakan bahasa MQL4 untuk Metatrader. Dan kalau kita menginstal Metatrader, kita disediakan tools untuk membuat program MQL4, yaitu MetaEditor.

void OnTick()
  {
      if (isnewcandle())
       {
            if(onRetrainBar()){            
               if(!socket){  
                  socket = new ClientSocket(server,port);
                  if (socket.IsSocketConnected()){
                     Print("Client connection succeeded");
                  } 
                  else{
                     Print("Client connection failed");
                     Print("Please check all connection");
                     delete socket;
                     socket = NULL;
                     return;
                  }
                  Print("Connected to Machine Learning at ",server,":",port);
                        
                  //----Preparing data to be sent to Machine Learning via socket      
                  datetime time[]; //--Datetime 
                  int copyTime = CopyTime(_Symbol,PERIOD_CURRENT,0,retrain,time);
                  
                  double oppr[]; //--Open price
                  int copyOPP = CopyOpen(ChartSymbol(ChartID()),ChartPeriod(ChartID()),0,retrain,oppr);
                  
                  double hipr[]; //--High Price
                  int copyHP = CopyHigh(ChartSymbol(ChartID()),ChartPeriod(ChartID()),0,retrain,hipr);
                  
                  double lopr[]; //--Low Price
                  int copyLP = CopyLow(ChartSymbol(ChartID()),ChartPeriod(ChartID()),0,retrain,lopr);
                  
                  double clpr[]; //--Close Price
                  int copyed = CopyClose(ChartSymbol(ChartID()),ChartPeriod(ChartID()),0,retrain,clpr);
                  
                  //--Preparing json message
                  CJAVal json;
                  for (int i = 0; i < ArraySize(clpr); i++)
                  {
                     json["Time"].Add((string)time[i]);   
                     //--OHLC data                    
                     json["Open"].Add(DoubleToString(oppr[i],6));
                     json["High"].Add(DoubleToString(hipr[i],6));
                     json["Low"].Add(DoubleToString(lopr[i],6));
                     json["Close"].Add(DoubleToString(clpr[i], 6));
                        
                  }                  
                  string jsonString = json.Serialize();

                  if(socket.Send(jsonString)){
                     Print("Data sent successfully to Machine Learning for RETRAIN phase.");
                  }
                  
               }
               else{               
                  Print("Sorry......Socket or Machine Learning is Busy!!!");
                  Print("Please try again later, OK ! ");               
               }  
                     
            } // end of retrain bar            
        } // end isnewcandle()
  } // end of on tick

Seperti teman-teman lihat pada script MQL4 Client Side di atas, kita menyalin data harga OHLC (Open-High-Low-Close) dan dikemas ke dalam format JSON lalu dikirim ke Server melalui socket.

Voila !!! Itulah gambaran singkat [belajar] pemrograman menggunakan Python dan MQL4 pada projek ini.

Saya yakin, teman-teman masih banyak hal yang kurang jelas pada projek ini…..hahaha 😀 :D. Yah, itu memang karena keterbatasan saya dalam memberikan detil. Tapi silahkan tinggalkan jejak di bawah pada kolom komentar atau kontak saya langsung. Kita bisa diskusi chit-chat sambil ngu-ber (*ngupi se-ember) 😀 :D.

Tunggu Part#4 yah untuk hasil ujicoba projek ini. 🙂

Colmar, 6/05/2023, Springtime

Have a nice long weekend, Guys… 🙂 Bon Weekend à vous 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *