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

 
mytarmailS:

1) Ja, du magst Recht haben, aber dieses Netz ist in der Lage zu lernen, wie man Entscheidungen trifft, es ist nicht die übliche Klassifizierung ohne Lehrer, und deshalb kann man in ihm das Konzept implementieren, über das ich schon lange gesprochen habe - man kann ihm nicht das Standardziel in Form von Kaufen-kaufen-kaufen oder 0001110101011 beibringen, sondern abstrakter, wie eine einfache Bedingung wie: "Netz! Es ist mir egal, wie Sie handeln, aber ich möchte, dass Ihr Gewinn mindestens 1% von 0,5% Drawdown pro Tag beträgt, und es wird nach den Regeln und Kombinationen für diesen Zweck suchen. Wenn ich falsch liege und Unsinn rede, korrigieren Sie mich bitte in meinem eigenen Interesse).

Richtig, daran habe ich nicht gedacht, das ist richtig. Dann ist es besser, das neuronale Netz so zu konditionieren, dass die Sharpe Ratio (oder der Erholungsfaktor) maximiert wird, und in R so etwas wie einen einfachen Forex-Tester mit echten Kursen zu erstellen, um das Modell zu testen und die Entwicklung zu bewerten. Aber ein Wunder geschieht nicht von selbst, das Problem der Umschulung bleibt bestehen, die Daten müssen weiterhin in Trainings- und Testproben unterteilt werden, und es müssen Kreuzvalidierungen für die endgültige Einschätzung des Modells während seiner Entwicklung durchgeführt werden. Wie man mit der Sharpe Ratio bei der Kreuzvalidierung arbeitet, konnte ich mir nicht schnell ausdenken. Meiner Meinung nach wird es nicht möglich sein, zufällige Balken in der Teststichprobe zu entfernen, da es nicht auf die Genauigkeit jedes einzelnen Balkens ankommt, sondern auf den kontinuierlichen Handel selbst, mit allen Drawdowns, Spreads und Provisionen für jedes neue Geschäft.

Alexey Burnakov:

Es scheint, dass sie ein Paket für R vorbereiten. Wir sollten das zur Kenntnis nehmen.

Ich habe das Paket bereits, aber ich weiß nicht, wie viele Prozent es bereit ist, für jetzt auf githab. Hier ist ein einfacheres Beispiel, eine Fortsetzung des Artikels. Sie lehren das Netz, die Wurzel zu extrahieren.

http://gekkoquant.com/2016/07/17/rneat-square-root-neural-net-trained-using-augmenting-topologies-simple-example/

Ich habe es später beendet:

Ich habe eine Klassifizierung von Schwertlilien durchgeführt, Code im Anhang nach Beispiel (das Modell hat die Klassifizierung nicht bestanden, ich habe alle Klassen durch Zahlen für die Regression ersetzt und die Ergebnisse auf die nächste numerische Stufe gerundet. Wahrscheinlich hätte man das irgendwie einfacher machen können).
Ich habe nur 50 % der Daten für das Training verwendet, bei der Validierung waren 95 % erfolgreich, das ist ziemlich gut. Nach dem Diagramm zu urteilen, hat das Modell sogar den ersten Prädiktor selbst entfernt.

Forex ist komplizierter als Iris :) wird das Ergebnis dort viel schlechter ausfallen.

Mir ist auch aufgefallen, dass in den Teilen 3 und 4 des Artikels unterschiedliche Funktionen zum Trainieren des Modells verwendet werden.
Teil 3 dient der Simulation beliebiger dynamischer Prozesse, z. B. kann das Modell den Forex-Chart beobachten und Geschäfte in Echtzeit eröffnen/abschließen.
Teil 4 besteht einfach darin, das Modell mit vorgefertigten Beispielen zu trainieren und das Ergebnis vorherzusagen

Dateien:
 
Dr. Trader:

1) Richtig, daran habe ich nicht gedacht, das ist richtig. Dann ist es besser, dem neuronalen Netz eine Bedingung zu geben, um die Sharpe Ratio (oder den Erholungsfaktor) zu maximieren, und in R so etwas wie einen einfachen Forex-Tester auf realen Kursen zu erstellen

2) Mir ist auch aufgefallen, dass in den Teilen 3 und 4 des Artikels unterschiedliche Funktionen zum Trainieren des Modells verwendet werden.
Teil 3 dient der Simulation einiger dynamischer Prozesse, z. B. kann das Modell das Forex-Chart beobachten und Geschäfte in Echtzeit öffnen/schließen.
Teil 4 besteht lediglich darin, ein Modell anhand fertiger Beispiele zu trainieren und das Ergebnis vorherzusagen.

1) Absolut richtig! Das ist genau das, was ich meinte, Gewinn/Verlust nur für das Beispiel, ich dachte daran, den Erholungsfaktor zu nehmen, aber Sharpe ist im Grunde nicht schlechter

2) Du hast Recht, im 4. Artikel hat der Autor bereits so etwas wie ein Paket erstellt, nach allen "R"-Standards ist es maximal ein Modell - ein Zielvektor - Vorhersage durch "predict" - aber dieser Ansatz wird für uns nicht funktionieren, weil alle Funktionen bereits im Paket versteckt sind... Wir müssen den Quellcode verstehen und alles selbst schreiben, deshalb sagte ich Hilfe zum Verstehen, denn hier ist alles viel komplizierter als mit dem "fertigen Paket mit Beispielen dazu" Ich denke, dass sogar die Funktionen aus Teil 3 nicht ausreichen werden für das, was wir brauchen. Es wäre also fabelhaft, wenn wir alle an Bord gehen würden.

 
mytarmailS:

1) Das ist genau das, was ich meinte, der Gewinn/Verlust ist nur ein Beispiel, ich dachte daran, den Erholungsfaktor zu nehmen, aber der Sharpe ist im Grunde so gut, wie es nur geht

2) Du hast Recht, im 4. Artikel hat der Autor bereits so etwas wie ein Paket erstellt, nach allen "R"-Standards ist es nur ein Modell - ein Zielvektor - Vorhersage durch "predict" - aber dieser Ansatz wird für uns nicht funktionieren, weil alle Funktionen bereits im Paket versteckt sind... Wir müssen den Quellcode verstehen und alles selbst schreiben, deshalb sagte ich Hilfe zum Verstehen, denn hier ist alles viel komplizierter als mit dem "fertigen Paket mit Beispielen dazu" Ich denke, dass sogar die Funktionen aus Teil 3 nicht ausreichen werden für das, was wir brauchen. Es wäre also fabelhaft, wenn wir alle mitmachen würden.

Wer soll euch unterrichten, wenn nicht ihr selbst? Verschaffen Sie sich Zugang zum Quellcode. Studieren Sie es. Und auch über die Differenzierbarkeit der Funktion. Sie müssen eine reibungslose Funktion in das Netz einspeisen. Und Sie werden es uns sagen - und wir werden Ihnen unsere Ratschläge geben.
 
Alexey Burnakov:
Sie müssen eine reibungslose Funktion in das Netz einspeisen. Und Sie werden es uns sagen), und wir werden Ihnen unsere Ratschläge geben.

Verzeihen Sie, wenn ich mich einmische, aber nicht nur glatt, sondern auch normalisiert.

Damit der NS niemals über seine bekannten Gebiete hinausgeht.

Etwa so.

 

Ich kann nicht verstehen, warum diese Netze angegriffen werden?

Immerhin sind sie über die käsigen Verpackungen hinaus in die Weiten des R! Aber nein, die alten Sünden schleppen und schleppen ...

Nehmen Sie zum Beispiel caret. Dort gibt es nicht nur hundertfünfzig Modelle, sondern auch eine Reihe nützlicher Vorverarbeitungs- und Vorhersagefunktionen...

Also nein, Netze und Netze...

 
SanSanych Fomenko:

Ich kann nicht verstehen, warum diese Netze angegriffen werden?

Immerhin sind sie über die käsigen Verpackungen hinaus in die Weiten des R! Aber nein, die alten Sünden schleppen und schleppen ...

Nehmen Sie zum Beispiel caret. Dort gibt es nicht nur einhundertfünfzig Modelle, sondern auch einen Haufen nützlicher Vorverarbeitungs- und Vorhersagefunktionen ...

Also nein, Netze und Netze...

Also, zeigen Sie uns Ihr Caret und hundertfünfzig Modelle in Aktion! :)

 
Vadim Schischkin:

Zeigen Sie uns also bald Ihr Caret und hundertfünfzig Modelle in Aktion! :)

Übrigens, ich selbst benutze Caret und erhalte zufriedenstellende Ergebnisse im Forex.

Ich benutze Caret selbst und erhalte zufriedenstellende Ergebnisse im Forex-Bereich:

####
##########
############## start experiment
##########
####

library(caret)
library(gbm)
library(doParallel)

        
# tuning GBM - перебор параметров обучения по сетке
gbmGrid <- expand.grid(interaction.depth = seq(from = 3, to = 9, by = 2)
                  , n.trees = seq(from = 600, to = 1200, by = 300)
                  , shrinkage = seq(from = 0.01, to = 0.02, by = 0.005)
                  , n.minobsinnode = seq(from = 30, to = 60, by = 30))

######################
# start training cycle - ввод основных переменных и массива для результатов

validating_arr <- data.frame()
max_best_models <- 1
counter <- 1
max_inputs <- 15
max_cv_folds <- 5
max_bag_fract <- 1
distributions <- c('gaussian', 'laplace')
start <- Sys.time()
        
for (best_inp_num in seq(from = 3, to = max_inputs, by = 3)){
        
        for (cv_folds in 2:max_cv_folds){
                
                for (bag_frac in seq(from = 0.2, to = max_bag_fract, by = 0.2)){

#########################
# prepare training scheme - параметры caret
                                        gbmControl <- trainControl(method = 'cv'
                                                                      , number = cv_folds
                                                                      , verboseIter = F
                                                                      , returnData = F
                                                                      , returnResamp = 'all'
                                                                      , savePredictions = 'none'
                                                                      , summaryFunction = mymetrics
                                                                      , search = 'grid'
                                                                      , allowParallel = T)

########################
# initiate paralleling
                        cores <- 4 #detectCores()
                        cl <- makePSOCKcluster(cores)
                        registerDoParallel(cl)
                        
                        # train the model - обучение моделей с кроссвалидацией. Используется GBM.
                        best_models <- train(training[, ncol(training)] ~.
                                                , data = training[, 1:(ncol(training) - 1)]
                                                , method = 'gbm'
                                                , distribution = distributions[2]
                                                , bag.fraction = bag_frac
                                                , metric = 'mae_improve'
                                                , maximize = T
                                                , trControl = gbmControl
                                                , tuneGrid = gbmGrid)
                        
                        # stop paralleling
                        stopCluster(cl)
                        
                        # summarize the model - сохранение n лучших моделей
                        best_models_arr <- as.data.frame(cbind(best_models[[4]][1]
                                                                    , best_models[[4]][2]
                                                                    , best_models[[4]][3]
                                                                    , best_models[[4]][4]
                                                                    , best_models[[4]][5]
                                                                    , best_models[[4]][6]
                                                                    , best_models[[4]][7]
                                                                    , best_models[[4]][8]))
                        
                        rm(best_models)
                        
                        best_models_arr_ordered <- best_models_arr[order(best_models_arr$mae_improve, decreasing = T), ]

# далее - обучение лучших моделей и их валидация


 
Ich danke Ihnen. :)
 
SanSanych Fomenko:

Ich kann nicht verstehen, warum diese Netze angegriffen werden?

Immerhin sind sie über die käsigen Verpackungen hinaus in die Weiten des R! Aber nein, die alten Sünden schleppen und schleppen ...

Nehmen Sie zum Beispiel caret. Dort gibt es nicht nur einhundertfünfzig Modelle, sondern auch einen Haufen nützlicher Vorverarbeitungs- und Vorhersagefunktionen ...

Also, nein, Netze und Netze...

In der Regel kann eine Bibliothek entweder viel, aber nur Durchschnitt, oder nur eine Sache mit guter Qualität. Caret ist der erste Fall, es ist einfach, Dutzende von Modellen zu testen und die Ergebnisse zu vergleichen, aber es ist schwierig, etwas für Ihre Aufgabe zu verbessern. Ich habe große Schwierigkeiten bei der Auswahl von Prädiktoren nach meinen Regeln - Caret kann simuliertes Annealing, um sie aufzuzählen (und Genetik), kann aber nicht einfach meine Fitness-Funktion für die Schätzung nehmen. Ich muss ein neues Modell für caret mit Trainings-, Validierungs- und Fitnessfunktionen erstellen, aber caret wird weiterhin Trainings- und Testproben von Daten nach seinen eigenen Regeln kontrollieren, mit seinen eigenen Kreuzvalidierungen.
Es ist einfacher für mich, das GA- oder GenSA-Paket zu nehmen, um die Prädiktoren aufzuzählen, und nur eine Fitnessfunktion zu schreiben, die sowohl das Modell erstellt als auch die Kreuzvalidierung nach den von mir benötigten Regeln vornimmt.

Neuronka ist nicht schlechter als der Wald, meine Ergebnisse mit ihm sind im Plus, oder im schlimmsten Fall nur ohne Verlust der Einzahlung. Aufgrund der unterschiedlichen Algorithmen bevorzugt neuronka andere Prädiktoren als forest, aber die Regeln für die Auswahl der Prädiktoren sind vollständig dieselben wie für forest.

Die Übertragung des neuronc in den mt5 EA ist eine Sache von ein paar Minuten (Gewichte aus R in csv speichern, in den EA einlesen). Wald auf mt5 zu übertragen wird viel schwieriger sein, deshalb bevorzuge ich neuronka.

 

Ich habe ein wenig mit RNeat experimentiert und bin zu dem Schluss gekommen, dass es nicht auf die gleiche Weise wie herkömmliche neuronale Netze behandelt werden kann.

1) Im Gegensatz zu herkömmlichen Modellen werden beim RNeat-Training keine Rohdaten verwendet. Das Modell wird nach dem Zufallsprinzip erstellt, verbessert und erst am Ende anhand von Rohdaten getestet. Normalerweise verwenden Modelle Rohdaten, bauen ihre Logik darauf auf und verwenden dann Validierungsstichproben, um festzustellen, ob die Logik des Modells korrekt ist oder ob es einfach die Rohbeispiele gelernt hat. Im Gegensatz zu den anderen ist RNeat nicht in der Lage, sich die Rohdaten zu merken, denn es kennt sie nicht, das Modell kennt nur die gewünschten Ergebnisse und weiß, wie nahe es ihnen kommt.

2) Die Kreuzvalidierung trägt nicht zur Verbesserung der Fronttest-Ergebnisse bei. Wir scheinen uns alle einig zu sein, dass es möglich ist, ein reguläres Modell zu trainieren, ein paar Kreuzvalidierungen durchzuführen und die Fehler in allen Stichproben irgendwie für die endgültige Fitnessbewertung des Modells zu verarbeiten. Da RNeat die Rohdaten nicht kennt, ist es ihm egal, ob die Daten zu einer Trainings- oder Teststichprobe gehören, es wird seine Logik in jedem Fall an das gewünschte Ergebnis anpassen. Theoretisch "lernt" es (genauer gesagt mutiert es :) ) aus allen Proben, die in der Fitnessfunktion verwendet werden. Alles, was Sie tun können, ist, das Modell auf die richtige Genauigkeit zu trainieren und zu hoffen, dass es nicht übertrainiert wird - ein ziemlich riskanter Ansatz für den Devisenhandel. Die Kreuzvalidierung kann nur nach dem Training verwendet werden, als endgültige Schätzung des möglichen Ergebnisses im Fronttest, und in keiner Weise wird diese Validierungsstichprobe in der Fitnessfunktion verwendet.