2014-06-05 47 views
1

我堅持用下面的代碼。過濾XTS通過共同的日期對象

僅供參考它是從以下網站(http://gekkoquant.com/2013/01/21/statistical-arbitrage-trading-a-cointegrated-pair/)所採取的代碼,我也編過R Studio中的代碼。

library("quantmod") 

startDate = as.Date("2013-01-01") 
symbolLst<-c("WPL.AX","BHP.AX") 

symbolData <- new.env() 
getSymbols(symbolLst, env = symbolData, src = "yahoo", from = startDate) 

stockPair <- list(
    a =coredata(Cl(eval(parse(text=paste("symbolData$\"",symbolLst[1],"\"",sep=""))))) 
    ,b = coredata(Cl(eval(parse(text=paste("symbolData$\"",symbolLst[2],"\"",sep=""))))) 
    ,hedgeRatio = 0.70 ,name=title) 

spread <- stockPair$a - stockPair$hedgeRatio*stockPair$b 

我收到以下錯誤。

Error in stockPair$a - stockPair$hedgeRatio * stockPair$b : 
     non-conformable arrays 

這些特定系列不匹配的原因是因爲「WPL.AX」有一個額外的值(日期:19-05-2014 - 矩陣的長度是不同的)相比,「必和必拓」。加載數據時如何解決這個問題?

我還測試了其他股票對,如「ANZ」,「WBC」與源=「谷歌」,它產生兩個相同長度的數組。

> length(stockPair$a) 
[1] 360 
> length(stockPair$b) 
[1] 359 
+0

你需要找到爲什麼尺寸不同,不要試圖強迫他們是相同的。 –

+0

@MatthewLundberg對不起,讓我重新自我說明,這些特定系列不匹配的原因是因爲「WPL.AX」與「BHP」相比具有額外的價值(日期:19-05-2014)。加載數據時如何解決此問題? – NodeExplosion

+1

請在問題說明這一點,而不是「我將如何力R符合兩個數組。」 –

回答

2

添加如下代碼之前stockPair計算,以調整每個xts設置爲日期的交集:

common_dates <- as.Date(Reduce(intersect, eapply(symbolData, index))) 
symbolData <- eapply(symbolData, `[`, i=common_dates) 
+0

請注意'''忽略參數名稱並且只使用位置匹配,所以'i = common_dates'中的i ='是不相關的。 –

1

你的代碼工作正常,如果你不轉換您的XTS反對矩陣通過coredata。然後Ops.xts將確保只有具有相同索引的行會被減去。和fortune(106)適用。

fortunes::fortune(106) 
# If the answer is parse() you should usually rethink the question. 
# -- Thomas Lumley 
#  R-help (February 2005) 

stockPair <- list(
    a = Cl(symbolData[[symbolLst[1]]]) 
    ,b = Cl(symbolData[[symbolLst[2]]]) 
    ,hedgeRatio = 0.70 
    ,name = "title") 
spread <- stockPair$a - stockPair$hedgeRatio*stockPair$b 

這裏的另一種方法:

# merge stocks into a single xts object 
stockPair <- do.call(merge, eapply(symbolData, Cl)) 
# ensure stockPair columns are in the same order as symbolLst, since 
# eapply may loop over the environment in an order you don't expect 
stockPair <- stockPair[,pmatch(symbolLst, colnames(stockPair))] 
colnames(stockPair) <- c("a","b") 
# add hedgeRatio and name as xts attributes 
xtsAttributes(stockPair) <- list(hedgeRatio=0.7, name="title") 
spread <- stockPair$a - attr(stockPair,'hedgeRatio')*stockPair$b