Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Ich werde die Bedingungen für den Geldpreis klarstellen:
5 Punkte für die erste Person, die das Problem löst
Einsendeschluss für Lösungen: 30. Juni 2016
Es gibt ein Beispiel für die Anwendung eines Algorithmus zur Auswahl von informativen Merkmalen zur Umsetzung einer Handelsstrategie.
Sie haben wahrscheinlich meine Blogs über das Große Experiment gelesen: https://www.mql5.com/ru/blogs/post/661895
Und hier ist ein Bild wie dieses:
Ich habe versucht, ein Muster für fünf Paare zu finden und den Prozentsatz der richtig erratenen Geschäfte auf der Grundlage einer Validierungsstichprobe von 25 Jahren oder so zu ermitteln. Es hat nicht sofort geklappt. Ich habe die gewünschte Genauigkeit für einen bestimmten Vorhersagehorizont nicht erreicht.
Nehmen wir als nächstes nur ein Paar, den Eurusd. Ich habe eine Abhängigkeit der Kursbewegung 3 Stunden im Voraus von einer Teilmenge meiner Prädiktoren festgestellt.
Ich reduzierte die Prädiktoren auf eine kategoriale Form und begann mit der Suche nach signifikanten Prädiktoren. Ich habe es gerade jetzt, während ich auf der Arbeit war, in 20 Minuten geschafft.
[1] "1.51%"
> final_vector <- c((sao$par >= threshold), T)
> names(sampleA)[final_vector]
[1] "lag_diff_45_var" "lag_diff_128_var" "lag_max_diff_8_var" "lag_max_diff_11_var" "lag_max_diff_724_var" "lag_sd_362_var"
[7] "output"
Ich habe nicht so schnell Konvergenz erreicht, aber ich habe ein Ergebnis auf dem Niveau von eineinhalb Prozent Erklärungskraft.
Der Konvergenzgraph (Minimierung).
Als nächstes folgt die Konstruktion des Modells.
Wir haben mehrere kategoriale Prädiktoren. Wir erstellen ein "Regelwerk" oder eine Beziehung zwischen den Prädiktoren und dem Output - lang oder kurz in einem 3-Stunden-Zeithorizont.
Wie sieht das Ergebnis aus?
Wir sehen die Schiefe der Anzahl der Käufe und Verkäufe in jeder Zeile und den entsprechenden Wert des p-value des Chi-Quadrat-Kriteriums für die Übereinstimmung mit der 50/50-Verteilung. Wir wählen nur die Zeilen aus, bei denen die Wahrscheinlichkeit unter 0,01 liegt.
Und der Code des gesamten Experiments, beginnend mit dem Moment, in dem die Eingänge bereits ausgewählt wurden:
dat_test <- sampleA[, c("lag_diff_45_var"
, "lag_diff_128_var"
, "lag_max_diff_8_var"
, "lag_max_diff_11_var"
, "lag_max_diff_724_var"
, "lag_sd_362_var"
, "output")]
dat_test$concat <- do.call(paste0, dat_test[1:(ncol(dat_test) - 1)])
x <- as.data.frame.matrix(table(dat_test$concat
, dat_test$output))
x$pval <- NA
for (i in 1:nrow(x)){
x$pval[i] <- chisq.test(x = c(x$`0`[i], x$`1`[i])
, p = c(0.5, 0.5))$p.value
}
trained_model <- subset(x
, x$pval < 0.01)
trained_model$concat <- rownames(trained_model)
trained_model$direction <- NA
trained_model$direction [trained_model$`1` > trained_model$`0`] <- 1
trained_model$direction [trained_model$`0` > trained_model$`1`] <- 0
### test model
load('C:/Users/aburnakov/Documents/Private/big_experiment/many_test_samples.R')
many_test_samples_eurusd_categorical <- list()
for (j in 1:49){
dat <- many_test_samples[[j]][, c(1:108, 122)]
disc_levels <- 3
for (i in 1:108){
naming <- paste(names(dat[i]), 'var', sep = "_")
dat[, eval(naming)] <- discretize(dat[, eval(names(dat[i]))], disc = "equalfreq", nbins = disc_levels)[,1]
}
dat$output <- NA
dat$output [dat$future_lag_181 > 0] <- 1
dat$output [dat$future_lag_181 < 0] <- 0
many_test_samples_eurusd_categorical[[j]] <- subset(dat
, is.na(dat$output) == F)[, 110:218]
many_test_samples_eurusd_categorical[[j]] <- many_test_samples_eurusd_categorical[[j]][(nrow(dat) / 5):(2 * nrow(dat) / 5), ]
}
correct_validation_results <- data.frame()
for (i in 1:49){
dat_valid <- many_test_samples_eurusd_categorical[[i]][, c("lag_diff_45_var"
, "lag_diff_128_var"
, "lag_max_diff_8_var"
, "lag_max_diff_11_var"
, "lag_max_diff_724_var"
, "lag_sd_362_var"
, "output")]
dat_valid$concat <- do.call(paste0, dat_valid[1:(ncol(dat_valid) - 1)])
y <- as.data.frame.matrix(table(dat_valid$concat
, dat_valid$output))
y$concat <- rownames(y)
valid_result <- merge(x = y, y = trained_model[, 4:5], by.x = 'concat', by.y = 'concat')
correct_sell <- sum(subset(valid_result
, valid_result$direction == 0)[, 2])
correct_buys <- sum(subset(valid_result
, valid_result$direction == 1)[, 3])
correct_validation_results[i, 1] <- correct_sell
correct_validation_results[i, 2] <- correct_buys
correct_validation_results[i, 3] <- sum(correct_sell
, correct_buys)
correct_validation_results[i, 4] <- sum(valid_result[, 2:3])
correct_validation_results[i, 5] <- correct_validation_results[i, 3] / correct_validation_results[i, 4]
}
hist(correct_validation_results$V5, breaks = 10)
plot(correct_validation_results$V5, type = 's')
sum(correct_validation_results$V3) / sum(correct_validation_results$V4)
Dann gibt es 49 Validierungsstichproben, die jeweils etwa 5 Jahre abdecken. Überprüfen wir das Modell an ihnen und zählen wir den Prozentsatz der richtig erratenen Handelsrichtungen.
Sehen wir uns den Prozentsatz der richtig erratenen Abschlüsse nach Stichproben und das Histogramm dieses Wertes an:
Und zählen Sie, wie sehr wir insgesamt die Richtung des Handels bei allen Proben erraten haben:
> sum(correct_validation_results$`total correct deals`) / sum(correct_validation_results$`total deals`)
[1] 0.5361318
Etwa 54%. Aber ohne zu berücksichtigen, dass wir den Abstand zwischen Ask und Bid überwinden müssen. Das heißt, der Schwellenwert liegt laut obigem Diagramm bei etwa 53 %, wenn man davon ausgeht, dass der Spread = 1 Pip ist.
Das heißt, wir haben in 30 Minuten ein einfaches Modell ausgeheckt, das sich z. B. im Terminal leicht codieren lässt. Und es ist nicht einmal ein Ausschuss. Und ich habe 20 Minuten statt 20 Stunden lang nach Abhängigkeiten gesucht. Alles in allem gibt es also etwas.
Und das alles dank der richtigen Auswahl an informativen Attributen.
Und detaillierte Statistiken für jede gültige Stichprobe.
Alle Rohdaten sind über die Links im Blog verfügbar.
Und dieses Modell ist nicht sehr rentabel. MO ist auf dem Niveau eines halben Punktes. Aber das ist die Richtung, in die ich gehe.
Immer aus der Vergangenheit lernen.
Wir schauen uns jahrhundertelang ein Diagramm an. Beide auf und wir sehen "drei Soldaten", dann sehen wir "Kopf und Schultern". Wie viele dieser Zahlen haben wir bereits gesehen und wir glauben an diese Zahlen, wir handeln...
Und wenn die Aufgabe so eingestellt ist:
1. automatisch solche Zahlen zu finden, nicht für alle Charts, sondern für ein bestimmtes Währungspaar, die vor kurzem aufgetreten sind, nicht vor drei Jahrhunderten im japanischen Reishandel.
2) Die Ausgangsdaten, auf denen wir automatisch nach solchen Zahlen - Mustern - suchen.
Um die erste Frage zu beantworten, betrachten wir den "Random Forest" genannten Algorithmus, der die Kurse einer oder mehrerer Währungen, Indikatoren, Preissteigerungen - alles, was der Mensch erfunden hat - als Eingangsdaten für seine Arbeit verwendet. 10-5-100-200 ... Eingabevariablen. Dann nimmt es den gesamten Satz von Werten der Variablen, die sich auf einen Zeitpunkt beziehen, der einem Balken entspricht, und sucht nach einer solchen Kombination dieser Eingangsvariablen, die auf den Verlaufsdaten einem ganz bestimmten Ergebnis entsprechen würde, zum Beispiel einer BUY-Order. Und eine weitere Reihe von Kombinationen für einen anderen Auftrag - VERKAUFEN. Jeder dieser Gruppen entspricht ein eigener Baum. Die Erfahrung zeigt, dass der Algorithmus bei einer Eingabemenge von 18000 Balken (etwa 3 Jahre) 200-300 Bäume findet. Dies ist die Reihe von Mustern, fast Analoga von "Köpfen und Schultern", und ganze Münder von Soldaten.
Das Problem bei diesem Algorithmus ist, dass solche Bäume einige Besonderheiten aufgreifen können, die in Zukunft nicht mehr vorkommen. Dies wird hier im Forum "Superfitting" genannt, beim maschinellen Lernen "Overfitting". Wir wissen, dass eine große Menge von Eingangsvariablen in zwei Teile unterteilt werden kann: diejenigen, die mit der Ausgangsvariablen zusammenhängen, und diejenigen, die nicht mit dem Rauschen zusammenhängen. Burnakov versucht also, diejenigen auszusortieren, die für das Ergebnis irrelevant sind.
PS.
Beim Aufbau eines Trend-TS (KAUFEN, VERKAUFEN) sind alle Arten von Stäben mit Rauschen verbunden!
Was Sie sehen, ist ein kleiner Teil des Marktes und nicht der wichtigste. Niemand baut eine Pyramide auf dem Kopf stehend.
Was Sie sehen, ist ein kleiner Teil des Marktes und nicht der wichtigste. Niemand baut eine Pyramide auf dem Kopf stehend.
Ich habe versucht, das Neuron anhand der Eingabedaten zu trainieren, und mir dann die Gewichte angesehen. Wenn die Eingabedaten ein geringes Gewicht haben, scheint es, dass sie nicht benötigt werden. Ich habe es mit R (Rattle) gemacht, danke an SanSanych für seinen Artikel https://www.mql5.com/ru/articles/1165.
Ich habe diesen Ansatz nicht in der Praxis getestet, ich frage mich, ob er funktioniert hat oder nicht. Ich würde Eingang_1 Eingang_3 Eingang_5 Eingang_7 Eingang_9 Eingang_11 nehmen
Ich habe versucht, das Neuron anhand der Eingabedaten zu trainieren, und mir dann die Gewichte angesehen. Wenn die Eingabedaten ein geringes Gewicht haben, scheint es, dass sie nicht benötigt werden. Ich habe es mit R (Rattle) gemacht, danke an SanSanych für seinen Artikel https://www.mql5.com/ru/articles/1165.
Ich habe diesen Ansatz nicht in der Praxis getestet, ich frage mich, ob er funktioniert hat oder nicht. Ich würde Eingang_1 Eingang_3 Eingang_5 Eingang_7 Eingang_9 Eingang_11 nehmen
) hmm. sehr interessant.
Klärende Frage. Warum fügen Sie dann nicht noch weitere Eingaben hinzu, bei denen das Gewicht gering ist, z. B. 13, 14, 16? Könnten Sie ein Diagramm der Eingänge und Gewichte, geordnet nach Gewicht, zeigen?
Entschuldigung, ich habe es zuerst nicht verstanden. Ja, die angegebenen Eingaben haben ein großes Modulo-Gewicht, wie es auch sein sollte.
Optisch sind alle Gewichte in zwei Gruppen unterteilt. Wenn man sie nach Bedeutung/Nicht-Bedeutung einteilen will, dann stechen 5,11,7,1,3,9 deutlich hervor, dieser Satz ist meiner Meinung nach ausreichend.