R 中的 lm 和 quantmod 出错
Error with lm and quantmod in R
我在尝试编写基于简单线性回归的配对交易代码时似乎在 R 中遇到错误。我怀疑这可能是下载数据的错误?但是,我不确定我是否正确或如何处理该错误。正如您可能看到的那样,我对 R 中的这类事情还比较陌生。非常感谢对此的任何帮助。
symbols <- c("GOLDBEES.NS", "NIFTYBEES.NS")
getSymbols(symbols)
#[1] "GOLDBEES.NS" "NIFTYBEES.NS"
startT <- "2011-01-01"
endT <- "2014-01-01"
rangeT <- paste(startT,"::",endT,sep ="")
tGOLDBEES <- GOLDBEES.NS[,6][rangeT]
tNIFTYBEES <- NIFTYBEES.NS[,6][rangeT]
startO <- "2014-02-01"
endO <- "2016-04-01"
rangeO <- paste(startO,"::",endO,sep ="")
oGOLDBEES <- GOLDBEES.NS[,6][rangeO]
oNIFTYBEES <- NIFTYBEES.NS[,6][rangeO]
pdtGOLDBEES <- diff(tGOLDBEES)[-1]
pdtNIFTYBEES <- diff(tNIFTYBEES)[-1]
model <- lm(pdtGOLDBEES ~ pdtNIFTYBEES - 1)
#Error in model.frame.default(formula = pdtGOLDBEES ~ pdtNIFTYBEES - 1,
#: variable lengths differ (found for 'pdtNIFTYBEES')
正如您已经注意到的,nrow(GOLDBEES.NS)
给出 1742 而 nrow(NIFTYBEES.NS)
给出 1925。让我们仔细看看:
a <- attr(GOLDBEES.NS, "index")
a <- as.integer((a - a[1]) / 86400) # number of days since 2008-01-01
b <- attr(NIFTYBEES.NS, "index")
b <- as.integer((b - b[1]) / 86400) # number of days since 2008-01-01
你真的没有连续的日常观察。我们应该只处理来自共同日期的数据。
GOLDBEES.NS <- GOLDBEES.NS[a %in% b]
NIFTYBEES.NS <- NIFTYBEES.NS[b %in% a]
nrow(GOLDBEES.NS) # 1740
nrow(NIFTYBEES.NS) # 1740
现在您可以使用您的代码了:
startT <- "2011-01-01"
endT <- "2014-01-01"
rangeT <- paste(startT,"::",endT,sep ="")
tGOLDBEES <- GOLDBEES.NS[,6][rangeT]
tNIFTYBEES <- NIFTYBEES.NS[,6][rangeT]
pdtGOLDBEES <- diff(tGOLDBEES)[-1]
pdtNIFTYBEES <- diff(tNIFTYBEES)[-1]
model <- lm(pdtGOLDBEES ~ pdtNIFTYBEES - 1)
#Call:
#lm(formula = pdtGOLDBEES ~ pdtNIFTYBEES - 1)
#Coefficients:
#pdtNIFTYBEES
# -0.6383
我在尝试编写基于简单线性回归的配对交易代码时似乎在 R 中遇到错误。我怀疑这可能是下载数据的错误?但是,我不确定我是否正确或如何处理该错误。正如您可能看到的那样,我对 R 中的这类事情还比较陌生。非常感谢对此的任何帮助。
symbols <- c("GOLDBEES.NS", "NIFTYBEES.NS")
getSymbols(symbols)
#[1] "GOLDBEES.NS" "NIFTYBEES.NS"
startT <- "2011-01-01"
endT <- "2014-01-01"
rangeT <- paste(startT,"::",endT,sep ="")
tGOLDBEES <- GOLDBEES.NS[,6][rangeT]
tNIFTYBEES <- NIFTYBEES.NS[,6][rangeT]
startO <- "2014-02-01"
endO <- "2016-04-01"
rangeO <- paste(startO,"::",endO,sep ="")
oGOLDBEES <- GOLDBEES.NS[,6][rangeO]
oNIFTYBEES <- NIFTYBEES.NS[,6][rangeO]
pdtGOLDBEES <- diff(tGOLDBEES)[-1]
pdtNIFTYBEES <- diff(tNIFTYBEES)[-1]
model <- lm(pdtGOLDBEES ~ pdtNIFTYBEES - 1)
#Error in model.frame.default(formula = pdtGOLDBEES ~ pdtNIFTYBEES - 1,
#: variable lengths differ (found for 'pdtNIFTYBEES')
正如您已经注意到的,nrow(GOLDBEES.NS)
给出 1742 而 nrow(NIFTYBEES.NS)
给出 1925。让我们仔细看看:
a <- attr(GOLDBEES.NS, "index")
a <- as.integer((a - a[1]) / 86400) # number of days since 2008-01-01
b <- attr(NIFTYBEES.NS, "index")
b <- as.integer((b - b[1]) / 86400) # number of days since 2008-01-01
你真的没有连续的日常观察。我们应该只处理来自共同日期的数据。
GOLDBEES.NS <- GOLDBEES.NS[a %in% b]
NIFTYBEES.NS <- NIFTYBEES.NS[b %in% a]
nrow(GOLDBEES.NS) # 1740
nrow(NIFTYBEES.NS) # 1740
现在您可以使用您的代码了:
startT <- "2011-01-01"
endT <- "2014-01-01"
rangeT <- paste(startT,"::",endT,sep ="")
tGOLDBEES <- GOLDBEES.NS[,6][rangeT]
tNIFTYBEES <- NIFTYBEES.NS[,6][rangeT]
pdtGOLDBEES <- diff(tGOLDBEES)[-1]
pdtNIFTYBEES <- diff(tNIFTYBEES)[-1]
model <- lm(pdtGOLDBEES ~ pdtNIFTYBEES - 1)
#Call:
#lm(formula = pdtGOLDBEES ~ pdtNIFTYBEES - 1)
#Coefficients:
#pdtNIFTYBEES
# -0.6383