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

 
Aleksey Nikolayev #:

EinArtikel mit einem ähnlichen Ansatz wie der von Aleksey Vyazmikin propagierte. Anstelle eines Klassifizierungsbaums wird ein "Differenzbaum" konstruiert, bei dem jedes Blatt einer anderen Wahrscheinlichkeit eines Ereignisses entspricht (z. B. der Häufigkeit von Bränden). Im Wesentlichen handelt es sich dabei um eine Variante des Clustering.

Ich möchte gleich anmerken, dass ich nicht bereit bin, den Artikel im Detail wiederzugeben, da ich ihn nur flüchtig überflogen habe.

Ich danke Ihnen für den Artikel!

Ich habe ihn übersetzt und gelesen.

Können Sie mir helfen, den Algorithmus in Form von Formeln in eine verständlichere Sprache zu übersetzen? Und ich werde versuchen, den Code für diese Methode zur Erstellung eines Baums zu schreiben.

 
Maxim Dmitrievsky #:
Ich habe speziell auf Ihre Frage geantwortet - auf jede, die Sie wollen. Das ist Ihre eigene Angelegenheit. Es ist sogar seltsam, warum ich gefragt wurde. Es hatte nichts mit dem Thema zu tun, an dem ich interessiert war.

Hmm, Sie haben hier im Thread über Uplift-Modelle berichtet, die eine Weiterentwicklung des A-B-Tests sind. Die Methode wurde also entwickelt, um die Auswirkungen abzuschätzen, wenn sich das Ziel durch den neuen Aufprall verändert. Daher ist es für mich offensichtlich, dass der Ausgangspunkt für den Einfluss des gesuchten Prädiktors festgelegt werden sollte. Hier wollte ich Ihre Meinung zu diesem Thema hören. Auch den Grund, warum Sie denken, dass es nicht wichtig ist.

 
Maxim Dmitrievsky #:
Warum Meisterwerke als Müll bezeichnen? Ich bot Ihnen kostenlos, auch auf Ihre Superlative, genau wie Alexej. Aber ich wurde in den Kodobazu geschickt. Und jetzt läuft er, der Nörgler, herum und beschimpft mich.

Wer ist der Nörgler? Wer beschimpft mich?

Wenn ich es bin, dann sind die Anschuldigungen unbegründet. Ich werde meine Energie darauf verwenden, die Unerwünschten zu beseitigen, und zwar fairerweise nur dann, wenn es notwendig ist, um meine Ziele zu erreichen.

Ich habe angeboten, die Prädiktorwerte zur Überprüfung anzugeben, da dies schnell geht.

Ich habe vorhin geschrieben, dass ich Prädiktoren in großer Zahl auf Daten von ZZ verwende, ich habe sogar den Kern der Sache beschrieben. Es ist kontraproduktiv, es in Python neu zu schreiben.

 
Aleksey Vyazmikin #:

Vielen Dank für den Artikel!

Ich habe ihn übersetzt und gelesen.

Können Sie mir helfen, den Algorithmus in Form von Formeln in eine verständlichere Sprache zu übersetzen? Und ich werde versuchen, den Code dieser Methode zum Aufbau eines Baumes zu schreiben.

Dort, in dem Artikel, auf Seite 10, gibt es eine Implementierung in Form von Pseudocode. Auf der vorletzten Seite, im Anhang, finden sich Hinweise auf die Implementierung in der Sprache R und auf die im Artikel verwendeten Daten.

Wie werden Entscheidungsbäume in mql5 generell implementiert? Durch Arrays oder Templates?

 
Aleksey Vyazmikin #:

Hmm, Sie haben hier im Thread über Uplift-Modelle berichtet, die eine Weiterentwicklung des A-B-Tests sind. Die Methode ist also darauf ausgelegt, den Einfluss zu schätzen, wenn sich das Ziel durch den neuen Einfluss ändert. Daher ist es für mich offensichtlich, dass der Ausgangspunkt für den Einfluss des gesuchten Prädiktors festgelegt werden sollte. Ich würde gerne Ihre Meinung zu diesem Thema hören. Auch den Grund, warum Sie ihn für unwichtig halten.

Die Stichproben in randomisierten Experimenten werden nach dem Zufallsprinzip bestimmt. Ganz am Anfang des Buches.

Es gibt die Eröffnung von Geschäften nach dem Zufallsprinzip und das entsprechende Ergebnis für die Kontrollgruppe, und es gibt ein Modell, das auf einer anderen Teilstichprobe, der Testgruppe, beruht. Wir müssen den Effekt der Verwendung eines solchen Modells bestimmen, ob er für die Kontrollgruppe positiv ist. Wenn ja, kann das Modell auf eine der vorgeschlagenen Arten verbessert werden.

Durch einfaches Testen mit neuen Daten lässt sich der Effekt nicht bestimmen, da die Daten oft verzerrt sind. Daher besteht die Formel aus zwei Summanden ATE + Bias. Man kann sogar noch weiter gehen und CATE definieren, d. h. von Fall zu Fall, und nur diejenigen auswählen, die besser behandelt werden, den Rest ignorieren/im Handel auslassen.

Mit den Worten von Sanych: Suche nach dem Stationären im Nicht-Stationären.
 
Aleksey Vyazmikin #:

Wer ist der Nörgler? Wer schimpft?

Wenn es um mich geht, sind die Anschuldigungen unbegründet. Ich werde meine Energie darauf verwenden, das Unerwünschte zu beseitigen, und zwar fairerweise nur dann, wenn dies zur Erreichung meiner Ziele notwendig ist.

Ich habe angeboten, die Prädiktorenwerte zur Überprüfung zur Verfügung zu stellen, da es schnell geht.

Ich habe bereits geschrieben, dass ich Prädiktoren in großer Zahl für Daten von ZZ verwende, ich habe sogar den Kern der Sache beschrieben. Dies in Python umzuschreiben ist kontraproduktiv.

Du beschwerst dich und beschimpfst mich wie ein Kind.
Und in einer kleinen Menge von allem ist produktiv?)
 
def R_learner():
    dataset = get_prices()
    dataset = labeling(dataset)

    data = dataset[dataset.index < FORWARD].copy()
    data['treatment'] = data['labels'].apply(lambda x: np.random.choice([0, 1], p=[0.2, 0.8])) // случайно выбрал элементы для лечения


    X = data[data['treatment'] == 1]
    X = X[X.columns[1:-2]]
    X_t = data[data['treatment'] == 0]
    X_t = X_t[X_t.columns[1:-2]]

    y = data[data['treatment'] == 1]
    y = y[y.columns[-2]]
    y_t = data[data['treatment'] == 0]
    y_t = y_t[y_t.columns[-2]]

    treat_m = CatBoostClassifier(iterations=1000,
                                depth=6,
                                custom_loss=['Accuracy'],
                                eval_metric='Accuracy',
                                verbose=False,
                                use_best_model=True,
                                task_type='CPU')
    treat_m.fit(X, y, eval_set=(X_t, y_t),
                    early_stopping_rounds=50, plot=False) // обучил модель на этих примерах, остальные попали в валидацию

    data['y_t'] = [x[0] < 0.5 for x in treat_m.predict_proba(data[data.columns[1:-2]])] // теперь метки классов - это предсказания обученной модели
    data['y_t'] = data['y_t'].astype(float)
    
    # perform residualisation
    debias_m = CatBoostClassifier(iterations = 5,
                                    max_depth = 1,
                                    early_stopping_rounds = 2,
                                    verbose = False) // эта модель определяет смещение в оценках тритмента
    denoise_m = CatBoostClassifier(iterations = 5,
                                    max_depth = 1,
                                    early_stopping_rounds = 2,
                                    verbose = False) // эта модель определяет смещение в оценках целевой

    t_diff = data['treatment'] - cross_val_predict(debias_m, 
                                                data[data.columns[1:-3]], 
                                                data[data.columns[-2]], 
                                                method='predict_proba', cv=5)[:, 0] // определяем тритмент эффект

    y_diff =  data['y_t'] - cross_val_predict(denoise_m, 
                                                data[data.columns[1:-3]], 
                                                data[data.columns[-1]], 
                                                method='predict_proba', cv=5)[:, 0] // определяем байес

    # create the weights
    w = t_diff ** 2 // новые веса для модели
    # create the transformed target
    y_debias = (y_diff / t_diff).apply(lambda x: 1 if x > 0.0 else 0) // новые метки без смещения

    data['weights'] = w
    data['y_debias'] = y_debias
    data = data.drop(['labels', 'treatment', 'y_t'], axis=1)


    X = data[data.columns[1:-2]]
    y = data[data.columns[-2:]]

    train_X, test_X, train_y, test_y = train_test_split(
            X, y, train_size=0.5, test_size=0.5, shuffle=True)

    train_data = Pool(
        data=train_X,
        label=train_y[train_y.columns[1]],
        weight=train_y[train_y.columns[0]] // добавляем веса к обучению
    )

    eval_data = Pool(
        data=test_X,
        label=test_y[test_y.columns[1]],
        weight=test_y[test_y.columns[0]]
    )

    # learn final model with train and validation subsets
    model = CatBoostClassifier(iterations=1000,
                                depth=6,
                                learning_rate=0.1,
                                custom_loss=['Accuracy'],
                                eval_metric='Accuracy',
                                verbose=False,
                                use_best_model=True,
                                task_type='CPU')

    model.fit(X= train_data, eval_set=eval_data,
                early_stopping_rounds=50, plot=False) // учим новую модель с обесшумленными метками и дополнительными весами

    return model

Dieser Ansatz funktioniert nicht gut bei neuen Daten. Offensichtlich, weil ich schlecht definiert habe, was ein Tritent sein soll und in welcher Beziehung :)

Die Idee von R-learner stammt von hier
 
Maxim Dmitrievsky #:

Dieser Ansatz funktioniert nicht gut bei neuen Daten. Offensichtlich, weil ich schlecht definiert habe, was ein Tritent sein soll und in welcher Beziehung :)

die Idee von R-learner stammt von hier

Der Artikel verwendet sehr wichtiges Wissen über Inputs - Elastizität von Angebot und Nachfrage. Daher auch der hartnäckige Geruch der Überanpassung.

Wir verfügen nicht über solche fundamentalen Kursdaten, und außerdem funktioniert die Elastizität wahrscheinlich nicht: Der Preis eines Vermögenswerts kann von Null bis zu himmelhoch schwanken.

Der von Ihnen gepostete Code sowie der kausale Ansatz selbst sind nur dann von Wert, wenn sie im MKL-5-Tester ausgeführt werden, und zwar notwendigerweise mit einem Forward.

 

Selbst wenn man die Elastizität berücksichtigt, funktionierte es mit den neuen Daten überhaupt nicht. Bei der Ausbildung war es dagegen in Ordnung.

Die Gründe dafür werden gerade ermittelt...

Weil es vielleicht funktioniert hat, aber nicht so, wie Sie es gerne hätten


 
Maxim Dmitrievsky #:

Selbst wenn man die Elastizität berücksichtigt, funktionierte es mit den neuen Daten überhaupt nicht. Obwohl es in der Ausbildung gut lief.

Die Gründe werden noch ermittelt...

Weil es vielleicht funktioniert hat, aber nicht so, wie Sie es gerne hätten


Die Diagramme zeigen keine eindeutige Ursache und Wirkung wie Lufttemperatur und --> Eiskauf.