文章 "梯度提升(CatBoost)在交易系统开发中的应用. 初级的方法"

 

新文章 梯度提升(CatBoost)在交易系统开发中的应用. 初级的方法已发布:

在 Python 中训练 CatBoost 分类器,并将模型导出到mql5,以及解析模型参数和自定义策略测试程序。Python 语言和 MetaTrader 5 库用于准备数据和训练模型。

编译后的 EA 可以在标准的 MetaTrader 5 策略测试器中进行测试。选择一个合适的时间框架(必须与模型训练中使用的时间框架相匹配)和输入参数look_back 和 MA_period,这也应该与 Python 程序中的参数相匹配。让我们在训练期间检查模型(培训+验证子样本):

模型的效果(训练+验证子样本)

如果我们将结果与在定制测试器中获得的结果进行比较,这些结果是相同的,除了一些点差引起的偏差。现在,让我们从年初开始,用全新的数据来测试这个模型:

新数据的模型性能

该模型在新数据上的表现明显较差。如此糟糕的结果与客观原因有关,我将进一步阐述。

作者:Maxim Dmitrievsky

 

没必要在这里混为一谈

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

根据 https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html 的帮助

shuffle bool, 默认为 true

是否在分割前对数据进行洗牌。如果 shuffle=False 则 stratify 必须为 None。

在拆分之前对数据进行洗牌,也就是说,测试中的一些示例将包含在训练中。

总的来说,我很喜欢这篇文章,它表明在交易中实施和使用人工智能是非常容易的。

sklearn.model_selection.train_test_split — scikit-learn 0.23.2 documentation
  • scikit-learn.org
*arrays , **options ¶ Quick utility that wraps input validation and and application to input data into a single call for splitting (and optionally subsampling) data in a oneliner. Parameters *arrays Allowed inputs are lists, numpy arrays, scipy-sparse matrices or pandas dataframes. test_size If float, should be between 0.0 and 1.0 and represent...
 
你能做文章中的最后一张图,但不混合吗?
我想验证效果会变差,而对未知数据的测试效果可能会有所改善。
 
elibrarius:

没必要在这里搅和

根据帮助 https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html



总的来说,我喜欢这篇文章,它表明在交易中实施和使用人工智能非常容易。

我这样做的目的是让样本更均匀一些。如果不混合,测试结果会更糟,但对新数据几乎没有影响。我稍后会举例说明。

 

这就是我不明白的地方:

if dataset['close'][i] >= (dataset['close'][i + rand]):
            labels.append(1.0)
        elif dataset['close'][i] <= (dataset['close'][i + rand]):
            labels.append(0.0)              
        else:
            labels.append(0.0)

永远不会起作用的条件用红色标出。

 
Stanislav Korotky:

这就是我不明白的地方:

永远不会起作用的条件用红色标出。

这里没有任何问题,我已经更改了条件,但仍然有伪影。

 
马克西姆万分感谢你分享这样的文章......
尤其是在 mql5 上导入 python 模型。
因为我不是 ALGLIB 专家,但我强烈认为 XGBoost CATBoost 和 Pytorch 是目前机器学习和深度学习领域的佼佼者。
 
非常有趣的作品!感谢作者。
 
有一个问题与这篇文章并不直接相关,但间接与CatBoost 有关。

谁能用手指解释一下 CatBoost(或更广义的基于直方图的梯度提升决策树)是如何根据直方图按特征(输入变量)进行分离的?很明显,每个分区(直方图条)都要计算统计数据:数值在分区范围内的向量的总点击数,以及它们属于输出类别(本例中为两个)的细分情况。有了包含这些统计数据的直方图,如何选择创建下一级树的分部呢?

 
Stanislav Korotky:
有一个问题与这篇文章有关,不是直接相关,而是通过 CatBoost 依赖关系间接相关。

谁能用手指解释一下 CatBoost(或更广义的基于直方图的梯度提升决策树)是如何根据直方图按特征(输入变量)进行分离的?很明显,每个分区(直方图条)都要计算统计数据:数值在分区范围内的向量的总点击数,以及它们属于输出类别(本例中为两个)的细分情况。有了包含这些统计数据的直方图,如何选择创建下一级树的分部呢?

树的构建是相互独立的,然后在树叶中进行计数(通过未量化的预测因子进行枚举),从而减少梯度误差。

在为树的构建和树的分割选择预测因子 时,会使用随机系数,这在理论上可以提高完整性(召回)并防止过度训练。

 
Stanislav Korotky:
有一个问题与这篇文章有关,不是直接相关,而是通过 CatBoost 依赖关系间接相关。

谁能用手指解释一下 CatBoost(或更广义的基于直方图的梯度提升决策树)是如何根据直方图按特征(输入变量)进行分离的?很明显,每个分区(直方图条)都要计算统计数据:数值在分区范围内的向量的总点击数,以及它们属于输出类别(本例中为两个)的细分情况。有了包含这些统计数据的直方图,如何选择创建下一级树的分部呢?

最好请教开发人员