2013-07-07 2 views
2

Я пытаюсь запустить код в учебнике по rbresearch под названием 'Low Volatility with R', однако при попытке запустить функцию cbind временной ряд кажется полностью несогласованным.Функция cbind создает несовместимый объект xts

Вот раздел данных подготовка, которая работает отлично:

require(quantmod) 

symbols = c("XLY", "XLP", "XLE", "XLF", "XLV", "XLI", "XLK", "XLB", "XLU") 
getSymbols(symbols, index.class=c("POSIXt","POSIXct"), from='2000-01-01') 

for(symbol in symbols) { 
    x<-get(symbol) 
    x<-to.monthly(x,indexAt='lastof',drop.time=TRUE) 
    indexFormat(x)<-'%Y-%m-%d' 
    colnames(x)<-gsub("x",symbol,colnames(x)) 
    assign(symbol,x) 
} 

for(symbol in symbols) { 
    x <- get(symbol) 
    x1 <- ROC(Ad(x), n=1, type="continuous", na.pad=TRUE) 
    colnames(x1) <- "ROC" 
    colnames(x1) <- paste("x",colnames(x1), sep =".") 
    #x2 is the 12 period standard deviation of the 1 month return 
    x2 <- runSD(x1, n=12) 
    colnames(x2) <- "RANK" 
    colnames(x2) <- paste("x",colnames(x2), sep =".") 
    x <- cbind(x,x2) 
    colnames(x)<-gsub("x",symbol,colnames(x)) 
    assign(symbol,x) 
} 

rank.factors <- cbind(XLB$XLB.RANK, XLE$XLE.RANK, XLF$XLF.RANK, XLI$XLI.RANK, 
    XLK$XLK.RANK, XLP$XLP.RANK, XLU$XLU.RANK, XLV$XLV.RANK, XLY$XLY.RANK) 

r <- as.xts(t(apply(rank.factors, 1, rank))) 

for (symbol in symbols){ 
    x <- get(symbol) 
    x <- x[,1:6] 
    assign(symbol,x) 
} 

Для иллюстрации того, что данные ETF данных XLE совмещается с XLE ранговых данных:

> head(XLE) 
      XLE.Open XLE.High XLE.Low XLE.Close XLE.Vodalume XLE.Adjusted 
2000-01-31 27.31 29.47 25.87  27.31 5903600  22.46 
2000-02-29 27.31 27.61 24.62  26.16 4213000  21.51 
2000-03-31 26.02 30.22 25.94  29.31 8607600  24.10 
2000-04-30 29.50 30.16 27.52  28.87 5818900  23.74 
2000-05-31 29.19 32.31 29.00  32.27 5148800  26.54 
2000-06-30 32.16 32.50 30.09  30.34 4563100  25.07 
> nrow(XLE) 
[1] 163 
> head(r$XLE.RANK) 
      XLE.RANK 
2000-01-31  2 
2000-02-29  2 
2000-03-31  2 
2000-04-30  2 
2000-05-31  2 
2000-06-30  2 
nrow(r$XLE.RANK) 
[1] 163 

Однако после выполнения следующей функции cbind, объект xts полностью смещается:

> XLE <- cbind(XLE, r$XLE.RANK) 
> head(XLE) 
      XLE.Open XLE.High XLE.Low XLE.Close XLE.Volume XLE.Adjusted XLE.RANK 
2000-01-31 27.31 29.47 25.87  27.31 5903600  22.46  NA 
2000-01-31  NA  NA  NA  NA   NA   NA  2 
2000-02-29 27.31 27.61 24.62  26.16 4213000  21.51  NA 
2000-02-29  NA  NA  NA  NA   NA   NA  2 
2000-03-31 26.02 30.22 25.94  29.31 8607600  24.10  NA 
2000-03-31  NA  NA  NA  NA   NA   NA  2 
> nrow(XLE) 
[1] 326 

Так работает уже существующий код редко работает для меня, я подозреваю, что что-то не так с моей R консоли, так вот моя сессия информация:

> sessionInfo() 
R version 3.0.1 (2013-05-16) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 

locale: 
[1] LC_COLLATE=English_Canada.1252 LC_CTYPE=English_Canada.1252 LC_MONETARY=English_Canada.1252 LC_NUMERIC=C     
[5] LC_TIME=English_Canada.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] timeSeries_3010.97   timeDate_3010.98   quantstrat_0.7.8   foreach_1.4.1    
[5] blotter_0.8.14    PerformanceAnalytics_1.1.0 FinancialInstrument_1.1.9 quantmod_0.4-0    
[9] Defaults_1.1-1    TTR_0.22-0     xts_0.9-5     zoo_1.7-10     

loaded via a namespace (and not attached): 
[1] codetools_0.2-8 grid_3.0.1  iterators_1.0.6 lattice_0.20-15 tools_3.0.1  

Я совершенно не уверен, как правильно выровнять объект xts без NA и будет очень признателен за любую помощь.

+1

Работает отлично для меня (хотя _holy cow_ устанавливал 'quantstrat' вовлеченный процесс). Все, о чем я могу думать, это то, что у вас есть странный метод 'cbind', плавающий вокруг, который вызывается по ошибке. – joran

+0

Спасибо, что подтвердили это! Мой приятель побежал, и он отлично сработал для него. Я решил удалить и переустановить R, установить пакет Quantstrat только для того, чтобы встретить ту же самую точную ошибку. Почти ни один из кода, который загружается онлайн, работает для меня. Я убежден, что что-то не так с программным обеспечением R или с моим новым ноутбуком. –

+0

попробуйте 'XLE $ XLE.RANK <- an.numeric (r $ XLE.RANK)' – haki

ответ

1

Я не вижу, как кто-то не смог повторить вашу проблему. Проблема заключается эта линия:

r <- as.xts(t(apply(rank.factors, 1, rank))) 

первый цикл преобразует данные в месяц и капель во времени компонент индекса, который преобразует индекс к Date. Это означает, что rank.factors имеет индекс Date. Но as.xts создает индекс POSIXct по умолчанию, поэтому r будет иметь индекс POSIXct.

cbind(XLE, r$XLE.RANK) Слияние объекта xts с индексом Date с объектом xts с индексом POSIXct. Преобразование из POSIXct в Date может быть проблематичным, если вы не очень осторожны с настройками часового пояса.

Если вам не нужен компонент времени, лучше избегать POSIXct и просто используйте Date. Поэтому все должно работать, если вы установили dateFormat="Date" в свой звонок as.xts.

R> r <- as.xts(t(apply(rank.factors, 1, rank)), dateFormat="Date") 
R> XLE <- cbind(XLE, r$XLE.RANK) 
R> head(XLE) 
      XLE.Open XLE.High XLE.Low XLE.Close XLE.Volume XLE.Adjusted XLE.RANK 
2000-01-31 27.31 29.47 25.87  27.31 5903600  22.46  2 
2000-02-29 27.31 27.61 24.62  26.16 4213000  21.51  2 
2000-03-31 26.02 30.22 25.94  29.31 8607600  24.10  2 
2000-04-30 29.50 30.16 27.52  28.87 5818900  23.74  2 
2000-05-31 29.19 32.31 29.00  32.27 5148800  26.54  2 
2000-06-30 32.16 32.50 30.09  30.34 4563100  25.07  2 
+0

Спасибо большое, Джош, который решил проблему. Должен признаться, я как раз собирался переформатировать свой ноутбук, и в случае, если он не решит проблему, я бы потерял всякую надежду на использование R. –

Смежные вопросы