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

 
Mihail Marchukajtes:
不,伙计们,这个系统已经消失了,展示它甚至没有意义。

会不会是因为我忘了警告,三元分类器的逻辑已经改变?

二进制有相同的逻辑:如果输出值小于零,就像样本中的0。如果更多,则是样本中的1。

而三元如果输出是:1为样本中的1,0为样本中的0,-1为jPrediction中的"-"。

 


为了利益,我们成立了一个由8个模型组成的委员会,在验证上模拟了4000次交易的序列(5.5年的交易)。这是一个蒙特卡洛模拟,目的是为了了解存款增长的可能范围,没有对初始交易点进行调整(在策略测试器中给出了一个运行情况)。这里验证的MO是0.00026点。下四分位数显然高于零,这是我想得到的。

接下来我们将分析这些系列的恢复因子的分布。

这就是恢复因子的分布。3.7的中位数算是目标值了(计划)。下四分位数也不坏...

我们仍然需要等待对另外80个训练样本的训练运行,并组成一个更大的委员会。

 
Yury Reshetov:

会不会是因为我忘了警告,三元分类器的逻辑已经改变?

二进制有相同的逻辑:如果输出值小于零,就像样本中的0。如果更多,则为样本中的1。

而三元如果输出是:1为样本中的1,0为样本中的0,-1为jPrediction中的"-"。

Ү不,我明白了,有了这个就可以了....这里还有一件事。重点是,优化器非常善于寻找包含输出信息的数据。一旦发现数据的概括性在80%以上。这些数据可以成功地用于任何其他网络拓扑结构,而且训练结果将是完美的,无需重新训练等。这是为那些不想在交易中直接使用优化器的人准备的。在我的案例中,结果发现用于输出分类的数据并不完全成功,所以周五的交易结果并不是我想要的。然而,我没有气馁,找到了另一组谓词,在反复构建时,并没有导致进入和退出时的垃圾状态.......,反正这里有一些建议,把分类器作为你的TS的智能信号过滤器(不是预测)。

1.将买入和卖出信号分开。如果你使用前值的数据,并且这种分离混淆了数据的顺序,那么必然有一个谓词应该是信号的符号。买入=1,卖出=1,也就是说,其中一个谓词将是信号的方向。

2.谓词必须与预测系统有一定的联系。我把它作为信号的Zscore,信号的Kelli,信号的顺序(系统是不可逆的,所以在一个方向可能有几个连续的信号)。基本上,以某种方式与系统有关的信息。你甚至可以采取动量,单独在优化器MT4中,我选择了一个参数,在系统信号的交易中,在测试期获得利润。即动量是针对训练区的系统信号而优化的,等等。

3.退出。这是最重要的部分,因为在我的案例中,100点的输出给了50%的利润概括,把它改成10点,概括增长到65%。在Demark的TS中,这是很难做到的。我经常要手动查看,因为在这种情况下,方法的正规化并没有通过........ 在训练领域,最好是在信号中犯错,但仍然得到一个具有高度概括性的模型。比方说,信号在训练中赚了100个点,我们仍然把它标记为0,因为市场容易出现信号的反面。也就是说,我们故意让TS输掉,以提高归纳水平,从而使TS在未来更好地发挥作用。毕竟我们的产出是理想的,让它有一点不理想,但纠正....。

4)在预测中使用CME的交易量。这真的很有效,并大大增加了模型的概括水平......。我从德尔塔群中取材,所以它像这样.....

 
阿列克谢-伯纳科夫

这是一个蒙特卡洛模拟,以便了解存款增长的可能范围,没有对初始交易点进行调整(在策略测试器中给出运行情况)。

我希望无论你如何移动交易的起点,它们都是在训练期之后。例如,如果你在2015年1月和3月的数据上训练模型(去除2月的数据),那么你就不应该在2月做最终验证,尽管这个数据不在训练样本中,但这样的结果是不可靠的。如果你在2015年4月开始验证,在所有可能被模型在训练或交叉验证中用来拟合模型参数的日期之后,验证才会显示真实交易中预期的充分结果。

我对你的数据进行的第二次尝试(回归四舍五入为[0;0.5;1])没有成功。该模型和遗传学再次选择了 "无交易 "的恒定类选项。
显然,对于预测三个等级,神经元必然有3个输出,否则它不能将三个等级装入一个有水平的输出。或者我不得不去掉 "不交易 "类,留下两个类,并与它们一起工作。

为了在fronttest上检查一些东西,我拿了一个由遗传学选择的预测器列表,通过caret与交叉验证(method = "recommoncv")对它们训练了一个神经元(一切都正确,有三个输出,输入有因子)。结果很一般,即使在训练数据上,准确率也只有40%。
我现在才注意到,验证文件的输出上有实数,而不是类。我只是把它们换成了+1,代表所有的正面,-1代表所有的负面。
此外,在前面的测试中得到了两个准确度。
1)鉴于在预测=0时,模型不应进行交易,那么正确的结果是不相关的,因为交易不会被打开,不会影响最终的统计数据。在这种情况下,预测-1和1有51%的时间是正确的(忽略所有预测=0的例子)。
2)采取所有预测,与所有正确的结果进行比较。在这种情况下,准确率=14%,甚至比随机还差。

我想知道交易模型在你的交易模拟器中会有什么结果,你能不能做一个像上面那样的图,但用我附的模型进行交易?
RData文件太大,论坛没有立即接受它。我做了两个vinrar档案,并把它们分别放在zip档案中。你需要解压两个压缩包,然后打开第一个压缩包,提取数据,第二个压缩包会自己挂上,最重要的是它们必须在同一个文件夹里。
或者你可以运行所附的r脚本,它包含一个所选预测因子的列表,并将用它们生成一个模型。你应该有你发布的原始csv文件,它被使用。
同样的脚本也可以在从附件中打开RData后运行,脚本将采用已准备好的模型,而不是创建一个新的模型,代码中有一个预测和准确性估计的例子。你之前发布的RData文件是需要用来做前测的。

鉴于过去的错误,我开始了我的第三次尝试。

 
Dr.Trader:

1)考虑到在预测=0时,模型不应该进行交易,那么正确的结果并不重要,因为交易不会被打开,也不会影响最终的统计数据。在这种情况下,预测-1和1在51%的情况下是正确的(忽略了所有预测=0的例子)。

对于一个错误的答案,我会给-2分,对于没有答案的-1分,对于正确答案的1分。答案的得分比例可以向某一方变化,但重要的是网络不会不必要地消逝,所以应该对弃权进行惩罚。

两个网络的委员会各给出1个信号,-1(或0)没有信号,如果信号相互矛盾,最后的信号是0,所以来自网络的信号被合并成一个[-1,0,1]的总信号。

 

Dr.Trader:

我希望无论你如何移动交易的起点,它们都是在训练期之后。例如,如果你在2015年1月和3月的数据上训练模型(去除2月的数据),那么你就不应该在2月做最终验证,尽管这个数据不在训练样本中,但这样的结果是不可靠的。如果你在2015年4月开始验证,在所有可能被模型在训练或交叉验证中用来拟合模型参数的日期之后,验证才会显示真实交易中预期的充分结果。


是的,当然,你可以是铁板一块。这正是验证。只是,交易的序列是从大量的观察中随机抽出的。需要蒙特卡洛来了解交易曲线可能的位置。任何交易向一个或另一个方向转移几分钟都会产生自己的曲线。在MT测试器中,我看到一条曲线--一个实现。如果我在每笔交易中建立一个带有随机数发生器 的条件,并以随机数开仓,我可以运行策略测试器500次,得到相同的曲线。但在MT,这将需要很长的时间。而且我需要在30秒内完成。

然后,当我在委员会上制作EA时,我将在策略测试器中运行验证。曲线应该适合于一个扇形,我将得到一个独特的恢复系数值和数学期望值。但你不能只从一次运行中得出结论。不可取。

 
Dr.Trader:


我想知道在你的交易模拟器中交易这个模型会有什么结果,你能不能像上面那样做一个图,但用我所附的模型进行交易?
RData文件太大,论坛没有马上接受它。我做了两个vinrar档案,并把它们分别放在zip档案中。你需要解压两个压缩包,然后打开第一个压缩包,提取数据,第二个压缩包会自己挂上,最重要的是它们必须在同一个文件夹里。
或者你可以运行所附的r脚本,它包含一个所选预测因子的列表,并将用它们生成一个模型。你应该有你发布的原始csv文件,它被使用。
同样的脚本也可以在从附件中打开RData后运行,脚本将采用已准备好的模型,而不是创建一个新的模型,代码中有一个预测和准确性估计的例子。你之前发布的RData文件是需要用来做前测的。

考虑到过去的错误,我开始了第三次尝试。

你在学习哪个模型,神经网络

让我稍后试试。我有一个模型在所有核心上昼夜学习。

实际上,我以为你会成为这个问题的判断者。 只要把我在链接中给出的验证文件中的模型预测值替换掉即可。这些应该是+1/-1/0形式的方向,会有一个新的预测栏。预测列乘以目标列。减去0.0001的价差。删除模型输出为0的条目,采取cumsum函数。

plot(cumsum(your_data$trades_simulated_after_spread), type = 'l')

 mean(your_data$trades_simulated_after_spread)

粗略地说,这将在所有的观察中绘制交易图,并计算出MO。这很简单。

 
Alexey Burnakov:

那么你在学习什么模型,神经网络?

...

预测列乘以目标列。

是的,我正在学习一个神经网络,即nnet包。在这种情况下,我正在用caret训练模型,它可以拾取一些模型参数。

我又看了看你的RData文件中的结果栏,现在马上看到是价格收益。上次我以为是某种概率。
我喜欢你在目标变量中存储价格增量的方式,如果需要,你可以很容易地将它们转换为培训用的课程,或者计算利润。我也会这样做。

都明白了,谢谢你的澄清,计算了利润,计入了价差,画出了图表。太糟糕了,MO=-2.052423e-05,缓慢但肯定的损失。

关于点差,只需要考虑到4种情况:
1, 2) 上一栏的预测=0;新一栏的预测=-1或1。 开立新的头寸。
3) 上一栏的预测值=-1;新栏的预测值=1。反转,旧仓关闭,新仓打开。
4) 前一栏的预测=1;新一栏的预测=-1。反之,旧仓关闭;新仓打开。
在所有其他情况下,要么保留上一栏的旧头寸,要么关闭旧头寸,或者根本没有头寸。这一切都不需要传播。

(更确切地说,买入交易是以买入价+价差开盘,并以买入价平仓。卖出交易以出价+价差逆向开仓,并以出价+价差平仓。出价是指通常在终端显示的价格。但是,为了方便起见,对于恒定的点差,只需在开立新的头寸时考虑一次就足够了--这样做更容易)。

这一切都必须在EA中加以考虑,以使它不至于在一个新的条形图上立即以相同的方向关闭一个 被打开的头寸。我曾经犯过这样的错误,当时我认为我可以从我的经纪人那里得到回扣。但在这种情况下,回扣的交易频率并没有得到回报,一切都会变得更糟。

 
Dr.Trader:

是的,我正在学习一个神经网络,即nnet包。在这种情况下,我正在用caret训练模型,它可以拾取一些模型参数。

我又看了看你的RData文件中的结果栏,现在我马上看到是价格收益。上次我以为是某种概率。
我喜欢你在目标变量中存储价格增量的方式,如果需要,你可以很容易地将它们转换为培训用的课程,或者计算利润。我也会这样做。

都明白了,谢谢你的澄清,计算了利润,计入了价差,画出了图表。太糟糕了,MO=-2.052423e-05,缓慢但肯定的损失。

关于点差,只需要考虑到4种情况:
1, 2) 上一栏的预测=0;新一栏的预测=-1或1。 开立新的头寸。
3) 上一栏的预测值=-1;新栏的预测值=1。反转,旧仓关闭,新仓打开。
4) 前一栏的预测=1;新一栏的预测=-1。反之,旧仓关闭;新仓打开。
在所有其他情况下,要么保留上一栏的旧头寸,要么关闭旧头寸,或者根本没有头寸。这一切都不需要传播。

(更确切地说,买入交易是以买入价+价差开盘,并以买入价平仓。卖出交易以出价+价差逆向开仓,并以出价+价差平仓。出价是指通常在终端显示的价格。但是,为了方便起见,对于恒定的点差,只需在开立新的头寸时考虑一次就足够了--这样做更容易)。

这一切都必须在EA中加以考虑,以使它不至于在一个新的条形图上立即以相同的方向关闭一个 被打开的头寸。我曾经犯过这样的错误,当时我认为我可以从我的经纪人那里得到回扣。但在这种情况下,回扣的交易频率并没有得到回报,只会变得更糟。

按顺序排列。

MO IS 0.00002。这已经超过了-的范围。也就是说,模型已经从噪声中学到了一些东西,但预测的力度不够。

第二。你是否以某种方式指定了数据的哪一部分要滑入某个特定的折页?如果你只是默认为CV(重复CV),模型将采取随机选择的观测值进行测试。对于时间序列来说,这不是最好的选择。

接下来是模拟交易。我有一个简单的信号,在一定的分钟后打开和关闭。然后你可以让它变得更复杂。因此,如果考虑到每笔交易的价差,我有一个积极的MO。而这是现实中得到的。

做一些交叉验证的工作。可以创建指数集,将时间序列的某些部分纳入福德中。

而且除了神经元学,还有很多其他方法。今天最好的一个是GBM或XGBOOST。到目前为止,我选择了第一种。我喜欢它。

 

我使用了trainControl中的 "recommoncv "方法,并使用了默认的分割。最近我自己写了交叉验证的代码,我试着用随机抽取的条形图和连续抽取的没有空隙的块状图进行交叉验证。在前面的测试中没有看到任何区别,两种情况下的结果差不多。我把训练/交叉验证的数据分为50%/50%,也许在这个比例上已经不重要了。
我将实验一下这个问题,以照顾...

我记得在你不久前发布的那篇文章中,领先的比较是用普拉特的方法提升树木(类似这样)。我在谷歌上找到的关于这个方法的所有信息是,你必须把模型的输出传给sigmoid,然后取其结果。gbm或xgboost 能做到吗?这种方法似乎比森林、神经元卡和一些 "袋装树 "要好,它们排在第二位。