L'Apprentissage Automatique dans le trading : théorie, modèles, pratique et trading algo - page 2065

 
Evgeniy Chumakov:

En supposant qu'il n'y a pas de trous dans l'historique et qu'il y a 1440 minutes dans tous les jours (moins le vendredi), le code devrait être comme ceci

Il y a des écarts même dans l'eurusd. Travailler avec le temps de la barre
 
elibrarius:
Les écarts se produisent même sur eurusd. Travailler avec l'heure du bar


C'est compréhensible, si c'était le cas, c'est ce que je ferais. C'est juste pour faciliter l'explication.

 

D'une certaine manière, cela semble fonctionner) Pour sauvegarder, une nouvelle ligne est collectée dans rates[i].high

#property script_show_inputs
//+------------------------------------------------------------------+
input datetime tstart = D'2020.5.1 00:00';  // начало промежутка исследуемого времени
input datetime tstop = D'2020.10.1 00:00';   // конец промежутка исследуемого времени
string zztn = "dvol\\" + _Symbol + ".txt"; // text file name
//+------------------------------------------------------------------+
#define  NM 1440
ulong NSM = 60;
ulong NSD = 60 * 1440;
//+------------------------------------------------------------------+
void OnStart()
{
  MqlRates rates[];
  double vol[NM] = {0.0}, d;
  int n[NM] = {0}, t;
  int nprice = CopyRates(Symbol(), PERIOD_M1, tstart, tstop, rates);
  for(int i = 0; i < nprice; ++i)
  {
    t = (int)((((ulong)rates[i].time) % NSD) / NSM);
    d = rates[i].close - rates[i].open;
    ++n[t];
    vol[t] += d * d;
  }
  for(int i = 0; i < NM; ++i)
  {
    if(n[i] > 1) vol[i] /= n[i];
    vol[i] = sqrt(vol[i]);
  }
  for(int i = 0; i < nprice; ++i)
  {
    t = (int)((((ulong)rates[i].time) % NSD) / NSM);
    if(vol[t] > 0) rates[i].high = (rates[i].close - rates[i].open) / vol[t];
    if(i > 0) rates[i].high += rates[i - 1].high;
  }
  int ft = FileOpen(zztn, FILE_WRITE | FILE_COMMON | FILE_ANSI | FILE_TXT);
  FileWriteString(ft, "t p");
  for(int i = 0; i < nprice; ++i)
    FileWriteString(ft, "\n" + (string)((ulong)rates[i].time) + " "  + (string)rates[i].high);
  FileClose(ft);
}
 
Aleksey Nikolayev:

D'une certaine manière, cela semble fonctionner) Pour sauvegarder, la nouvelle ligne est collectée dans rates[i].high

Vous normalisez les barres passées, par exemple de 2020.5.1 00:00 aux barres du futur, c 2020.10.1 00:00 et celles entre les deux.
Vous ne pouvez pas le faire sur le marché réel.
Vous devez faire le même calcul pour chaque barre, mais seulement pour les barres passées.

 
Aleksey Nikolayev:

D'une manière ou d'une autre, cela semble fonctionner) Afin de sauvegarder, une nouvelle ligne est collectée dans rates[i].high

Même si vous le faites correctement, vous pouvez reconstruire très précisément ces hauteurs de chandeliers normalisées avec net/forest.
Nous utilisons 60 hauteurs de chandeliers avec décalage du jour, et nous enseignons les hauteurs normalisées obtenues dans votre code.
La formation devrait être proche de 100% de précision.

C'est-à-dire des hauteurs de chandeliers normalisées qui ne contiennent pas de nouvelles informations.
Le seul avantage est qu'il n'est pas nécessaire de passer 60 fonctions supplémentaires pour la formation du modèle.
Il est peu probable que quelqu'un soumette comme fiches des barres vieilles de 2 mois, c'est-à-dire des informations nouvelles pour ceux qui ne les ont pas déposées, il y en a encore).

Bien sûr, nous devrions vérifier si ces hauteurs de chandeliers normalisées amélioreront les performances du modèle, et bien sûr nous devrions l'utiliser (ou l'un de vos jetons, ce qui est plus préférable, ou le 60e dont il est composé).

 
Vérifions déjà quelque chose, sinon trois pages ont été écrites, de l'énergie a été gaspillée, et l'incrément de l'erreur, Dieu nous en préserve, est d'un demi pour cent.
 
elibrarius:

C'est étrange. Je me demande comment on pourrait l'expliquer ?
J'ai une autre version commentée, mais je ne l'ai pas aimée pour des raisons logiques :

Quel RandomInteger() utilisez-vous ? Je suis XOR.

Je ne sais pas comment expliquer :)

J'ai pris cette fonction

int RandomInteger(int max_vl)
{
   return (int)MathFloor((MathRand()+MathRand()*32767.0)/1073741824.0*max_vl);  //случайное Int от 0 до  1073741824
}
 

Maxim, je soupçonne que le modèle pour C++ n'est pas correctement déchargé de CatBoost - pouvez-vous comparer avec le modèle pour python ?

J'ai une divergence entre les valeurs d'interprétation du modèle dans MQL5 où les valeurs sont prises dans le modèle CPP et les valeurs du modèle binaire. Le delta est d'environ 0,15 - ce qui est beaucoup.

 
elibrarius:

Vous normalisez les mesures passées, par exemple de 2020.5.1 00:00 aux mesures futures, de 2020.10.1 00:00 et celles entre les deux.
On ne fait pas ça dans le monde réel.
Vous devez faire à peu près le même calcul à partir de chaque barre, mais uniquement à partir des barres passées pour celle-ci.

Oui, le regard vers l'avenir est là, ainsi que d'autres problèmes qui ne sont pas immédiatement évidents. Il n'est pas tout à fait applicable pour une négociation directe, mais il est irremplaçable pour une analyse préliminaire. Par exemple, la corrélation entre les incréments non pertinents n'a aucun sens.

 
Aleksey Nikolayev:

Oui, il y a un aperçu de l'avenir, ainsi que d'autres problèmes qui ne sont pas immédiatement évidents. Pour le trading direct, il n'est pas tout à fait applicable, mais pour l'analyse préliminaire, il est indispensable. Par exemple, cela n'a aucun sens de calculer la corrélation entre des incréments non relatifs.

Je vais en tenir compte et peut-être qu'un jour je le referai pour les barres précédentes et je vérifierai si cela améliore la capacité d'entraînement.
Si quelqu'un l'a déjà vérifié, faites-le moi savoir.

Quelle est l'analyse préliminaire ? Vous alimentez le modèle en entrée et le comparez avec ou sans cette fonctionnalité.

Je pense que c'est mieux de le normaliser par les 30 dernières minutes.
Comme alternative, 30 dernières minutes de ce jour et 5 jours précédents de 30 minutes.

Compte tenu de la façon dont la volatilité a évolué en mars, votre variante mettra très longtemps à s'adapter, un mois ou un mois et demi après, les valeurs actuelles seront beaucoup plus élevées qu'il y a un mois ou deux. Par conséquent, le modèle travaillera dans une zone inconnue. Elle ne disposera tout simplement pas d'exemples de ces travaux sur la base desquels elle pourra faire des prévisions.

Avec la normalisation au cours de la dernière semaine, il apprendra plus rapidement les nouvelles règles du jeu.