2016-03-07 36 views
1

這裏是樣本數據:返回到價格[R

set.seed(13) 
x1 <- runif(10, -0.05, 0.05) 
x2 <- runif(10, -0.05, 0.05) 
x3 <- runif(10, -0.05, 0.05) 
x4 <- runif(10, -0.05, 0.05) 
df <- as.data.frame(cbind(x1, x2, x3, x4)) 

讓我們認爲這些是返回,我想將這些轉化爲價格與100起始值有用來打開的一個矢量答案返回到這裏價格:How to convert returns to prices?我曾嘗試以下操作:

index <- as.data.frame(Reduce(function(x,y) {x * exp(y)}, df, init=100, accumulate=T)) 

但對數據幀不會工作。我也嘗試過應用函數,但沒有得到任何合理的結果。

+0

另一個答案使用'cumprod',你可以檢查出來。 – Laterow

回答

1

通過逐列運行擴展數據框的答案。

index <- sapply(colnames(df), function(col){ 
    Reduce(function(x,y){x * exp(y)}, 
      df[[col]], init=100, accumulate=T) 
}) 

index 
#x1  x2  x3  x4 
#[1,] 100.00000 100.0000 100.00000 100.00000 
#[2,] 102.12550 101.6243 96.43574 99.23404 
#[3,] 99.56554 105.5431 96.88956 98.29784 
#[4,] 98.47272 109.7467 98.62877 102.50103 
#[5,] 94.53007 110.4766 98.90613 105.71522 
#[6,] 99.00045 111.5149 94.90222 106.13989 
#[7,] 94.27516 110.0142 96.04782 102.05241 
#[8,] 94.97819 108.4567 91.65382 101.58857 
#[9,] 97.52289 109.4531 91.30083 97.13752 
#[10,] 101.23305 113.5271 89.76203 99.68356 
#[11,] 96.69209 115.5952 90.96857 95.62000 
+0

我也很喜歡這種方式,因爲通常情況下,我實際上需要初始值來讓所有東西排列起來。謝謝。 – Hakki

1

使用cumsum,它對數據幀起作用。

R> index <- exp(cumsum(df)) * 100 
      x1  x2  x3  x4 
1 102.12550 101.6243 96.43574 99.23404 
2 99.56554 105.5431 96.88956 98.29784 
3 98.47272 109.7467 98.62877 102.50103 
4 94.53007 110.4766 98.90613 105.71522 
5 99.00045 111.5149 94.90222 106.13989 
6 94.27516 110.0142 96.04782 102.05241 
7 94.97819 108.4567 91.65382 101.58857 
8 97.52289 109.4531 91.30083 97.13752 
9 101.23305 113.5271 89.76203 99.68356 
10 96.69209 115.5952 90.96857 95.62000 
+0

謝謝,很好地工作。我太緊張了,我擔心減少功能。你的名字看起來很熟悉,也許我試圖在某處模仿你的帖子。讓他們繼續來。 – Hakki