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

 

那你到底是如何计算R^2的,什么函数?

我试图通过 rattle 训练不同的模型,它通过相关性计算 "伪 r^2",即 cor(fitpoints[,1], fitpoints[,2])^2,但我想用你的方法计算 r^2,以便进行比较。

这段代码[1-sum((y-x)^2)/sum((y-mean(y))^2)]能行吗?

 
Dr.Trader:

那你到底是如何计算R^2的,什么函数?

我试图通过 rattle 训练不同的模型,它通过相关性计算 "伪 r^2",即 cor(fitpoints[,1], fitpoints[,2])^2,但我想用你的方法计算 r^2,以便进行比较。

这段代码[1-sum((y-x)^2)/sum((y-mean(y))^2)]能行吗?


正是如此。X是一个模型。

 
Dr.Trader:

隐蔽层中的神经元越多--神经元可以描述的功能就越复杂,你需要更多的隐蔽层和其中的神经元。

但问题是,神经元使用连续的加法和乘法(例如激活函数的sigmoids)来描述目标,也就是说,它显然不是你的原始函数,而是某种近似。而结果可能是,这个近似值会记住训练数据中的一些特征,所以它在新数据中不能正确工作。因此,有时你需要停止训练,看看测试样本的误差是否减少,如果一切正常,再继续训练。在某些时候,测试数据上的错误会开始增长,然后必须完全停止训练。

另外,神经元键的输出受激活函数的限制。对于流行的--sigmoid是(0;1),relu是[0;inf]。目标值需要按不同的区间进行缩放,你在区间(-7;7)的输出对许多数据包来说根本无法实现。

我用cf 0 st.off 1来衡量所有数据。

有可能以-1;1为目标。但只有在输出神经元有切向激活时才真正需要这样做。

0:;1为类似情况下的sigmoid。

如果那里有一个身份,你就不必了。 但你必须考虑到数据的真正传播。砝码可能不会饱和到这个水平。

而且我正在学习托盘上的输出曲线,并进行测试,看看在哪里可以停止。
 

再一次拿着拨浪鼓,训练了nnet,从日志中取出了完成的代码。Rattle与nnet的工作不太正常,我又加了一些代码来及时停止训练。

新数据的最佳R^2=0.18。最佳网络配置出来的结果非常有趣,在唯一的内层有一个神经元。我可以在内层多设两个神经元,这将是差不多的结果。如果我们不断增加神经元的数量,该图表明网络重新训练的速度非常快,在新数据上的表现也越来越差。

在右图中,蓝线是该模型的新数据,从20001行开始。剩下的就是培训和交叉验证了。

卷积网络似乎处于领先地位。

附加的文件:
 
Dr.Trader:

再一次拿着拨浪鼓,训练了nnet,从日志中取出了完成的代码。Rattle与nnet的工作不太正常,我又加了一些代码来及时停止训练。

新数据的最佳R^2=0.18。最佳网络配置出来的结果非常有趣,在唯一的内层有一个神经元。我可以在内层多设两个神经元,这将是差不多的结果。如果我们不断增加神经元的数量,图中显示网络重新训练的速度非常快,在新数据上的表现越来越差。

在右图中,蓝线是该模型的新数据,从20001行开始。剩下的就是培训和交叉验证了。

卷积网络似乎处于领先地位。

结果是好的!恭喜你,你打败了我的简单NS。

你是准备好了薯片,还是在它们滞后的时候喂它们?这个问题似乎不能在纯粹的滞后上得到解决。筹码的准备是必要的。

另一个观察结果--看起来你的网络输出是严格的-1;1。要么你采取了切向激活,然后没有把输出转换回来,要么就是其他原因。

仅供参考。mxnet软件包中的融合网络(深度学习)。到目前为止,只有git的版本。但基本的东西都是有效的。
 
阿列克谢-伯纳科夫

仅供参考。mxnet软件包中的融合网络(深度学习)。到目前为止,只有git的版本。但基本的一切都在运作。

只是一个观察,偏离主题,但....当 我求助于mxnet 并指出mxnet软件包时,大家都沉默不语,什么也不说。现在大家突然对我50页前说的事情感兴趣了,为什么会这样呢?:)我不知道100页之后是否有人会注意到我很久以前也注意过的quantstrat包....

你会说--哈,好吧,如果你这么聪明就自己去做吧,事实是我不是,我也不聪明,我也不太懂,英语也很差,你的四行代码加上解释对我来说可能需要几周时间才能搞定,即使这样也不一定能成功......

 
mytarmailS:

只是一个观察,偏离主题,但....当 我在卷积网络方面寻求帮助并指出mxnet软件包时,大家都沉默不语,什么也不说。现在大家突然对我在50页以前谈论的东西感兴趣了,为什么会这样?:)我不知道100页之后是否有人会注意到我很久以前也注意过的quantstrat包....

你会说--哈,好吧,如果你这么聪明就自己去做吧,事实是我不是,我也不聪明,我也不太懂,英语也很差,你的四行代码加上解释对我来说可能需要几周时间才能搞定,即使这样也不一定能成功......

只是一个伟大的评论,同事!) 哈

让我根据我的设想逐一回答。

1)这里90%的人都是由自我利益驱动,思考阶段和实验阶段。因此,一些好的想法被搁置了很久。由于你没有提供任何有趣的例子和挑战,所以没有人感兴趣。很简单,不是吗?

2)获得知识有两种策略:挖掘和痛苦地尝试做一些事情(我们都在不同程度上这样做。例如,我记得在 "学会赚钱,村民们!"的主题中,有位老兄花了几年时间来测试可用的专家顾问的工作能力。而他们都失败了)。另一个选择是--等待,希望有人会帮助并发布一个现成的。因此,如果你由于自身情况选择了第二种策略,那么等待现成的EA的时间可能会非常长。

关于mxnet,既然我对它感兴趣,我不介意把代码贴出来,顺便说一下,在互联网上几乎是一样的。

install.packages("drat", repos="https://cran.rstudio.com")
drat::: addRepo("dmlc") 

install.packages("mxnet") 

 

 

train.x = data.matrix(dat_ready_scale[1:(nrow(dat_ready_scale) / 2), 1:100])

train.y = dat_ready_scale[1:(nrow(dat_ready_scale) / 2), 101]

test.x = data.matrix(dat_ready_scale[!rownames(dat_ready_scale) %in% rownames(train.x), 1:100])

test.y = dat_ready_scale[!rownames(dat_ready_scale) %in% rownames(train.x), 101]



########

train.x <- t(train.x)

test.x <- t(test.x)


dim(train.x) <- c(100, 1, 1, ncol(train.x))

dim(test.x) <- c(100, 1, 1, ncol(test.x))

#########



############ BUILD NET


library(mxnet)


# first conv layer


data <- mx.symbol.Variable('data')


conv1 <- mx.symbol.Convolution(data = data,

  kernel=c(14, 1),

  stride=c(1, 1),

  num.filter = 1)


tanh1 <- mx.symbol.Activation(data = conv1, 

 act.type = 'relu')


pool1 <- mx.symbol.Pooling(data = tanh1, 

     pool_type = "avg",

     kernel=c(5, 1), 

     stride=c(1, 1))



# second conv layer


conv2 <- mx.symbol.Convolution(data = conv1,

  kernel=c(12, 1),

  stride=c(1, 1),

  num.filter = 1)


tanh2 <- mx.symbol.Activation(data = conv2, 

 act.type = 'relu')


pool2 <- mx.symbol.Pooling(data = tanh2, 

     pool_type = "avg",

     kernel=c(5, 1), 

     stride=c(1, 1))



# third conv layer


conv3 <- mx.symbol.Convolution(data = conv2,

  kernel=c(10, 1),

  stride=c(1, 1),

  num.filter = 1)


tanh3 <- mx.symbol.Activation(data = conv3, 

 act.type = 'relu')


pool3 <- mx.symbol.Pooling(data = tanh3, 

     pool_type = "avg",

     kernel=c(2, 1), 

     stride=c(1, 1))



# first fully connected layer


flatten <- mx.symbol.Flatten(data = conv3)


fc1 <- mx.symbol.FullyConnected(data = flatten

   , num_hidden = 10)


tanh4 <- mx.symbol.Activation(data = fc1, act.type = 'tanh')



# second fully connected layer


fc2 <- mx.symbol.FullyConnected(data = tanh4, num_hidden = 1)


lenet <- mx.symbol.LinearRegressionOutput(data = fc2)


#### train


device <- mx.cpu()

log <- mx.metric.logger$new()


model <- mx.model.FeedForward.create(lenet, 

 X = train.x,

 y = train.y,

 ctx = device, 

 num.round = 100, 

 array.batch.size = 128,

 learning.rate = 0.01, 

 momentum = 0.9,

 eval.metric = mx.metric.rmse,

 eval.data = list(data = test.x, label = test.y),

 optimizer = 'sgd',

 initializer = mx.init.uniform(0.5),

 #array.layout = 'rowmajor',

 epoch.end.callback = mx.callback.log.train.metric(1, log))


plot(log$train, type = 'l', col = 'blue', ylim = c(min(c(log$train, log$eval)), max(c(log$train, log$eval))))

lines(log$eval, type = 'l', col = 'red')


mx.ctx.internal.default.value = list(device="cpu",device_id=0,device_typeid=1)

class(mx.ctx.internal.default.value) = "MXContext"


preds <- as.numeric(predict(model, test.x))

1 - sum((test.y - preds)^2) / sum((test.y - mean(test.y))^2)

自然,这只是一条显示基本逻辑的鱼。

 
阿列克谢-伯纳科夫
筹码是准备好的,还是像滞销品那样被喂养?这项任务似乎不能靠纯粹的滞后来解决。筹码的准备是必要的。

另一个观察结果--看起来你的净输出是严格的-1;1。要么你采取了切线激活,然后没有做反向输出转换,要么就是其他原因。

我把所有的东西都按原样喂给了他们,没有改动。我确信我可以得到更好的结果,如果我计算了正确的指标值并将它们也用于预测。但哪些是正确的指标?(反问句,没有答案)。

关于答案中的"-1;1",一切都很有趣。最后一个神经元的输出是线性的,没有激活函数,也就是说不受任何限制。我也试过在-1;1中缩放目标值,但之后网络开始给出范围(-0.2;0.2)的结果。由于某些原因,结果总是在一个比要求更窄的范围内,可能是由于迅速停止了学习,只有250次迭代。
如果我们增加更多的神经元,并且不停止学习,那么在最后,网络会学到正确的不变式。内层的100个神经元几乎足够在训练数据上达到100%的准确性。根据日志,所有20000*0.7(后来修正的) 结果的残差之和约为200。但在这种情况下,交叉验证的结果将不再与所需的结果有任何关联,它们将只是随机的值,尽管在所需的区间内。

 
Dr.Trader:

我提交的所有内容都是原样,没有任何改动。我相信,通过计算正确的指标值并将其也用于预测,我可以得到更好的结果。但哪些是正确的指标?(反问句,还没有答案)。

关于答案中的"-1;1",这一切都很有趣。最后一个神经元的输出是线性的,没有激活函数,也就是说不受任何限制。我试着将目标值也按-1;1的比例调整,但之后网络开始输出范围为(-0.2;0.2)的结果。由于某些原因,结果总是在一个比要求更窄的范围内,可能是由于迅速停止了学习,只有250次迭代。
如果我们增加更多的神经元,并且不停止学习,那么在最后,网络会学到正确的不变式。内层的100个神经元几乎足够在训练数据上达到100%的准确性。根据日志,所有20000*100个预测因子的残差之和约为200。但是交叉验证的结果根本不会有关联,它们只是随机的数值,虽然是在规定的区间内。

这很有趣。我得考虑一下。

HH:最可能的是,在[-1;1]这个范围内 ,网络在输入端得到最一致的信号,这个片段的函数是最容易建模的(NS学习最容易的东西)。当然,这也是梯度下降找到最小值时的变化。这一点很难说得通...

好吧,如果你还想练习,我就给你加个提示。

首先,R^2 0.55确实可以通过对 "元函数 "进行一些小的函数转换来实现。另一件事是,这个功能在外观上变成了一个有点复杂的东西。

另外,尽量采取。

rowMeans(df[, 1:10])

rowMeans(df[, 1:20])

rowMeans(df[, 1:30])

...

rowMeans(df[, 1:100])

这10个metafiches包含所需的有意义的输入组合。

顺便说一下,卷积层允许在学习过程中就把它挑出来,如果你知道在哪里挖掘的话。

我为什么要提示,其实--即使你知道用什么掩盖什么,你也应该努力去重现输出近似值。而作为一个内部人士,我不喜欢试图向人们推销一个无法解决的问题的感觉。

 
阿列克谢-伯纳科夫

只是一个伟大的评论,同事!) 哈

请允许我根据我的设想逐点回应。

我理解你,我本来以为会有更粗暴的回应,谢谢你没有打)))也谢谢你的代码,我会在周末试着解决,因为我现在正忙着另一个想法....。

需要一些帮助...

我想在Sliding中做一个协整测试,但它抛出了一个错误。

这里有一个关于静态数据的简单测试...


library(tseries) 
ri <- cumsum(rnorm(10000))  #  типа цены
si <- cumsum(rnorm(10000))  #  типа цены
ln <- length(ri)

data <- as.data.frame(cbind(ri,si))

#проводим  линейную регрессию для определения правильного соотношения
model <- lm(  ri ~ si + 0 , data)
#вычисляем  разницу цен (спред)
spread <- ri - coef(model)[1] * si
#проводим  тест Дики-Фуллера на стационарность
test <- adf.test(as.vector(spread), k=0)

test$p.value

它的作用...

但当我在滑动窗口中做同样的事情时,我得到了一个错误 -lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...)中的错误

0(非NA)病例

滑动窗口测试

ri <- cumsum(rnorm(10000))  #  типа цены
si <- cumsum(rnorm(10000))  #  типа цены
ln <- length(ri)


data <- as.data.frame(cbind(ri,si))


test_vec <- rep(0,ln) #  тут будем хранить показатели теста 

for(i in 151:ln){
  print(i)
          idx <- (i-150):i
                #проводим  линейную регрессию для определения правильного соотношения
                model <- lm(  ri[idx] ~ si[idx] + 0 , data[idx,])
                #вычисляем  разницу цен (спред)
                spread <- ri[idx] - coef(model)[1] * si[idx]
                #проводим  тест Дики-Фуллера на стационарность
                test <- adf.test(as.vector(spread), k=0)
                
                test_vec[i] <- test$p.value
                
}

在类似的问题中,堆栈溢出说这是由于数据中的 "NA",但我没有,这是肯定的

问题是什么? 请帮助