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

 
桑桑尼茨-弗门科

我没有看到任何证据表明NS已经应对了任何事情。

过度学习是科学领域,特别是模型建立领域的一个世界性的恶习。

因此需要对三组进行误差。

  • 学习套路。拨浪鼓理解的方式(OOB、测试、验证)就可以了。
  • 从日期上看,是在训练集之外的集合。
  • 另一个集子,在日期的意义上,是在训练集之外。

最后两组在到达终点站时是未混合的,基地在酒吧后面。

这三组的误差应该是差不多的。这样做,你将不得不固定你在训练模型时采取的预测因子集。

我一开始并没有考虑重新培训这项工作,没有必要。第一次神经元c是在内层只有一个神经元的情况下。我现在检查了一下,连续学习期间的误差大约是45%,而且不会再低了。网络在训练时给那些输入1,3,5,7,9,11更高的权重,但由于缺乏神经元,它无法真正训练。这是为了在非常有限的条件下,从它身上榨取最大的正确结果,看看它对哪些输入会给予更多的重视。

现在有了验证文件,我可以更认真地工作。现在我把源文件分成两部分(85%和15%),在第一部分上进行训练,有时停止训练并测量两部分的误差。那些来自15%文件的例子没有进入训练,但其中的错误减少了,与训练部分的错误差不多。当它在文件的两部分都变成0%时,我停止训练,在第二个文件上测试神经元,那里的误差是~0%。事实证明,对于这项任务,甚至没有实现过度训练,这很有趣。


但是外汇上的神经元比这个问题上的神经元更糟糕。起初,训练和验证样本的误差都在下降。然后,训练样本的误差继续下降,但测试样本的误差开始增长,这时就应该停止训练。然后我通常在采样前的历史上测试结果,并在采样后的历史上再次测试。对我来说,那是三组数据,就像你的一样。但到目前为止,这三组的误差是不同的(而且在训练期之外的误差很大)。

我有不同的想法来改善结果,例如平滑结果或添加一个过滤器(<0.1 - 卖出,>0.9 - 买入,以及介于两者之间的一切 - 无交易期)。你可以通过给神经输出添加过滤器和优化它来改善结果,但对于fronttest来说,这一点都没有帮助。另一个好主意是,如果神经元是在某段历史上训练的,那么你可以在这段历史之前的历史上优化过滤器。因为优化期之前的错误可能与优化期之后的错误有关。但这并不奏效--如果有三个历史时期--"之前的神经元"--"学习的神经元"--"之后的神经元",那么这三个时期都会有各自的最佳过滤器,它们没有任何联系。

到目前为止,我得出的结论是,该模型的训练和测试样本的误差应该很小(<10%)。不应该对模型结果进行过滤,也不应该进行类似 "每隔四周对结果进行反转 "的猜测。不落入小于M15的时期。我尝试不同的新想法,如果10个想法中至少有一个能改善结果,那就很好。而这在某种程度上应该会形成一种盈利模式。

 
Dr.Trader:

起初我并没有考虑重新培训这项工作,没有必要。第一次是在内层只有一个神经元的情况下。我现在检查了一下,长期训练时的误差大约是45%,而且不会再低了。网络在训练时给那些输入1,3,5,7,9,11更高的权重,但由于缺乏神经元,它无法真正训练。这是为了在非常有限的条件下,从它身上榨取最大的正确结果,看看它对哪些输入会给予更多的重视。

现在有了验证文件,我可以更认真地工作。现在我把源文件分成两部分(85%和15%),在第一部分上进行训练,有时停止训练并测量两部分的误差。15%文件中的那些例子没有进入训练,但其中的误差减少了,与训练部分的误差差不多。当它在文件的两部分都变成0%时,我停止训练,在第二个文件上测试神经元,那里的误差是~0%。事实证明,对于这项任务,甚至没有实现过度训练,这很有趣。


但是外汇上的神经元比这个问题上的神经元更糟糕。起初,训练和验证样本的误差都在下降。然后,训练样本的误差继续下降,但测试样本的误差开始增长,这时就应该停止训练。然后我通常在采样前的历史上测试结果,并在采样后的历史上再次测试。对我来说,那是三组数据,就像你的一样。但到目前为止,这三组的误差是不同的(而且在训练期之外的误差很大)。

我有不同的想法来改善结果,例如平滑结果或添加一个过滤器(<0.1 - 卖出,>0.9 - 买入,以及介于两者之间的一切 - 无交易期)。你可以通过在神经输出中加入过滤器并对其进行优化来改善结果,但对于fronttest来说,这一点都没有帮助。另一个好主意是,如果神经元是在某段历史上训练的,那么你可以在这段历史之前的历史上优化过滤器。因为优化期之前的错误可能与优化期之后的错误有关。但这并不奏效--如果有三个历史时期--"之前的神经元"--"学习的神经元"--"之后的神经元",那么这三个时期都会有各自的最佳过滤器,它们没有任何联系。

到目前为止,我得出的结论是,该模型的训练和测试样本的误差应该很小(<10%)。不应该对模型结果进行过滤,也不应该进行类似 "每隔四周对结果进行反转 "的猜测。不落入小于M15的时期。我尝试不同的新想法,如果10个想法中至少有一个能改善结果,那就很好。而这在某种程度上应该会形成一种盈利模式。

这一切都在数据中 )

所有集合中的数据应包含相互独立的观测值。但即使在这种情况下,验证也会得到最坏的结果。
 

我尝试了Rattle的不同模型,森林也给出了良好的结果。

第1步--森林已经学到了一些东西,在统计数字的输入中,1,3,5,7,9,11看起来有些不同。训练文件的误差为0%,验证文件的误差为46%。

第2步 - 在文件中只留下输入1,3,5,7,9,11和结果。在新文件上再次训练了森林,现在训练和验证文件的误差都是0%,一切都很好。唯一的细微差别是,Rattle在第二步将 "变量数 "参数设置为2,可能是因为文件的大小较小。我把它改为4,就像第一步那样。

 

窦建德博士

很高兴看到一个基于拨浪鼓的兄弟在心中。至少我们可以比较结果。

所以和我自己的经验。

我们从它那里得到的是拨浪鼓和模型。

在 "模型 "选项卡上,我们学习,获得AOB的值,在 "评估 "选项卡上,我们对验证和测试集进行评估。我们得到三个数字。

认为,所得到的结果,如果预测器集以前没有清除过噪音预测器--这些结果是关于什么的,很可能只是一组数字。

在 "评估 "选项卡上,除了获得列出的结果外,还必须将该集合放入R数据集窗口。非常重要的是,这组文件是通过机械地划分原始文件得到的,即所有三个数字的第一个文件,例如从2014年1月1日到2015年1月1日,但文件在

R数据集必然在2015年1月1日之后,没有任何随机抽样和R中使用的其他技巧。它只是钝的,机械的。

我不承认有任何其他的方法可以评估将重要的预测因素从嘈杂的预测因素中分离出来的成功,因为我提出的方法是模仿真实的交易。

能否请你把这四个数字都贴出来?包括R数据集窗口的文件上的结果?

 
Dr.Trader:

我尝试了Rattle的不同模型,森林也给出了良好的结果。

第1步--森林已经训练了一些东西,在统计数据中,输入1、3、5、7、9、11看起来有些不同。训练文件的误差是0%,验证文件的误差是46%。

第2步 - 在文件中只留下输入1,3,5,7,9,11和结果。在新文件上再次训练了森林,现在训练和验证文件的误差都是0%,一切都很好。唯一的细微差别是,Rattle在第二步将 "变量数 "参数设置为2,可能是因为文件的大小较小。我把它改为4,就像第一步那样。

有趣的是...深度必须设置为6个变量,以拾取所有相关的变量。
 
Dr.Trader:

我尝试了Rattle的不同模型,森林也给出了良好的结果。

第1步--森林已经训练了一些东西,在统计数据中,输入1、3、5、7、9、11看起来有些不同。训练文件的误差是0%,验证文件的误差是46%。

第2步 - 在文件中只留下输入1,3,5,7,9,11和结果。在新文件上再次训练了森林,现在训练和验证文件的误差都是0%,一切都很好。唯一的细微差别是,Rattle在第二步将 "变量数 "参数设置为2,可能是因为文件的大小较小。我把它改为4,就像第一步那样。

在第一种情况下,森林使用噪音进行训练,这是不好的。
 
桑桑尼茨-弗门科

能否请你把这四个数字都贴出来?包括R数据集窗口的结果在文件上?

用neuronka做了这个--dummy_set_features.csv分为3部分,分别是70%/15%/15%;dummy_set_validation.csv在evaluation标签中作为 "csv文件 "使用(它与R Dataset基本相同,只是文件格式不同)。

从Rattle获取日志,从neuronics调用中移除这两个限制,关于这一点我之前写过,在R中运行,但模型仍然训练不足(训练样本的35%误差)。因此,如果你减少训练样本,那么训练结果就会变差。但你可以增加内层的神经元数量,它应该能改善学习。

我把神经元的数量从10个改为20个,重新进行训练,现在训练的误差已经变成了0%。验证样本的误差为0.6%,测试样本的误差为0.1%。dummy_set_validation.csv文件的误差是0.3%。一切顺利,R在申请中。

有趣的是,事实证明,神经元卡的训练问题与树的问题非常不同。对我来说,nn的问题是采取正确的内部神经元数量,并在网络开始重新训练之前暂停学习。基本上,神经元越多越好,但这大大影响了所需的内存和训练时间。多余的预测器对学习没有很大的阻碍,神经元通常在有它们的情况下也能学得很好,但它们会增加训练时间,最好是把它们去掉,让它变得更快。

一旦我使用自编的mt4网络,一个EA可以立即学习和交易。在学习速度、权重的初始化、学习算法方面都存在问题。有太多的小问题,即使有训练样本也很难取得好的结果,所以我最终放弃了,现在用R语言工作。nnet包可以通过bfgs算法进行训练,它可以消除所有这些小问题。但该包装有一个限制,即只有1个内层。我想至少有3个内部层,但要用bfgs算法,否则再学习就会有很多问题。

附加的文件:
r_nnet2.txt  10 kb
 
Dr.Trader:

用神经元做了这个--dummy_set_features.csv被分为3部分,分别为70%/15%/15%,作为标准;dummy_set_validation.csv在evaluation标签中作为 "csv文件 "使用(这与R Dataset 基本相同,只是文件格式不同)。

不,这是不一样的。

令人惊讶的是,我和很多人讨论过这个问题,没有人像我写的那样做。而且我知道我在写什么,因为我已经花了半年的时间在像你这样的练习上,还有外面的拨浪鼓()。我没有放进测试器的东西,我得到一个完全不同的错误。然后我做了上面描述的事情,测试器中的错误与R数据集文件中的错误几乎是一致的。

我给了阿列克谢三个文件,这些文件是通过机械地将一个大文件分成三部分得到的。在第一部分,我们锻炼、学习、评估...而在另外两个方面,我们检查我们在第一个方面得到的数字。如果这三个文件的误差都大于20%(!),或者更准确地说,接近40%,模型就不会被重新训练,你可以用它来工作。

上述3个文件有27个预测因子和6个目标变量。这27个预测因子是我自己的算法从170个预测因子中选出的。到今天为止,这27个预测器并没有导致过度训练的模型。但是,我这组中剩下的143个预测因子是噪声,在这个噪声上,你可以很容易地得到一个与你相当的误差,但这个模型是过度训练的,不适合进一步使用。

为什么噪声预测器上的误差比有意义预测器上的误差小?

在我看来,由于模型拟合算法倾向于减少拟合误差,它总是能够在嘈杂的随机值中找到比有意义的预测器更好的东西。因此,误差越小,在建立模型时涉及的有意义的预测因子就越少!

PS

从这个错误来看,要么NS是100%的过度训练,要么是瞻前顾后。

 

评价标签上的 "CSV文件 "和 "R数据集 "只是指定数据源的不同方式。如果你向它们输入相同的数据,在测试模型时你会得到相同的结果。

如果在拨浪鼓之前执行

dataset_validate <- read.csv("file:///C:/dummy_set_validation.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")

那么这个dataset_validate现在将作为R数据集在evaluation标签中可用。但模型检查的结果最终将是相同的,因为如果你只是选择csv文件选项并指定文件C:/dummy_set_validation.csv,两种情况下测试的数据将是相同的。

训练本身是在一个不同的文件上进行的,即dummy_set_features.csv,所以在这里向前看是不可能的,因为两个文件中的数据是不同的,而且完全不受时间影响(但受公式影响)。我认为神经网络做得很好,找到了决定结果的6个输入,减少了其他输入的影响,并通过一些神经逻辑描述了所需的公式。

为了以防万一,我检查了这两个文件以找到重复的字符串,如果它们仍然存在的话。以下是R语言的代码。

#читаем  данные из файлов для обучения и валидации
dataset_train <- read.csv("file:///C:/dummy_set_features.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")
dataset_validate <- read.csv("file:///C:/dummy_set_validation.csv", na.strings=c(".", "NA", "", "?"), strip.white=TRUE, encoding="UTF-8")

anyDuplicated(dataset_train) #количество  повторных строк в первом файле - 567
anyDuplicated(dataset_validate) #количество  повторных строк во втором файле - 202
#  это покачто просто повторные строки в обоих файла по отдельности. Это не вредит, но и ничего не улучшает, лучше их убрать.
dataset_train <- unique(dataset_train)
dataset_validate <- unique(dataset_validate)

#Теперь  можно узнать сколько строк из dataset_train повторяются в dataset_validate
dataset_combined <- rbind(dataset_train, dataset_validate) #Объединяем  оба файла в один
nrow(dataset_combined) - nrow(dataset_combined[!duplicated(dataset_combined), ]) #количество  повторенных строк - 23. Таких повторов быть не должно, их надо удалить.
#Удаление  повторенных строк из dataset_validate
dataset_validate <- dataset_validate[!(tail(duplicated(dataset_combined), nrow(dataset_validate))), ]
#Удаление  из памяти объединённого файла, он больше не нужен
rm(dataset_combined)

如果这是在 rattle 之前完成的,那么dataset_train 和dataset_validate 表都可以用于训练和模型检查,而且不会有任何重复。荣耀R.

模型验证文件包含了23个重复的训练样本,但除此之外,它还有3000个独特的行,所以模型评估不可能受到很大影响。

 
这是它应该有的样子。该文件是由随机数生成的。

一般来说,我高估了任务的复杂性。事实上,这个问题已经被森林解决了。你可能会想,从森林的工作方式来看,这怎么可能呢?