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

 

我将澄清现金奖的条件。

第一个 解决问题的人获得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小时的时间范围内是长还是短。

它的结果是什么样子的。

уровни предикторов
sell
buy
pval
concat
direction
121121
11
31
2.03E-03
121121
1
211112
3
15
4.68E-03
211112
1
222222
19
4
1.76E-03
222222
0
222311
8
0
4.68E-03
222311
0
321113
7
0
8.15E-03
321113
0
333332
53
19
6.15E-05
333332
0

我们看到每一行的买入和卖出数量的偏度,以及匹配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小时的依赖关系。总而言之,是有的。

而这一切都要归功于对信息属性的正确选择。

并对每个有效样本进行详细统计。

sample
correct sell correct buy total correct deals total deals share correct
1 37 10 47 85 0.5529412
2 26 7 33 65 0.5076923
3 30 9 39 80 0.4875
4 36 11 47 88 0.5340909
5 33 12 45 90 0.5
6 28 10 38 78 0.4871795
7 30 9 39 75 0.52
8 34 8 42 81 0.5185185
9 24 11 35 67 0.5223881
10 23 14 37 74 0.5
11 28 13 41 88 0.4659091
12 31 13 44 82 0.5365854
13 33 9 42 80 0.525
14 23 7 30 63 0.4761905
15 28 12 40 78 0.5128205
16 23 16 39 72 0.5416667
17 30 13 43 74 0.5810811
18 38 8 46 82 0.5609756
19 26 8 34 72 0.4722222
20 35 12 47 79 0.5949367
21 32 11 43 76 0.5657895
22 30 10 40 75 0.5333333
23 28 8 36 70 0.5142857
24 21 8 29 70 0.4142857
25 24 8 32 62 0.516129
26 34 15 49 83 0.5903614
27 24 9 33 63 0.5238095
28 26 14 40 66 0.6060606
29 35 6 41 84 0.4880952
30 28 8 36 74 0.4864865
31 26 14 40 79 0.5063291
32 31 15 46 88 0.5227273
33 35 14 49 93 0.5268817
34 35 19 54 85 0.6352941
35 27 8 35 64 0.546875
36 30 10 40 83 0.4819277
37 36 9 45 79 0.5696203
38 25 8 33 73 0.4520548
39 39 12 51 85 0.6
40 37 9 46 79 0.5822785
41 41 12 53 90 0.5888889
42 29 7 36 59 0.6101695
43 36 14 50 77 0.6493506
44 36 15 51 88 0.5795455
45 34 7 41 67 0.6119403
46 28 12 40 75 0.5333333
47 27 11 38 69 0.5507246
48 28 16 44 83 0.5301205
49 29 10 39 72 0.5416667
СОПРОВОЖДЕНИЕ ЭКСПЕРИМЕНТА ПО АНАЛИЗУ ДАННЫХ ФОРЕКСА: доказательство значимости предсказаний
СОПРОВОЖДЕНИЕ ЭКСПЕРИМЕНТА ПО АНАЛИЗУ ДАННЫХ ФОРЕКСА: доказательство значимости предсказаний
  • 2016.03.02
  • Alexey Burnakov
  • www.mql5.com
Начало по ссылкам: 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
 

所有的原始数据都可以在博客的链接中找到。

而这种模式几乎没有什么利润可言。MO处于半点水平。但这是我的方向。

 
桑桑尼茨-弗门科

总是从过去学习。

我们在一张图上找了几个世纪。既上,我们看到'三个士兵',然后我们看到'头和肩膀'。这些数字中有多少我们已经看到了,而且我们相信这些数字,我们交易...

而如果任务是这样设置的。

1.自动找到这样的数字,不是对所有的图表,而是对某个特定的货币对,是最近发生的,而不是三个世纪前的日本大米交易。

2)我们自动搜索这种数字的初始数据--模式。

为了回答第一个问题,让我们考虑称为 "随机森林 "的算法。 该算法将一种或几种货币的报价、指标、价格增量--人类发明的一切,作为其操作的输入数据。10-5-100-200 ...输入变量。然后,它采用与一个时间点相对应的一整套变量值,寻找这些输入变量的组合,使其在历史数据上与某个结果相对应,例如,一个BUY订单。而另一组组合则是另一个订单--卖出。一棵单独的树对应于每个这样的集合。经验表明,对于一个18000条的输入集(大约3年),该算法可以找到200-300棵树。这是一套模式,几乎类似于 "头和肩膀",以及士兵的整个嘴巴。

这种算法的问题是,这种树可以捡到一些未来没有遇到的具体细节。这在论坛中被称为 "超拟合",在机器学习中被称为 "过拟合"。我们知道,一大堆输入变量可以分为两部分:与输出变量相关的变量和与噪音无关的变量。所以伯纳科夫试图剔除那些与产出无关的东西。

PS。

当建立一个趋势TS(买入,卖出)时,任何品种的魔杖都与噪音有关!

你所看到的只是市场的一小部分,它不是最重要的。没有人把金字塔倒过来建。
 
yerlan Imangeldinov:
你所看到的只是市场的一小部分,而不是最重要的部分。没有人把金字塔倒过来建。
具体而言,我没有看到什么?
 
yerlan Imangeldinov:
你所看到的只是市场的一小部分,而不是最重要的部分。没有人把金字塔倒过来建。
除了价格历史之外,你可以向系统添加信息。但你仍然要在历史上进行训练。或者--弗莱尔。
 

试着在输入数据上训练神经元,然后看了看权重。如果输入数据的权重很低,似乎就不需要了。我是用R(Rattle)做的,感谢SanSanych的文章https://www.mql5.com/ru/articles/1165。

输入 输入_1 输入_2 输入_3 输入_4 输入_5 输入_6 输入_7 输入_8 输入_9 输入_10 输入_11 输入_12 输入_13 输入_14 输入_15 输入_16 输入_17 输入_18 输入_19 输入_20
重量 -186.905 7.954625 -185.245 14.88457 -206.037 16.03497 190.0939 23.05248 -182.923 4.268967 196.8927 16.43655 5.419367 8.76542 36.8237 5.940322 8.304859 8.176511 17.13691 -0.57317
子集

我没有在实践中测试这种方法,不知道它是否有效。我会选择输入_1 输入_3 输入_5 输入_7 输入_9 输入_11

Случайные леса предсказывают тренды
Случайные леса предсказывают тренды
  • 2014.09.29
  • СанСаныч Фоменко
  • www.mql5.com
В статье описано использование пакета Rattle для автоматического поиска паттернов, способных предсказывать "лонги" и "шорты" для валютных пар рынка Форекс. Статья будет полезна как новичкам, так и опытным трейдерам.
 
Dr.Trader:

试着在输入数据上训练神经元,然后看了看权重。如果输入数据的权重很低,似乎就不需要了。我是用R(Rattle)做的,感谢SanSanych的文章https://www.mql5.com/ru/articles/1165。

输入 输入_1 输入_2 输入_3 输入_4 输入_5 输入_6 输入_7 输入_8 输入_9 输入_10 输入_11 输入_12 输入_13 输入_14 输入_15 输入_16 输入_17 输入_18 输入_19 输入_20
重量 -186.905 7.954625 -185.245 14.88457 -206.037 16.03497 190.0939 23.05248 -182.923 4.268967 196.8927 16.43655 5.419367 8.76542 36.8237 5.940322 8.304859 8.176511 17.13691 -0.57317
子集

我没有在实践中测试这种方法,不知道它是否有效。我会选择输入_1 输入_3 输入_5 输入_7 输入_9 输入_11

)嗯。非常有趣。

澄清的问题。那你为什么不在权重较小的地方再加入一些输入,如13、14、16?你能展示一个按重量排序的输入和权重图吗?

对不起,一开始没有理解。是的,指定的输入有一个大的模数权重,因为它们应该如此。

 

从视觉上看,所有的砝码都被分为两组。如果你想按照重要/不重要来划分,那么5,11,7,1,3,9明显突出,这一组我认为足够了。