head(trainData) <NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA> [1,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [2,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [3,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [4,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [5,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [6,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA <NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA> [1,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [2,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [3,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [4,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [5,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [6,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA <NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA><NA> [1,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [2,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [3,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [4,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [5,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA [6,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA <NA><NA><NA><NA><NA><NA><NA><NA> target [1,] NA NA NA NA NA NA NA NA NA [2,] NA NA NA NA NA NA NA NA NA [3,] NA NA NA NA NA NA NA NA NA [4,] NA NA NA NA NA NA NA NA NA [5,] NA NA NA NA NA NA NA NA NA [6,] NA NA NA NA NA NA NA NA NA
那么,如果我不在"Y"的末尾加上NA,然后再删除同样的 NA,而是直接删除SomeData中的最后一行,不就一样了吗?
我真的不明白其中的差别,也许我已经完全过热了((
我不抱歉,但我不知道怎么做,它就是不工作,我试过多少次了,你用你的方法试试,我做的哪个目标你知道,告诉我你是怎么做的。
你用任何打包器打包所有东西,并附上文件。
我试了很多次,都没有用,把我扔出了论坛,就是这样......
拿着我的代码,我把所有的东西都贴出来了,第一个代码是创建特征,第二个是训练模型,你会完全一样,做训练并展示你得到的东西。
我试了很多次,都没有用,把我扔出了论坛,就是这样......
拿着我的代码,我把所有的东西都贴出来了,第一个代码是创建特征,第二个是训练模型,你会完全一样,做训练并展示你得到的东西。
当进行微分时,由于系列变短了一个元素,转移是自动的,那么你所需要的就是将样本(有观测值的表格)缩短最后一个元素的长度。
代码中有两件事让我感到不安。
1)由于预测使用的是ohlc,所以不能使用最后一个条形图进行预测,因为我们将在条形图的开头进行预测,而hlc将在整个条形图的有效期内发生变化。因此,我们使用完全形成的最后一栏来教导模型,然后使用未形成的一栏来预测。这是不对的,我们应该把目标转移2个小节而不是1个小节。
如果你只使用开盘价进行预测,忽略高点、低点、收盘价,那么将目标转移到1个柱状是可以接受的。
2)你对目标使用了Close而不是Open。它对某种战略很重要,还是只是为了好玩?毕竟,我们通常在一个条形图的开头进入交易,然后在下一个新条形图 上,我们要么翻转,要么离开,要么退出。而对于训练有素的模型来说,预测从当前开盘到下一个开盘的价格上涨是很重要的。
当前条形图的收盘价不一定与下一个条形图的开盘价一致,也就是说,以收盘价为目标,你可以避免第一个错误,但可能会得到错误的增量。现在我查了一下,通常价格表中的收盘价与下一栏的开盘价不一致,所以你的目标值很值得怀疑。
如果烛台透支了,你必须绕开它。
取一个移动窗口,前一百条(100只是一个随机数字,对于你的代码来说,最小的条数=23,如果少于这个条数,烛台就会出错),找到指标值,只留下其中最新的,找到相关的目标,把它全部加到最后的表格中。我们将窗口向前移动1小节,重复。所有这些都比一次性计算所有东西要慢几十倍,但它更安全。然后我们可以比较这两个结果,得出是否存在翻转的结论。
改变滑动窗口的大小,看看结果是否有变化,这将是件好事。如果它们发生了变化--那么指标就会使用自己以前的数值来计算新的数值,在这种情况下,窗口宽度将作为指标本身的一种指数周期来工作。如果结果会发生变化,则应增加窗口宽度,直到结果不发生变化。指标可能有自己的内部限制,例如mt5中的zigzag有这个值=100条,也就是说,窗口宽度大于100条不会影响结果。
首先,试试这段代码,创建一个训练/测试表。将其与你的表格进行比较,如果100%一致,你就不会看到任何过度渲染,你可以相信Candlestick会使用以前的数值来识别新的数值。
然后尝试增加indicatorDepth--滑动窗口的宽度,看看是否会改变结果,以及你是否能找到这样一个indicatorDepth的值,此时即使增加它也不会影响结果。
if(!require(rusquant)){ install.packages("rusquant", repos="http://r-forge.r-project.org", dependencies = TRUE); library(rusquant) }
if(!require(candlesticks)){ install.packages("candlesticks", repos="http://r-forge.r-project.org", dependencies = TRUE); library(candlesticks) }
tryCatch({
load("SPFB.RTS.rdata")
}, error = function(e){
getSymbols("SPFB.RTS", src = "Finam", period="5min", from = Sys.Date()-500)
save(SPFB.RTS, finam.stock.list, file = "SPFB.RTS.rdata")
SPFB.RTS <<- SPFB.RTS
finam.stock.list <<- finam.stock.list
})
chart_Series(tail(SPFB.RTS, 100))
indicatorDepth <- 23
tryCatch({
load("trainData.rdata")
}, error=function(e){
trainData <<- matrix(NA, ncol=60, nrow = nrow(SPFB.RTS)-2)
for(i in (indicatorDepth+1):(nrow(SPFB.RTS)-2)){
X1 <- as.numeric(tail(CandleBodyLength(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X2 <- as.numeric(tail(CandleLength(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X3 <- as.numeric(tail(CSPDarkCloudCover(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X4 <- as.numeric(tail(CSPDoji(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X5 <- as.numeric(tail(CSPEngulfing(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X6 <- as.numeric(tail(CSPGap(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X7 <- as.numeric(tail(CSPHammer(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X8 <- as.numeric(tail(CSPHarami(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X9 <- as.numeric(tail(CSPInsideDay(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X10 <- as.numeric(tail(CSPInvertedHammer(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X11 <- as.numeric(tail(CSPKicking(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X12 <- as.numeric(tail(CSPLongCandle(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X13 <- as.numeric(tail(CSPLongCandleBody(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X14 <- as.numeric(tail(CSPMarubozu(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X15 <- as.numeric(tail(CSPNHigherClose(SPFB.RTS[max(1, i-indicatorDepth):i,],N = 3), 1))
X16 <- as.numeric(tail(CSPNLowerClose(SPFB.RTS[max(1, i-indicatorDepth):i,],N = 3), 1))
X17 <- as.numeric(tail(CSPOutsideDay(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X18 <- as.numeric(tail(CSPPiercingPattern(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X19 <- as.numeric(tail(CSPShortCandle(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X20 <- as.numeric(tail(CSPShortCandleBody(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X21 <- as.numeric(tail(CSPStar(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X22 <- as.numeric(tail(CSPStomach(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X23 <- as.numeric(tail(CSPTasukiGap(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X24 <- as.numeric(tail(CSPThreeInside(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X25 <- as.numeric(tail(CSPThreeMethods(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X26 <- as.numeric(tail(CSPThreeOutside(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X27 <- as.numeric(head(tail(nextCandlePosition(SPFB.RTS[max(1, i-indicatorDepth):i,]), 2), 1))
X28 <- as.numeric(tail(TrendDetectionChannel(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X29 <- as.numeric(tail(TrendDetectionSMA(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
target <- as.numeric(SPFB.RTS[i+2,"SPFB.RTS.Open"]) - as.numeric(SPFB.RTS[i+1,"SPFB.RTS.Open"])
trainData[i,] <<- c(X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,target)
cat(i, "/", nrow(SPFB.RTS)-2, "\n")
}
colnames(trainData)[-ncol(trainData)] <- paste0("pred",1:(ncol(trainData)-1))
colnames(trainData)[ncol(trainData)] <- "target"
save(trainData, file="trainData.rdata")
})
# trainData <- trainData[-(1:indicatorDepth),]
我对代码中的两件事感到担忧。
1)由于我们使用ohlc进行预测,最新的条形图不能用于进行预测,因为我们将在条形图的开头进行预测,而hlc将在条形图的有效期内发生变化。因此,我们使用完全形成的最后一栏来教导模型,然后使用未形成的一栏来预测。这是不对的,我们应该把目标转移2个小节而不是1个小节。
如果你把目标转移到一个柱子上,你可以只用开盘价来做预测,而忽略了高点、低点和收盘价。
我不明白这个问题:我们想预测当前收盘价相对于前一个收盘价的位置,我们不知道当前的蜡烛,我们知道前一个蜡烛,因为它已经收盘,因此所有的OHLC价格已经形成,我不明白什么是谨慎,什么是误差
2)你对目标使用了Close而不是Open。这对某种战略很重要,还是只是为了好玩?........
绝对是白拿的,为了速度和方便
如果烛台被透支,你必须绕过它........。
SPFB.RTS.rdata 是什么?
从何而来?为什么会被覆盖? 完全没有头绪(
tryCatch({
load("SPFB.RTS.rdata")
}, error = function(e){
getSymbols("SPFB.RTS", src = "Finam", period="5min", from = Sys.Date()-500)
save(SPFB.RTS, finam.stock.list, file = "SPFB.RTS.rdata")
SPFB.RTS <<- SPFB.RTS
finam.stock.list <<- finam.stock.list
})
而最重要的是,你肯定已经尝试用数据来教一些东西,为什么不提呢?
而最重要的是,你一定尝试过用数据来教东西,为什么不提呢?
训练表的进度为16527,共55857。一旦它被创造出来,我就会试着去教它。
预测当前回文相对于前一个回文的位置
这由你决定。只是很奇怪,像往常一样,策略在一个新的条形图 开始时做出决定并开启交易。
然后你必须做出预测,并在条形图的末尾开出交易。有点不方便,航站楼里的新酒吧很容易被抓。但是,"在当前柱状体结束时,在新柱状体开启前一秒开启交易,希望当前的收盘价已经是最终价格 "对我来说太模糊了。
我不明白这一块,它有什么作用?SPFB.RTS.rdata 是什么?
下载的报价。下载后,保存在rdata中,不至于每次运行这个脚本时都是垃圾,也不至于等上几秒钟才下载完毕。如果它们早些时候被下载并保存在rdata文件中--那么它们就是从该文件中提取的。
谢谢你
代码中有两件事让我感到不安。
1)因为我们使用ohlc进行预测,所以我们不能使用最新的条形图进行预测,因为我们将在条形图的开头进行预测,而hlc将在条形图的有效期内发生变化。因此,我们使用完全形成的最后一栏来教导模型,然后使用未形成的一栏来预测。这是不对的,我们应该把目标转移2个小节而不是1个小节。
如果你只使用开盘价进行预测,忽略高点、低点、收盘价,那么将目标转移到1个柱状是可以接受的。
2)你对目标使用了Close而不是Open。它对某种战略很重要,还是只是为了好玩?毕竟,我们通常在一个条形图的开头进入交易,然后在下一个新条形图 上,我们要么翻转,要么离开,要么退出。而对于训练有素的模型来说,预测从当前开盘到下一个开盘的价格上涨是很重要的。
当前条形图的收盘价不一定与下一个条形图的开盘价一致,也就是说,以收盘价为目标,你可以避免第一个错误,但可能会得到错误的增量。现在我查了一下,通常价格表中的收盘价与下一栏的开盘价不一致,所以目标值非常值得怀疑。
在我看来,你是在把事情复杂化。
1.第一个问题与第二个问题密切相关。如果我们用收盘价作为目标,其他三个价格都会形成,不会改变。当提前一步进行预测时,你必须将目标转移1个位置。
2.我也不能接受你关于收盘价和开盘价差异的论点。它是在什么TF或一周中的一天。如果我们采取H1,那么我们有三种不同的变体。
这只是我想到的事情。而且还可能有更多的情况。他们都说,真实的交易与模型有很大不同。目前,专注于一些理想化的版本,并对其余的拖曳和其他方面单独编程,是比较有用的。
3.关于超额竞价的问题。
TA的圣牛。它被认为是一些亘古不变的真理。
根据什么?
对所有分析工作者来说,改变他们对过去得出划时代结论的数据是不可接受的。再次强调:对于过去的事情是不可接受的。
我们从事的是预测的工作,我们对过去的看法不仅可以,而且必须根据新的可用数据而改变。为不重绘的数据付出的代价是:滞后。
这里出现了一个新的柱子,这是市场反转的预兆。但是,我们在继续喂养这头神牛的同时,并没有为了从 "分析 "部分摘取的一些想法而改变我们的历史观。
我们不应该害怕指标变化。
一个新的酒吧已经到来。而在它到来时,我们需要在这个新的酒吧所创造的条件下做出决定。我们需要预测未来,直到下一次预测时误差最小。我没有看到任何出版物将预测误差的大小与历史上指标类型的变化联系起来。
这都是理论上的谈论。我们应该建立一个模型,并获得其估计值。这就是我打算做的事。
制作了一个5000个价格的小数据集
脚本没有正常工作。
当所有的东西都被清点后,我得到了一个警告。
....
....
5677 / 5688
5678 / 5688
5679 / 5688
5680 / 5688
5681 / 5688
5682 / 5688
5683 / 5688
5684 / 5688
5685 / 5688
5686 / 5688
5687 / 5688
5688 / 5688
Warning message:
In readChar(con, 5L, useBytes = TRUE) :
cannot open compressed file 'trainData.rdata', probable reason 'No such file or directory'
数据本身
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[1,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[2,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[3,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[4,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[5,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[6,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[1,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[2,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[3,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[4,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[5,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[6,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[1,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[2,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[3,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[4,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[5,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[6,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> target
[1,] NA NA NA NA NA NA NA NA NA
[2,] NA NA NA NA NA NA NA NA NA
[3,] NA NA NA NA NA NA NA NA NA
[4,] NA NA NA NA NA NA NA NA NA
[5,] NA NA NA NA NA NA NA NA NA
[6,] NA NA NA NA NA NA NA NA NA
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[5683,] 8.621061e-05 10 0.0016378604 190 0 1 0 0 0 0 0 0 0
[5684,] 6.036304e-04 70 0.0010346611 120 0 0 0 0 0 1 0 0 0
[5685,] 1.208355e-03 140 0.0018122977 210 0 0 0 0 0 0 0 0 0
[5686,] 6.911447e-04 80 0.0019009764 220 0 0 0 0 0 0 0 0 0
[5687,] 2.592577e-04 30 0.0007778402 90 0 0 0 0 0 0 0 0 0
[5688,] 9.501188e-04 110 0.0016415396 190 0 0 0 0 0 0 0 0 0
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[5683,] 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
[5684,] 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
[5685,] 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
[5686,] 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
[5687,] 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
[5688,] 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[5683,] 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
[5684,] 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[5685,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
[5686,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[5687,] 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
[5688,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> target
[5683,] NA NA NA NA NA NA 0 1 0 0 0 0 1 -1 -70
[5684,] NA NA NA NA NA NA 0 1 0 0 0 0 1 -1 -140
[5685,] NA NA NA NA NA NA 0 0 1 -1 0 0 1 -1 -90
[5686,] NA NA NA NA NA NA 0 0 1 -1 0 0 1 -1 20
[5687,] NA NA NA NA NA NA 0 0 1 -1 0 0 1 -1 100
[5688,] NA NA NA NA NA NA 0 0 1 -1 0 0 1 -1 50
数据中总是有NA,尽管我不排除是我自己做的。