【问题标题】:Capture iteration output into a data.frame in R将迭代输出捕获到 R 中的 data.frame 中
【发布时间】:2011-04-08 12:41:22
【问题描述】:

我有一个用 R 编写的简单回测程序,用于计算测试期间的返回日期。非常简单。不是年化的,只是整体买入并持有的回报。但不仅仅是一组参数。它为一组“参数”计算这些天真的回报。这需要循环,我首先创建了一个显式的 R 循环来执行操作。这是代码及其生成到控制台的内容。

require(quantmod)

getSymbols("GLD")

for(i in seq(5, 15, 5))
  for(j in seq(50, 80, 15))

{
GLD$fast     <- SMA(Cl(GLD), n=i)     
GLD$slow     <- SMA(Cl(GLD), n=j)         

golden_cross <- Lag(ifelse(GLD$fast > GLD$slow, 1, -1))
golden_cross <- na.locf(golden_cross, na.rm=TRUE)

coin         <- ROC(Cl(GLD))*golden_cross

coin_box     <- cumprod(1+coin)
last_coin    <- coin_box[NROW(coin_box),]

coin_value   <- round((last_coin-1)*100, digits=2)

cat(i,j,coin_value,  "\n")
}

输出:

5 50 9.96 
5 65 -26.37 
5 80 -21.92 
10 50 3.09 
10 65 -13.55 
10 80 -17.98 
15 50 -6.48 
15 65 -21.79 
15 80 -9.73 

使用cat() 函数将输出从循环中取出。这对我没用。我想让它返回一个 data.frame 对象,这样我就可以对其进行分析。本质上,我想删除cat() 调用并使用循环过程逐行创建data.frame 对象。第一列为i,第二列为j,第三列为与唯一的i,j 迭代关联的值。

我已经在考虑对脚本进行矢量化的不同方法。我现在使用显式 R 循环方法作为一种占位符。我相信在进行重构之前先解决这个问题是有用的。如果你不同意,我欢迎你的意见。

编辑:

下面接受的答案是成立的。但我更仔细地研究了cat() 函数并提出了一个问题:有没有办法将此函数的默认输出从控制台更改为文件?事实上,有。以下行将输出重定向到文件中。出于说明目的,我将文件保存到我的主目录,并将其称为“test_result”(没有文件扩展名,因为这样看起来更干净)。如果您不传递append=TRUE,它将只返回从循环派生的最后一个值。

    cat(i,j, coin_value,  "\n", file="~/test_result", append=TRUE) 

【问题讨论】:

    标签: r loops


    【解决方案1】:

    您可以使用applyexpand.grid 的组合来获得您想要的:

    fac1 <- seq(5, 15, 5)
    fac2 <- seq(50, 80, 15)
    
    Out <- apply(expand.grid(fac1,fac2),1,function(x){
      GLD$fast     <- SMA(Cl(GLD), n=x[1])
      GLD$slow     <- SMA(Cl(GLD), n=x[2])
    
      golden_cross <- Lag(ifelse(GLD$fast > GLD$slow, 1, -1))
      golden_cross <- na.locf(golden_cross, na.rm=TRUE)
    
      coin         <- ROC(Cl(GLD))*golden_cross
    
      coin_box     <- cumprod(1+coin)
      last_coin    <- coin_box[NROW(coin_box),]
    
      coin_value   <- round((last_coin-1)*100, digits=2)
    
    return(c(x[1],x[2],Value=coin_value))
    })
    as.data.frame(t(Out))
    

    给:

      Var1 Var2  Value
    1    5   50   9.96
    2   10   50   3.09
    3   15   50  -6.48
    4    5   65 -26.37
    5   10   65 -13.55
    6   15   65 -21.79
    7    5   80 -21.92
    8   10   80 -17.98
    9   15   80  -9.73
    

    【讨论】:

    • 不知道 expand.grid。一个非常合适的内置 R。谢谢。
    最近更新 更多