【发布时间】: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)
【问题讨论】: