2016-11-15 105 views
1

我有以下代碼,通過使用lapply成功計算了通過CAPM測試的股票列表。但是,在每個股票通過模型運行之後,我想將回歸係數(beta)附加到單獨的列表(或從capm列表中提取它們)。我的問題是append在我的lapply函數中不起作用。我希望數據列表中會有係數。將結果附加到列表中

library(qmao) 
library(broom) 

startDate = as.Date("2013-10-01") #Specify what date to get the prices from 
endDate = as.Date("2016-09-30") 

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') 
pfMthRets <- na.omit(pfMthRets) 

tail(pfMthRets) 
plot(pfMthRets$AAPL) 

getSymbols("^gspc",from = startDate, to = endDate) 
GSPC_Adjusted = GSPC$GSPC.Adjusted 
GSPC.mrtn <- monthlyReturn(GSPC$GSPC.Adjusted) 
GSPC.mrtn <- GSPC.mrtn [-1,] 
names(GSPC.mrtn)[1] <- "SP" 

datalist = list() 
lapply(symbols, function(symbols) { 
input <- as.formula(paste("pfMthRets$",symbols, "~ GSPC.mrtn$SP")) 
capm <- lm(input) 
datalist <- append(datalist, coefficients(capm)) 
}) 

回答

1

試試這個:

res <- lapply(symbols, function(symbols) { 
    input <- as.formula(paste("pfMthRets$",symbols, "~ GSPC.mrtn$SP")) 
    capm <- lm(input) 
    coefficients(capm) 
}) 

res2 <- do.call(rbind, res) 

# > res2 
# (Intercept) GSPC.mrtn$SP 
# [1,] 0.006102159  1.523730 
# [2,] 0.017761587  1.509065 

你的問題的產生是因爲裏面lapplydatalist不結果追加,你通過符號週期(在你的函數的每次調用,datalist是一個空列表)。您要「結合」(rbindlapply操作的輸出結果。一個常用的方法是do.call

+0

非常感謝您的支持。我在循環之外使用了do.call函數,但無法使其正常工作。關鍵是係數(capm)線。豐富的學習經驗。 –