Maschinelles Lernen im Handel: Theorie, Modelle, Praxis und Algo-Trading - Seite 261

 
Und wie lauten die Ergebnisse der Vorhersagen? wage ich zu fragen.
 
mytarmailS:
Und was sind die Ergebnisse bei der Vorhersage? wage ich zu fragen.
Wenn Sie mich fragen, kann ich wahrscheinlich keine eindeutige Antwort geben, denn es gibt viele Vorhersagen und alles ist anders. Aber im Durchschnitt sind es etwa 60-65%.
 

Hier ist das vorbereitete Arbeitsblatt für das Modelltraining.

Preise werden spaltenweise in Deltas umgewandelt; entfernte Spalten ohne Änderungen oder mit NA.

In jede Zeile jeder Spalte wurden 3 Verzögerungen eingefügt (aktuelle Zeile minus vorhergehende; vorhergehende minus vorbestehende; vorbestehende minus vorbestehende)

Ziel - Erhöhung/Verringerung des Wertes in der nächsten Zeile (nächste Zeile minus aktuelle Zeile, gerundet auf +-1, oder 0, wenn keine Änderung; insgesamt 3 Klassen). Alle Ziele haben das Präfix "target_".

*Es dürfen keine anderen Ziele für die Vorhersage eines Ziels verwendet werden, sonst wäre es ein Blick in die Zukunft. Alle Spalten, denen das Präfix "target_" vorangestellt ist, können nicht als Prädiktor oder Intu verwendet werden.

Dateien:
 

Problem.

Die csv-Datei wurde zeilenweise in zwei Teile geteilt, im Verhältnis 10:1 für Trainingsdaten und Fronttest. Ich habe das Modell für target_SiH7.bid (aus der obigen Tabelle) trainiert und eine Klassifizierungsgenauigkeit von 62 % bei den Trainingsdaten und 74 % bei den neuen Daten erhalten. War glücklich, aber doppelt überprüft, stellte sich heraus, dass Klasse 0 ist sehr unausgewogen in Bezug auf andere, und nur durch den Betrag hat 60% und 74%. Das heißt, das Modell hat gelernt, 0 gut zu erkennen, aber es hat sich bei den Klassen -1 und 1 festgefahren.

Es ist eine andere Bewertung erforderlich. Für zwei unausgewogene Klassen ist diese Metrik großartig -https://en.wikipedia.org/wiki/Cohen's_kappa, aber in unserem Fall gibt es drei unausgewogene Klassen, nicht zwei, gibt es ein Kappa-Analogon für 3?

 
Das habe ichnicht:
Wenn Sie mich fragen, kann ich wahrscheinlich keine eindeutige Antwort geben, denn es gibt sehr viele Dinge, die vorhergesagt werden, und alles ist anders. Aber im Durchschnitt sind es etwa 60-65%.

Interessant, können Sie das genauer beschreiben...

Es ist nur so, dass ich jetzt in einem ganz anderen Bereich der Vorhersage tätig bin und ich kann es mir nicht leisten, zerstreut zu sein, also kann ich an diesem Märztermin keine Experimente mit Ihnen machen, aber es ist sehr interessant zu lesen und zu beobachten, schreiben Sie bitte mehr...

Dr. Trader:

Es stellt sich heraus, dass die Klasse 0 im Verhältnis zu den anderen sehr unausgewogen ist und allein in Bezug auf die Menge 60 % und 74 % beträgt. Das heißt, das Modell hat gelernt, 0 sehr gut zu erkennen, hat aber bei den Klassen -1 und 1 aufgegeben.

Ich hatte das gleiche Problem, als ich meinen Random Forest auf U-Turns trainierte, es gab natürlich viel weniger U-Turns als Nicht-U-Turns. Je mehr Bäume ich machte, desto mehr punktete die MO bei den Zugklassen und konzentrierte sich mehr auf die Nicht-Zugklassen.

Es gibt mehrere Methoden in caret , um Klassen auszugleichen, aber alle sind trivial - entweder verdoppeln Sie die Klasse, die weniger Beobachtungen hat, um die Summe der Beobachtungen in allen Klassen anzugleichen, um das Gleiche zu erhalten, oder umgekehrt entfernen Sie überflüssige Beobachtungen aus der Klasse, die mehr Beobachtungen hat.

Keine der Methoden ist rentabler, als überhaupt nicht auszugleichen (aber das gilt nur für meinen Fall).

 
mytarmailS:

Interessant, können Sie das genauer beschreiben...

Ich arbeite gerade in einem ganz anderen Bereich der Vorhersage und kann es mir nicht leisten, mich zu verirren, deshalb kann ich keine Experimente mit Ihnen auf diesem Markt machen, aber es ist sehr interessant zu lesen und zu beobachten, bitte schreiben Sie mehr...

Ich hatte das gleiche Problem, als ich für U-Turns trainierte, U-Turns waren natürlich viel weniger als Nicht-U-Turns. Je mehr Bäume ich machte, desto mehr verzettelte sich die MO in der Klasse der U-Turns und konzentrierte sich mehr auf die Klasse der Non-Turns.

Es gibt mehrere Methoden in caret , um Klassen auszugleichen, aber alle sind trivial - entweder verdoppeln Sie die Klasse, die weniger Beobachtungen hat, um die Summe der Beobachtungen in allen Klassen gleich zu machen, oder entfernen Sie unnötige Beobachtungen aus der Klasse, die mehr Beobachtungen hat.

Keine der Methoden ist rentabler als ein Verzicht auf den Ausgleich (aber das gilt nur für meinen Fall)

In caret können Sie die Fitnessfunktion in der Zugfunktion über einige Parameter ändern. Für die Klassifizierung können Sie Präzision oder Kappa verwenden: und für die Regression zwei eigene Varianten, wie r^2 und etwas anderes. Ich habe Kappa nur von dort gelernt, es hat mir geholfen, ein Modell auf sehr unausgewogenen Klassen richtig zu trainieren, ohne irgendwelche zusätzlichen Operationen.
 
Wenn wir von Umkehrungen sprechen, dann sollten wir die Klassen sinnvoll ausbalancieren: nicht ein Balken für eine Umkehrung, sondern mehrere Balken vor der Umkehrung und mehrere Balken nach der Umkehrung. Wenn die Klassen ohnehin unausgewogen sind, aber nicht so fatal und durch Sorgfalt ausgeglichen werden können
 
giftig:

Alles ist verhandelbar. Ich habe Forts-Futures vorgeschlagen, z. B. Si, RI, BR usw., die im Allgemeinen am liquidesten sind. Ich schlage vor, Signal (-1,0,1)(short,cash,long) als Ergebnis, das Signal ist eindeutig als Wahrscheinlichkeit und nicht verzerrtdurch MM als Aufträge. Die Nachbearbeitung, die Beschilderung und das Targeting können Sie selbst vornehmen oder buchen.

Nach einigem Nachdenken bin ich zu dem Schluss gekommen, dass mindestens ein weiteres Glas hinzugefügt werden sollte{price:vol,...||..., price:vol }, wie es ist, ein letztes pro Sekunde, für jedes vorhergesagte Instrument, dann ist das Delta nicht erforderlich und bid, ask auch, es ist IMHO obligatorisch, wenn mit dem Band pro Sekunde die Split-Volumina und Verschiebung von OM, mehr oder weniger informativ, dann für das Glas ein Delta ist sehr wenig, zumindest muss man verschiedene "Platten" Verteilung, etc. zu sehen, und das ist genug, wie ein Anfang. Fügen Sie einen Becher hinzu und stellen Sie einen Trainingsdatensatz für ein paar Tage ein, dann spielen wir. :)

 

Schließlich entschied ich mich für ScottsPi-Metrik https://en.wikipedia.org/wiki/Scott's_Pi

Hier sind meine Ergebnisse mit dieser Schätzung, ich trainierte das Modell auf den ersten 91% der Zeilen und führte dann einen Fronttest auf den letzten verbleibenden Daten durch (Verhältnis Backtest : Fronttest = 10:1)
Spalte "class_0_rate" in der Tabelle - Verhältnis der Klasse 0 zu den Klassen -1und1, damit ich in Excel die Ergebnisse aussieben kann, bei denen dieser Wert zu hoch ist.

Die letzten beiden Spalten sind Scotts Pi-Metrik für Training und Test, der Wert liegt zwischen -1 und 1, wobei 0 = Ergebnis zufällig und das Modell unbrauchbar ist, und 1 = alles in Ordnung ist. Ein negatives Ergebnis ist nicht gut, inverse Korrelation, Sie können versuchen, das Ergebnis der Vorhersage zu invertieren. Die umgekehrte Korrelation funktioniert manchmal gut mit zwei Klassen, wenn das genaue Gegenteil der Vorhersage gehandelt wird. Bei drei Klassen ist es jedoch schwierig, das Gegenteil zu finden, denn jede Klasse hat zwei entgegengesetzte Werte, und in diesem Fall ist ein negativer Wert ebenfalls schlecht.

Ich denke, wir müssen die Währung wählen, deren Geld- (oder Brief-) Vorhersagen ähnliche und hohe Werte im Backtest und Fronttest haben, zum Beispiel xagusd. Ein Wert von 0,18 auf einer Skala von 0 bis 1 ist zwar gering. Und Vorhersagen, die einen Tick voraus sind, sind im realen Handel ebenfalls schlecht. Im Allgemeinen gibt es ein Ergebnis, aber es ist nicht anwendbar :)

R-Code für Scotts Pi

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))
}
 
Dr. Trader:

Schließlich entschied ich mich für ScottsPi-Metrik https://en.wikipedia.org/wiki/Scott's_Pi

Hier sind meine Ergebnisse mit dieser Schätzung, ich trainierte das Modell auf den ersten 91% der Zeilen und führte dann einen Fronttest auf den letzten verbleibenden Daten durch (Verhältnis Backtest : Fronttest = 10:1)
Spalte "class_0_rate" in der Tabelle - Verhältnis der Klasse 0 zu den Klassen -1und1, damit ich in Excel die Ergebnisse aussieben kann, bei denen dieser Wert zu hoch ist.

Die letzten beiden Spalten sind Scotts Pi-Metrik für Training und Test, der Wert liegt zwischen -1 und 1, wobei 0 = Ergebnis zufällig und das Modell unbrauchbar ist, und 1 = alles in Ordnung ist. Ein negatives Ergebnis ist nicht gut, inverse Korrelation, Sie können versuchen, das Ergebnis der Vorhersage zu invertieren. Die umgekehrte Korrelation funktioniert manchmal gut mit zwei Klassen, wenn das genaue Gegenteil der Vorhersage gehandelt wird. Aber bei drei Klassen ist es schwer, das Gegenteil zu finden, jede Klasse hat zwei Gegensätze und in diesem Fall ist ein negatives Ergebnis auch schlecht.

Ich denke, wir müssen die Währung wählen, deren Geld- (oder Brief-) Vorhersagen ähnliche und hohe Werte im Backtest und Fronttest haben, zum Beispiel xagusd. Ein Wert von 0,18 auf einer Skala von 0 bis 1 ist zwar gering. Und Vorhersagen, die im realen Handel einen Tick voraus sind, sind ebenfalls schlecht. Im Allgemeinen gibt es ein Ergebnis, aber es ist nicht anwendbar :)

R-Code für Scotts Pi

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))
}
Die Daten sind sehr klein, mein Freund hängt einen normalen Datensatz auf, der aber irgendwo verloren gegangen ist. Dr. Trader: Es gibt nicht viele Daten, aber sie gehen irgendwo verloren. Und wenn Sie nicht spezifisch sind, ist es natürlich für den Tick im Voraus wirklich nutzlos, mindestens eine Minute im Voraus, in den Pässen ist eine Minute reines MM, Begrenzer auf beiden Seiten, in einem Abstand proportional zum Spread, hier "Quantenschaum", kein Sinn, über die Richtung zu sprechen, weil es viel weniger ist als der Spread.