L'apprentissage automatique dans la négociation : théorie, modèles, pratique et algo-trading - page 3154

 
Aleksey Nikolayev #:

Unarticle avec une approche similaire à celle promue par Aleksey Vyazmikin. Au lieu d'un arbre de classification, on construit un "arbre des différences", dans lequel chaque feuille correspond à une probabilité différente d'un événement (par exemple, la fréquence des incendies). Il s'agit essentiellement d'une variante de la classification en grappes.

Je dirai tout de suite que je ne suis pas prêt à raconter l'article en détail, car je ne l'ai parcouru qu'en passant.

Merci pour l'article !

Je l'ai traduit, je l'ai lu.

Pouvez-vous m'aider à traduire l'algorithme sous forme de formules dans un langage plus compréhensible ? Et je vais essayer d'écrire le code de cette méthode de construction d'un arbre.

 
Maxim Dmitrievsky #:
J'ai répondu spécifiquement à votre question spécifique - dans celle que vous voulez. C'est votre affaire. Il est même étrange que l'on m'ait posé cette question. Cela n'avait rien à voir avec le sujet qui m'intéressait.

Hmm, vous avez parlé ici dans le fil de discussion des modèles de soulèvement, qui sont une évolution des essais A-B. La méthode est donc conçue pour estimer les coûts de la construction. La méthode est donc conçue pour estimer l'impact lorsque la cible change par rapport au nouvel impact. Il me semble donc évident que le point de départ de l'influence du prédicteur recherché doit être fixé. J'aimerais connaître votre avis sur cette question. Y compris la raison pour laquelle vous pensez qu'elle n'est pas importante.

 
Maxim Dmitrievsky #:
Pourquoi qualifier les chefs-d'œuvre de déchets ? Je vous ai proposé gratuitement, y compris sur vos superlatifs, tout comme Alexei. Mais j'ai été envoyé au kodobazu. Et maintenant, c'est lui, le plaignant, qui se promène en me traitant de tous les noms.

Qui est le plaignant ? Qui me traite de tous les noms ?

Si c'est moi, les accusations sont sans fondement. Je consacrerai mon énergie à éliminer les indésirables, en toute équité, uniquement si cela est nécessaire pour atteindre mes objectifs.

J'ai proposé de donner les valeurs des prédicteurs pour vérification, car c'est rapide.

J'ai écrit précédemment que j'utilisais des prédicteurs en grand nombre sur les données de ZZ, j'en ai même décrit l'essentiel. Il est contre-productif de le réécrire en python.

 
Aleksey Vyazmikin #:

Merci pour cet article !

Je l'ai traduit et lu.

Pouvez-vous m'aider à traduire l'algorithme sous forme de formules dans un langage plus compréhensible ? Et je vais essayer d'écrire le code de cette méthode de construction d'un arbre.

Là, dans l'article, à la page 10, il y a une implémentation sous forme de pseudocode. A l'avant-dernière page, en annexe, il y a des références à l'implémentation en langage R et aux données utilisées dans l'article.

De manière générale, comment implémentez-vous les arbres de décision dans mql5 ? Par des tableaux ou des modèles ?

 
Aleksey Vyazmikin #:

Hmm, vous avez parlé dans le fil de discussion des modèles d'élévation, qui sont une évolution des tests A-B. La méthode est donc conçue pour estimer l'influence lorsque la cible change par rapport à la nouvelle influence. La méthode est donc conçue pour estimer l'influence lorsque la cible change par rapport à la nouvelle influence. Il me semble donc évident que le point de départ de l'influence du prédicteur recherché doit être fixé. J'aimerais connaître votre avis sur cette question. Y compris la raison pour laquelle vous pensez qu'il n'est pas important.

Les échantillons des expériences aléatoires sont déterminés au hasard. Le tout début du livre.

Il y a l'ouverture de transactions au hasard et le résultat correspondant sur le groupe de contrôle, et il y a un modèle construit sur un autre sous-échantillon, le groupe de test. Nous devons déterminer l'effet de l'utilisation d'un tel modèle, s'il est positif pour le groupe de contrôle. Si c'est le cas, il convient d'améliorer le modèle de l'une des manières suggérées.

En testant simplement sur de nouvelles données, vous ne pouvez pas déterminer l'effet car les données sont souvent biaisées. Par conséquent, la formule est composée de deux sommets : ATE + Biais. Vous pouvez aller encore plus loin et définir le CATE, c'est-à-dire au cas par cas, et ne sélectionner que ceux qui sont mieux traités, les autres étant ignorés ou ignorés dans les échanges.

En termes de Sanych, il s'agit de rechercher le stationnaire dans le non-stationnaire.
 
Aleksey Vyazmikin #:

Qui se plaint ? Qui profère des injures ?

S'il s'agit de moi, les accusations sont sans fondement. Je consacrerai mon énergie à éliminer l'indésirable, en toute équité, uniquement si cela est nécessaire pour atteindre mes objectifs.

J'ai proposé de donner les valeurs prédictives pour vérification, car c'est rapide.

J'ai écrit précédemment que j'utilisais des prédicteurs en grand nombre sur les données de ZZ, j'en ai même décrit l'essentiel. Réécrire cela en python est contre-productif.

Vous vous plaignez et me traitez de tous les noms comme un enfant
Et en peu de temps tout est productif ?)
 
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

Cette approche ne fonctionne pas bien avec les nouvelles données. Apparemment parce que j'ai mal défini ce qui devrait être un tritent et en relation avec quoi :)

l'idée de R-learner est tirée d'ici
 
Maxim Dmitrievsky #:

Cette approche ne fonctionne pas bien avec les nouvelles données. Apparemment parce que j'ai mal défini ce qui devrait être un tritent et en relation avec quoi :)

l'idée de R-learner est tirée d'ici

L'article utilise des connaissances très importantes sur les intrants - l'élasticité de l'offre et de la demande. D'où l'odeur persistante d'ajustement excessif.

Nous ne disposons pas de telles données sur les cotations fondamentales, et il est probable que l'élasticité ne fonctionne pas : le prix d'un actif peut varier de zéro à des niveaux très élevés.

Le code que vous avez posté, ainsi que l'approche causale elle-même, n'auront de valeur qu'après avoir été exécutés dans le testeur MKL-5, et nécessairement avec un forward.

 

Même ajusté pour l'élasticité, il ne fonctionnait pas du tout sur les nouvelles données. En revanche, il a fonctionné correctement sur les données de la formation.

Les raisons sont en train d'être déterminées...

Parce qu'il a peut-être fonctionné, mais pas de la manière dont vous le souhaitez.


 
Maxim Dmitrievsky #:

Même ajusté pour l'élasticité, il n'a pas fonctionné du tout sur les nouvelles données. En revanche, elle est restée correcte sur les données de la formation.

Les raisons sont en train d'être établies...

Parce que cela a peut-être fonctionné, mais pas de la manière dont vous le souhaitez.


Les graphiques ne montrent pas clairement la cause et l'effet, comme la température de l'air et --> l'achat de crème glacée.