Начало по ссылкам: https://www.mql5.com/ru/blogs/post/659572 https://www.mql5.com/ru/blogs/post/659929 https://www.mql5.com/ru/blogs/post/660386 https://www.mql5.com/ru/blogs/post/661062
В статье описано использование пакета Rattle для автоматического поиска паттернов, способных предсказывать "лонги" и "шорты" для валютных пар рынка Форекс. Статья будет полезна как новичкам, так и опытным трейдерам.
我将澄清现金奖的条件。
第一个 解决问题的人获得5分
解决方案的截止日期。2016年6月30日
有一个例子是应用选择信息性特征的算法来实施交易策略。
你可能已经读过我关于大实验的博客:https://www.mql5.com/ru/blogs/post/661895
而这里有一张这样的照片。
我试图为五对交易找到一种模式,并在25年左右的验证样本上检测出正确猜测交易的百分比。它并没有立即发挥作用。在任何给定的预测范围内,我都没有达到预期的准确性。
接下来,让我们只取一对,即欧元兑美元。我发现未来3小时的价格走势对我的预测因素子集的依赖性。
我把预测因子简化为分类形式,并开始我寻找重要预测因子的功能。现在就做了,当我在工作时,在20分钟内完成。
[1] "1.51%"
> final_vector <- c((sao$par >= threshold), T)
> names(sampleA)[final_vector]
[1] "lag_diff_45_var" "lag_diff_128_var" "lag_max_diff_8_var" "lag_max_diff_11_var" "lag_max_diff_724_var" "lag_sd_362_var"
[7] "output"
我没有那么快得到收敛,但我在百分之一点五的解释力水平上得到一些结果。
收敛图(最小化)。
接下来是模型的构建。
我们有几个分类的预测因素。我们建立了一本 "规则书",或者在预测因素和产出之间有什么样的关系--在3小时的时间范围内是长还是短。
它的结果是什么样子的。
我们看到每一行的买入和卖出数量的偏度,以及匹配50/50分布的卡方标准的相应值。我们只选择那些概率低于0.01的线条。
还有整个实验的代码,从输入已经被选择的那一刻开始。
dat_test <- sampleA[, c("lag_diff_45_var"
, "lag_diff_128_var"
, "lag_max_diff_8_var"
, "lag_max_diff_11_var"
, "lag_max_diff_724_var"
, "lag_sd_362_var"
, "output")]
dat_test$concat <- do.call(paste0, dat_test[1:(ncol(dat_test) - 1)])
x <- as.data.frame.matrix(table(dat_test$concat
, dat_test$output))
x$pval <- NA
for (i in 1:nrow(x)){
x$pval[i] <- chisq.test(x = c(x$`0`[i], x$`1`[i])
, p = c(0.5, 0.5))$p.value
}
trained_model <- subset(x
, x$pval < 0.01)
trained_model$concat <- rownames(trained_model)
trained_model$direction <- NA
trained_model$direction [trained_model$`1` > trained_model$`0`] <- 1
trained_model$direction [trained_model$`0` > trained_model$`1`] <- 0
### test model
load('C:/Users/aburnakov/Documents/Private/big_experiment/many_test_samples.R')
many_test_samples_eurusd_categorical <- list()
for (j in 1:49){
dat <- many_test_samples[[j]][, c(1:108, 122)]
disc_levels <- 3
for (i in 1:108){
naming <- paste(names(dat[i]), 'var', sep = "_")
dat[, eval(naming)] <- discretize(dat[, eval(names(dat[i]))], disc = "equalfreq", nbins = disc_levels)[,1]
}
dat$output <- NA
dat$output [dat$future_lag_181 > 0] <- 1
dat$output [dat$future_lag_181 < 0] <- 0
many_test_samples_eurusd_categorical[[j]] <- subset(dat
, is.na(dat$output) == F)[, 110:218]
many_test_samples_eurusd_categorical[[j]] <- many_test_samples_eurusd_categorical[[j]][(nrow(dat) / 5):(2 * nrow(dat) / 5), ]
}
correct_validation_results <- data.frame()
for (i in 1:49){
dat_valid <- many_test_samples_eurusd_categorical[[i]][, c("lag_diff_45_var"
, "lag_diff_128_var"
, "lag_max_diff_8_var"
, "lag_max_diff_11_var"
, "lag_max_diff_724_var"
, "lag_sd_362_var"
, "output")]
dat_valid$concat <- do.call(paste0, dat_valid[1:(ncol(dat_valid) - 1)])
y <- as.data.frame.matrix(table(dat_valid$concat
, dat_valid$output))
y$concat <- rownames(y)
valid_result <- merge(x = y, y = trained_model[, 4:5], by.x = 'concat', by.y = 'concat')
correct_sell <- sum(subset(valid_result
, valid_result$direction == 0)[, 2])
correct_buys <- sum(subset(valid_result
, valid_result$direction == 1)[, 3])
correct_validation_results[i, 1] <- correct_sell
correct_validation_results[i, 2] <- correct_buys
correct_validation_results[i, 3] <- sum(correct_sell
, correct_buys)
correct_validation_results[i, 4] <- sum(valid_result[, 2:3])
correct_validation_results[i, 5] <- correct_validation_results[i, 3] / correct_validation_results[i, 4]
}
hist(correct_validation_results$V5, breaks = 10)
plot(correct_validation_results$V5, type = 's')
sum(correct_validation_results$V3) / sum(correct_validation_results$V4)
接下来,有49个验证样本,每个样本大约覆盖5年。让我们在他们身上验证该模型,并计算正确猜测交易方向的百分比。
让我们看看各样本正确猜测交易的百分比和这个值的直方图。
并计算我们在所有样本上总共猜测了多少交易方向。
> sum(correct_validation_results$`total correct deals`) / sum(correct_validation_results$`total deals`)
[1] 0.5361318
约54%。但没有考虑到我们需要克服Ask & Bid之间的距离。也就是说,根据上图,假设点差=1点,阈值约为53%。
也就是说,我们在30分钟内构思了一个简单的模型,例如,在终端很容易进行charcode。而且这甚至不是一个委员会。而且,我已经找了20分钟而不是20小时的依赖关系。总而言之,是有的。
而这一切都要归功于对信息属性的正确选择。
并对每个有效样本进行详细统计。
所有的原始数据都可以在博客的链接中找到。
而这种模式几乎没有什么利润可言。MO处于半点水平。但这是我的方向。
总是从过去学习。
我们在一张图上找了几个世纪。既上,我们看到'三个士兵',然后我们看到'头和肩膀'。这些数字中有多少我们已经看到了,而且我们相信这些数字,我们交易...
而如果任务是这样设置的。
1.自动找到这样的数字,不是对所有的图表,而是对某个特定的货币对,是最近发生的,而不是三个世纪前的日本大米交易。
2)我们自动搜索这种数字的初始数据--模式。
为了回答第一个问题,让我们考虑称为 "随机森林 "的算法。 该算法将一种或几种货币的报价、指标、价格增量--人类发明的一切,作为其操作的输入数据。10-5-100-200 ...输入变量。然后,它采用与一个时间点相对应的一整套变量值,寻找这些输入变量的组合,使其在历史数据上与某个结果相对应,例如,一个BUY订单。而另一组组合则是另一个订单--卖出。一棵单独的树对应于每个这样的集合。经验表明,对于一个18000条的输入集(大约3年),该算法可以找到200-300棵树。这是一套模式,几乎类似于 "头和肩膀",以及士兵的整个嘴巴。
这种算法的问题是,这种树可以捡到一些未来没有遇到的具体细节。这在论坛中被称为 "超拟合",在机器学习中被称为 "过拟合"。我们知道,一大堆输入变量可以分为两部分:与输出变量相关的变量和与噪音无关的变量。所以伯纳科夫试图剔除那些与产出无关的东西。
PS。
当建立一个趋势TS(买入,卖出)时,任何品种的魔杖都与噪音有关!
你所看到的只是市场的一小部分,而不是最重要的部分。没有人把金字塔倒过来建。
你所看到的只是市场的一小部分,而不是最重要的部分。没有人把金字塔倒过来建。
试着在输入数据上训练神经元,然后看了看权重。如果输入数据的权重很低,似乎就不需要了。我是用R(Rattle)做的,感谢SanSanych的文章https://www.mql5.com/ru/articles/1165。
我没有在实践中测试这种方法,不知道它是否有效。我会选择输入_1 输入_3 输入_5 输入_7 输入_9 输入_11
试着在输入数据上训练神经元,然后看了看权重。如果输入数据的权重很低,似乎就不需要了。我是用R(Rattle)做的,感谢SanSanych的文章https://www.mql5.com/ru/articles/1165。
我没有在实践中测试这种方法,不知道它是否有效。我会选择输入_1 输入_3 输入_5 输入_7 输入_9 输入_11
)嗯。非常有趣。
澄清的问题。那你为什么不在权重较小的地方再加入一些输入,如13、14、16?你能展示一个按重量排序的输入和权重图吗?
对不起,一开始没有理解。是的,指定的输入有一个大的模数权重,因为它们应该如此。
从视觉上看,所有的砝码都被分为两组。如果你想按照重要/不重要来划分,那么5,11,7,1,3,9明显突出,这一组我认为足够了。