2011-11-05 74 views
3

我試圖將xts時間序列數據以累積方式轉換爲較低的週期性。如何將xts以累計方式轉換爲較低頻率

例如,使用to.weekly從XTS包樣本數據(sample_matrix)我得到這樣的:

library(xts) 
data(sample_matrix) 
to.weekly(as.xts(sample_matrix), name="") 

> to.weekly(as.xts(sample_matrix), name="") 
       .Open .High  .Low .Close 
2007-01-08 50.03978 50.42188 49.95041 49.98806 
2007-01-15 49.99489 50.68583 49.80454 50.48912 
..... 

我想能夠使用稍微不同的功能to.weekly.cumulative那會取而代之返回:

> to.weekly.cumulative(as.xts(sample_matrix), name="") 
       .Open .High  .Low .Close 
2007-01-02 50.03978 50.11778 49.95041 50.11778 
2007-01-03 50.03978 50.42188 49.95041 50.39767 
2007-01-04 50.03978 50.42188 49.95041 50.33236 
2007-01-05 50.03978 50.42188 49.95041 50.33459 
2007-01-06 50.03978 50.42188 49.95041 50.18112 
2007-01-07 50.03978 50.42188 49.95041 49.99185 
2007-01-08 50.03978 50.42188 49.95041 49.98806 
2007-01-09 49.99489 49.99489 49.80454 49.91333 
2007-01-10 49.99489 50.13053 49.80454 49.97246 
2007-01-11 49.99489 50.23910 49.80454 50.23910 
2007-01-12 49.99489 50.35980 49.80454 50.28519 
2007-01-13 49.99489 50.48000 49.80454 50.41286 
2007-01-14 49.99489 50.62395 49.80454 50.60145 
2007-01-15 49.99489 50.68583 49.80454 50.48912 
.... 

此函數不會僅返回端點的數據,而是返回xts對象中所有行的數據。例如,我想要得到的是每日酒吧的每週酒吧(或1分鐘酒吧的15分鐘酒吧),以這種方式每天(或每分鐘)獲得當前(從當天/分鐘)開發每週(15分鐘)的酒吧。因此,週一我會得到一個週一的開盤價,最高價,最低價,收盤價,週一收盤時間爲週二,週二收盤價爲週一收盤價,週二收盤價高於週一高點如果低於星期一低點,低點將爲星期二低點......星期五我將從星期一開放,全周高點,全周低點和星期五收盤點。星期五的數據應該是相同的,如果我使用從xts to.weekly函數。

因此,基本上,這不僅僅是端點處的數據(如xts到.weekly一樣),而是沿着原始xts對象的週期可用的時間步長。所以不知何故,這部電影是每週發展到每週酒吧的電影(我每天都會在每週酒吧的每個星期結束時獲得)。

如何做到這一點(如何寫函數to.weekly.cumulative?)?

關於如何做到這一點高度讚賞的例子。

編輯:試圖解釋更多基於迪丁評論。

+1

您將不勝感激示例顯示如何做到這一點(這似乎目前尚未確定)。我們將不勝感激數據。建議你搜索SO:[r]「如何寫出一個好問題。」 –

+0

迪丁感謝您的評論。我希望我能更清楚地解釋我想在這裏實現的目標。上面的數據是包中的樣本數據。一切都達到.weekly.cumulative(我爲了顯示我想要的)應該運行在任何R與xts包安裝我希望。 – Samo

+0

我沒有試過這個 - 但是做了'cumsum(to.weekly(x))'做你想做的事? – isomorphismes

回答

1

的 「周」 分割,應用自定義功能,每星期的數據,然後rbind結果

to.weekly.cumulative <- function(xts.obj, name="") { 
    out <- do.call(rbind, 
        lapply(split(xts.obj, 'weeks'), 
         function(x) cbind(rep(first(x[,1]), NROW(x[,1])), 
            cummax(x[,2]), cummin(x[,3]), x[,4]))) 
    colnames(out) <- paste(name, c("Open", "High", "Low", "Close"), sep=".") 
    out 
} 

> library(quantmod) 
> data(sample_matrix) 
> myxts <- as.xts(sample_matrix) 


> head(to.weekly.cumulative(myxts), 15) 
       .Open .High  .Low .Close 
2007-01-02 50.03978 50.11778 49.95041 50.11778 
2007-01-03 50.03978 50.42188 49.95041 50.39767 
2007-01-04 50.03978 50.42188 49.95041 50.33236 
2007-01-05 50.03978 50.42188 49.95041 50.33459 
2007-01-06 50.03978 50.42188 49.95041 50.18112 
2007-01-07 50.03978 50.42188 49.95041 49.99185 
2007-01-08 50.03555 50.10363 49.96971 49.98806 
2007-01-09 50.03555 50.10363 49.80454 49.91333 
2007-01-10 50.03555 50.13053 49.80454 49.97246 
2007-01-11 50.03555 50.23910 49.80454 50.23910 
2007-01-12 50.03555 50.35980 49.80454 50.28519 
2007-01-13 50.03555 50.48000 49.80454 50.41286 
2007-01-14 50.03555 50.62395 49.80454 50.60145 
2007-01-15 50.61724 50.68583 50.47359 50.48912 
2007-01-16 50.61724 50.73731 50.47359 50.67835 
+0

非常感謝。 – Samo

2

不知道這是否是你想要的,但也許你可以通過做這些工作:

  1. 作出時間序列的循環指數(這裏,wday)。
  2. 使用rollapplyr使用wday作爲窗口寬度。

這裏有一個例子:

z <- as.xts(sample_matrix) 
wday <- .indexwday(z) + 1 
wday <- (wday-3)%%7 + 1 # rotate the wday index if need. 

z2 <- data.frame(
    Open = rollapplyr(z$Open, wday, function(x) x[1], partial = TRUE), 
    High = rollapplyr(z$High, wday, max, partial = TRUE), 
    Low = rollapplyr(z$Low, wday, min, partial = TRUE), 
    Close = z$Close 
) 

z2是這樣的:

> head(z2, 15) 
       Open  High  Low Close 
2007-01-02 50.03978 50.11778 49.95041 50.11778 
2007-01-03 50.03978 50.42188 49.95041 50.39767 
2007-01-04 50.03978 50.42188 49.95041 50.33236 
2007-01-05 50.03978 50.42188 49.95041 50.33459 
2007-01-06 50.03978 50.42188 49.95041 50.18112 
2007-01-07 50.03978 50.42188 49.95041 49.99185 
2007-01-08 50.03978 50.42188 49.95041 49.98806 
2007-01-09 49.99489 49.99489 49.80454 49.91333 
2007-01-10 49.99489 50.13053 49.80454 49.97246 
2007-01-11 49.99489 50.23910 49.80454 50.23910 
2007-01-12 49.99489 50.35980 49.80454 50.28519 
2007-01-13 49.99489 50.48000 49.80454 50.41286 
2007-01-14 49.99489 50.62395 49.80454 50.60145 
2007-01-15 49.99489 50.68583 49.80454 50.48912 
2007-01-16 50.62024 50.73731 50.56627 50.67835 
+0

非常感謝。 – Samo