2016-11-11 16 views
1

我有下面的代碼,它的目的是下載一個選擇股票,然後計算這些股票的月度回報。一切順利,直到我使用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 

回答

2

如果你改變,你創建變量Temp到行:

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

它的工作原理。

我認爲一個更易於維護,更靈活的方法做這種計算的(在這裏您保持正確的列名也一樣)是使用包qmao(find it here)它擁有2個代表非常有用的功能PFRFPriceFrameReturnFrame。即

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 
+0

非常感謝您的幫助。與R的方式一樣,我升級到3.3.1,並且qmao在此版本中尚未提供。我想我將不得不得到一個老版本的R –

+0

對不起,只需要加載一些其他的軟件包,但現在都很好。 –