我有一个用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)
答案 0 :(得分:2)
您可以使用apply
和expand.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