使用quantmod的lapply获得月度回报

时间:2016-11-11 21:53:42

标签: r lapply quantmod

我有以下代码,其目的是下载选择的股票,然后计算这些股票的月度回报。在我使用lapply函数之前,一切正常。此示例为每个股票返回相同的结果。其他尝试也是错误的

NB符号也可以像symbols <- c("AAPL", "GOOG", "GE")

tickerlist <- "sp5001.csv"  #CSV containing tickers on rows
startDate = as.Date("2013-10-01") #Specify what date to get the prices from
endDate = as.Date("2016-09-30")
stocksLst <- read.csv("sp5001.csv", header = F, stringsAsFactors = F)
symbols <- read.csv("sp5001.csv", header = F)$V1
symbols <-as.character(symbols)
nrstocks = length(stocksLst[,1])

data.env <- new.env()
getSymbols(symbols, env = data.env ,from= startDate ,to= endDate)
dataX <-do.call(merge, eapply(data.env, Ad)[symbols])

Temp <- lapply(symbols, function(symbols) {monthlyReturn(dataX)})
What_I_need <- do.call(merge.xts,Temp)

What_I_need data.frame / xts看起来像这样 - 这是错误的。

            monthly.returns monthly.returns.1 monthly.returns.2
2013-10-31     0.071194294       0.071194294       0.071194294
2013-11-29     0.070052705       0.070052705       0.070052705
2013-12-31     0.008901793       0.008901793       0.008901793
2014-01-31    -0.107696737      -0.107696737      -0.107696737

1 个答案:

答案 0 :(得分:2)

如果您将创建变量Temp的行更改为:

Temp <- lapply(1:length(symbols), function(x) {monthlyReturn(dataX[,x])})

它有效。

我认为更容易维护,更灵活的方法来进行这种计算(同时保留正确的列名)是使用包qmao (find it here),它有2个非常有用函数PFRF代表PriceFrameReturnFrame。即。

    library(qmao)
    symbols <- c('AAPL','AMZN')
    data.env <- new.env()
    getSymbols(symbols, env = data.env ,from= startDate ,to= endDate)
    pf <- PF(symbols,env = data.env,silent=TRUE) # consolidated xts-object
    pfMth <- pf[endpoints(pf,on='months'),]   # get monthly endpoints
    pfMthRets <- ROC(pfMth,type='discrete')       
    tail(pfMthRets)
                      AAPL         AMZN
    2016-04-29 -0.13992110  0.111094283
    2016-05-31  0.07177292  0.095817020
    2016-06-30 -0.04265974 -0.009919871
    2016-07-29  0.09006276  0.060353265
    2016-08-31  0.02365190  0.013639745
    2016-09-30  0.06550429  0.088603187