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

 
Alexey Burnakov:
  • J'essaierai de sélectionner les modèles sur la base de la VF maximale (actuellement, je sélectionne les modèles par MO). C'est-à-dire que je vais changer la fonction d'évaluation de la qualité du modèle. HZ....

La bonne fonction pour évaluer la qualité du modèle est très importante, car ce que nous recherchons et essayons de maximiser est ce que nous obtenons au final. Si vous utilisez la précision du modèle, il est facile de glisser vers un maximum local où le modèle renvoie toujours la classe ayant le plus grand nombre d'exemples. Pour les données de formation avec des classes non équilibrées, il est préférable d'utiliser le F-score ou le Kappa de Cohen. Mais même avec eux, j'ai eu des problèmes, car l'augmentation du prix par barre peut être différente, et même en ayant une estimation positive, vous pouvez être dans le négatif - le nombre de trades gagnants sera plus important que les trades perdants, mais quelques trades perdants peuvent avoir des pertes importantes et irrécupérables. La simulation de trading, et l'évaluation du modèle sur la base des résultats de trading est la bonne chose à faire, je suis d'accord avec vous, j'ai récemment commencé à le faire aussi. Besoin de rentabilité avec un faible drawdown - l'évaluation du modèle doit donc utiliser ces concepts.

Je pense que le MO n'est pas un bon choix car il ne prend pas en compte le drawdown, qui est important. De toutes les fonctions disponibles pour estimer les EA dans MT5, je préfère le facteur de récupération et le ratio de Sharpe.
Le facteur de récupération est le bénéfice total divisé par le prélèvement maximal pour toute la période. Assez simple, mais efficace.
Ratio de Sharpe - de nombreuses descriptions sur Internet, mais je n'ai pas trouvé beaucoup de formules. Il y a un code pour MT4, je pense que nous devrions le transférer à R et l'essayer.

double GetSharpeRatioFromHistory(double riskFreeYearlyIncome = 0.01){
   double profitsArray[];
   int profitsArraySize = 0;
   
   double profitsAvg = 0.0;
   int profitsAvgCount = 0;
   
   int ordersHistoryTotal = OrdersHistoryTotal();
   if(ordersHistoryTotal == 0){
      return 0.0;
   }
   for(int i=0; i<ordersHistoryTotal; i++){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
         if((OrderSymbol() == _Symbol) && (OrderMagicNumber() == magic)){
            double profitForTrade = (OrderProfit() + OrderCommission() + OrderSwap());
            double seconds = double(OrderCloseTime() - OrderOpenTime());
            double riskFreeRate = riskFreeYearlyIncome / double(365*24*60*60) * seconds;
            double tradeResult = profitForTrade - riskFreeRate;
            
            profitsArraySize = ArrayResize(profitsArray, profitsArraySize+1);
            if(profitsArraySize>0){
               profitsArray[profitsArraySize-1] = tradeResult;
            }
            
            profitsAvg += tradeResult;
            profitsAvgCount++;
         }
      }
   }
   
   if(profitsArraySize == 0){
      return 0.0;
   }
   
   profitsAvg /= double(profitsAvgCount);
   
   double stdDev = 0.0;
   for(int i=0; i<profitsArraySize; i++){
      stdDev += ((profitsArray[i]-profitsAvg)*(profitsArray[i]-profitsAvg)/double(profitsArraySize));
   }
   
   if(stdDev == 0.0){
      return 0.0;
   }

   return profitsAvg/stdDev;
}

Le paramètre riskFreeYearlyIncome - rendement annuel pour un investissement sans risque (dépôt bancaire), dans l'exemple il est de 1%. Le ratio de Sharpe tient compte de l'avantage de la stratégie par rapport à un tel investissement.
double seconds = double(OrderCloseTime() - OrderOpenTime()) - la durée d'ouverture d'une transaction en secondes. Pour le trading de barres, il s'agit respectivement du nombre de secondes dans une barre.

 
Dr.Trader:

1) La bonne fonction pour évaluer la qualité du modèle est très importante, car ce que nous recherchons et essayons de maximiser, c'est ce que nous obtenons au final.

2) Mais même avec eux, j'ai eu des problèmes, parce que l'augmentation des prix par barre peut être différente, et même en ayant une évaluation positive, vous pouvez être dans le négatif - le nombre de trades gagnants sera plus que perdants, mais quelques trades perdants peuvent avoir une perte importante et irrécupérable.

3) Simuler une transaction, et évaluer le modèle sur la base des résultats de la transaction est la bonne chose à faire, je suis d'accord avec vous, j'ai récemment commencé à le faire aussi. Vous avez besoin de rentabilité avec un faible drawdown - l'évaluation du modèle doit donc utiliser ces concepts.

4)

Je pense que le MO n'est pas un bon choix car il ne prend pas en compte le drawdown qui est important. Mes fonctions préférées dans MT5 sont le facteur de récupération et le ratio de Sharpe.
Le facteur de récupération est le bénéfice total divisé par le prélèvement maximal pour toute la période. Assez simple, mais efficace.
Ratio de Sharpe - de nombreuses descriptions sur Internet, mais je n'ai pas trouvé beaucoup de formules. Il existe un tel code pour MT4, je pense que nous devrions le transférer à R et essayer.


1) Absolument

2) exactement.

3) Oui, cela permet de se débarrasser du biais du point de départ de l'évaluation.

4) FS est le facteur de récupération. J'ai beaucoup de respect pour elle en général. Je vais le mettre dans la fonction d'estimation, c'est facile.

Sharpe. C'est facile ! J'explique.

a) Vous obtenez un vecteur de résultats de transaction en pips, n'est-ce pas ?

b) Vous devez simuler le trading avec REINVESTMENT et convertir le vecteur de points en un vecteur d'incréments en pourcentage du dépôt. Exemple. On commence avec 100 000 dollars. Nous avons échangé 0,1 lot et obtenu 0,001 (dix points). C'est 10 dollars par lot. Cette valeur se transforme donc en 10 / 100 000. Et ainsi de suite, en tenant compte de l'augmentation ou de la diminution du lot.

c) En utilisant le vecteur résultant des augmentations de pourcentage, calculer : la moyenne, l'écart-type.

d) Entrez un certain rendement sans risque par an (3%) - le nombre est conditionnel, un petit nombre.

e) Soit vous traduisez vos transactions en revenu annuel moyen, soit vous décomposez le rendement sans risque par an par le rendement moyen par transaction. C'est fait.

f) (votre rendement moyen par transaction (par période) - rendement sans risque) / écart type

Je n'ai pas encore le code pour R. Mais il ne devrait pas être difficile d'écrire une telle fonction.

 

Sur les marchés financiers, tout est recyclé ! Même ce qu'on dit ne pas être recyclé est recyclé.

La régression linéaire robuste est moins entraînée, mais donne une qualité d'apprentissage tellement merdique qu'elle est également merdique dans l'exprapolation à de nouvelles données.

 
Alexey Burnakov:

Votre idée de catégoriser les gains de prix est pour moi, depuis le début, une idée purement émotionnelle. Si nous prédisons des tendances, nous regardons ZZ et c'est clair : voici une classe et voici une autre classe. Si l'on regarde le graphique de l'augmentation des prix, il est chaotique et tourne autour de zéro. Où sont les classes clairement visibles ici ?

C'est par pure émotion que j'accorde une grande importance aux statistiques - tout devrait être clair et évident sans mathématiques.

De plus, pour les hausses de prix sur les marchés financiers, le modèle ARIMA-ARCH a été développé depuis de nombreuses années et fonctionne assez bien. Cet opéra a même des modèles qui tiennent compte de Hearst. Qu'est-ce qui est mieux qu'une classification ?

La classification concerne les modèles - "tête et épaules", dont la recherche a été automatisée et qui prédisent une classe clairement visible. Avec la classification, nous trouvons un modèle (sous la forme d'un arbre, par exemple) et nous disons : "après ce modèle, il y aura une croissance. Si nous avons formulé correctement la variable cible, elle le fera. Ici, ZZ n'est pas la bonne variable cible. L'idée ici était de prédire une croissance future de 100 pips. Une telle variable cible me semble beaucoup plus correcte.

Conclusion. Nous devrions commencer par la variable cible, la cible est toujours notre tout, les fausses cibles mènent au marécage.

 
SanSanych Fomenko:

Votre idée de catégoriser les gains de prix est pour moi, depuis le début, une idée purement émotionnelle. Si nous prédisons des tendances, nous regardons ZZ et c'est clair : voici une classe et voici une autre classe. Si l'on regarde le graphique de l'augmentation des prix, il est chaotique et tourne autour de zéro. Où sont les classes clairement visibles ici ?

C'est par pure émotion que j'accorde une grande importance aux statistiques - tout devrait être clair et évident sans mathématiques.

En outre, pour les hausses de prix sur les marchés financiers, le modèle ARIMA-ARCH a été développé depuis de nombreuses années et fonctionne assez bien. Cet opéra a même des modèles qui tiennent compte de Hearst. Qu'est-ce qui est mieux qu'une classification ?

La classification concerne les modèles - "tête et épaules", dont la recherche a été automatisée et qui prédisent une classe clairement visible. Avec la classification, nous trouvons un modèle (sous la forme d'un arbre, par exemple) et nous disons : "après ce modèle, il y aura une croissance. Si nous avons formulé correctement la variable cible, elle le fera. Ici, ZZ n'est pas la bonne variable cible. L'idée ici était de prédire une croissance future de 100 pips. Une telle variable cible me semble beaucoup plus correcte.

Conclusion. Vous devez commencer par la variable cible, comme toujours la cible est notre tout, les fausses cibles mènent au marécage.

Je ne vois pas ce qu'il y a d'émotionnel dans tout ça. C'est une façon de voir les choses. La couleur de la bougie est également appelée ainsi.

Permettez-moi de vous rappeler que les tâches de régression et de classification étaient un passage obligé avant l'étape de la construction d'un système rentable.

De plus, j'en suis arrivé au point où je prédis non seulement le signe de la croissance, mais aussi une croissance avec un module plus important. C'est-à-dire qu'on n'achète que là où le système prévoit une forte croissance, et pas seulement une croissance. Aussi avec la vente. Techniquement, la machine apprend la régression. Et ensuite j'interprète sa sortie comme un haut fort, un bas fort, se balançant dans un canal.

Ceci est très proche de la prévision d'une future hausse de 100 pips. Seulement, je ne vois pas très bien moi-même comment vous envisagez la formalisation d'un tel ciblage. Qu'est-ce que cela signifie si avant la croissance il y avait une baisse de 90 pips, et si cette croissance est atteinte seulement en une semaine ?

À mon horizon de 9 heures, une forte hausse se situe aux alentours de 20 pips. Après 9 heures, la transaction est fermée.

Et en fait, je ne prédis pas du tout la classe maintenant (montée / descente / bavardage / forte montée). Je suis en fait en train de construire un système dont la note dans la phase d'apprentissage est mesurée par l'attente de maturité du métier. En d'autres termes, la précision du classement peut être faible (53 % pour moi), mais le fait de frapper dans la bonne direction donne un gain légèrement supérieur à celui de ne pas frapper. Ressentez-vous la différence dans l'énoncé du problème ? La précision de la classification est en corrélation mais ne coïncide pas totalement avec la rentabilité du commerce.

 

D'ailleurs, le facteur de récupération en fonction de l'évaluation de la qualité du modèle est également déséquilibré. Je peux avoir 10 transactions et 1 transaction perdante, ou 500 transactions et 10 transactions perdantes. Dans le second cas, le FS peut être inférieur et le bénéfice 50 fois plus élevé.

Vous pouvez également prendre le profit total et en soustraire le drawdown maximum. Ici au moins, le profit sera maximisé.

Ou encore le traditionnel facteur de rentabilité : bénéfice total / perte totale.

 
Alexey Burnakov:

Dans le second cas, le FS peut être inférieur et le bénéfice 50 fois plus élevé.

Tout dépend du risque que vous voulez prendre. Par exemple, il y a deux signaux : le premier apporte 100% de profit par an avec un drawdown maximum de 10%. Le deuxième signal représente 300 % du bénéfice avec un drawdown de 40 %. Donc, le deuxième signal est la conduite par les bénéfices.
Mais si vous calculez la PV, le leader sera le premier signal, et il a raison, car vous pouvez simplement augmenter la taille des transactions (en lots) du premier signal en quatre fois, ce qui donnera le même drawdown que le deuxième signal, mais avec des profits plus importants. Ou si vous ne voulez pas risquer un grand pourcentage du solde du compte, vous pouvez réduire la taille des lots du second signal par 4 fois, ce qui donnera le risque désiré de 10% du solde, mais le bénéfice sera également inférieur à celui du premier signal.

En d'autres termes, le plan de trading de la stratégie peut être le suivant : déterminer le drawdown maximum possible par la stratégie roll forward ; calculer combien de fois ce drawdown est supérieur/inférieur à la valeur autorisée pour le solde de votre compte ; calculer la taille du lot pour que ces nombres convergent.
L'utilisation de FS implique qu'avant de commencer à trader, vous calculerez tous les risques et déterminerez une taille de lot appropriée. Plus le drawdown de la stratégie est faible lors de la négociation, plus la taille de la transaction peut être importante.

 
Alexey Burnakov:

Ou encore le facteur de rentabilité traditionnel : bénéfice total/perte totale.

IMHO, plus acceptable est :

criterion_evaluation_TC = total_profitable_transactions / (total_profitable_transactions + total_loss_transactions)

à condition que la négociation se fasse avec un lot fixe.

Dans ce cas, si le critère est supérieur à 0,5, alors le TS a réalisé un bénéfice total, sinon une perte.

L'avantage de ce critère est qu'il est strictement rationné et que sa valeur ne peut dépasser la fourchette de 0 à 1,0 inclus.

Les drawdowns, même en dépit du profit final du système de trading, influencent ce critère de manière négative, c'est-à-dire qu'ils sont considérés comme un facteur négatif.

 
Yury Reshetov:

IMHO, plus acceptable est :

criterion_evaluation_TC = total_profitable_transactions / (total_profitable_transactions + total_loss_transactions)

à condition de négocier avec un lot fixe.

Dans ce cas, si le critère est supérieur à 0,5, alors le TS a réalisé un bénéfice final, sinon une perte.

L'avantage de ce critère est qu'il est strictement rationné et que sa valeur ne peut dépasser la fourchette de 0 à 1,0 inclus.

Les drawdowns, même en dépit du bénéfice final de la transaction, influencent ce critère de manière négative, c'est-à-dire qu'ils sont considérés comme un facteur négatif.

"Le_montant_des_marchés_perdus" - laissez-moi clarifier, je veux dire la valeur absolue. Merci, je n'avais jamais vu un tel critère normalisé auparavant.
 
Yury Reshetov:

IMHO, plus acceptable est :

criterion_evaluation_TC = total_profitable_transactions / (total_profitable_transactions + total_loss_transactions)

à condition de négocier avec un lot fixe.

Dans ce cas, si le critère est supérieur à 0,5, alors le TS a réalisé un bénéfice final, sinon une perte.

L'avantage de ce critère est qu'il est strictement rationné et que sa valeur ne peut dépasser la fourchette de 0 à 1,0 inclus.

Les drawdowns, même en dépit du bénéfice final de la transaction, influencent ce critère de manière négative, c'est-à-dire qu'ils sont considérés comme un facteur négatif.

Que se passe-t-il si nous obtenons le principal bénéfice en quelques transactions, alors que des milliers d'autres transactions subissent de petites pertes ? - Je ne pense pas que ce soit une bonne idée.