将新交易行添加到 quantmod 数据集中后,如何解决计算变量的错误?

How to solve an error of calculated variable after adding new trade row into quantmod data set?

我使用代码(link 附上)将新行的贸易数据添加到数据集中:

 gspc<-getSymbols(("^GSPC") , src = 'yahoo', from = '2008-01-01',  auto.assign = T)
    gspc<-cbind(GSPC)
    q <- getQuote("^GSPC") # adds the current trade row
    qCols <- c("Open","High","Low","Last","Volume","Last")
    qx <- xts(q[,qCols], as.Date(q[,"Trade Time"]))
    gspc <- rbind(gspc, qx)

我得到了一个很好的输出:

tail(gspc)

               GSPC.Open GSPC.High GSPC.Low GSPC.Close GSPC.Volume GSPC.Adjusted GSPCIsuP GSPCIsUp1day GSPCOpAbOp GSPCMA5Op GSPCMA5High GSPCHiLo1d GSPCMAHiLo5d GSPCSTdVHiLo5d GSPCMaOpCl5d GSPCMA10Op
2015-11-03   2102.63   2116.48  2097.51    2109.79  4272060000       2109.79        1            1  21.869873  2085.644    2090.752  25.439941     11.88403      11.720686    -6.943994   2068.559
2015-11-04   2110.60   2114.59  2096.98    2102.31  4078870000       2102.31        0            1   7.970215  2094.468    2099.974  13.850097     14.33003      10.223758    -8.948047   2076.272
2015-11-05   2101.68   2108.78  2090.41    2099.93  4051890000       2099.93        0            0  -8.920166  2097.134    2104.822   3.989990     10.35400       9.420192    -2.516015   2084.252
2015-11-06   2098.60   2101.91  2083.74    2099.20  4369020000       2099.20        1            0  -3.079834  2098.854    2108.074   7.100097     10.94004       9.022028    -1.954053   2088.293
2015-11-09   2096.56   2096.56  2068.24    2078.58  3882350000       2078.58        0            0  -2.040039  2102.014    2109.592   3.309814     10.73799       9.216563    -4.202002   2090.441
2015-11-10   2077.19   2077.98  2073.35    2077.12    34835429       2077.12       NA           NA         NA        NA          NA         NA           NA             NA           NA         NA

但是当我尝试添加两个计算字段时,第一个工作正常但另一个产生错误

gspc$GSPCHiLo1d<-Lag(Hi(GSPC),k=1)-Lag(Op(GSPC),k=1) # that's fine
gspc$GSPCMAHiLo10d<-SMA(gspc$GSPCHiLo1d,n=10)
#I got an error "Error in runSum(x, n) : Series contains non-leading NAs"

我该如何克服这个问题? link 到我使用的代码:

您可以将最后一行替换为:

gspc$GSPCMAHiLo10d<-SMA(gspc$GSPCHiLo1d[-nrow(gspc)]) # the n=10 is optional as it is the default option

tail(gspc)
           GSPC.Open GSPC.High GSPC.Low GSPC.Close GSPC.Volume GSPC.Adjusted GSPCHiLo1d GSPCMAHiLo10d
2015-11-03   2102.63   2116.48  2097.51    2109.79  4272060000       2109.79  25.439941     12.483997
2015-11-04   2110.60   2114.59  2096.98    2102.31  4078870000       2102.31  13.850097     13.270007
2015-11-05   2101.68   2108.78  2090.41    2099.93  4051890000       2099.93   3.989990     13.219006
2015-11-06   2098.60   2101.91  2083.74    2099.20  4369020000       2099.20   7.100097     10.597021
2015-11-09   2096.56   2096.56  2068.24    2078.58  3882350000       2078.58   3.309814      8.772998
2015-11-09   2096.56   2096.56  2068.24    2078.58   664847995       2078.58         NA            NA

如您所见,它会在右下角的最后一个单元格中放置一个 NA。问题是,带有两个 Lag 的公式比 gspc 短一个元素,因此最后一个元素是 NA,这将导致您的计算出现问题。在 运行 执行命令 SMA 之后,您可以(如果需要)替换 NA 值。

您也可以用您想要的替换 gspc$GSPCHiLo1d 的最后一个值,然后 运行 SMA 命令没有问题。

好的,我想我发现了其中一个问题:使用

gspc$GSPCHiLo1d<-Lag(Hi(gspc),k=1)-Lag(Op(gspc),k=1)

而不是

gspc$GSPCHiLo1d<-Lag(Hi(GSPC),k=1)-Lag(Op(GSPC),k=1)

然后是

gspc$GSPCMAHiLo10d<-SMA(gspc$GSPCHiLo1d,n=10)

tail(gspc)
           GSPC.Open GSPC.High GSPC.Low GSPC.Close GSPC.Volume GSPC.Adjusted GSPCHiLo1d
2015-11-03   2102.63   2116.48  2097.51    2109.79  4272060000       2109.79  25.439941
2015-11-04   2110.60   2114.59  2096.98    2102.31  4078870000       2102.31  13.850097
2015-11-05   2101.68   2108.78  2090.41    2099.93  4051890000       2099.93   3.989990
2015-11-06   2098.60   2101.91  2083.74    2099.20  4369020000       2099.20   7.100097
2015-11-09   2096.56   2096.56  2068.24    2078.58  3882350000       2078.58   3.309814
2015-11-10   2077.19   2079.70  2069.91    2071.69   109144559       2071.69   0.000000
           GSPCMAHiLo10d
2015-11-03     12.483997
2015-11-04     13.270007
2015-11-05     13.219006
2015-11-06     10.597021
2015-11-09      8.772998
2015-11-10      8.767016

从你的评论中你想要 High - Low 但在你的代码中它是 High - Open。将 Op 替换为 Lo,您将得到

tail(gspc)
           GSPC.Open GSPC.High GSPC.Low GSPC.Close GSPC.Volume GSPC.Adjusted GSPCHiLo1d
2015-11-03   2102.63   2116.48  2097.51    2109.79  4272060000       2109.79   25.43994
2015-11-04   2110.60   2114.59  2096.98    2102.31  4078870000       2102.31   18.96997
2015-11-05   2101.68   2108.78  2090.41    2099.93  4051890000       2099.93   17.61011
2015-11-06   2098.60   2101.91  2083.74    2099.20  4369020000       2099.20   18.37012
2015-11-09   2096.56   2096.56  2068.24    2078.58  3882350000       2078.58   18.16992
2015-11-10   2077.19   2079.70  2069.91    2071.01   110450050       2071.01   28.32007
           GSPCMAHiLo10d
2015-11-03      18.58199
2015-11-04      19.22799
2015-11-05      18.91400
2015-11-06      17.41902
2015-11-09      17.08101
2015-11-10      19.05203

与所需的 28.32

如果这不是你想要的,请告诉我