【问题标题】:Calculating simple daily returns with a for loop in R使用 R 中的 for 循环计算简单的每日收益
【发布时间】:2021-06-11 17:21:47
【问题描述】:

我正在尝试使用 for 循环计算简单的每日回报 (x_t - x_t-1 / x_t-1),但我无法管理它。

假设我们有以下股票的收盘价。

x <- c(100, 101, 102, 100, 101, 102)

我的循环思路是:

returns <- function(x){
n <- length(x)
daily.returns <- numeric(n-1)
for(i in 1:(n-1)){ 
daily.returns[i] <- (x[i+1]-x[i])/x[i]
return(daily.returns)
}
}

结果,R 正确计算了第一个返回值,但否则我得到 0。

非常感谢任何帮助。

【问题讨论】:

    标签: r


    【解决方案1】:

    Norman Matloff 和 Hadley Wichkam 在他们关于 R(R 编程的艺术和高级 R)的书中都指出,鉴于 R 是矢量化的,R 中的循环大多是可以避免的。这可以在没有循环的情况下轻松完成

    x <- c(100, 101, 102, 100, 101, 102)
    
    daily_ret <- c(NA, (x[-1] - x[-length(x)])/x[-length(x)])
    
    [1]          NA  0.01000000  0.00990099 -0.01960784  0.01000000  0.00990099
    

    【讨论】:

    • 或者,我们可以tail(x,-1)/head(x,-1)-1
    • @ThomasIsCoding 是的,它看起来又短又优雅。谢谢,我也会记住这一点。顺便说一句,看到embed 后我仍然感到敬畏和哇 :)
    【解决方案2】:

    一点点 tidyverse 可能比循环更优雅:

    library(tidyverse)
    
    x <- data.frame(value=c(100, 101, 102, 100, 101, 102))
    
    return <- x %>%
      mutate(daily_return = (x-lag(x))/lag(x))
    

    如果你真的想要一个 for 循环:

    x <- c(100, 101, 102, 100, 101, 102)
    return <- numeric()
    
    for(i in 1:length(x)) {
      return[i] <- (x[i] - x[i-1]) / x[i-1]
    }
    

    【讨论】:

      【解决方案3】:

      这是一个使用map_dbl 的简短解决方案,它比使用循环更简洁:

      library(tidyverse)
      returns <- map_dbl(2:length(x), ~ (x[.] - x[.-1])/x[.-1])
      

      【讨论】:

        【解决方案4】:

        我们可以像下面这样使用embed

        with(
          data.frame(embed(x,2)),
          X1/X2-1
        )
        

        给了

        [1]  0.01000000  0.00990099 -0.01960784  0.01000000  0.00990099
        

        【讨论】:

        • 第一次看到这个embed。感谢分享:)
        猜你喜欢
        • 1970-01-01
        • 2020-01-22
        • 1970-01-01
        • 2013-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-05
        • 2020-07-22
        相关资源
        最近更新 更多