R 循环以计算价格回报

R 循环以计算价格回报,r,return-value,R,Return Value,我有下面的代码来计算并生成一个data.frame,其中包含收盘价表的log retunrs。出于某种原因,我只得到0个值。不确定问题是在n值还是在i值上 number <- c(1:505) n <- nrow(data_all) for (i in number) {returns <- log(data_all[2:n, i]) - log(data_all[1:(n-1), i]) if (i == number[1]) returns

我有下面的代码来计算并生成一个data.frame,其中包含收盘价表的log retunrs。出于某种原因,我只得到0个值。不确定问题是在n值还是在i值上

 number <- c(1:505)
    n <- nrow(data_all)
    for (i in number)
    {returns <- log(data_all[2:n, i]) - log(data_all[1:(n-1), i])
    if (i == number[1]) returns_all <- returns else
      returns_all <- merge(returns_all, returns)
rm(returns)    
}

number我根据你的问题做了一个演示。
代码是

data\u all由于
log(a)-log(b)=log(a/b)
您可以使用
diff
log
函数来计算 价格系列的回报如下:

对于多个系列,我建议将系列转换为
xts
系列

library("xts")

#if closePx is price series with first column as date with format = 2002-02-12
#specify the corresponding date format , %Y-%m-%d, 
#2002/02/12 => %Y/%m/%d
#closePx_xts = xts(closePx[,-1],order.by = as.Date(closePx[,1],format="%Y-%m-%d")

library("quantmod")

#create environment to store price data
stockNames = c("IBM","MSFT")
dataEnv = new.env()
getSymbols(stockNames, env = dataEnv, from = "2002-01-01", to = "2010-01-01")

#check prices

ls(dataEnv)

head(dataEnv$IBM)
head(dataEnv$MSFT)



#combine closing prices, using Cl function on each list member get closing price 
#for each stock and use merge.xts to combine prices
#if you have missing prices checkout `zoo::na.locf` function
#i.e. na.locf function from zoo package

closePx = do.call(merge.xts,lapply(dataEnv,Cl))

#closePx = Cl(IBM)

#log returns
logRet = diff(log(closePx))


head(logRet)
#              IBM.Close   MSFT.Close
#2002-01-02           NA           NA
#2002-01-03  0.017621634  0.032144867
#2002-01-04  0.015566342 -0.004778131
#2002-01-07 -0.012417504 -0.004946962
#2002-01-08  0.005226094  0.011889353
#2002-01-09 -0.001685453 -0.009703864
使用lag函数,您可以按如下方式计算离散/算术返回

#discrete returns
discRet = closePx/lag(closePx) - 1


head(discRet)
#              IBM.Close   MSFT.Close
#2002-01-02           NA           NA
#2002-01-03  0.017777811  0.032667094
#2002-01-04  0.015688128 -0.004766734
#2002-01-07 -0.012340725 -0.004934746
#2002-01-08  0.005239774  0.011960312
#2002-01-09 -0.001684034 -0.009656933

另外,
PerformanceAnalytics
更多实用功能的软件包

请给出一个,即编辑您的问题:
返回所有Hi Jogo,是数据\u all是一个矩阵,我想按行将计算应用于每一列。因此,第一列应用公式log(x+1)-log(x),然后跳到下一列。这就是我的代码所做的。没有必要一个接一个地做(专栏)。嗨,非常感谢你的帮助。还有一个问题,您只有一列,如何将其应用于具有多列的data.frame?您只需在
xts
series对象中组合序列,我已更新了上面的示例HI,合并函数并没有给我带来麻烦,只需应用滞后(x+1)-log(x)公式所有行的每一列中是否包含mex NA?inf?删除NA然后成功运行?如果我浪费了你的时间,我很抱歉,但我实际上找到了一个更简单的方法。简单地使用{RealsSth-ALL谢谢~!但是我认为>XXSH()>代码>可以使用参数来考虑如何处理NA。
library("xts")

#if closePx is price series with first column as date with format = 2002-02-12
#specify the corresponding date format , %Y-%m-%d, 
#2002/02/12 => %Y/%m/%d
#closePx_xts = xts(closePx[,-1],order.by = as.Date(closePx[,1],format="%Y-%m-%d")

library("quantmod")

#create environment to store price data
stockNames = c("IBM","MSFT")
dataEnv = new.env()
getSymbols(stockNames, env = dataEnv, from = "2002-01-01", to = "2010-01-01")

#check prices

ls(dataEnv)

head(dataEnv$IBM)
head(dataEnv$MSFT)



#combine closing prices, using Cl function on each list member get closing price 
#for each stock and use merge.xts to combine prices
#if you have missing prices checkout `zoo::na.locf` function
#i.e. na.locf function from zoo package

closePx = do.call(merge.xts,lapply(dataEnv,Cl))

#closePx = Cl(IBM)

#log returns
logRet = diff(log(closePx))


head(logRet)
#              IBM.Close   MSFT.Close
#2002-01-02           NA           NA
#2002-01-03  0.017621634  0.032144867
#2002-01-04  0.015566342 -0.004778131
#2002-01-07 -0.012417504 -0.004946962
#2002-01-08  0.005226094  0.011889353
#2002-01-09 -0.001685453 -0.009703864
#discrete returns
discRet = closePx/lag(closePx) - 1


head(discRet)
#              IBM.Close   MSFT.Close
#2002-01-02           NA           NA
#2002-01-03  0.017777811  0.032667094
#2002-01-04  0.015688128 -0.004766734
#2002-01-07 -0.012340725 -0.004934746
#2002-01-08  0.005239774  0.011960312
#2002-01-09 -0.001684034 -0.009656933