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

 
Dr.Trader:

谢谢你,我试过了。我可以看出,你在选择预测器方面做了很多工作,因为神经元很容易对它们进行训练,并将结果也存储在测试数据集上。

下面的结果是指关于R1.F3的培训。

1)Rattle有一个有趣的结果。采用标准配置的HH显示出30%/29%/33%的训练/验证/测试误差。R2.F3的误差为35%。但这一切真的只是一个幸运的案例,在其他配置中,它很容易训练不足或训练过度,在这里它只是运气好。

2)然后我采取了一个简单粗暴的无监督学习方法,200个隐藏的神经元,网络被训练到停止改进。错误训练/验证/测试/R2.F3 - 2%/30%/27%/45%。很明显,网络被重新训练。

3)监督下的学习。这与树木不同,但你应该始终对一个神经元这样做,不要过度训练它。它的本质是偶尔暂停训练,检查训练/验证/测试结果。我不知道结果整理的黄金法则,但很正常的做法是在训练数据集上进行训练,然后在验证和测试数据集中寻找错误,当验证/测试中的错误不再下降时停止训练。这为防止过度训练提供了某种保障。在这整个过程中,R2.F3被认为是不可用的,测试只在训练结束后进行。在这种情况下,训练/验证/测试/R2.F3的误差为27%/30%/31%/37%。这里又有过度训练的情况,但不多。你可以在列车误差明显小于验证/测试误差后提前停止学习过程,但这是猜测......可能有帮助,也可能没有帮助。

R1.F1 "目标变量有三个值,Rattle不能用神经元做这个,你必须在R中自己写代码,我跳过这个数据集。

"R1.F4""R1.F5""R1.F6 "在Rattle neuronka中对所有4个错误给出了差不多的结果,我认为用neuronka的适当方法也会得到差不多的结果,我没有进一步处理它们。

我有类似的森林和阿达的数字。

现在,如果我们回到我们的 "公羊"--如何从一个任意的预测器列表中抛弃噪音?我有一些经验性的算法,从170个预测器中选出27个预测器。我也曾用它来分析其他人的预测器组,也很成功。基于这一经验,我认为所有来自R的、在其算法中使用 "重要性 "变量的方法都不能清除预测器集的噪音。

我向本支部的所有读者呼吁:如果原始数据以RData或不需要处理的Excel文件形式呈现,我愿意做相应的分析。

除此以外。

我附上了一些文章,据说这些文章解决了清除原始预测器集的噪音问题,而且质量要好得多。可惜我现在没有时间去尝试。也许有人会尝试并公布结果?

附加的文件:
 
SanSanych Fomenko:

附上一些文章,据说这些文章解决了清除原始预测器集的噪音问题,而且质量更高。可惜我现在没有时间去尝试。也许有人会试一试并公布结果?

谢谢,翻阅了文件,但没有找到我需要的东西。我正试图训练我的外汇模型,在M15和H4之间。对我来说,仅仅获取最后一个柱状图的数据是不够的,我需要一次获取几十个柱状图的数据,然后一个接一个地放在一个长的数组中作为模型输入。例如(open_bar1, close_bar1, hh_bar1, open_bar2, close_bar2, hh_bar2, open_bar3, close_bar3, hh_bar3,...)。如果某些选择方法会告诉我删除第二根柱子的时间,这对我没有帮助,该方法应该告诉我删除所有关于时间的数据(索引3、6、9...)。

我没有理解错吧,在你的文件ALL_cod.RData中,你也可以使用Rat_DF1进行训练(指定必要的目标),然后使用Rat_DF2和Rat_DF3进行检查?我附上了我的R语言代码,供感兴趣的人参考,它实现了误差控制的神经网络 训练。要选择另一个目标变量,你可以简单地将 "Short_Long.75 "替换为 "Short_Long.35"、"Flet_Long"、"Short_Flet"、"Flet_In "中的某一个。这比替换不同的数据集更方便。

附加的文件:
 
Dr.Trader:
我正试图训练我的外汇模型,在M15-H4范围内的某个地方。对我来说,仅仅获取最后一个条形图的数据是不够的,我需要一次获取几十个条形图的数据,并把它们一个接一个地放在一个长的数组中作为模型输入。例如(open_bar1, close_bar1, hh_bar1, open_bar2, close_bar2, hh_bar2, open_bar3, close_bar3, hh_bar3,...)。如果一些选择方法会告诉我,我需要删除第二个柱状体的时间,这对我没有帮助,该方法应该告诉我,例如我可以删除所有的时间数据(索引3、6、9...)。

可能需要时间数据,因为不同时段的市场运作方式不同。

看看我的外汇功能设置。

> names(sampleA)

  [1] "lag_diff_2"        "lag_diff_3"        "lag_diff_4"        "lag_diff_6"        "lag_diff_8"        "lag_diff_11"       "lag_diff_16"     

  [8] "lag_diff_23"       "lag_diff_32"       "lag_diff_45"       "lag_diff_64"       "lag_diff_91"       "lag_diff_128"      "lag_diff_181"    

 [15] "lag_diff_256"      "lag_diff_362"      "lag_diff_512"      "lag_diff_724"      "lag_mean_diff_2"   "lag_mean_diff_3"   "lag_mean_diff_4" 

 [22] "lag_mean_diff_6"   "lag_mean_diff_8"   "lag_mean_diff_11"  "lag_mean_diff_16"  "lag_mean_diff_23"  "lag_mean_diff_32"  "lag_mean_diff_45"

 [29] "lag_mean_diff_64"  "lag_mean_diff_91"  "lag_mean_diff_128" "lag_mean_diff_181" "lag_mean_diff_256" "lag_mean_diff_362" "lag_mean_diff_512"

[36] "lag_mean_diff_724" "lag_max_diff_2"    "lag_max_diff_3"    "lag_max_diff_4"    "lag_max_diff_6"    "lag_max_diff_8"    "lag_max_diff_11" 

 [43] "lag_max_diff_16"   "lag_max_diff_23"   "lag_max_diff_32"   "lag_max_diff_45"   "lag_max_diff_64"   "lag_max_diff_91"   "lag_max_diff_128"

 [50] "lag_max_diff_181"  "lag_max_diff_256"  "lag_max_diff_362"  "lag_max_diff_512"  "lag_max_diff_724"  "lag_min_diff_2"    "lag_min_diff_3"  

 [57] "lag_min_diff_4"    "lag_min_diff_6"    "lag_min_diff_8"    "lag_min_diff_11"   "lag_min_diff_16"   "lag_min_diff_23"   "lag_min_diff_32" 

 [64] "lag_min_diff_45"   "lag_min_diff_64"   "lag_min_diff_91"   "lag_min_diff_128"  "lag_min_diff_181"  "lag_min_diff_256"  "lag_min_diff_362"

 [71] "lag_min_diff_512"  "lag_min_diff_724"  "lag_sd_2"          "lag_sd_3"          "lag_sd_4"          "lag_sd_6"          "lag_sd_8"        

 [78] "lag_sd_11"         "lag_sd_16"         "lag_sd_23"         "lag_sd_32"         "lag_sd_45"         "lag_sd_64"         "lag_sd_91"       

 [85] "lag_sd_128"        "lag_sd_181"        "lag_sd_256"        "lag_sd_362"        "lag_sd_512"        "lag_sd_724"        "lag_range_2"     

 [92] "lag_range_3"       "lag_range_4"       "lag_range_6"       "lag_range_8"       "lag_range_11"      "lag_range_16"      "lag_range_23"    

 [99] "lag_range_32"      "lag_range_45"      "lag_range_64"      "lag_range_91"      "lag_range_128"     "lag_range_181"     "lag_range_256"   

[106] "lag_range_362"     "lag_range_512"     "lag_range_724"     "symbol"            "month"             "day"               "week_day"        

[113] "hour"              "minute"            "future_lag_2"      "future_lag_3"      "future_lag_4"      "future_lag_6"      "future_lag_8"    

[120] "future_lag_11"     "future_lag_16"     "future_lag_23"     "future_lag_32"     "future_lag_45"     "future_lag_64"     "future_lag_91"   

[127] "future_lag_128"    "future_lag_181"    "future_lag_256"    "future_lag_362"    "future_lag_512"    "future_lag_724"

我从移动平均线 和高低点,以及窗口中的价格差这两个数据。还有时间,还有几天甚至几个月)。

我的算法可以现实地在114个预测器中留下10个甚至5个。这很正常。在这样的数据中,PREDICTORS之间有很强的关联性,因此有很强的冗余性。

 

我将向你简要介绍一下我选择信息特征的方法。代码见附件。

问题有两个方面--如何选择子集以及如何衡量所选预测因子与输出变量的相关性。

第一个问题。我 通过使用模拟退火法对预测器组合进行随机列举来解决这个问题。在结果上与遗传学和非确定性梯度下降相似。好的一面是,它从局部最小值中进行选择,并根据自然界中的原则进行工作。可以与非光滑的误差面一起工作,但这里的一切是有条件的。

对于许多问题,该方法的支持者认为它比遗传学更好,例如。它是通过R中的一个包实现的,作为一个标准的几乎。诀窍在于它是针对连续数据的,而我有预测器的索引,所以我做了一个长度为预测器总数的连续向量,当任何标量突破给定的阈值时,预测器的索引变成了1。

第二个问题 甚至更加微妙。健身功能。

如何衡量预测器(和一组预测器)对输出的影响。这种依存关系可以是非线性的。标准回归在一些非线性问题上可以得到很大的滞后。我不是在谈论黑箱训练和使用内置的重要性估计器。我说的是一种单独的方法。

你必须明白,依赖性可能非常复杂,并涉及相互作用、冗余、非线性等问题。所有这些东西都可以适用于分类数据以及数字数据。

我选择了分类数据,因为有很好的信息论工具来处理它。简单地说:有一个输入和一个输出。如果输出状态至少有一点取决于输入(概率上),那么它们就有依赖性。有一种东西叫做相互信息。它是这样衡量的。

现在再深入了解一下。VI衡量的是有限大小的样本上的观察分布的东西。这当然是一个点估计。

所以我们需要在独立的输入-输出对的情况下估计信息的统计边界。这是由一个使用数值方法的自写函数完成的。

甚至更深。如果我们有两个或更多的预测因子--该如何处理它们?

首先,它们本身可能是相关的,它们的关系越大,其集合中的冗余度就越大。这种冗余度是通过所谓的多信息来衡量的。但多信息也是对一个样本的点估计。对它来说,分布的四分位数也是通过另一个自写的函数进行数值计算的。

第二,预测者类别的级别 数量可能非常大(例如,2 ^ 15),以至于对这些级别的依赖性无话可说。每个级别的观察值非常少。

最后,当所有这些都完成并放在一起时,我们可以测量任何一种对任意数量的预测器和输出的依赖性,对任意的样本量进行预定的统计意义。底层函数本身取自信息论软件包。

这一切都在所附文件中。当然,没有100克就不容易理解。还有用于创建交易规则及其验证的完整代码。所有这些都是为了给你提供信息,加深你的知识。

基本上,结果和往常一样。

[1] "1.69%"

> final_vector <- c((sao$par >= threshold), T)

> names(sampleA)[final_vector]

 [1] "lag_diff_23"      "lag_diff_45"      "lag_mean_diff_2"  "lag_mean_diff_8"  "lag_max_diff_11"  "lag_max_diff_181" "lag_min_diff_3"   "lag_min_diff_724"

 [9] "lag_sd_724"       "lag_range_32"     "symbol" "future_lag_181"  

经过一天半的工作和对数以万计的预测器组合的列举,该函数输出了一个健身函数值--这是对预测器集合中的冗余进行惩罚的有意义的互信息。还有预测者本身。

我再说一遍,所有这些都是分类的,允许构建人类可读的规则。允许对发现的模式进行解释。

例如,上面我有1.7%的完全决定论(这对外汇来说还不错)和很多输入,这些输入在0.1的置信度水平上一起显著地决定了输出(二进制)状态(我把实验这样做)。也就是说,显然外汇数据中的信息是存在的。这个问题已被实验证明。

之后,我们可以在验证的基础上评估盈利能力,并对交易系统进行编码。

ǞǞǞ

附加的文件:
 
Dr.Trader:


我是否正确理解,在你的文件ALL_cod.RData中,你也可以使用Rat_DF1进行训练(通过指定所需的目标),然后使用Rat_DF2和Rat_DF3进行检查?我附上了我的R语言代码,供感兴趣的人参考,它实现了误差控制的神经网络训练。要选择另一个目标变量,你可以简单地将文件中的 "Short_Long.75 "替换为 "Short_Long.35"、"Flet_Long"、"Short_Flet"、"Flet_In "中的某些内容。这比替换不同的数据集更方便。

是的,正是为了方便拨动。

还有一个细微差别。

所有目标变量都来自两个ZZ:ZZ(35)和ZZ(25)。这里有一个非常令人不快的细微差别,与你的产生了共鸣。

目标变量是一个0和1的序列,对应于ZZ臂。但我们总是预测ZZ手臂的个别元素,而不是手臂本身。因此,说我们在预测趋势是不正确的。说我们在预测一个趋势的要素 是正确的。而如果你把所有预测的趋势元素加起来,这个趋势很可能不会成功。

 

谢谢你的feature_selector_modeller.zip,我会研究的。

桑桑尼茨-弗门科

我向支部的所有读者致意:我准备做相应的分析,如果最初的数据将以RData或Excel文件的形式呈现,这不需要处理。

我附上了文件,它是一组来自外汇的数据。在RData内部有两个数据集,用于训练和验证。从物理上看,这两个数据集的数据运行在彼此的后面,它们被分成两个文件只是为了测试模型的方便。这个数据集上的模型是可以训练的,我手动筛选出了预测器并训练了神经元,最后验证数据集上的最小误差是46%,这其实是不赚钱的。如果误差降到40%以下,你可以认为是真正的利润。请尝试从这个文件中筛选出预测因素。

桑桑尼茨-弗门科

目标变量是一个0和1的序列,对应于杠杆ZZ。但我们总是预测ZZ手臂的个别元素,而不是手臂本身。因此,说我们在预测趋势是不正确的。说我们在预测一个趋势的要素 是正确的。而如果你把所有预测的趋势元素加起来,你可能甚至不会得到一个趋势。

我已经尝试了不同的目标变量。一方面,你可以提前一个交易日预测价格,然后目标变量将是1或0,取决于下一个交易日的价格是上升还是下降。我在小的时间框架上从来没有得到任何结果,收盘价在它们上面似乎是一个相当随机的数字。但在H1及以上级别,已经有了一些积极的结果。

另一个变体是 "之 "字形或其他趋势指标。我用它得到了一些积极的结果,但条件是要把结果通过过滤器。例如,取最后一个条形图的结果的平均值,或只使用高于某个阈值的结果。在我看来,不值得应用所有这些,它更多的是猜测,而不是精确的计算。问题是,该模型被要求只给出未来10-20个柱状的买入信号,而它有时会在其中给出卖出信号。在这种情况下,交易被逆转,佣金和点差被支付,如此反复,每个趋势都有几次。因此,我们应该获得高精度或平滑的结果,以避免仅在一个柱子上出现这种逆转。也就是说,正如你所说,只有趋势的一个元素被预测,趋势本身不能由这种元素组成。

附加的文件:
set56.RData.zip  525 kb
 
Dr.Trader:


我已经尝试了不同的目标变量。一方面,你可以提前一个交易日预测价格,然后目标变量将是1或0,这取决于下一个交易日的价格是上升还是下降。我在小的时间框架上从来没有得到任何结果,收盘价在它们上面似乎是一个相当随机的数字。但在H1及以上级别,已经有了一些积极的结果。


我的结果始终是相反的。我可以轻松地预测提前几分钟(最多一个小时)的价格走势,准确率为55%(Ask to Ask)。23分钟的最佳结果。这是一个关于验证样本的二元分类。

而随着预测范围的增加,准确率慢慢下降到提前12小时的51%。而这种依赖性在整个历史上都存在。但准确度必须更高,才能达到正数(克服Ask - Bid距离)。

我们以后会讨论这个问题。

 
Dr.Trader:

谢谢你提供的feature_selector_modeller.zip,我会研究的。

我已经附上了文件,是一个外汇数据集。在RData内部有两个数据集,用于训练和验证。从物理上看,这两个数据集的数据是相通的,它们被分成两个文件只是为了测试模型的方便。这个数据集上的模型是可以训练的,我手动筛选出了预测器并训练了神经元,最后验证数据集上的最小误差是46%,这其实是不赚钱的。如果误差降到40%以下,你可以认为是真正的利润。请尝试从这个文件中筛选出预测因素。


我没有发现任何一个预测因素--所有的都是噪音。你的预测因素对你的目标变量没有预测能力。一些提示54,55,56。你也许能从他们那里得到一些东西......否则,在我看来,所有的东西都可以被扔掉了。
 
我明白了,谢谢你,我将寻找其他的投入。
 
Dr.Trader:
我明白了,谢谢,我会去找其他的原始数据。

等一下。我也会运行你的数据进行依赖。

在我开始之前有一个问题。你的数据是否包括一排所有的柱子,或者在制作样品之前有细化的柱子?