2014-03-28 28 views
0

這有點複雜!我想用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

  1. 數據(所有股票相關數據)
  2. 事件(所有事件相關數據)
  3. 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)的所有異常回報。 謝謝

+0

'nrow(mydf)中的錯誤:未找到'mydf'對象' – rawr

+0

@ rawr:thx,現在應該是正確的。 – cptn

+0

我也在這行'W < - 滯後(動物園(天), - C(0,250:1))',條件長度> 1,這導致動物園系列,沒有列的錯誤,所以當你'X = cbind(rep(1,ncol(W))'時,我得到另一個錯誤,因爲ncol(W)是NULL,所以錯誤的時間參數。你是否也得到這些錯誤? – rawr

回答

0

我不明白你爲什麼代碼失敗,但我想我會使用apply功能家族而不是for循環。此外,我會嘗試時間序列對象(我猜quantmod返回xts對象),這應該使窗口選擇更容易。

請注意,我使用Fama和法國日常因素的數據框。 Ian Gow提供代碼here

以下函數返回一個xts對象,每個事件有一列。從那裏你應該可以得到你想要的任何彙總數據。讓我知道我是否太遠(我不知道更大的目標或代碼)。

require(quantmod) 
require(zoo) 

# get data and find returns 
tickers <- c("BRCM", "AAPL", "MSFT") 
prices <- lapply(tickers, getSymbols, auto.assign=FALSE, from="2000-01-01") 
my.ret <- function(x) { 
    y <- dailyReturn(x, type="log") 
    names(y) <- strsplit(names(x)[1], "\\.")[[1]][1] 
    y 
} 
returns <- lapply(prices, my.ret) 
returns <- merge(Reduce(merge, returns), read.zoo(ff_daily_factors), all=FALSE) 

# 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") 

# my function to calculate predicted abnormal returns 
my.AR <- function(x, tic, day) { 
    x$exret <- x[, tic] - x[, "rf"] 
    est.beg <- as.Date(day) - 280 
    est.end <- as.Date(day) - 30 
    model <- lm(exret ~ mktrf + smb + hml +umd, data=window(x, start=est.beg, end=est.end)) 
    pred.beg <- as.Date(day) - 29 
    pred.end <- as.Date(day) + 29 
    exret.hat <- predict(model, window(x, start=pred.beg, end=pred.end)) 
    exret.hat <- zoo(exret.hat, order.by=as.Date(names(exret.hat))) 
    x <- merge(x, exret.hat) 
    x$exret - x$exret.hat 
} 
ARs <- Reduce(merge, mapply(my.AR, tic=COMP, day=DATE, MoreArgs=list(x=returns), SIMPLIFY=FALSE)) 
names(ARs) <- paste0(COMP, DATE) 
returns <- merge(returns, ARs) 

這有幫助嗎?

+0

@ Richard Herron:謝謝你的回答!你的代碼完美地工作!只是,輸出應該是一個完全像我的data.frame「events」的面板,並帶有一個額外的列AR – cptn

+0

我只改變了pred.beg < - as。 Date(day) - 0和pred.end < - as.Date(day)+ 0,因爲我只需要事件日的異常回報。 – cptn

+0

太好了。在這種情況下,您可以進行額外的合併,將收益和AR組合在一起。 –