这是我关于编程的第一篇文章,所以如果我没有使用正确的术语或在正确的位置发布,我会道歉.我对使用r非常陌生,而且对编程很新(除了一点点VBA).我写了一个基本函数,用于计算从最新价格到最早价格列出的股票价格列表的每日价格回报.我认为我的代码有点草率,我可以使用一些帮助来清理它.我创建"returnarray"的目的是让我可以将循环结果存储到变量而不是仅仅打印.
我真的想在这里做的一件事是消除对"returnarray"的需要,而是希望将结果保存到用户输入的任何内容中.例如,myreturns <- price.return(mydata)将生成一个名为myreturns的变量,其中包含所有返回值,而不是创建returnarray.在下面找到我的代码,并提前感谢您.
price.return <- function(mydata)
{
returnarray <- c()
tmp <- c()
for (i in 1:length(mydata)-1)
{
tmp <- (((mydata[i]/mydata[i+1])-1))
returnarray <- c(returnarray,tmp)
returnarray <<- returnarray
}
}
Run Code Online (Sandbox Code Playgroud)
从评论中转移.
1)问题中显示的功能是这样的:
price.return1 <- function(x) x[-length(x)] / x[-1] - 1 # similar to question
Run Code Online (Sandbox Code Playgroud)
2)指数在时间的增加看来,这个问题是假设x[1]是最近的点x[length(x)]是最古老的点,而通常惯例是,x[1]是最古老的点x[length(n)]是最近的,即通常假设该指数增加及时,所以使用这个更常见的约定,它将写成这样:
price.return2 <- function(x) x[-1] / x[-length(x)] - 1 # assume index increasing in time
Run Code Online (Sandbox Code Playgroud)
示例:为了举例说明price.return2,假设价格随时间增加1,2,3,4,5.然后我们可以写:
price.return2(1:5)
## [1] 1.0000000 0.5000000 0.3333333 0.2500000
Run Code Online (Sandbox Code Playgroud)
所以从1到2的回报是1或100%,从2到3的回报是.5或50%,依此类推.
3)相同 的另一种写它的方式相当于price.return2:
price.return3 <- function(x) exp(diff(log(x))) - 1 # similar to price.return2
Run Code Online (Sandbox Code Playgroud)
我们可以验证price.return2并price.return3为输入提供类似的答案,1:5如下所示:
all.equal(price.return2(1:5), price.return3(1:5))
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)
注意:您可能对动物园中的一些函数感兴趣,xts,PerformanceAnalytics和quantmod包.更多信息,请参阅" 经验财务任务视图".