L'apprendimento automatico nel trading: teoria, modelli, pratica e algo-trading - pagina 1341

 

Codice script, se qualcuno è interessato - ahimè, nessuna classe

CSV *csv_Write=new CSV();
int NomerStolbca=0;

input int Set_Total=10;//Количество сетов настроек 1к10
input string CB_Dir="Catboost_Tester";//Директория проекта

input string Version="catboost-0.11.1.exe";//Имя exe файла CatBoost
input int depth=6;//Глубина дерева
input int iterations=1000;//Максимальное число итераций (деревьев)
input double learning_rate=0.03;//Шаг обучения
input int od_wait=100;//Число деревьев без улучщения для остановки обучения


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
      csv_Write.Add_column(dt_string,0);
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
      csv_Write.Add_column(dt_string,s());
NomerStolbca=0;

string Train_All[23];
Train_All[0]=Version+" fit";
Train_All[s()]=" --learn-set train.csv";
Train_All[s()]=" --test-set test.csv";
Train_All[s()]=" --column-description %%a";
Train_All[s()]=" --has-header";
Train_All[s()]=" --delimiter ;";
Train_All[s()]=" --model-format CatboostBinary,CPP";
Train_All[s()]=" --train-dir ..\Rezultat\RS_01/result_4_%%a";
Train_All[s()]=" --depth "+depth;
Train_All[s()]=" --iterations "+iterations; 
Train_All[s()]=" --nan-mode Forbidden ";
Train_All[s()]=" --learning-rate "+learning_rate; 
Train_All[s()]=" --rsm 1 ";
Train_All[s()]=" --fold-permutation-block 1";
Train_All[s()]=" --boosting-type Ordered";
Train_All[s()]=" --l2-leaf-reg 6";
Train_All[s()]=" --loss-function Logloss:border=0.5";
Train_All[s()]=" --use-best-model";
Train_All[s()]=" --eval-metric Precision";
Train_All[s()]=" --custom-metric Logloss:border=0.5";
Train_All[s()]=" --od-type Iter";
Train_All[s()]=" --od-wait "+od_wait;
Train_All[s()]=" --random-seed ";
NomerStolbca=0;
int Size_Arr=ArraySize(Train_All);
int Seed=0;
int line=0;

for(int N=0;N<Set_Total;N++)
{
         int line=csv_Write.Add_line();
         csv_Write.Set_value(line,1,"FOR %%a IN (*.) DO (",false);
for(int Z=2;Z<22+1;Z++)csv_Write.Set_value(line,Z,"",false);

   for(int i=1;i<10+1;i++)
     {
         Seed=N*10+i;
         Train_All[7]=" --train-dir ..\Rezultat\RS_"+Seed+"/result_4_%%a";

         line=csv_Write.Add_line();
         int x=0;         
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++],false);
         csv_Write.Set_value(line,s(),Train_All[x++]+Seed,false);
         NomerStolbca=0;
     }
         line=csv_Write.Add_line();
         csv_Write.Set_value(line,1,")",false);
         for(int Z=2;Z<22+1;Z++)csv_Write.Set_value(line,Z,"",false);
   }
   
   
     line=csv_Write.Add_line(1,false,true);
     csv_Write.Set_value(line,1,"Pause",false);

      csv_Write.data_separator='\t';
      csv_Write.Write_to_file(CB_Dir+"\\Setup\\_01_Train_All.txt",true,true,false,true,false);
      csv_Write.Clear_all();

//---------
string Rezultat_Exam[9];
Rezultat_Exam[0]=Version+" calc";
Rezultat_Exam[s()]=" --model-path ..\Rezultat\RS_"+"\result_4_%%a\model.bin";//Добавлять номер директории
Rezultat_Exam[s()]=" --input-path exam.csv"; 
Rezultat_Exam[s()]=" --column-description %%a";  
Rezultat_Exam[s()]=" --has-header"; 
Rezultat_Exam[s()]=" --delimiter ;"; 
Rezultat_Exam[s()]=" --output-path ..\Rezultat\RS_"+"\result_4_%%a\output";//Добавлять номер директории
Rezultat_Exam[s()]=" --has-header"; 
Rezultat_Exam[s()]=" --prediction-type Probability";
NomerStolbca=0;
Seed=0;
Size_Arr=ArraySize(Rezultat_Exam);

for(int Z=0;Z<Size_Arr+1;Z++)csv_Write.Add_column(dt_string,Z);
for(int N=0;N<Set_Total;N++)
{
         int line=csv_Write.Add_line(1,false,true);
         csv_Write.Set_value(line,1,"FOR %%a IN (*.) DO (",false);

   for(int i=1;i<10+1;i++)
     {
         Seed=N*10+i;
         Rezultat_Exam[1]=" --model-path ..\Rezultat\RS_"+Seed+"\\result_4_%%a\model.bin";
         Rezultat_Exam[6]=" --output-path ..\Rezultat\RS_"+Seed+"\\result_4_%%a\output";
         int line=csv_Write.Add_line(1,false,true);
         int x=0;  
         for(int S=1;S<Size_Arr+1;S++)csv_Write.Set_value(line,S,Rezultat_Exam[S-1],false);
     }
         line=csv_Write.Add_line(1,false,true);
         csv_Write.Set_value(line,1,")",false);
   }
      
      line=csv_Write.Add_line(1,false,true);
      csv_Write.Set_value(line,1,"Pause",false);

      csv_Write.data_separator='\t';
      csv_Write.Write_to_file(CB_Dir+"\\Setup\\_02_Rezultat_Exam.txt",true,true,false,true,false);
      csv_Write.Clear_all();

//----------
string Rezultat_Test[9];
Rezultat_Test[0]=Version+" calc";
Rezultat_Test[s()]=" --model-path ..\Rezultat\RS_"+"\result_4_%%a\model.bin";//Добавлять номер директории
Rezultat_Test[s()]=" --input-path test.csv"; 
Rezultat_Test[s()]=" --column-description %%a";  
Rezultat_Test[s()]=" --has-header"; 
Rezultat_Test[s()]=" --delimiter ;"; 
Rezultat_Test[s()]=" --output-path ..\Rezultat\RS_"+"\result_4_%%a\output_test";//Добавлять номер директории
Rezultat_Test[s()]=" --has-header"; 
Rezultat_Test[s()]=" --prediction-type Probability";
NomerStolbca=0;
Seed=0;
Size_Arr=ArraySize(Rezultat_Test);

for(int Z=0;Z<Size_Arr+1;Z++)csv_Write.Add_column(dt_string,Z);
for(int N=0;N<Set_Total;N++)
{
         int line=csv_Write.Add_line(1,false,true);
         csv_Write.Set_value(line,1,"FOR %%a IN (*.) DO (",false);
  
   for(int i=1;i<10+1;i++)
     {
         Seed=N*10+i;
         //Train_All[7]=" --train-dir ..\Rezultat\RS_"+Seed+"/result_4_%%a";
         Rezultat_Test[1]=" --model-path ..\Rezultat\RS_"+Seed+"\\result_4_%%a\model.bin";
         Rezultat_Test[6]=" --output-path ..\Rezultat\RS_"+Seed+"\\result_4_%%a\output_test";
         int line=csv_Write.Add_line(1,false,true);
         int x=0;  
         for(int S=1;S<Size_Arr+1;S++)csv_Write.Set_value(line,S,Rezultat_Test[S-1],false);
     }
         line=csv_Write.Add_line(1,false,true);
         csv_Write.Set_value(line,1,")",false);
   }
      line=csv_Write.Add_line(1,false,true);
      csv_Write.Set_value(line,1,"Pause",false);

      csv_Write.data_separator='\t';
      csv_Write.Write_to_file(CB_Dir+"\\Setup\\_02_Rezultat_Test.txt",true,true,false,true,false);
      csv_Write.Clear_all();

//-----------------
string Rezultat_Train[9];
Rezultat_Train[0]=Version+" calc";
Rezultat_Train[s()]=" --model-path ..\Rezultat\RS_"+"\\result_4_%%a\model.bin";//Добавлять номер директории
Rezultat_Train[s()]=" --input-path train.csv"; 
Rezultat_Train[s()]=" --column-description %%a";  
Rezultat_Train[s()]=" --has-header"; 
Rezultat_Train[s()]=" --delimiter ;"; 
Rezultat_Train[s()]=" --output-path ..\Rezultat\RS_"+"\\result_4_%%a\output_train";//Добавлять номер директории
Rezultat_Train[s()]=" --has-header"; 
Rezultat_Train[s()]=" --prediction-type Probability";
NomerStolbca=0;
Seed=0;
Size_Arr=ArraySize(Rezultat_Train);

for(int Z=0;Z<Size_Arr+1;Z++)csv_Write.Add_column(dt_string,Z);
for(int N=0;N<Set_Total;N++)
{
         int line=csv_Write.Add_line(1,false,true);
         csv_Write.Set_value(line,1,"FOR %%a IN (*.) DO (",false);

   for(int i=1;i<10+1;i++)
     {
         Seed=N*10+i;
         Rezultat_Train[1]=" --model-path ..\Rezultat\RS_"+Seed+"\\result_4_%%a\model.bin";
         Rezultat_Train[6]=" --output-path ..\Rezultat\RS_"+Seed+"\\result_4_%%a\output_train";
         int line=csv_Write.Add_line(1,false,true);
         int x=0;  
         for(int S=1;S<Size_Arr+1;S++)csv_Write.Set_value(line,S,Rezultat_Train[S-1],false);
     }
         line=csv_Write.Add_line(1,false,true);
         csv_Write.Set_value(line,1,")",false);
   }
      line=csv_Write.Add_line(1,false,true);
      csv_Write.Set_value(line,1,"Pause",false);

      csv_Write.data_separator='\t';
      csv_Write.Write_to_file(CB_Dir+"\\Setup\\_02_Rezultat_Train.txt",true,true,false,true,false);
      csv_Write.Clear_all();


//-----------------
string Metrik_Exam[8];

Metrik_Exam[0]=Version+"  eval-metrics";
Metrik_Exam[s()]=" --metrics Logloss:border=0.5,Precision,Recall,Kappa,Accuracy,BalancedAccuracy,AUC,F1,MCC";
Metrik_Exam[s()]=" --model-path ..\Rezultat\RS_\result_4_%%a\model.bin";
Metrik_Exam[s()]=" --input-path exam.csv";
Metrik_Exam[s()]=" --column-description %%a"; 
Metrik_Exam[s()]=" --has-header";
Metrik_Exam[s()]=" --delimiter ;"; 
Metrik_Exam[s()]=" --result-dir ..\Rezultat\RS_\result_4_%%a\metr\Exam";
NomerStolbca=0;
Seed=0;
Size_Arr=ArraySize(Metrik_Exam);

for(int Z=0;Z<Size_Arr+1;Z++)csv_Write.Add_column(dt_string,Z);
for(int N=0;N<Set_Total;N++)
{
         int line=csv_Write.Add_line(1,false,true);
         csv_Write.Set_value(line,1,"FOR %%a IN (*.) DO (",false);

   for(int i=1;i<10+1;i++)
     {
         Seed=N*10+i;
         Metrik_Exam[2]=" --model-path ..\Rezultat\RS_"+Seed+"\\result_4_%%a\model.bin";
         Metrik_Exam[7]=" --result-dir ..\Rezultat\RS_"+Seed+"\\result_4_%%a\metr\Exam";
         int line=csv_Write.Add_line(1,false,true);
         int x=0;  
         for(int S=1;S<Size_Arr+1;S++)csv_Write.Set_value(line,S,Metrik_Exam[S-1],false);
     }
         line=csv_Write.Add_line(1,false,true);
         csv_Write.Set_value(line,1,")",false);
   }
      line=csv_Write.Add_line(1,false,true);
      csv_Write.Set_value(line,1,"Pause",false);

      csv_Write.data_separator='\t';
      csv_Write.Write_to_file(CB_Dir+"\\Setup\\_03_Metrik_Exam.txt",true,true,false,true,false);
      csv_Write.Clear_all();


//-----------------
string Metrik_Test[8];

Metrik_Test[0]=Version+"  eval-metrics";
Metrik_Test[s()]=" --metrics Logloss:border=0.5,Precision,Recall,Kappa,Accuracy,BalancedAccuracy,AUC,F1,MCC";
Metrik_Test[s()]=" --model-path ..\Rezultat\RS_\result_4_%%a\model.bin";
Metrik_Test[s()]=" --input-path test.csv";
Metrik_Test[s()]=" --column-description %%a"; 
Metrik_Test[s()]=" --has-header";
Metrik_Test[s()]=" --delimiter ;"; 
Metrik_Test[s()]=" --result-dir ..\Rezultat\RS_\result_4_%%a\metr\Test";
NomerStolbca=0;
Seed=0;
Size_Arr=ArraySize(Metrik_Test);

for(int Z=0;Z<Size_Arr+1;Z++)csv_Write.Add_column(dt_string,Z);
for(int N=0;N<Set_Total;N++)
{
         int line=csv_Write.Add_line(1,false,true);
         csv_Write.Set_value(line,1,"FOR %%a IN (*.) DO (",false);

   for(int i=1;i<10+1;i++)
     {
         Seed=N*10+i;
         Metrik_Test[2]=" --model-path ..\Rezultat\RS_"+Seed+"\\result_4_%%a\model.bin";
         Metrik_Test[7]=" --result-dir ..\Rezultat\RS_"+Seed+"\\result_4_%%a\metr\Test";
         int line=csv_Write.Add_line(1,false,true);
         int x=0;  
         for(int S=1;S<Size_Arr+1;S++)csv_Write.Set_value(line,S,Metrik_Test[S-1],false);
     }
         line=csv_Write.Add_line(1,false,true);
         csv_Write.Set_value(line,1,")",false);
   }
      line=csv_Write.Add_line(1,false,true);
      csv_Write.Set_value(line,1,"Pause",false);

      csv_Write.data_separator='\t';
      csv_Write.Write_to_file(CB_Dir+"\\Setup\\_03_Metrik_Test.txt",true,true,false,true,false);
      csv_Write.Clear_all();

//-----------------
string Metrik_Train[8];

Metrik_Train[0]=Version+"  eval-metrics";
Metrik_Train[s()]=" --metrics Logloss:border=0.5,Precision,Recall,Kappa,Accuracy,BalancedAccuracy,AUC,F1,MCC";
Metrik_Train[s()]=" --model-path ..\Rezultat\RS_\result_4_%%a\model.bin";
Metrik_Train[s()]=" --input-path test.csv";
Metrik_Train[s()]=" --column-description %%a"; 
Metrik_Train[s()]=" --has-header";
Metrik_Train[s()]=" --delimiter ;"; 
Metrik_Train[s()]=" --result-dir ..\Rezultat\RS_\result_4_%%a\metr\Train";
NomerStolbca=0;
Seed=0;
Size_Arr=ArraySize(Metrik_Train);

for(int Z=0;Z<Size_Arr+1;Z++)csv_Write.Add_column(dt_string,Z,100);
for(int N=0;N<Set_Total;N++)
{
         int line=csv_Write.Add_line(1,false,true);
         csv_Write.Set_value(line,1,"FOR %%a IN (*.) DO (",false);
   
   for(int i=1;i<10+1;i++)
     {
         Seed=N*10+i;
         Metrik_Train[2]=" --model-path ..\Rezultat\RS_"+Seed+"\\result_4_%%a\model.bin";
         Metrik_Train[7]=" --result-dir ..\Rezultat\RS_"+Seed+"\\result_4_%%a\metr\Train";
         int line=csv_Write.Add_line(1,false,true);
         int x=0;  
         for(int S=1;S<Size_Arr+1;S++)csv_Write.Set_value(line,S,Metrik_Train[S-1],false);
     }
         line=csv_Write.Add_line(1,false,true);
         csv_Write.Set_value(line,1,")",false);
   }
      line=csv_Write.Add_line(1,false,true);
      csv_Write.Set_value(line,1,"Pause",false);

      csv_Write.data_separator='\t';
      csv_Write.Write_to_file(CB_Dir+"\\Setup\\_03_Metrik_Train.txt",true,true,false,true,false);
      csv_Write.Clear_all();

  }
  
//+------------------------------------------------------------------+
int s()
  {
   NomerStolbca++;
   return (NomerStolbca);
  }
 

Ha fatto un'analisi dei modelli paralleli, cioè mostra i punti di attivazione della soglia (default 0,5) sul campione di prova.

Si può vedere che i modelli sono abbastanza simili in generale, ma un'altra cosa che sorprende sono gli intervalli di tempo molto grandi in cui non ha avuto luogo alcuna attivazione. Forse la ragione è qualche predittore che prende informazioni dalla barra mensile...

 
Aleksey Vyazmikin:

Ha fatto un'analisi dei modelli paralleli, cioè mostra i punti di attivazione della soglia (default 0,5) sul campione di prova.

Si può vedere che i modelli sono abbastanza simili in generale, ma un'altra cosa che sorprende sono gli intervalli di tempo molto grandi in cui non ha avuto luogo alcuna attivazione. Forse la ragione è in qualche predittore che prende informazioni dalla barra mensile...

E poi molti trade di fila su ogni barra? Ho avuto un problema simile con NS. La conclusione è simile - la grande TF influenza, mentre le piccole la integrano.
 
elibrario:
E poi un mucchio di scambi in fila su ogni barra? Ne ho avuto uno simile, con NS. La conclusione è simile - la grande TF sta influenzando, e le piccole la stanno integrando.

Non proprio, è solo che le offerte sono più grandi della larghezza dello schermo - non ne ho postata una grande. Ma il fatto che si presenti sotto forma di raggruppamenti - sì. Se valga la pena di buttare via i TF superiori che tagliano così tanto le possibilità di entrata o no, è la domanda...

 
Alexander_K:

+++

Senza offesa per Alexei - mi colpisca se capisco una parola di quello che scrive. Né gli obiettivi né i metodi per raggiungerli sono chiari o comprovati. Lo spirito di Teacher, che ha passato 15 anni sulle reti neurali e ora lavora in un autolavaggio, aleggia così su di lui.

Sì, tutti camminiamo sotto Dio, non c'è particolare differenza in un autolavaggio, o in qualche manager, "cresciuto" ad uno pseudo socio, che però può anche facilmente farsi prendere a calci in culo prima della pensione e lasciare al trogolo rotto. Ora in alcune aziende in stile occidentale ci sono 30 "vice-presidenti" per 100 dipendenti, il manager medio è ora una vice-presidenza per 50.000 al mese))) È divertente e peccaminoso...

O un rischio consapevole e una minaccia reale di lavorare in un autolavaggio, ma sulla strada con più entusiasmo, interesse e avventura, o un rischio ancora maggiore ma nascosto "sotto il tappeto" "crescita di carriera", con delusione sia nel processo che nel risultato. Se nasci plebeo è meglio che abbandoni subito le speranze, ma puoi provare a "farcela", tanto non hai niente da perdere, almeno prima di morire puoi dire che hai fatto il meglio che potevi e non hai dovuto strisciare tutta la vita come uno stronzo)))

 
Aleksey Vyazmikin:

Vale la pena buttare via i TF superiori, che tagliano così tanto le possibilità di entrata, o no, questa è la domanda...

Beh, o lo si testa manualmente e si decide, o lo si ottimizza.

 
elibrario:

Beh, o sudare manualmente e decidere, o fare un po' di ottimizzazione.

Ho bisogno di scavare tra i fogli e trovare la causa, ci arriverò nei prossimi giorni - ho bisogno di riposare un po' per questo.

Finora alcuni modelli sono scossi dal tag - sembrano avere più variazioni, il che può essere interessante in termini di accoppiamento


 

Congratulazioni.

Terminale: Aggiunta API per la richiesta di dati dal terminale MetaTrader 5 tramite applicazioni che utilizzano illinguaggio R.

Abbiamo preparato un pacchetto speciale MetaTraderR. Contiene DLL per l'interazione tra R e il terminale MetaTrader 5, documentazione e file r ausiliari. Ora il pacchetto è in fase di registrazione nel repositoryCRAN, e presto sarà disponibile per il download e l'installazione.

Aspettiamo il seguito.

Buona fortuna

 
Vladimir Perervenko:

Congratulazioni.

Terminale: Aggiunta API per la richiesta di dati dal terminale MetaTrader 5 tramite applicazioni che utilizzano illinguaggio R.

Abbiamo preparato un pacchetto speciale MetaTraderR. Contiene DLL per l'interazione tra R e il terminale MetaTrader 5, documentazione e file r ausiliari. Ilpacchetto è in fase di registrazione nel repositoryCRAN e sarà disponibile per il download e l'installazione nel prossimo futuro.

Aspettiamo il seguito.

Buona fortuna

Gli sviluppatori ignorano la domanda di feedback, quindi la probabilità non è molto alta che sia...

 

Ecco un altro modo di rappresentare il comportamento dei modelli nel campione - qui per colore:

TP - classificazione corretta "1" - verde

FP - errore di classificazione "1" - rosso

FN - errore di classificazione "0" (in realtà manca "1") - blu

La dimensione dello schermo è grande - è più interessante da guardare con un clic.

E la gif sulla pressione delle due varianti cambierà per chiarezza

si può vedere che i miei modelli hanno molto poco tuffo nel mercato, come c'è un sacco di blu - abbiamo bisogno di guardare le ragioni per l'inattività. Forse dovrei cercare altri modi per fermare l'apprendimento, non solo con la precisione. Naturalmente imposterei sia la completezza che l'accuratezza a dei limiti, ma per qualche ragione sconosciuta questa opzione di fermare la formazione non è fornita dagli sviluppatori, ma è un peccato.