2017-08-02 41 views
0

有沒有人遇到過計算時間序列數據集中的歷史平均對數回報?時間序列的均值回報 - 在NA值之後重新啓動 - rstudio

該數據集按個別安全性按照各自安全性首先按時間排序。我試圖形成一個歷史平均日誌回報,即每個證券的每個時間點的安全性從數據集中的第一次出現到現在的平均日誌回報。

幸運的是,返回時間序列包含不同證券的回報之間的NAs。我的想法是計算出現每個NA後重新啓動的歷史數據。

一個簡單的cumsum()可能不會這樣做,因爲NA將不得不放棄。

我想過使用rollmean(),如果我只知道一個有效的方法來指定'寬度'參數連續前面的非NAs向量的長度。 基於Count how many consecutive values are true,我採用的當前方法花費的時間太長,因爲我正在使用的數據集的大小。 對於形x的任意x:[R(1)R(2)... R(N)],其中R(2)是在時間段2中的日誌返回:

df <- data.frame(x, zcount = NA) 
df[1,2] = 0 #df$x[1]=NA by construction of the data set 
for(i in 2:nrow(df)) 
df$zcount[i] <- ifelse(!is.na(df$x[i]), df$zcount[i-1]+1, 0) 

不知道如何加快這一點將不勝感激!

+1

請參閱[MCVE。 –

+0

請參閱[本示例](https://stackoverflow.com/a/42617491/4421870)使用'rollapply'排除NAs – Mako212

+0

謝謝@ Mako212。我也看過rollapply,但正如我理解它,它不會完成我正在尋找的東西。我可能會誤解它。如上所述,我並不是試圖從計算中排除NA,而是在NA發生時儘快重置「計算窗口」。 rollapply()需要指定參數'width',這就是爲什麼我想出了創建附加變量來計算連續非NA值'zcount'的方法的原因。然後將rollapply()中的'width'參數設置爲'zcount'。 –

回答

0

您需要重新設置data.frame以在每個安全性上應用cumsum功能 。具體方法如下:

首先,我要超過100個月當中,我認爲對應於您的數據的描述中

securities <- 100 
months <- 100 
time <- seq.Date(as.Date("2010/1/1"), by = "months", length.out = months) 
ID <- rep(paste0("sec", 1:months), each = securities) 
returns <- rnorm(securities * months, mean = 0.08, sd = 2) 

df <- data.frame(time, ID, returns) 
head(df) 
     time ID returns 
1 2010-01-01 sec1 -3.0114466 
2 2010-02-01 sec1 -1.7566112 
3 2010-03-01 sec1 1.6615731 
4 2010-04-01 sec1 0.9692533 
5 2010-05-01 sec1 1.3075774 
6 2010-06-01 sec1 0.6323768 

現在產生100種證券的一些數據,你必須重塑你的數據,使每個安全列包含其返回的 ,並且每一行代表日期。

library(tidyr) 
df_wide <- spread(df, ID, returns) 

完成此操作後,您可以使用apply函數對現在表示每個安全性的每列進行求和。或使用cumsum功能。注意數據對象df_wide[-1],其中刪除time列。這是避免sum或cumsum函數拋出錯誤所必需的。

matrix_sum <- apply(df_wide[-1], 2, FUN = sum) 

matrix_cumsum <- apply(df_wide[-1], 2, FUN = cumsum) 

現在,添加time列回爲data.frame,如果你喜歡:

df_final <- data.frame(time = df_wide[,1], matrix_cumsum) 
+0

謝謝@Justin。我非常感謝您的回覆,這對於每項安全總累計回報看起來不錯。不過,如果我沒有弄錯的話,我需要爲每項證券提供針對具體時間的累計回報,以便對整個證券運行* cumsum()*不會產生影響。你如何使它具體時間? 目前,我花時間採取上述方法,但下次更有效率會有所幫助。 –

+0

@JonE。我列出了上述兩種方法。 'cumsum'函數*會*在每個日期產生一個累計總和。在上面的例子中,將結果分配給'matrix_cumsum',累積和*在每個日期顯示。將我的代碼剪切並粘貼到您的R會話中,然後查看(df_final)'查看每個日期的每個安全性的運行總數。 – Justin

相關問題