Artikel ini ditulis sebagai sebahagian daripada "Pembelajaran Mesin: Bagaimana Mesin Vektor Sokongan Boleh Digunakan dalam Perdagangan" yang dipaparkan di laman MQL5.
Bayangkan senario hipotetikal di mana anda seorang penyelidik yang sedang menyelidik haiwan jarang yang hanya ditemui di kedalaman Artik, dikenali sebagai Schnicks. Memandangkan betapa sukarnya untuk menemui haiwan ini, hanya sedikit sahaja yang pernah dijumpai (katakan sekitar 5000). Sebagai penyelidik, anda terperangkap dengan soalan... bagaimana saya boleh mengenal pasti Schnick?
Semua yang anda ada adalah kertas penyelidikan yang diterbitkan oleh beberapa penyelidik yang pernah melihatnya. Dalam kertas penyelidikan ini, penulis menggambarkan ciri-ciri tertentu tentang Schnicks yang mereka temui, seperti tinggi, berat, bilangan kaki dan sebagainya, tetapi semua ciri ini berbeza antara satu sama lain tanpa pola yang jelas....
Bagaimana kita boleh menggunakan data ini untuk mengenal pasti haiwan baru sebagai Schnick?
Salah satu penyelesaian kepada masalah kita adalah dengan menggunakan mesin vektor sokongan untuk mengenal pasti pola dalam data dan mencipta rangka kerja yang boleh digunakan untuk mengklasifikasikan haiwan sebagai Schnick atau bukan Schnick. Langkah pertama adalah mencipta set data yang boleh digunakan untuk melatih mesin vektor sokongan anda untuk mengenal pasti Schnicks. Data latihan adalah set input dan output yang sepadan untuk mesin vektor sokongan menganalisis dan mengekstrak pola daripadanya.
Skrip ini berusaha untuk menunjukkan kuasa menggunakan mesin vektor sokongan dalam menyelesaikan masalah klasifikasi dengan menggunakan Alat Pembelajaran Mesin Vektor Sokongan yang tersedia di MQL5 Market. Penerangan lengkap mengenai masalah hipotetikal ini dan skrip boleh didapati dalam artikel "Pembelajaran Mesin: Bagaimana Mesin Vektor Sokongan Boleh Digunakan dalam Perdagangan". Artikel tersebut termasuk panduan tentang cara menggunakan skrip dan bagaimana masalah ini boleh memberikan pandangan tentang menggunakan pembelajaran mesin untuk menilai tren pasaran.
Kod:
//+------------------------------------------------------------------+ //| Schnick_Demo.mq5 | //| Hak Cipta 2011, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Hak Cipta 2011, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Skrip ini menunjukkan kemampuan Alat Pembelajaran Mesin Vektor Sokongan //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Pernyataan berikut mengimport semua fungsi yang terdapat dalam //| Alat Mesin Vektor Sokongan 'svMachineTool.ex5' //+------------------------------------------------------------------+ #import "svMachineTool_demo.ex5" enum ENUM_TRADE {BUY,SELL}; enum ENUM_OPTION {OP_MEMORY,OP_MAXCYCLES,OP_TOLERANCE}; int initSVMachine(void); void setIndicatorHandles(int handle,int &indicatorHandles[],int offset,int N); void setParameter(int handle,ENUM_OPTION option,double value); bool genOutputs(int handle,ENUM_TRADE trade,int StopLoss,int TakeProfit,double duration); bool genInputs(int handle); bool setInputs(int handle,double &Inputs[],int nInputs); bool setOutputs(int handle,bool &Outputs[]); bool training(int handle); bool classify(int handle); bool classify(int handle,int offset); bool classify(int handle,double &iput[]); void deinitSVMachine(void); #import //--- Bilangan input yang akan kita gunakan untuk svm int N_Inputs=7; //+------------------------------------------------------------------+ //| Fungsi penginisialisasian pakar | //+------------------------------------------------------------------+ int OnInit() { double inputs[]; //array double kosong untuk digunakan bagi mencipta input latihan bool outputs[]; //array bool kosong untuk digunakan bagi mencipta output latihan int N_TrainingPoints=5000; //menentukan bilangan sampel latihan yang akan dihasilkan int N_TestPoints=5000 //menentukan bilangan sampel yang digunakan semasa menguji genTrainingData(inputs,outputs,N_TrainingPoints); //Menghasilkan input dan output yang akan digunakan untuk melatih svm int handle1=initSVMachine(); //memulakan mesin vektor sokongan baru dan mengembalikan handle setInputs(handle1,inputs,7); //menghantar input (tanpa kesalahan) kepada mesin vektor sokongan setOutputs(handle1,outputs); //menghantar output (tanpa kesalahan) kepada mesin vektor sokongan setParameter(handle1,OP_TOLERANCE,0.01); //menetapkan parameter toleransi ralat kepada <5% training(handle1); //melatih mesin vektor sokongan menggunakan input/output yang dihantar insertRandomErrors(inputs,outputs,500); //mengambil input/output asli yang dihasilkan dan menambah kesalahan rawak kepada data int handle2=initSVMachine(); //memulakan mesin vektor sokongan baru dan mengembalikan handle setInputs(handle2,inputs,7); //menghantar input (dengan kesalahan) kepada mesin vektor sokongan setOutputs(handle2,outputs); //menghantar output (dengan kesalahan) kepada mesin vektor sokongan setParameter(handle2,OP_TOLERANCE,0.01); //menetapkan parameter toleransi ralat kepada <5% training(handle2); //melatih mesin vektor sokongan menggunakan input/output yang dihantar double t1=testSVM(handle1,N_TestPoints); //mengujii ketepatan mesin vektor sokongan yang dilatih dan menyimpannya ke t1 double t2=testSVM(handle2,N_TestPoints); //mengujii ketepatan mesin vektor sokongan yang dilatih dan menyimpannya ke t2 Print("Ketepatan SVM adalah ",NormalizeDouble(t1,2),"% (menggunakan input/output latihan tanpa kesalahan)"); Print("Ketepatan SVM adalah ",NormalizeDouble(t2,2),"% (menggunakan input/output latihan dengan kesalahan)"); deinitSVMachine(); //Membersihkan semua memori yang digunakan dalam menjana SVM untuk mengelakkan kebocoran memori return(0); } //+------------------------------------------------------------------+ //| Fungsi penyahpasangan pakar | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- Tiada fungsi dilaksanakan dalam OnDeinit() } //+------------------------------------------------------------------+ //| Fungsi tick pakar | //+------------------------------------------------------------------+ void OnTick() { //--- Tiada fungsi dilaksanakan dalam OnTick() } //+------------------------------------------------------------------+ //| Fungsi ini mengambil sifat pemerhatian haiwan yang diperhatikan //| dan berdasarkan kriteria yang kita pilih, mengembalikan //| true/false sama ada ia adalah schnick //+------------------------------------------------------------------+ bool isItASchnick(double height,double weight,double N_legs,double N_eyes,double L_arm,double av_speed,double f_call) { if(height < 1000 || height > 1100) return(false); //Jika tinggi berada di luar parameter > kembalikan(false) if(weight < 40 || weight > 50) return(false); //Jika berat berada di luar parameter > kembalikan(false) if(N_legs < 8 || N_legs > 10) return(false); //Jika N_Legs berada di luar parameter > kembalikan(false) if(N_eyes < 3 || N_eyes > 4) return(false); //Jika N_eyes berada di luar parameter > kembalikan(false) if(L_arm < 400 || L_arm > 450) return(false); //Jika L_arm berada di luar parameter > kembalikan(false) if(av_speed < 2 || av_speed > 2.5) return(false); //Jika av_speed berada di luar parameter > kembalikan(false) if(f_call < 11000 || f_call > 15000) return(false); //Jika f_call berada di luar parameter > kembalikan(false) return(true); //Jika tidak > kembalikan(true) } //+------------------------------------------------------------------+ //| Fungsi ini mengambil array double kosong dan array boolean kosong //| dan menghasilkan input/output yang akan digunakan untuk melatih SVM //+------------------------------------------------------------------+ void genTrainingData(double &inputs[],bool &outputs[],int N) { double in[]; //mencipta array double kosong untuk digunakan //bagi menyimpan input yang dihasilkan secara sementara ArrayResize(in,N_Inputs); //menyusun saiz array in[] kepada N_Inputs ArrayResize(inputs,N*N_Inputs); //menyusun saiz array inputs[] kepada N*N_Inputs ArrayResize(outputs,N); //menyusun saiz array outputs[] kepada N for(int i=0;i<N;i++) { in[0]= randBetween(980,1120); //Input rawak dihasilkan untuk tinggi in[1]= randBetween(38,52); //Input rawak dihasilkan untuk berat in[2]= randBetween(7,11); //Input rawak dihasilkan untuk N_kaki in[3]= randBetween(3,4.2); //Input rawak dihasilkan untuk N_mata in[4]= randBetween(380,450); //Input rawak dihasilkan untuk L_tangan in[5]= randBetween(2,2.6); //Input rawak dihasilkan untuk kelajuan purata in[6]= randBetween(10500,15500); //Input rawak dihasilkan untuk f_call //--- salin input rawak baharu yang dihasilkan ke dalam array input latihan ArrayCopy(inputs,in,i*N_Inputs,0,N_Inputs); //--- menilai input rawak dan menentukan sama ada ia adalah schnick outputs[i]=isItASchnick(in[0],in[1],in[2],in[3],in[4],in[5],in[6]); } } //+------------------------------------------------------------------+ //| Fungsi ini mengambil handle untuk SVM yang dilatih dan menguji seberapa //| berjaya ia mengklasifikasikan input rawak baharu //+------------------------------------------------------------------+ double testSVM(int handle,int N) { double in[]; int atrue=0; int afalse=0; int N_correct=0; bool Predicted_Output; bool Actual_Output; ArrayResize(in,N_Inputs); for(int i=0;i<N;i++) { in[0]= randBetween(980,1120); //Input rawak dihasilkan untuk tinggi in[1]= randBetween(38,52); //Input rawak dihasilkan untuk berat in[2]= randBetween(7,11); //Input rawak dihasilkan untuk N_kaki in[3]= randBetween(3,4.2); //Input rawak dihasilkan untuk N_mata in[4]= randBetween(380,450); //Input rawak dihasilkan untuk L_tangan in[5]= randBetween(2,2.6); //Input rawak dihasilkan untuk kelajuan purata in[6]= randBetween(10500,15500); //Input rawak dihasilkan untuk f_call //--- menggunakan fungsi isItASchnick untuk menentukan output yang diingini secara sebenar Actual_Output=isItASchnick(in[0],in[1],in[2],in[3],in[4],in[5],in[6]); //--- menggunakan SVM yang dilatih untuk mengembalikan output yang diramalkan. Predicted_Output=classify(handle,in); if(Actual_Output==Predicted_Output) { N_correct++; //Pernyataan ini menyimpan kiraan berapa banyak kali output yang diramalkan adalah betul. } } //--- mengembalikan ketepatan SVM yang dilatih sebagai peratusan return(100*((double)N_correct/(double)N)); } //+------------------------------------------------------------------+ //| Fungsi ini mengambil input dan output latihan yang betul //| yang dihasilkan dan memasukkan N kesalahan rawak ke dalam data //+------------------------------------------------------------------+ void insertRandomErrors(double &inputs[],bool &outputs[],int N) { int nTrainingPoints=ArraySize(outputs); //mengira bilangan titik latihan int index; //mencipta integer baru 'index' bool randomOutput; //mencipta bool baru 'randomOutput' double in[]; //mencipta array double kosong untuk digunakan //bagi menyimpan input yang dihasilkan secara sementara ArrayResize(in,N_Inputs); //menyusun saiz array in[] kepada N_Inputs for(int i=0;i<N;i++) { in[0]= randBetween(980,1120); //Input rawak dihasilkan untuk tinggi in[1]= randBetween(38,52); //Input rawak dihasilkan untuk berat in[2]= randBetween(7,11); //Input rawak dihasilkan untuk N_kaki in[3]= randBetween(3,4.2); //Input rawak dihasilkan untuk N_mata in[4]= randBetween(380,450); //Input rawak dihasilkan untuk L_tangan in[5]= randBetween(2,2.6); //Input rawak dihasilkan untuk kelajuan purata in[6]= randBetween(10500,15500); //Input rawak dihasilkan untuk f_call //--- secara rawak memilih salah satu input latihan untuk memasukkan kesalahan index=(int)MathRound(randBetween(0,nTrainingPoints-1)); //--- menjana output boolean rawak untuk digunakan bagi mencipta ralat if(randBetween(0,1)>0.5) randomOutput=true; else randomOutput=false; //--- salin input rawak baharu yang dihasilkan ke dalam array input latihan ArrayCopy(inputs,in,index*N_Inputs,0,N_Inputs); //--- salin output rawak baharu yang dihasilkan ke dalam array output latihan outputs[index]=randomOutput; } } //+------------------------------------------------------------------+ //| Fungsi ini digunakan untuk mencipta nilai rawak antara t1 dan t2 //+------------------------------------------------------------------+ double randBetween(double t1,double t2) { return((t2-t1)*((double)MathRand()/(double)32767)+t1); } //+------------------------------------------------------------------+
Siaran berkaitan
- MQL5 Wizard: Cipta Sistem Trading Berdasarkan Pola Morning/Evening Star dan RSI
- Panduan Lengkap MQL5 Wizard untuk Isyarat Dagangan Berdasarkan Morning/Evening Stars dan Stochastic
- Menggunakan MQL5 Wizard untuk Signal Perdagangan '3 Black Crows/3 White Soldiers' + RSI
- MQL5 Wizard: Cipta Isyarat Dagangan Berdasarkan Corak Hammer/Hanging Man dan Stochastic
- MQL5 Wizard: Cipta Isyarat Dagangan Menggunakan Corak Morning/Evening Star dan MFI