L'apprentissage automatique dans la négociation : théorie, modèles, pratique et algo-trading - page 1341

 

Code de script, si quelqu'un est intéressé - hélas, pas de cours

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);
  }
 

A fait une analyse de modèles parallèles, c'est-à-dire montre les points d'activation de seuil (par défaut 0.5) sur l'échantillon de test.

On peut voir que les modèles sont assez similaires en général, mais une autre chose qui surprend est les très grands intervalles de temps où aucune activation n'a eu lieu. Peut-être que la raison est un prédicteur qui prend des informations de la barre mensuelle...

 
Aleksey Vyazmikin:

A fait une analyse de modèles parallèles, c'est-à-dire montre les points d'activation de seuil (par défaut 0.5) sur l'échantillon de test.

On peut voir que les modèles sont assez similaires en général, mais une autre chose qui surprend est les très grands intervalles de temps où aucune activation n'a eu lieu. Peut-être que la raison se trouve dans un prédicteur qui prend des informations de la barre mensuelle...

Et ensuite plusieurs transactions d'affilée sur chaque barre ? J'ai eu un problème similaire avec NS. La conclusion est similaire - le grand TF influence, tandis que les petits le complètent.
 
elibrarius:
Et ensuite un tas de transactions d'affilée sur chaque barre ? J'ai eu un cas similaire, avec NS. La conclusion est similaire - le grand TF exerce une influence, et les petits le complètent.

Pas vraiment, c'est juste que les offres sont plus grandes que la largeur de l'écran - je n'en ai pas posté une grande. Mais, le fait que cela se produise sous la forme de groupements - oui. La question est de savoir si cela vaut la peine d'éliminer les TF supérieures qui réduisent autant les possibilités d'entrée ou non...

 
Alexander_K:

+++

Sans vouloir offenser Alexei, je suis mort si je comprends un seul mot de ce qu'il écrit. Ni les objectifs ni les méthodes pour les atteindre ne sont clairs ou justifiés. L'esprit de Teacher, qui a passé 15 ans sur les réseaux neuronaux et qui travaille maintenant dans une station de lavage de voitures, plane sur lui.

Oui, nous marchons tous sous Dieu, il n'y a pas de différence particulière à une station de lavage de voitures, ou à un quelconque manager, "adulte" à un pseudo-partenaire, qui, pourtant, peut tout aussi bien se faire botter le cul avant la retraite et le laisser à l'auge brisée. Aujourd'hui, dans certaines entreprises de style occidental, il y a 30 "vice-présidents" pour 100 employés, le cadre moyen est maintenant une vice-présidence pour 50 000 par mois ;))) C'est drôle et c'est un péché...

Soit un risque conscient et une menace réelle de travailler dans une station de lavage, mais en chemin avec plus d'enthousiasme, d'intérêt et d'aventure, soit un risque encore plus grand mais caché "sous le tapis" "d'évolution de carrière", avec une déception tant dans le processus que dans le résultat. Si vous êtes né plébéien, il vaut mieux perdre tout espoir tout de suite, mais vous pouvez essayer de "réussir", vous n'avez rien à perdre de toute façon, au moins avant de mourir vous pouvez dire que vous avez fait de votre mieux et que vous n'avez pas eu à ramper toute votre vie comme une salope)))).

 
Aleksey Vyazmikin:

Cela vaut-il la peine de jeter les TF supérieurs, qui réduisent tellement les possibilités d'entrée, ou non, telle est la question...

Eh bien, il faut soit le tester manuellement et décider, soit l'optimiser.

 
elibrarius:

Eh bien, soit vous transpirez manuellement et vous décidez, soit vous faites de l'optimisation.

Je dois fouiller dans les feuilles et trouver la cause, je vais m'y atteler dans les prochains jours - je dois me reposer pour cela.

Jusqu'à présent, quelques modèles sont ébranlés par le marquage - il semble qu'ils présentent plus de variations, ce qui peut être intéressant en termes d'appariement.


 

Félicitations.

Terminal : Ajout d'une API pour demander des données au terminal MetaTrader 5 via des applications utilisant lelangage R.

Nous avons préparé un paquet spécial MetaTraderR. Il contient une DLL pour l'interaction entre R et le terminal MetaTrader 5, une documentation et des fichiers r auxiliaires. Lepaquet est actuellement en cours d'enregistrement dans le dépôtCRAN, et il sera bientôt disponible pour le téléchargement et l'installation.

Attendons la suite.

Bonne chance

 
Vladimir Perervenko:

Félicitations.

Terminal : Ajout d'une API pour demander des données au terminal MetaTrader 5 via des applications utilisant lelangage R.

Nous avons préparé un paquet spécial MetaTraderR. Il contient une DLL pour l'interaction entre R et le terminal MetaTrader 5, une documentation et des fichiers r auxiliaires. Le paquet est en cours d'enregistrement dans le dépôtCRAN et sera disponible pour le téléchargement et l'installation dans un avenir proche.

Attendons la suite.

Bonne chance

Les développeurs ignorent la question du retour d'information, donc la probabilité n'est pas très élevée que ce soit...

 

Voici une autre façon de représenter le comportement des modèles de l'échantillon - ici par couleur :

TP - classification correcte "1" - vert

FP - erreur de classification "1" - rouge

FN - classification erronée "0" (en fait, il manque "1") - bleu

La taille de l'écran est grande - il est plus intéressant de regarder en cliquant.

Et le gif sur la pression des deux variantes va changer pour plus de clarté.

on peut constater que mes modèles ont très peu d'immersion sur le marché, car il y a beaucoup de bleu - nous devons examiner les raisons de cette inactivité. Je devrais peut-être chercher d'autres moyens d'arrêter l'apprentissage, pas seulement par la précision. J'aurais bien sûr fixé des limites à l'exhaustivité et à la précision, mais pour une raison inconnue, cette option d'arrêt de la formation n'est pas fournie par les développeurs, mais c'est dommage.