交易中的机器学习:理论、模型、实践和算法交易 - 页 3154

 
Aleksey Nikolayev #:

篇文章 采用的方法与 Aleksey Vyazmikin 推广的方法类似。这篇文章采用了与 Aleksey Vyazmikin 所提倡的方法类似的方法,即构建一棵 "差异树",而不是一棵分类树,在这棵树上,每一片叶子都对应着一个事件的不同概率(例如火灾频率)。从本质上讲,这是聚类的一种变体。

我想说的是,我还没有准备好详细复述这篇文章,因为我只是顺便浏览了一下。

感谢您的文章!

翻译了,读了。

您能帮我把公式形式的算法翻译成更容易理解的语言吗?我将尝试编写这种建树方法的代码。

 
Maxim Dmitrievsky #:
我具体回答了你的具体问题--你想怎么回答都行。那是你自己的事。至于为什么问我这个问题,那就更奇怪了。

嗯,你已经在这里的主题中报告了上浮模型,它是 A-B 试验的演变。因此,该方法旨在估算目标从新撞击发生变化时的撞击力。因此,在我看来,显然应该设定所寻求的预测因子影响的起点。在这里,我想听听大家对这个问题的看法。包括您认为它不重要的原因。

 
Maxim Dmitrievsky #:
为什么说杰作是垃圾?我像阿列克谢一样,免费为您提供包括您的上乘之作在内的一切。但我被送进了 "小木屋"。现在他,那个抱怨者,到处骂我。

谁是抱怨者?谁在骂我?

如果是我,这些指责毫无根据。只有在实现我的目标所必需的情况下,我才会花费精力,公平地清除不受欢迎的人。

我提出提供预测值以供验证,因为这样做很快。

我之前写道,我在 ZZ 的数据中大量使用了预测器,我甚至描述了其中的要点。用 python 重写会适得其反。

 
Aleksey Vyazmikin #:

感谢您的文章!

翻译了它,读了它。

你能帮我把公式形式的算法翻译成更容易理解的语言吗?我将尝试编写这种建树方法的代码。

在这篇文章的第 10 页,有一个伪代码形式的实现方法。在倒数第二页的附录中,提到了 R 语言的实现和文章中使用的数据。

一般来说,如何在 mql5 中实现决策树?通过数组还是模板?

 
Aleksey Vyazmikin #:

嗯,您在这里的主题中报告了上浮模型,这是 A-B 测试的演变。因此,该方法旨在估算当目标从新的影响因素发生变化时的影响因素。因此,在我看来,显然应该设定所寻找的预测因子的影响起点。在这里,我想听听大家对这个问题的看法。包括您认为它不重要的原因。

随机试验中的样本是随机确定的。本书的开头。

有随机开仓交易和对照组的相应结果,还有一个建立在另一个子样本(测试组)上的模型。我们需要确定使用这种模型的效果,是否对对照组产生积极影响。如果是,那么就用建议的方法之一来提升模型。

如果只是对新数据进行测试,则无法确定效果,因为数据往往存在偏差。因此,计算公式为 ATE + 偏差两两相加。您还可以更进一步,定义 CATE,即根据具体情况,只选择治疗效果较好的患者,其他患者在交易中忽略/跳过。

用 Sanych 的术语来说,就是在非稳态中寻找稳态。
 
Aleksey Vyazmikin #:

谁在抱怨?谁在骂人?

如果是针对我,那么这些指责毫无根据。只有在实现我的目标所必需的情况下,我才会花费精力,公平地消除不受欢迎的人。

我提出提供预测值以供验证,因为这样做很快。

我之前写道,我在 ZZ 的数据中大量使用了预测器,我甚至描述了它的要点。把它改写成 python 会适得其反。

你像个孩子一样抱怨并骂我
少量的东西就能产生效果吗?)
 
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

这种方法对新数据效果不佳。显然是因为我没有很好地定义什么应该是三元组以及三元组与什么的关系:)

R-learner 的概念来自这里
 
Maxim Dmitrievsky #:

这种方法对新数据效果不佳。显然是因为我没有很好地定义什么应该是三元组以及三元组与什么的关系:)

R-learner 的想法来自这里

这篇文章使用了非常重要的投入知识--供需弹性。因此,过度拟合的气味始终存在。

我们没有这样的基本报价数据,而且,弹性很可能不起作用:资产的价格可以从零变化到天价。

您发布的代码以及因果关系方法本身,只有在 MKL-5 测试器中运行后才有价值,而且必须是正向的。

 

即使经过弹性调整,在新数据上也完全不起作用。但在 Traine 上却没有问题。

原因正在研究中...

因为它可能起作用了,但不是以你希望的方式起作用的


 
Maxim Dmitrievsky #:

即使经过弹性调整,在新数据上也完全不起作用。尽管它在 Traine 上保持正常。

原因正在研究中...

因为它可能起作用了,但不是以你希望的方式起作用的


图表没有显示出明确的因果关系,比如气温和-->买冰激凌。