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

 
Et quels sont les résultats en matière de prédiction ? oserai-je demander.
 
mytarmailS:
Et quels sont les résultats en matière de prévision ? oserai-je demander.
Si vous me posez la question, je ne peux probablement pas répondre sans équivoque, il y a beaucoup de choses qui sont prédites et tout est différent. Mais en moyenne environ 60-65%.
 

Voici la feuille de calcul préparée pour l'entraînement du modèle.

Les prix sont convertis en deltas par colonnes ; colonnes supprimées sans changement ou avec NA.

Entasser 3 décalages dans chaque ligne pour chaque colonne (ligne actuelle moins précédente ; précédente moins préexistante ; préexistante moins préexistante).

Cible - valeur d'augmentation/diminution sur la ligne suivante (ligne suivante moins ligne actuelle, arrondie à +-1, ou 0 si aucun changement ; 3 classes au total). Toutes les cibles ont le préfixe "cible_".

*Aucune autre cible ne peut être utilisée pour prédire une cible, sinon ce serait un coup d'œil dans le futur. Toutes les colonnes qui sont préfixées par "target_" ne peuvent pas être utilisées comme prédicteur ou intuition.

Dossiers :
 

Problème.

Divisé le fichier csv en deux parties par lignes, ratio 10:1 pour les données d'entraînement et le fronttest. J'ai entraîné le modèle pour target_SiH7.bid (du tableau ci-dessus) et j'ai obtenu une précision de classification de 62% sur les données d'entraînement et de 74% sur les nouvelles données. J'étais content, mais en revérifiant, il s'est avéré que la classe 0 est très déséquilibrée par rapport aux autres, et juste par le montant a 60% et 74%. Autrement dit, le modèle a appris à bien détecter le 0, mais il s'est enlisé dans les classes -1 et 1.

Un score différent est nécessaire. Pour deux classes déséquilibrées, cette métrique est excellente -https://en.wikipedia.org/wiki/Cohen's_kappa, mais dans notre cas, il y a trois classes déséquilibrées, pas deux, y a-t-il un analogue de Kappa pour 3 ?

 
Jene l'aipas fait :
Si vous me posez la question, je ne peux probablement pas répondre sans ambiguïté, il y a beaucoup de choses qui sont prédites et tout est différent. Mais en moyenne environ 60-65%.

Intéressant, pouvez-vous le décrire plus en détail...

C'est juste que je suis dans un tout autre domaine de la prévision maintenant et je ne peux pas me permettre d'être dispersé donc je ne peux pas faire des expériences avec vous à cette date de mars, mais c'est très intéressant à lire et à observer, écrivez plus s'il vous plaît....

Dr. Trader:

il s'avère que la classe 0 est très déséquilibrée par rapport aux autres, et juste en termes de quantité, elle a 60% et 74%. Autrement dit, le modèle a appris à détecter très bien le 0, mais il a abandonné les classes -1 et 1.

J'ai eu le même problème lorsque j'ai entraîné ma forêt aléatoire pour les demi-tours, il y avait naturellement beaucoup moins de demi-tours que de non-tours. Plus je faisais d'arbres, plus le MO marquait des points sur les classes de virage et se concentrait davantage sur les classes de non-virage.

Il y a plusieurs méthodes dans caret pour équilibrer les classes mais toutes sont triviales - soit doubler la classe qui a moins d'observations pour aligner la somme des observations dans toutes les classes pour devenir la même ou enlever les observations inutiles de la classe qui a plus d'observations.

Aucune des méthodes n'est plus rentable que l'absence totale d'équilibrage (mais c'est uniquement mon cas).

 
mytarmailS:

Intéressant, pouvez-vous le décrire plus en détail...

Je travaille actuellement dans un domaine complètement différent de la prévision et je ne peux pas me permettre de m'égarer ; c'est pourquoi je ne peux pas faire d'expériences avec vous sur ce marché, mais c'est très intéressant à lire et à observer, écrivez-en plus...

J'ai eu le même problème lorsque je m'entraînais aux demi-tours, les demi-tours étant bien sûr beaucoup moins nombreux que les autres. Plus je faisais d'arbres, plus le MO s'embourbait dans la classe des demi-tours et se concentrait davantage sur la classe des non-tours.

Il y a plusieurs méthodes dans caret pour équilibrer les classes mais toutes sont triviales - soit doubler la classe qui a moins d'observations pour aligner la somme des observations dans toutes les classes pour devenir la même ou enlever les observations inutiles de la classe qui a plus d'observations.

Aucune de ces méthodes n'est plus rentable que l'absence totale d'équilibrage (mais c'est uniquement mon cas).

Dans caret vous pouvez changer la fonction de fitness dans la fonction de formation via un certain paramètre. Pour la classification, vous pouvez utiliser la précision ou le kappa : et pour la régression, deux variantes de votre choix, comme r^2 et autre chose. J'ai appris kappa juste à partir de là, il m'a aidé à entraîner un modèle correctement sur des classes très déséquilibrées, sans aucune opération supplémentaire.
 
Si nous discutons des renversements, alors nous devons équilibrer les classes de manière significative : pas une barre pour un renversement, mais plusieurs barres avant le renversement et plusieurs barres après le renversement. Si les classes sont déséquilibrées de toute façon, mais pas si fatale et peut être équilibré par caret
 
toxiques:

Tout est négociable. J'ai suggéré des contrats à terme sur les forts, par exemple Si, RI, BR etc. les plus liquides en général. Je suggère le signal (-1,0,1)(short,cash,long) comme résultat, le signal est non ambigu que la probabilité et pas déformépar MM comme des ordres. Le post-traitement, la signalisation et le ciblage sont à votre choix, ou à celui du livre.

Après réflexion, je suis arrivé à la conclusion qu'il faudrait ajouter au moins un verre supplémentaire{price:vol,...||..., price:vol } tel qu'il est, un dernier par seconde, pour chaque instrument prédit, alors le delta n'est pas nécessaire et bid, ask aussi, il est IMHO obligatoire, si avec la bande par seconde la répartition des volumes et le déplacement de l'OM, plus ou moins informatif, alors pour le verre un delta est très peu, au moins on devrait voir la distribution des "plaques" différentes, etc et c'est assez comme un début. Ajoutez un verre et postez un jeu de données d'entraînement pendant quelques jours, nous allons jouer. :)

 

J'ai finalement choisi la métrique duPi de Scotthttps://en.wikipedia.org/wiki/Scott's_Pi

Voici mes résultats avec cette estimation, j'ai entraîné le modèle sur les 91% de lignes restantes, puis j'ai fait un fronttest sur les dernières données restantes (ratio backtest : fronttest = 10:1).
colonne "class_0_rate" dans le tableau - rapport entre la classe 0 et les classes -1et1, afin de pouvoir trier dans Excel les résultats où cette valeur est trop élevée.

Les deux dernières colonnes sont la métrique Pi de Scott pour la formation et le test, la valeur sera comprise entre -1 et 1 ; où 0=le résultat est aléatoire et le modèle est inutile, et 1 = tout va bien. Un résultat négatif n'est pas bon, corrélation inverse, vous pouvez essayer d'inverser le résultat de la prédiction. La corrélation inverse fonctionne parfois très bien avec deux classes lorsque l'on négocie l'exact opposé de la prédiction. Mais avec trois classes, il est difficile de trouver l'opposé, chaque classe a deux valeurs opposées et dans ce cas, la valeur négative est également mauvaise.

Je pense que nous devons choisir la devise dont les prédictions d'offre (ou de demande) ont des valeurs similaires et élevées dans le backtest et le fronttest, par exemple xagusd. Bien qu'un score de 0,18 sur une échelle de 0 à 1 soit faible. Et prévoir un tick d'avance dans le commerce réel est également mauvais. En général, il y a un résultat, mais il n'est pas applicable :)

Code R pour le Pi de Scott

ScottsPi <- function(act, pred){
  if(length(act) != length(pred)){
    stop("different length")
  }
  
  n_observ <- length(act)
  
  all_levels <- unique(c(act,pred))
  n_levels <- length(all_levels)
  
  marginal_matrix <- matrix(NA, ncol=n_levels, nrow=n_levels)
  colnames(marginal_matrix) <- all_levels
  rownames(marginal_matrix) <- all_levels
  
  for(i in 1:n_levels){
    for(j in 1:n_levels){
      marginal_matrix[i,j] <- sum((act==all_levels[i]) & (pred==all_levels[j]))
    }
  }
  diagSum <- 0
  for(i in 1:n_levels){
    diagSum <- diagSum + marginal_matrix[i,i]
  }
  diagSum <- diagSum / n_observ
  
  marginalSum <- 0
  for(i in 1:n_levels){
    marginalSum <- marginalSum + ((sum(marginal_matrix[i,]) + sum(marginal_matrix[,i]))/n_observ/2)^2
  }
  p <- marginalSum
  return((diagSum - p)/(1-p))
}
Dossiers :
 
Dr. Trader:

J'ai finalement choisi la métriquePi de Scotthttps://en.wikipedia.org/wiki/Scott's_Pi

Voici mes résultats avec cette estimation, j'ai entraîné le modèle sur les 91% de lignes restantes, puis j'ai fait un fronttest sur les dernières données restantes (ratio backtest : fronttest = 10:1).
colonne "class_0_rate" dans le tableau - rapport entre la classe 0 et les classes -1et1, afin de pouvoir trier dans Excel les résultats où cette valeur est trop élevée.

Les deux dernières colonnes sont la métrique Pi de Scott pour la formation et le test, la valeur sera comprise entre -1 et 1 ; où 0=le résultat est aléatoire et le modèle est inutile, et 1 = tout va bien. Un résultat négatif n'est pas bon, corrélation inverse, vous pouvez essayer d'inverser le résultat de la prédiction. La corrélation inverse fonctionne parfois très bien avec deux classes lorsque l'on négocie l'exact opposé de la prédiction. Mais avec trois classes, il est difficile de trouver le contraire, chaque classe a deux valeurs opposées et dans ce cas, la valeur négative est également mauvaise.

Je pense que nous devons choisir la devise dont les prédictions d'offre (ou de demande) ont des valeurs similaires et élevées dans le backtest et le fronttest, par exemple xagusd. Bien qu'un score de 0,18 sur une échelle de 0 à 1 soit faible. Et prévoir un tick d'avance dans le commerce réel est également mauvais. En général, il y a un résultat, mais il n'est pas applicable :)

Code R pour le Pi de Scott

ScottsPi <- function(act, pred){
  if(length(act) != length(pred)){
    stop("different length")
  }
  
  n_observ <- length(act)
  
  all_levels <- unique(c(act,pred))
  n_levels <- length(all_levels)
  
  marginal_matrix <- matrix(NA, ncol=n_levels, nrow=n_levels)
  colnames(marginal_matrix) <- all_levels
  rownames(marginal_matrix) <- all_levels
  
  for(i in 1:n_levels){
    for(j in 1:n_levels){
      marginal_matrix[i,j] <- sum((act==all_levels[i]) & (pred==all_levels[j]))
    }
  }
  diagSum <- 0
  for(i in 1:n_levels){
    diagSum <- diagSum + marginal_matrix[i,i]
  }
  diagSum <- diagSum / n_observ
  
  marginalSum <- 0
  for(i in 1:n_levels){
    marginalSum <- marginalSum + ((sum(marginal_matrix[i,]) + sum(marginal_matrix[,i]))/n_observ/2)^2
  }
  p <- marginalSum
  return((diagSum - p)/(1-p))
}
Les données sont très peu nombreuses, mon ami accroche un jeu de données normal, mais quelque part il s'est perdu. Dr Trader : Il n'y a pas beaucoup de données, mais elles sont perdues quelque part. Et si vous n'êtes pas précis, bien sûr pour le tick ahead c'est vraiment inutile, au moins une minute à l'avance, dans les passes une minute c'est du pur MM, des limiteurs des deux côtés, à une distance proportionnelle au spread, ici "mousse quantique", pas la peine de parler de direction, car elle est bien inférieure au spread.