R 循环以计算价格回报
我有下面的代码来计算并生成一个data.frame,其中包含收盘价表的log retunrs。出于某种原因,我只得到0个值。不确定问题是在n值还是在i值上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
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