Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 3154

 
Aleksey Nikolayev #:

Umartigo com uma abordagem semelhante à promovida por Aleksey Vyazmikin. Em vez de uma árvore de classificação, é construída uma "árvore de diferenças", na qual cada folha corresponde a uma probabilidade diferente de um evento (por exemplo, frequência de incêndios). Em essência, essa é uma variante do agrupamento.

Já adianto que não estou pronto para relatar o artigo em detalhes, pois só dei uma olhada de relance.

Obrigado pelo artigo!

Traduzi-o e o li.

Você pode me ajudar a traduzir o algoritmo na forma de fórmulas para uma linguagem mais compreensível? E tentarei escrever o código desse método de construção de uma árvore.

 
Maxim Dmitrievsky #:
Respondi especificamente à sua pergunta específica - em qualquer uma que você quiser. Isso é problema seu. É até estranho o motivo pelo qual me perguntaram. Ela não tinha nada a ver com o tópico no qual eu estava interessado.

Hmm, você relatou aqui no tópico sobre modelos de elevação, que são uma evolução do teste A-B. Portanto, o método é projetado para estimar o impacto quando o alvo muda em relação ao novo impacto. Portanto, é óbvio para mim que o ponto de partida da influência do preditor que está sendo procurado deve ser definido. Aqui eu gostaria de ouvir sua opinião sobre essa questão. Incluindo o motivo pelo qual você acha que isso não é importante.

 
Maxim Dmitrievsky #:
Por que chamar obras-primas de lixo? Eu lhe ofereci gratuitamente, inclusive em seus superlativos, assim como Alexei. Mas fui mandado para o kodobazu. E agora ele, o reclamão, anda por aí me xingando.

Quem é o reclamão? Quem está me xingando?

Se for eu, as acusações não têm fundamento. Gastarei minhas energias para remover os indesejáveis, de forma justa, somente se isso for necessário para atingir meus objetivos.

Eu me ofereci para fornecer os valores do preditor para verificação, pois isso é rápido.

Escrevi anteriormente que uso preditores em grande número nos dados da ZZ, e até descrevi a essência disso. É contraproducente reescrevê-lo em python.

 
Aleksey Vyazmikin #:

Obrigado pelo artigo!

Traduzi-o e li-o.

Você pode me ajudar a traduzir o algoritmo na forma de fórmulas para uma linguagem mais compreensível? Tentarei escrever o código desse método de construção de uma árvore.

Lá, no artigo, na página 10, há uma implementação na forma de pseudocódigo. Na penúltima página, no apêndice, há referências à implementação na linguagem R e aos dados usados no artigo.

Como, em termos gerais, você implementa árvores de decisão no mql5? Por meio de matrizes ou modelos?

 
Aleksey Vyazmikin #:

Hmm, você relatou aqui no tópico sobre modelos de elevação, que são uma evolução do teste A-B. Portanto, o método é projetado para estimar a influência quando o alvo muda a partir da nova influência. Portanto, é óbvio para mim que o ponto inicial da influência do preditor que está sendo procurado deve ser definido. Aqui, eu gostaria de ouvir sua opinião sobre essa questão. Incluindo o motivo pelo qual você acha que isso não é importante.

As amostras em experimentos aleatórios são determinadas aleatoriamente. Logo no início do livro.

Há a abertura de negociações de forma aleatória e o resultado correspondente no grupo de controle, e há um modelo construído em outra subamostra, o grupo de teste. Precisamos determinar o efeito do uso desse modelo, se ele é positivo para o grupo de controle. Em caso afirmativo, aplique o modelo de uma das maneiras sugeridas.

Ao simplesmente testar com novos dados, não é possível determinar o efeito, pois os dados geralmente são tendenciosos. Portanto, a fórmula é composta de dois somatórios: ATE + Bias. Você pode ir ainda mais longe e definir o CATE, ou seja, caso a caso, e selecionar apenas aqueles que são mais bem tratados, e o restante ignorar/esquivar na negociação.

Nos termos de Sanych, procurar o estacionário no não estacionário.
 
Aleksey Vyazmikin #:

Quem é o reclamão? Quem está xingando?

Se for sobre mim, as acusações não têm fundamento. Gastarei minhas energias para eliminar o indesejável, de forma justa, somente se isso for necessário para atingir meus objetivos.

Eu me ofereci para fornecer os valores do preditor para verificação, pois isso é rápido.

Escrevi anteriormente que uso preditores em grande número nos dados da ZZ e até descrevi a essência disso. Reescrever isso em python é contraproducente.

Você reclama e me xinga como uma criança
E em uma pequena quantidade de tudo é produtivo?)
 
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

Essa abordagem não funciona bem com novos dados. Aparentemente, porque fiz um trabalho ruim ao definir o que deveria ser um tritente e em relação a quê :)

A ideia do R-learner foi tirada daqui
 
Maxim Dmitrievsky #:

Essa abordagem não funciona bem com novos dados. Aparentemente, porque fiz um trabalho ruim ao definir o que deveria ser um tritente e em relação a quê :)

A ideia do R-learner foi tirada daqui

O artigo usa conhecimentos muito importantes sobre insumos - elasticidade da oferta e demanda. Daí o cheiro persistente de ajuste excessivo.

Nãotemos esses dados fundamentais de cotações e, além disso, é provável que a elasticidade não funcione: o preço de um ativo pode variar de zero a altíssimo.

O código que você postou, bem como a abordagem causal em si, só terá valor depois de ser executado no testador MKL-5, e necessariamente com um forward.

 

Mesmo ajustado para a elasticidade, não funcionou de forma alguma com os novos dados. No entanto, ficou bom na linha de base.

Os motivos estão sendo determinados...

Porque pode ter funcionado, mas não da maneira que você gostaria que funcionasse


 
Maxim Dmitrievsky #:

Mesmo ajustado para a elasticidade, ele não funcionou de forma alguma nos novos dados. Embora tenha ficado bem na linha de base.

As razões estão sendo estabelecidas...

Porque pode ter funcionado, mas não da maneira que você gostaria que funcionasse


Os gráficos não mostram causa e efeito claros, como temperatura do ar e --> compra de sorvete.