[PYTHON] Versuchen Sie, FX mit LSTM mithilfe von Keras + Tensorflow Teil 3 vorherzusagen (versuchen Sie, alle Parameter zu treffen).

Einführung

Versuchen Sie, FX mit LSTM mithilfe von Keras + Tensorflow Teil 2 vorherzusagen (mit GPU berechnen) Schreiben Sie, dass der Start endgültig beendet ist Ich tat. Der Grund dafür ist, dass es zwar viele Parameter gibt, die für Deep Learning und FX verwendet werden, es jedoch eine beträchtliche Zeit in Anspruch nimmt, wichtige oder korrekte Werte unter ihnen zu finden.

Das ist richtig, Sie können es nicht finden, ohne GPU zu verwenden.

Dieses Mal kann ich also eine GPU verwenden, also werde ich versuchen, einen guten Wert zu finden, indem ich verschiedene Parameter aufrunde, nach denen ich mich gesehnt habe.

Quelle

Die Quelle finden Sie unter https://github.com/rakichiki/keras_fx. Oder mach einen Git-Klon.

git clone https://github.com/rakichiki/keras_fx.git 

Die Quelle ist diesmal keras_fx_gpu_multi.ipynb. Holen Sie sich dies und laden Sie es auf jupyter hoch.

Lassen Sie mich ein wenig erklären.

Parameter Round-Robin

Zuerst habe ich mich für die Parameter entschieden, die ich ändern möchte. Es ist wie folgt. (Wenn Sie genau hinschauen, ist es nicht alles ...)

Round-Robin


l_of_s_list                  = [20,25]
n_next_list                  = [5,7]
check_treshhold_list         = [0.50,0.60]
#activation_list              = ['sigmoid','tanh','linear']
activation_list              = ['tanh']
#loss_func_list               = ['mean_squared_error','mean_absolute_error','mean_squared_logarithmic_error']
loss_func_list               = ['mean_squared_error','mean_absolute_error']
#optimizer_func_list          = ['sgd','adadelta','adam','adamax']
optimizer_func_list          = ['adadelta','adam','adamax']
#validation_split_number_list = [0.1,0.05]
validation_split_number_list = [0.05]

currency_pair_list   = ['usdjpy']

#Speicherung der Ergebnisdatei
if os.path.exists('result') == False:
    os.mkdir('result')
if os.path.exists('png') == False:
    os.mkdir('png')

save_file_name = 'result/result_' + dt.today().strftime("%Y%m%d%H%M%S") + '.txt'
save_file_name = dt.today().strftime("%Y%m%d%H%M%S")

#fx Datenerfassung
start_day     = "20010101"
end_day       =  dt.today().strftime("%Y%m%d")

for currency_pair in currency_pair_list:
    (train_start_count, train_end_count,test_start_count, test_end_count,data) = \
        get_date(start_day, end_day, currency_pair)
    file_name = currency_pair + '_d.csv'

    for l_of_s in l_of_s_list:
        for n_next in n_next_list:
            for check_treshhold in check_treshhold_list:
                #
                (chane_data,average_value,diff_value, up_down,check_percent) = \
                    get_data(l_of_s, n_next,check_treshhold, file_name,train_start_count,\
                             train_end_count,test_start_count, test_end_count,data)
                
                #
                for activation in activation_list:
                    for loss_func in loss_func_list:
                        for optimizer_func in optimizer_func_list:
                            for validation_split_number in validation_split_number_list:
                                print('--------------------------')
                                fit_starttime = time.time()
                                fit(l_of_s, n_next,check_treshhold,file_name,save_file_name,activation,loss_func,optimizer_func,\
                                    validation_split_number,train_start_count, train_end_count,test_start_count, test_end_count,\
                                    chane_data,average_value,diff_value,up_down,check_percent)
                                print(str(math.floor(time.time() - fit_starttime)) + "s")
                                print('')

Ich möchte sagen, dass ich den Bereich der Erwartungen abrunden möchte, aber da die Zeit exponentiell ansteigen wird, ist es besser, etwas einzugrenzen und nach und nach zu untersuchen. Nun, selbst wenn Sie eine GPU verwenden können, wenn die Geschwindigkeit 10-mal schneller und der Berechnungsbetrag 1000-mal schneller ist, wird es das Original von Kiami sein. (Es liegt jedoch nicht mehr innerhalb des Bereichs, der von der CPU berechnet werden kann.)

Lassen Sie uns auch nach und nach gehen, anstatt uns aufgrund des später beschriebenen Problems von Anfang an umzudrehen (ich bin derjenige, der versagt hat, indem er sich am Anfang viel umgedreht hat).

Einführung des frühen Stopps

Der Rechenaufwand ist aufgrund der Rundung der Parameter explodiert, aber die Verbesserung der Einführung der GPU reicht nicht aus. Daher werden wir Early Stopping einführen, um unnötige Schleifen durch Epochen zu vermeiden.

EarlyStopping


early_stopping = EarlyStopping(monitor='val_loss', patience=10, verbose=1)
~~
high_history = high_model.fit(X_high_train, y_high_train, batch_size=100, epochs=300, \
                   validation_split=validation_split_number, callbacks=[early_stopping])

Ich denke, Keras ist hier einfach. Es ist jedoch unklar, ob dies die Voraussetzung für ein vorzeitiges Anhalten ist.

Ich möchte die Lernkurve sehen

Natürlich können Sie nicht feststellen, ob die Parameter korrekt sind, ohne die Lernkurve zu betrachten. Die Einführung ist nicht allzu schwierig.

Behalten Sie einfach den Rückgabewert von fit bei und zeichnen Sie ihn grafisch auf.

Lernkurve



    #Lernen
    high_history = high_model.fit(X_high_train, y_high_train, batch_size=100, epochs=300, \
                   validation_split=validation_split_number, callbacks=[early_stopping])

    ~~~~

    # high
    val_loss = high_history.history['val_loss']
    plt.rc('font',family='serif')
    fig = plt.figure()
    plt.plot(range(len(high_history.history['val_loss'])), val_loss, label='val_loss', color='black')
    plt.xlabel('epochs')
    plt.savefig('png/' + save_file_name + '_high_' + \
                str(l_of_s) + '_' + str(n_next) + \
                '_' + str(check_treshhold) + '_' + file_name + \
                '_' + activation + '_' + loss_func + \
                '_' + optimizer_func + '_' + str(validation_split_number) + \
                '.png')
    plt.show()

Wenn Sie ein Diagramm hinterlassen möchten, führen Sie als Einschränkung plt.show () nach plt.savefig aus. Der Grund ist unbekannt, aber wenn es umgekehrt ist, wird es nicht bleiben (ich habe irgendwo auf die Antwort in der Fragenecke verwiesen).

Wenn es gut ist, wird das Diagramm mit dem Übergang von val_loss wie unten gezeigt angezeigt.

loss.png

Nun, es ist eine andere Frage, ob die Trefferquote gut ist, nur weil dies schön ist. In diesem Diagramm können Sie jedoch sehen, ob Lernen möglich ist oder nicht.

Speichern Sie das Ergebnis als Datei

Es wird erwartet, dass es sehr lange dauern wird, aber der PC kann unterwegs heruntergefahren werden. ich Ich bin nicht der Typ, der einen PC ohne ECC-Speicher über 10 Stunden arbeiten lassen und weiter beten möchte, dass er nicht auf den Weg fällt.

Speichern Sie also das Analyseergebnis in einer Datei und ergreifen Sie Maßnahmen, auch wenn der PC in der Mitte ausfällt (obwohl ich im Falle eines Speicherfehlers aufgeben werde).

Dateiausgabe


    f = open(save_file_name, 'a')
    f.write('l_of_s: ' + str(l_of_s) + ' n_next: ' + str(n_next) + \
            ' check_treshhold:' + str(check_treshhold) + ' file_name:' + file_name + \
            ' activation:' + activation + ' loss_func:' + loss_func + \
            ' optimizer_func:' + optimizer_func + ' validation_split_number:' + str(validation_split_number) + \
            '\n')
    f.write('UP: ' + str(up_ok_count) + ' - ' + str(up_ng_count) + ' - ' + str(up_ev_count) + '\n')
    f.write('DN: ' + str(down_ok_count) + ' - ' + str(down_ng_count) + ' - ' + str(down_ev_count) + '\n')
    f.close()

War das CSV-Format besser? Nein, war es besser, das JSON-Format zu verwenden (ich mag das JSON-Format)? Ich werde den Fortschritt jedoch vorerst ausgeben. Ah, das JSON-Format ist nutzlos, wenn man bedenkt, dass es unterwegs fehlschlagen wird.

Wie oben erwähnt, möchten Sie möglicherweise auch das Diagramm speichern.

Ergebnis (nicht gut ...)

Ich habe es vorerst viel gedreht. Aus dem später beschriebenen Grund ist es jedoch ein wenig sanft (sagen Sie nicht, dass es nur ein Muster wie die Aktivierungsfunktion gibt).

Das einzige Währungspaar ist usdjpy. Das Ergebnis ist wie folgt (über die Anzahl der Tage des Kauf- und Verkaufsurteils ist nicht in der Trefferquote enthalten).

Tage für Kauf und Verkauf von Urteilsvermögen Tage nach dem Kauf und Verkauf Änderungsrate für das Handelsurteil Aktivierungsfunktion Zielfunktion Optimierungsalgorithmus Prozentsatz der Trainingsdaten(%) Anzahl der Treffer beim Aufstieg Anzahl der Fehler beim Aufstieg Anzahl der Treffer, wenn es sinkt Anzahl der Abweichungen beim Absenken Gesamttrefferquote(%)
20 5 0.5 tanh mse adadelta 0.05 55 34 114 81 59.5
20 5 0.5 tanh mse adam 0.05 24 22 66 46 57.0
20 5 0.5 tanh mse adamax 0.05 14 14 46 33 56.1
20 5 0.5 tanh mae adadelta 0.05 69 58 95 88 52.9
20 5 0.5 tanh mae adam 0.05 31 28 69 58 53.8
20 5 0.5 tanh mae adamax 0.05 29 26 84 69 54.3
20 5 0.6 tanh mse adadelta 0.05 72 53 129 98 57.1
20 5 0.6 tanh mse adam 0.05 64 52 111 97 54.0
20 5 0.6 tanh mse adamax 0.05 43 33 59 52 54.5
20 5 0.6 tanh mae adadelta 0.05 51 40 140 120 54.4
20 5 0.6 tanh mae adam 0.05 75 57 102 75 57.3
20 5 0.6 tanh mae adamax 0.05 45 39 107 93 53.5
20 7 0.5 tanh mse adadelta 0.05 11 12 84 81 50.5
20 7 0.5 tanh mse adam 0.05 7 5 45 35 56.5
20 7 0.5 tanh mse adamax 0.05 22 18 61 40 58.9
20 7 0.5 tanh mae adadelta 0.05 46 37 92 81 53.9
20 7 0.5 tanh mae adam 0.05 25 28 47 31 55.0
20 7 0.5 tanh mae adamax 0.05 20 28 75 62 51.4
20 7 0.6 tanh mse adadelta 0.05 23 16 39 39 53.0
20 7 0.6 tanh mse adam 0.05 24 21 77 67 53.4
20 7 0.6 tanh mse adamax 0.05 27 26 61 45 55.3
20 7 0.6 tanh mae adadelta 0.05 56 43 120 107 54.0
20 7 0.6 tanh mae adam 0.05 40 36 65 58 52.8
20 7 0.6 tanh mae adamax 0.05 49 41 60 54 53.4
25 5 0.5 tanh mse adadelta 0.05 54 32 86 60 60.3
25 5 0.5 tanh mse adam 0.05 25 21 59 41 57.5
25 5 0.5 tanh mse adamax 0.05 15 14 53 39 56.2
25 5 0.5 tanh mae adadelta 0.05 46 37 126 95 56.6
25 5 0.5 tanh mae adam 0.05 34 30 56 41 55.9
25 5 0.5 tanh mae adamax 0.05 25 24 69 47 57.0
25 5 0.6 tanh mse adadelta 0.05 23 21 108 94 53.3
25 5 0.6 tanh mse adam 0.05 19 20 58 51 52.0
25 5 0.6 tanh mse adamax 0.05 18 19 86 69 54.2
25 5 0.6 tanh mae adadelta 0.05 92 80 92 85 52.7
25 5 0.6 tanh mae adam 0.05 26 28 117 100 52.8
25 5 0.6 tanh mae adamax 0.05 32 31 126 102 54.3
25 7 0.5 tanh mse adadelta 0.05 32 18 110 95 55.7
25 7 0.5 tanh mse adam 0.05 16 16 37 19 60.2
25 7 0.5 tanh mse adamax 0.05 9 10 42 28 57.3
25 7 0.5 tanh mae adadelta 0.05 33 23 40 30 57.9
25 7 0.5 tanh mae adam 0.05 25 21 71 55 55.8
25 7 0.5 tanh mae adamax 0.05 36 29 55 38 57.6
25 7 0.6 tanh mse adadelta 0.05 43 35 104 92 53.6
25 7 0.6 tanh mse adam 0.05 23 23 63 58 51.5
25 7 0.6 tanh mse adamax 0.05 25 22 90 70 55.6
25 7 0.6 tanh mae adadelta 0.05 37 25 118 108 53.8
25 7 0.6 tanh mae adam 0.05 33 25 76 63 55.3
25 7 0.6 tanh mae adamax 0.05 40 25 74 59 57.6

Bestenfalls 60% und schlimmstenfalls 50% lag der Durchschnitt bei 55%, was etwas besser war als in den vorangegangenen Tagen. Die Berechnung von 48 Mustern (mit Geforce GTX 1070) dauerte übrigens ca. 2 Stunden. Es wird auch erwartet, dass das Erhöhen der Parameter exponentiell Zeit in Anspruch nimmt. Aus diesem Grund müssen Maßnahmen ergriffen werden, um irgendwo schneller zu werden, und da die Trefferquote schlecht ist, müssen Maßnahmen ergriffen werden, aber zuvor wurde ein großes Problem festgestellt.

ein Problem ist aufgetreten

Ich konnte die gewünschten Parameter bis zu einem gewissen Grad finden, fand aber ein enttäuschendes Problem.

Es ist ein speicherintensives Problem. Anfangs suchte ich nach ungefähr 1000 Mustern, aber ein Ereignis, das sehr langsam wurde, trat in der Mitte auf. Nach dem Ergreifen der Gegenmaßnahmen ist der Zustand des PCs als Ergebnis von weniger als 48 Mustern wie folgt.

ss2.png

Der Speicher des PCs selbst verbraucht 12 GB und die GPU 2 GB. Obwohl es nicht veröffentlicht wird, wenn ein Muster ausgeführt wird, hat die GPU weniger als 1 GB und der Hauptteil weniger als 4 GB verbraucht.

Einfach gesagt, es gibt ein Speicherleck. Anfangs hatte dieser PC nur 8 GB Speicher, aber in Eile ersetzte ich den Speicher (das Gehäuse ist Mini-ITX und es gibt nur zwei Speichersteckplätze) und erhöhte ihn auf 32 GB (ich denke, 16 GB waren hier gut). Es gibt Meinungen, aber eine halbfertige Investition bringt keine guten Ergebnisse, also habe ich sie auf einmal auf 32 GB gebracht.

Ich weiß nicht, warum es nicht so viel Speicher verbraucht (oder freigibt), aber wenn Sie mehr mit diesem Skript tun möchten, sollten Sie die Speichermenge sowie das Muster und die Ausführungszeit berücksichtigen. .. Ich habe bisher keine Problemumgehung gefunden.

Schließlich

Diese Serie war eigentlich bisher geplant. In Zukunft werde ich mein Bestes tun, um die Ergebnisse im Bereich des Fehlers zu verbessern, aber es gibt keine Garantie dafür, dass die Ergebnisse bisher erzielt werden.

Aus diesem Grund weiß ich nicht, wie weit ich gehen kann, aber ich denke, ich kann viele Dinge tun. Folgendes gehe ich an dieser Stelle aus:

Ich denke, ich kann eine Menge solcher Dinge tun, aber um klar zu sein, es ist ein Level, das 1 GPU wahrscheinlich nicht kann. In diesem Fall kann es erforderlich sein, mehrere GPUs zu installieren oder AWS zu mieten. Ich habe vor, über die nächsten Maßnahmen nachzudenken, während ich ein wenig über diesen Bereich nachdenke.

Verknüpfung

Recommended Posts

Versuchen Sie, FX mit LSTM mithilfe von Keras + Tensorflow Teil 3 vorherzusagen (versuchen Sie, alle Parameter zu treffen).
Vorhersage von Effekten mit LSTM mithilfe von Keras + Tensorflow Teil 2 (Berechnung mit GPU)
Versuchen Sie, den Wechselkurs (FX) mit nicht tiefem maschinellem Lernen vorherzusagen
Versuchen Sie es mit TensorFlow Part 2
Anfänger RNN (LSTM) | Versuchen Sie es mit Keras
Aktienprognose mit TensorFlow (LSTM) ~ Aktienprognose Teil 1 ~
Videorahmenvorhersage unter Verwendung von Faltungs-LSTM mit TensorFlow
[Python] Versuchen Sie, die FX-Systolenparameter durch zufällige Suche zu optimieren
Versuchen Sie, mit MVC eine RESTful-API mit Flask 1.0.2 zu erstellen
Ich habe versucht, Grad-CAM mit Keras und Tensorflow zu implementieren
Multivariates LSTM mit Keras
Versuchen Sie eine Regression mit TensorFlow
[TensorFlow 2 / Keras] Ausführen des Lernens mit CTC Loss in Keras
[Python] Versuchen Sie, die FX-Systolenparameter mit einem genetischen Algorithmus zu optimieren
Versuchen Sie, eine lineare Regression mit Pytorch mit Google Colaboratory zu implementieren