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

 

我的实验的目前状况。

在修正了代码中的错误后,在我的数据上,事实上,我在验证时有以下结果。

图中列举了货币对、预测范围和所谓的灰色区域--预测机器输出的数值区间,此时没有做出入市的决定。

正如你所看到的,我已经对一些货币对采取了积极的措施。对于欧元兑美元来说,是最大的一个。同时,我使实验更加准确,使用所有货币对的实际点差(来自我的DC)。

spreads <- as.data.frame(cbind(

c('audusd'

, 'eurusd'

, 'gbpusd'

, 'usdcad'

, 'usdchf')

, c(0.00018

, 0.0001

, 0.00014

, 0.00013

, 0.00012)

)

)

现在,我已经开始了一个非常强大的概括性实验,其中甚至有更多的参数要被检查,它将持续一周左右。将有大约60倍的估计。但那时我肯定会有一些好的结果可以比较。而且,正如我在某处承诺的那样,我将发布专家顾问(训练有素)的基本逻辑,以备测试。你可以进一步发展它。我将通过在MQL代码中直接添加不同的增强剂来为我自己改进它。

我将很快与你交谈。

 
阿列克谢-伯纳科夫

不,你肯定不大理解非平稳性的重要性。不管是NS模型、线性模型还是我的模型,如果你的数据是非平稳的,那么在其上发现的依赖关系就保证不会在样本之外出现。你拥有的所有数据,如:原始价格、MA(原始价格)、条形开盘(原始价格)等,都需要从模型中删除。你必须取其与最后已知价格的差异。

这里不可能扩展到一个区间。

这并不是那么糟糕。如果你单独考虑每个训练实例(即如果你按训练表中的一行进行归一化),你可以按组对所有数据进行归一化,分别在每个训练实例中进行。例如,在一个训练实例中,对所有100条(共400条)的o,h,l,c列,找到它们的最小和最大,并对它们进行扫描。这应该对每个训练实例分别重复进行。这种归一化将确保训练表中每一行的价格总是在[0...1]范围内。现在,如果将来我们得到一个新的例子,其中的价格已经远远超出了训练期间的价格,归一化将把它返回到[0...1]的范围,它将不会成为神经网络的一些新的未知数据区域。训练有素的模型很可能找到并识别一些规则,如 "在过去的N个柱子中,价格至少有一次高于0.8",这个规则将被应用于任何新的数据,即使价格已经下降了一半。

如果我们像通常那样分别对每一列进行归一化处理,前沿测试中的模型结果会更糟糕。在一个训练实例中,同类型的预测器之间的依赖关系会消失。(例如Open[1]、Open[2]、Open[3]......来自同一训练实例的扫描将以不同的间隔进行,根据所有训练实例)。此外,还有一个问题--在训练过程中,我们将根据数以千计的训练实例进行归一化处理,而在实际交易中,我们将只有一条线,应该与自己进行波浪式缩放,这并不清楚,也很奇怪。

如果你根本不做任何规范化处理,你就可以摆脱它。但如果价格下跌/上涨超出了可用于训练的区间--对模型来说,这将是一个新的、绝对未知的数据区域。它不会把它拉出来,会崩溃。

所有这些都是严格意义上的神经网络,来自经验。

 

在y-scale pca方面又做了一些工作。找到了一篇有分散公式的好文章http://www.chemometrics.ru/materials/textbooks/pca.htm, 在R中做了一个分散公式。

同一篇文章的基本代码http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/
我们需要执行代码"princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE) "并停止。 下一步。

extractProjection <- function(ndim,princ) {
  return(princ$rotation[,1:ndim]) #Эта функция уже была определена ранее, но в этот раз нельзя менять знаки в матрицах как раньше
}
countOfComponentsToUse <- ncol(princ$x) # сюда можно в цикле подставлять числа от 2 до ncol(princ$x), увеличивая число компонент до необходимой точности
PCnameList <- colnames(princ$x)[1:countOfComponentsToUse]
proj <- extractProjection(countOfComponentsToUse, princ)
residualsMatrix <- dmTrain - ((princ$x[,1:countOfComponentsToUse]) %*% (t(proj)))
V0 <- sum(residualsMatrix*residualsMatrix)/nrow(dmTrain)
TRV <- V0/ncol(dmTrain)                           #полная дисперсия остатков (средний квадрат ошибок)
ERV <- 1-nrow(dmTrain)*V0/sum(dmTrain*dmTrain)    #объяснённая дисперсия остатков, нужно увеличивать число компонент если ERV < 0.95

底线大致是这样的:princ对象包含一个账单矩阵(princ$x)和一个负载矩阵(princ$rotation)。如果我们将这两个矩阵princ$x %*% t(princ$rotation)相乘,我们就会得到带有dmTrain数据的原始表格(按Y缩放,没有目标变量)。

可以限制主成分的数量,然后在一定的误差范围内确定原始数据。如果你还记得缓慢的网络和特殊的jpeg图像,当你加载它们时,你会得到类似的东西,更多数量的主成分会对初始数据进行精确拟合。

对于组件的数量N,初始数据定义如下:princ$x[,1:N] %*% t(princ$rotation[,1:N])。误差可以通过从dmTrain中减去所得矩阵来计算,你可以得到残差矩阵。这些是误差,真实数据与发现的数据有多大差别。TRV是误差平方的平均值。ERV是类似于平均误差的东西。如果ERV=0.8,源数据与发现的数据在表格的每个单元格都会有~20%的差异。也就是说,如果你发现一个数字10,那么原始数据很可能是从8到12。 这是一个非常粗糙的定义,但它更有意义。而ERV至少应该是0.95,PCA模型才能包含足够的成分。

你能从中得到什么?你可以在princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE, tol=0.01)中加入新参数tol,这样就不会产生成千上万的主成分,当新成分的sdev< sdev(PC1) * tol时,生成就会停止。之后,可以用上面的函数调整使用的组件数量,从2开始,逐渐增加1。

试图想出如何应用它来筛选出预测者,还没有想到。例如,你可以将princ$rotation中的一个预测器的负载改为0,重新计算ERV,看看结果会差多少。然而我看不出这个行动的意义,不清楚如何应用这个结果。也许这样我们可以找到相关的预测因子,它们不携带任何新的信息,因此它们的消除可能不会使结果恶化。我想找到噪声预测器,但在这些矩阵中,与目标变量没有任何联系,也就是说,什么是噪声,什么不是,根本没有标准。

 
Dr.Trader:

在y-scale pca方面又做了一些工作。找到了一篇有分散公式的好文章http://www.chemometrics.ru/materials/textbooks/pca.htm, 在R中做了一个分散公式。

同一篇文章的基本代码http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

又看了一遍这篇文章。看起来你并不是要重复文章中的例子,只是逐点地用你的数据来代替它。还是我错过了什么?如果没有,为什么没有?
 

我重复了这个例子。用我自己的数据代替它,得到了100多个主成分,方差为0.95。我看了看记录图,没有看到任何突出的好的预测因素。也就是说,当作者在他的数据上看到他可以保留2个主成分和5个预测因子时,我在我的数据上看到了100多个成分和1000多个预测因子(低值逐级递减,甚至不清楚低值的阈值应该被剔除)。

不过我应该给Y-aware PCA点个赞,我只是在没有预先筛选的情况下替换了我的数据,在上面建立了一个Y-aware PCA模型,并在前沿测试中得到了45%的误差。这对外汇来说还没有盈利,但文章到此为止,所以如果我要使用Y-aware pca,那么我需要想出别的办法。

其他方法,我可以只留下十几个预测器,训练nnet,得到的前沿测试误差只有30%。我想用y-aware pca得到一个类似的结果。
 
Dr.Trader:

我重复了这个例子。用我自己的数据代替它,得到了100多个主成分,方差为0.95。我看了一下记录图,我没有看到任何突出的好的预测因素。也就是说,当作者在他的数据上看到他可以保留2个主成分和5个预测因子时,我在我的数据上看到了100多个成分和1000多个预测因子(低值逐渐减少,甚至不清楚低值消除的阈值是什么)。

不过我应该给Y-aware PCA点个赞,我只是在没有预先筛选的情况下替换了我的数据,在上面建立了一个Y-aware PCA模型,并在前沿测试中得到了45%的误差。对于外汇来说,它还没有盈利,但文章到此为止,所以如果我使用y-aware pca,那么我需要想出别的办法。

其他方法,我可以只留下十几个预测器,训练nnet,得到的前沿测试误差只有30%。我想用y-aware pca得到一个类似的结果。
我认为需要逐信重复。除了pca之外,还有一些使用的包,我没有和你一起看到。
 

https://c.mql5.com/3/97/Principal_Components_Regression__1.zip

这是文章中的R代码,文件_03.txt和_04.txt,我以前在我的数据上运行过这些。甚至在_04.txt中增加了对前沿测试数据的检查。我看到的唯一区别是文章结尾处提供的etal包。但甚至没有任何例子,他们只是建议尝试与vtreat prune的结果进行比较。

 
Dr.Trader:

https://c.mql5.com/3/97/Principal_Components_Regression__1.zip

这是文章中的R代码,文件_03.txt和_04.txt,我以前在我的数据上运行过这些。甚至在_04.txt中增加了对前沿测试数据的检查。我看到的唯一区别是文章结尾处提供的etal包。但甚至没有任何例子,只是提供尝试,并与vtreat prune所做的比较结果。

它看起来相当稳固。

那么,没有有用的结果吗?

 
Методические заметки об отборе информативных признаков (feature selection)
Методические заметки об отборе информативных признаков (feature selection)
  • habrahabr.ru
Всем привет! Меня зовут Алексей. Я Data Scientist в компании Align Technology. В этом материале я расскажу вам о подходах к feature selection, которые мы практикуем в ходе экспериментов по анализу данных. В нашей компании статистики и инженеры machine learning анализируют большие объемы клинической информации, связанные с лечением пациентов...
 

你好!

我有一个想法,我想看看,但我不知道用什么工具来实现它......我需要一种能够预测未来几个点的算法,比如3或5个点(最好是神经网络)。

我以前只从事过分类工作,所以我甚至不明白它应该是什么样子的,也不知道该如何建议别人去做,或者推荐一个R的包。

p.s. 伟大的文章Alexey