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
}
那你到底是如何计算R^2的,什么函数?
我试图通过 rattle 训练不同的模型,它通过相关性计算 "伪 r^2",即 cor(fitpoints[,1], fitpoints[,2])^2,但我想用你的方法计算 r^2,以便进行比较。
这段代码[1-sum((y-x)^2)/sum((y-mean(y))^2)]能行吗?
那你到底是如何计算R^2的,什么函数?
我试图通过 rattle 训练不同的模型,它通过相关性计算 "伪 r^2",即 cor(fitpoints[,1], fitpoints[,2])^2,但我想用你的方法计算 r^2,以便进行比较。
这段代码[1-sum((y-x)^2)/sum((y-mean(y))^2)]能行吗?
正是如此。X是一个模型。
隐蔽层中的神经元越多--神经元可以描述的功能就越复杂,你需要更多的隐蔽层和其中的神经元。
但问题是,神经元使用连续的加法和乘法(例如激活函数的sigmoids)来描述目标,也就是说,它显然不是你的原始函数,而是某种近似。而结果可能是,这个近似值会记住训练数据中的一些特征,所以它在新数据中不能正确工作。因此,有时你需要停止训练,看看测试样本的误差是否减少,如果一切正常,再继续训练。在某些时候,测试数据上的错误会开始增长,然后必须完全停止训练。
另外,神经元键的输出受激活函数的限制。对于流行的--sigmoid是(0;1),relu是[0;inf]。目标值需要按不同的区间进行缩放,你在区间(-7;7)的输出对许多数据包来说根本无法实现。
再一次拿着拨浪鼓,训练了nnet,从日志中取出了完成的代码。Rattle与nnet的工作不太正常,我又加了一些代码来及时停止训练。
新数据的最佳R^2=0.18。最佳网络配置出来的结果非常有趣,在唯一的内层有一个神经元。我可以在内层多设两个神经元,这将是差不多的结果。如果我们不断增加神经元的数量,该图表明网络重新训练的速度非常快,在新数据上的表现也越来越差。
在右图中,蓝线是该模型的新数据,从20001行开始。剩下的就是培训和交叉验证了。
卷积网络似乎处于领先地位。
再一次拿着拨浪鼓,训练了nnet,从日志中取出了完成的代码。Rattle与nnet的工作不太正常,我又加了一些代码来及时停止训练。
新数据的最佳R^2=0.18。最佳网络配置出来的结果非常有趣,在唯一的内层有一个神经元。我可以在内层多设两个神经元,这将是差不多的结果。如果我们不断增加神经元的数量,图中显示网络重新训练的速度非常快,在新数据上的表现越来越差。
在右图中,蓝线是该模型的新数据,从20001行开始。剩下的就是培训和交叉验证了。
卷积网络似乎处于领先地位。
只是一个观察,偏离主题,但....当 我求助于mxnet 并指出mxnet软件包时,大家都沉默不语,什么也不说。现在大家突然对我50页前说的事情感兴趣了,为什么会这样呢?:)我不知道100页之后是否有人会注意到我很久以前也注意过的quantstrat包....
你会说--哈,好吧,如果你这么聪明就自己去做吧,事实是我不是,我也不聪明,我也不太懂,英语也很差,你的四行代码加上解释对我来说可能需要几周时间才能搞定,即使这样也不一定能成功......
只是一个观察,偏离主题,但....当 我在卷积网络方面寻求帮助并指出mxnet软件包时,大家都沉默不语,什么也不说。现在大家突然对我在50页以前谈论的东西感兴趣了,为什么会这样?:)我不知道100页之后是否有人会注意到我很久以前也注意过的quantstrat包....
你会说--哈,好吧,如果你这么聪明就自己去做吧,事实是我不是,我也不聪明,我也不太懂,英语也很差,你的四行代码加上解释对我来说可能需要几周时间才能搞定,即使这样也不一定能成功......
只是一个伟大的评论,同事!) 哈
让我根据我的设想逐一回答。
1)这里90%的人都是由自我利益驱动,思考阶段和实验阶段。因此,一些好的想法被搁置了很久。由于你没有提供任何有趣的例子和挑战,所以没有人感兴趣。很简单,不是吗?
2)获得知识有两种策略:挖掘和痛苦地尝试做一些事情(我们都在不同程度上这样做。例如,我记得在 "学会赚钱,村民们!"的主题中,有位老兄花了几年时间来测试可用的专家顾问的工作能力。而他们都失败了)。另一个选择是--等待,希望有人会帮助并发布一个现成的。因此,如果你由于自身情况选择了第二种策略,那么等待现成的EA的时间可能会非常长。
关于mxnet,既然我对它感兴趣,我不介意把代码贴出来,顺便说一下,在互联网上几乎是一样的。
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中缩放目标值,但之后网络开始给出范围(-0.2;0.2)的结果。由于某些原因,结果总是在一个比要求更窄的范围内,可能是由于迅速停止了学习,只有250次迭代。
如果我们增加更多的神经元,并且不停止学习,那么在最后,网络会学到正确的不变式。内层的100个神经元几乎足够在训练数据上达到100%的准确性。根据日志,所有20000*0.7(后来修正的) 结果的残差之和约为200。但在这种情况下,交叉验证的结果将不再与所需的结果有任何关联,它们将只是随机的值,尽管在所需的区间内。
我提交的所有内容都是原样,没有任何改动。我相信,通过计算正确的指标值并将其也用于预测,我可以得到更好的结果。但哪些是正确的指标?(反问句,还没有答案)。
关于答案中的"-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)
它的作用...
但当我在滑动窗口中做同样的事情时,我得到了一个错误 -lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...)中的错误。
0(非NA)病例
滑动窗口测试
在类似的问题中,堆栈溢出说这是由于数据中的 "NA",但我没有,这是肯定的。
问题是什么? 请帮助