這有點複雜!我想用Fama-French在事件日獲得異常回報。時間窗口是:在活動日之前250天。使用for()循環計算異常退貨
第一,我data.frames:
require(quantmod)
require(zoo)
# STOCK DATA.FRAME
BRCM <- as.data.frame(getSymbols.yahoo("BRCM", from="2000-01-01", verbose=F, auto.assign=F))
AAPL <- as.data.frame(getSymbols.yahoo("AAPL", from="2000-01-01", verbose=F, auto.assign=F))
MSFT <- as.data.frame(getSymbols.yahoo("MSFT", from="2000-01-01", verbose=F, auto.assign=F))
BRCM$Company <- c("BRCM")
AAPL$Company <- c("AAPL")
MSFT$Company <- c("MSFT")
BRCM$Return <- Delt(BRCM$BRCM.Adjusted)
AAPL$Return <- Delt(AAPL$AAPL.Adjusted)
MSFT$Return <- Delt(MSFT$MSFT.Adjusted)
colnames(BRCM) <- c("Open", "High", "Low", "Close", "Volume", "Adjusted", "Company", "Return")
colnames(AAPL) <- c("Open", "High", "Low", "Close", "Volume", "Adjusted", "Company", "Return")
colnames(MSFT) <- c("Open", "High", "Low", "Close", "Volume", "Adjusted", "Company", "Return")
data <- rbind(BRCM, AAPL, MSFT)
data$Open <- NULL
data$Close <- NULL
data$High <- NULL
data$Low <- NULL
data$Volume <- NULL
data$Adjusted <- NULL
data$DATE <- row.names(data)
# EVENT DATA.FRAME
COMP <- c("BRCM", "AAPL", "AAPL", "MSFT", "BRCM", "BRCM", "MSFT")
DATE <- c("2003-03-04", "2004-12-01", "2002-12-03", "2008-02-08", "2003-10-10", "2005-12-12", "2003-11-14")
events <- data.frame(COMP, DATE)
events$AR <- paste("")
# FAMA FRENCH DATA.FRAME
date <- data$DATE
Mkt.RF <- sample(c(-2, -1.3, -0.9, -0.5, 0.15, 0.45, 0.95, 1.4, 1.8), size = nrow(data), replace=T)
SMB <- sample(c(-0.54, -0.41, -0.3, -0.21, -0.1, 0.12, 0.23, 0.34, 0.42, 0.6), size = nrow(data), replace= T)
HML <- sample(c(-0.54, -0.41, -0.3, -0.21, -0.1, 0.12, 0.23, 0.34, 0.42, 0.6), size = nrow(data), replace= T)
ff <- data.frame(date, Mkt.RF, SMB, HML)
,對不起,我在做這些例子非常糟糕。 唯一重要的事情到目前爲止,我們已經有了3個data.frames
- 數據(所有股票相關數據)
- 事件(所有事件相關數據)
- FF(帶所有Fama-French相關數據)
現在我想使用for()循環來計算異常收益(AR)。 有可能是一個更簡單的方法來做到這一點,但我想出了這個和 我希望有一個天才,誰明白我想做什麼!
# create R Objects for loop
companies <- as.vector(unique(events$COMP))
days <- as.vector(unique(data$DATE))
W <- lag(zoo(days), -c(0, 250:1))
ES_list <- vector("list", length = length(companies))
for(i in 1:length(companies)) {
data_k <- data[which(data$Company==companies[i]),] # all trading days for each firm
events_k <- events[which(events$COMP==companies[i]),] # all event days for each firm
for(j in 1:nrow(events_k)) {
d = which(days==events_k[j,"DATE"])
Z = W[d,] # time window assigned to each event-day (250 days)
Y = data_k[which(is.na(match(data_k$DATE, Z) == F)), "RET"] # all Returns of time window (250days)
X = cbind(rep(1, ncol(W)), ff[which(is.na(match(ff$DATE, Z) == F), c("Mkt.RF", "SMB", "HML"))]) # explaining variables
b = (t(X) %x% X)^(-1) %x% t(X) %x% Y # my model to get coefficients to calculate abnormal return (AR)
events_k[j, AR] = data_k[d, "Return"] -b[1] -b[2:4] %x% ff[d,2:4]
ES_list[i] = events_k
}
}
ES = do.call(rbind, ES_list)
我覺得這個循環應該工作,但它讓我的錯誤:
Error in arr.ind && !is.null(d <- dim(x)) : invalid 'x' type in 'x && y'
沒有任何人有一個想法,這意味着什麼,以及如何解決呢?
輸出應該是事件(data.frame),列中包含事件日(事件$ AR)的所有異常回報。 謝謝
'nrow(mydf)中的錯誤:未找到'mydf'對象' – rawr
@ rawr:thx,現在應該是正確的。 – cptn
我也在這行'W < - 滯後(動物園(天), - C(0,250:1))',條件長度> 1,這導致動物園系列,沒有列的錯誤,所以當你'X = cbind(rep(1,ncol(W))'時,我得到另一個錯誤,因爲ncol(W)是NULL,所以錯誤的時間參數。你是否也得到這些錯誤? – rawr