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

 
Dr.Trader:

我也试了一下Y尺度,两种情况下的R^2(有Y尺度和没有Y尺度)得出的结果是一样的(尽管他们使用的是不同的软件包!)。

我想,Y-scale可能会在主成分数量较少的情况下得到同样好的结果。但是,如果即使使用所有的组件,结果仍然不令人满意(就像我的情况一样)--那就没有什么区别了。另外,它的工作速度更快,这对我来说现在更重要。但我还没有通过理论或实践证明这种方法是否适合于选择预测因子......起初我有一个想法,在所有预测因子上建立主要成分模型,通过观察成分的系数来选择预测因子。但后来我注意到,随着添加垃圾--模型的R^2下降了。尝试不同的预测因子集并寻找那些具有较高R^2的预测因子是有意义的,但这只是一个理论。

我经常在这里提出以下建议:如果你把你的作品集蒸馏给我,我们就把我的结果和你的进行比较。

对我来说,最理想的是.RData。一个框架,其中目标是二进制的,预测器最好是实数。

 
Dr.Trader:

我用来训练森林并在验证样本上返回一个错误。原则上,它是有效的--如果森林过度训练,哪怕是一点点,误差都会趋于50%。

现在我使用GetPCrsquared(),即上面那段代码。我也有你在feature_selector_modeller.txt中的例子,但我必须弄清楚并得到需要的代码片段,所以我还没有检查我的数据。

以下是你需要带去的东西。

library(infotheo) # measured in nats, converted to bits

library(scales)

library(GenSA)


#get data

sampleA <- read.table('C:/Users/aburnakov/Documents/Private/dummy_set_features.csv'

, sep= ','

, header = T)




#calculate parameters

predictor_number <- dim(sampleA)[2] - 1

sample_size <- dim(sampleA)[1]

par_v <- runif(predictor_number, min = 0, max = 1)

par_low <- rep(0, times = predictor_number)

par_upp <- rep(1, times = predictor_number)



#load functions to memory

shuffle_f_inp <- function(x = data.frame(), iterations_inp, quantile_val_inp){

mutins <- c(1:iterations_inp)

for (count in 1:iterations_inp){

xx <- data.frame(1:dim(x)[1])

for (count1 in 1:(dim(x)[2] - 1)){

y <- as.data.frame(x[, count1])

y$count <- sample(1 : dim(x)[1], dim(x)[1], replace = F)

y <- y[order(y$count), ]

xx <- cbind(xx, y[, 1])

}

mutins[count] <- multiinformation(xx[, 2:dim(xx)[2]])

}

quantile(mutins, probs = quantile_val_inp)

}



shuffle_f <- function(x = data.frame(), iterations, quantile_val){

height <- dim(x)[1]

mutins <- c(1:iterations)

for (count in 1:iterations){

x$count <- sample(1 : height, height, replace = F)

y <- as.data.frame(c(x[dim(x)[2] - 1], x[dim(x)[2]]))

y <- y[order(y$count), ]

x[dim(x)[2]] <- NULL

x[dim(x)[2]] <- NULL

x$dep <- y[, 1]

rm(y)

receiver_entropy <- entropy(x[, dim(x)[2]])

received_inf <- mutinformation(x[, 1 : dim(x)[2] - 1], x[, dim(x)[2]])

corr_ff <- received_inf / receiver_entropy

mutins[count] <- corr_ff

}

quantile(mutins, probs = quantile_val)

}


############### the fitness function

fitness_f <- function(par){

indexes <- c(1:predictor_number)

for (i in 1:predictor_number){

if (par[i] >= threshold) {

indexes[i] <- i

} else {

indexes[i] <- 0

}

}

local_predictor_number <- 0

for (i in 1:predictor_number){

if (indexes[i] > 0) {

local_predictor_number <- local_predictor_number + 1

}

}

if (local_predictor_number > 1) {

sampleAf <- as.data.frame(sampleA[, c(indexes[], dim(sampleA)[2])])

pred_entrs <- c(1:local_predictor_number)

for (count in 1:local_predictor_number){

pred_entrs[count] <- entropy(sampleAf[count])

}

max_pred_ent <- sum(pred_entrs) - max(pred_entrs)

pred_multiinf <- multiinformation(sampleAf[, 1:dim(sampleAf)[2] - 1])

pred_multiinf <- pred_multiinf - shuffle_f_inp(sampleAf, iterations_inp, quantile_val_inp)

if (pred_multiinf < 0){

pred_multiinf <- 0

}

pred_mult_perc <- pred_multiinf / max_pred_ent

inf_corr_val <- shuffle_f(sampleAf, iterations, quantile_val)

receiver_entropy <- entropy(sampleAf[, dim(sampleAf)[2]])

received_inf <- mutinformation(sampleAf[, 1:local_predictor_number], sampleAf[, dim(sampleAf)[2]])

if (inf_corr_val - (received_inf / receiver_entropy) < 0){

fact_ff <- (inf_corr_val - (received_inf / receiver_entropy)) * (1 - pred_mult_perc)

} else {

fact_ff <- inf_corr_val - (received_inf / receiver_entropy)

}

} else if (local_predictor_number == 1) {

sampleAf<- as.data.frame(sampleA[, c(indexes[], dim(sampleA)[2])])

inf_corr_val <- shuffle_f(sampleAf, iterations, quantile_val)

receiver_entropy <- entropy(sampleAf[, dim(sampleAf)[2]])

received_inf <- mutinformation(sampleAf[, 1:local_predictor_number], sampleAf[, dim(sampleAf)[2]])

fact_ff <- inf_corr_val - (received_inf / receiver_entropy)

} else  {

fact_ff <- 0

}

return(fact_ff)

}



########## estimating threshold for variable inclusion


iterations = 5

quantile_val = 1


iterations_inp = 1

quantile_val_inp = 1


levels_arr <- numeric()

for (i in 1:predictor_number){

levels_arr[i] <- length(unique(sampleA[, i]))

}


mean_levels <- mean(levels_arr)

optim_var_num <- log(x = sample_size / 100, base = round(mean_levels, 0))


if (optim_var_num / predictor_number < 1){

threshold <- 1 - optim_var_num / predictor_number

} else {

threshold <- 0.5

}



#run feature selection


start <- Sys.time()


sao <- GenSA(par = par_v, fn = fitness_f, lower = par_low, upper = par_upp

     , control = list(

      #maxit = 10

        max.time = 1200

        , smooth = F

        , simple.function = F))


trace_ff <- data.frame(sao$trace)$function.value

plot(trace_ff, type = "l")

percent(- sao$value)

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

names(sampleA)[final_vector]

final_sample <- as.data.frame(sampleA[, final_vector])


Sys.time() - start

在数据框架中,最右边的一列是目标列。

所有列都应该是类别(整数、字符或因子)。

而且你必须装载所有的围栏。

一段代码显示了如何将数词转换为分类变量。

disc_levels <- 3 # сколько равночастотных уровней переменной создается


for (i in 1:56){

naming <- paste(names(dat[i]), 'var', sep = "_")

dat[, eval(naming)] <- discretize(dat[, eval(names(dat[i]))], disc = "equalfreq", nbins = disc_levels)[,1]

}

 

我在互联网上发现了这个有趣的功能

data_driven_time_warp <- function (y) {
  cbind(
    x = cumsum(c(0, abs(diff(y)))),
    y = y
  )
}


y <- cumsum(rnorm(200))+1000
i <- seq(1,length(y),by=10)
op <- par(mfrow=c(2,1), mar=c(.1,.1,.1,.1))
plot(y, type="l", axes = FALSE)
abline(v=i, col="grey")
lines(y, lwd=3)
box()
d <- data_driven_time_warp(y)
plot(d, type="l", axes=FALSE)
abline(v=d[i,1], col="grey")
lines(d, lwd=3)
box()
par(op)

也许在这种形式下,算法会更好地识别数据?但有一个问题,函数的输出是一个变量 "d",它有一个有两列 "x "和 "y "的矩阵,其中一列表示价格,另一列表示算法所弯曲的时间,问题是如何将这个矩阵变成一个向量,使它不失去其属性。

 
桑桑尼茨-弗门科

我经常在这里提出以下建议:如果你把你的套装分给我,我们将把我的结果与你的结果进行比较。

对我来说,最理想的是.RData。一个框架,其中的二进制目标和预测器最好是实数。

附着力是我最好的一组预测因素。TrainData是2015年eurusd的D1,fronttestData是从2016年1月1日到6月。前期测试有点长,在实际交易中,我不太可能在相同的设置下交易超过一个月,只是想看看这个模型的盈利能力到底能持续多久。FronttestData1、fronttestData2、fronttestData3是从fronttestData中单独切割出来的,只针对1月,只针对2月,只针对3月。我只对降低fronttestData1的误差感兴趣,其他的只是为了研究。预测器组主要包含指标和它们之间的不同计算方法。在fronttest上的nnet错误,我在fronttestData1上有30%,用迭代控制和拟合内部神经元的数量进行训练。我认为这里的30%只是一个机会问题,该模型从2015年3月到2016年2月在市场上抓住了一些趋势。但其他时期也没有合并,这已经很不错了。

这是一张来自mt5测试器2014.01-2016.06的图片,我用一个框架标记了训练期。它已经比以前好了:)。目前这是我的极限,我必须解决指标的许多问题,即它们的默认设置与时间框架严格挂钩,例如在H1上我的经验完全没有用,在H1上选择指标的相同算法认为一切都很垃圾。我应该在最初的指标集中加入一堆它们的不同参数的变化,或者自己从ohlc中生成随机指标。

附加的文件:
 
阿列克谢-伯纳科夫

有这个可以拿。

这就更有意义了,谢谢你。在我看来,每个指标只有3个类别是不行的。从逻辑上讲,我至少要做100个级别,但这样做会不会更好,或者说会不会失去算法的意义?

 
Dr.Trader:

这就更有意义了,谢谢你。在我看来,每个指标只有3个类别是不行的。从逻辑上讲,我至少要做100个级别,但这是更好的,还是会使算法失去意义?

该算法将失去其意义。该算法计算输入变量的总水平,并按这些水平的反应水平分布。因此,如果每个输入水平的响应值的数量很低,就不可能评估概率倾斜的统计意义。

如果你做100个级别,是的,会有很多变数。那么该算法将对任何子集返回零显著性,鉴于样本量有限,这是合理的。

例子是一个很好的例子。

输入水平 | 观察数

1 150

2 120

...

9 90

在这里,我们可以估计出一个反应中的重要性

例子--不好。

输入水平

112 5

...

357 2

...

1045 1

在此无法估计反应内的重要性

 
Dr.Trader:

附着力是我最好的一组预测因素。TrainData是2015年eurusd的D1,fronttestData是从2016年1月1日到6月。前期测试有点长,在实际交易中,我不太可能在相同的设置下交易超过一个月,我只是想看看这个模型的盈利能力到底能持续多久。FronttestData1、fronttestData2、fronttestData3是从fronttestData中单独切割出来的,只针对1月,只针对2月,只针对3月。我只对降低fronttestData1的误差感兴趣,其他的只是为了研究。预测器组主要包含指标和它们之间的不同计算方法。在fronttest上的nnet错误,我在fronttestData1上有30%,用迭代控制和拟合内部神经元的数量进行训练。我认为这里的30%只是一个机会问题,该模型从2015年3月到2016年2月在市场上抓住了一些趋势。但事实上,其余的时期不合并已经很好了。

这是一张来自mt5测试器2014.01-2016.06的图片,我用一个框架标记了训练期。它已经比以前好了:)。目前这是我的极限,我必须解决指标的许多问题,即它们的默认设置与时间框架严格挂钩,例如在H1上我的经验完全没有用,在H1上选择指标的相同算法认为一切都很垃圾。我需要在原来的指标集上添加一堆不同参数的变化,或者以某种方式从ohlc生成随机指标。

还不错,但样本外的时期本身很小。

也不清楚有多少交易属于样本之外。有几十个,几百个,顺序是什么?

 
Dr.Trader:

附着力是我最好的一组预测因素。TrainData是2015年eurusd的D1,fronttestData是从2016年1月1日到6月。前期测试有点长,在实际交易中,我不太可能在相同的设置下交易超过一个月,我只是想看看这个模型的盈利能力到底能持续多久。FronttestData1、fronttestData2、fronttestData3是从fronttestData中单独切割出来的,只针对1月,只针对2月,只针对3月。我只对降低fronttestData1的误差感兴趣,其他的只是为了研究。预测器组主要包含指标和它们之间的不同计算方法。在fronttest上的nnet错误,我在fronttestData1上有30%,用迭代控制和拟合内部神经元的数量进行训练。我认为这里的30%只是一个机会问题,该模型从2015年3月到2016年2月在市场上抓住了一些趋势。但事实上,其余的时期不合并已经很好了。

这是一张来自mt5测试器2014.01-2016.06的图片,我用一个框架标记了训练期。它已经比以前好了:)。目前这是我的极限,我必须解决指标的许多问题,即它们的默认设置与时间框架严格挂钩,例如在H1上我的经验完全没有用,在H1上选择指标的相同算法认为一切都很垃圾。我需要在原来的指标集上添加一堆不同参数的变化,或者以某种方式从ohlc生成随机指标。

我已经看了。

我的理解是否正确,在总的数据集中有107条线(107个观测值)?

 
桑桑尼茨-弗门科

看了看。

我是否正确理解了总的数据集有107行(107个观测值)?

不,训练集有250多行(2015年的交易日数)。我在trainData表上训练了这个模型。我在fronttestData1上测试了它。其他都是用于额外的检查,你可以忽略它们。

trainData--2015年全年。
fronttestData1 - 2016年1月
fronttestData2 - 2016年2月
fronttestData3 - 2016年3月
fronttestData - 2016年1月 - 2016年6月

 
Dr.Trader:

不,训练集有250多行(2015年的交易日数)。我在trainData表上训练了模型。我在fronttestData1上测试了它。其他都是为了额外的检查,你可以忽略它们。

trainData--2015年全年。
fronttestData1 - 2016年1月
fronttestData2 - 2016年2月
fronttestData3 - 2016年3月
fronttestData - 2016年1月 - 2016年6月

对我来说,这很少--我使用统计数据。即使对于目前的窗口,107行对我来说也是非常小的。我为当前的窗口使用了400多个。

一般来说,在你的集合中,观察值的数量与预测因子的数量相当。这些是非常具体的套装。不知何故,我看到这种套装需要特殊的方法。没有参考资料,因为我没有这样的问题。

不幸的是,我的方法并不适合你的数据。