Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • eventstudy2 issue with expected return computation

    Hi, everyone,

    I have encountered an issue with the user-written program -eventstudy2- which I have solved it with the help of Thomas Kaspereit, the author of the routine. At the request of Thomas, I post the solution here to help other users.
    More specifically, the problem lies in the expected return computation using CAPM or other factor models which requires excess returns, i.e., returns in excess of risk-free rate. If one tries to use the following code
    Code:
    eventstudy2 Security_id Date using Security_returns_mod if Ea > 0.05, ret(Return) car1LB(-1) car1UB(1) mod(FM) marketfile(Factor_returns) mar(MKT) idmar(Market_reference) risk(risk_free_rate) log replace
    will get different results compared to
    Code:
    eventstudy2 Security_id Date using Security_returns_mod if Ea > 0.05, ret(excess_Return) car1LB(-1) car1UB(1) mod(FM) marketfile(Factor_returns) mar(excess_MKT) idmar(Market_reference) risk(risk_free_rate) log replace
    where
    Code:
    excess_Return=Return-risk_free_rate
    and
    Code:
    excess_MKT=MKT-risk_free_rate
    . Thomas figured out that the phenomenon is due to the Maynes and Rumsey (1993, JBF) alogrithm to treat missing returns and thin trading. The solution is to add on top of
    Code:
        if "`model'" == "MA" | "`model'" == "FM" | "`model'" == "RAW" | "`model'" == "COMEAN"{    
            foreach v in `marketreturns' `factor1' `factor2' `factor3' `factor4' `factor5' `factor6' `factor7' `factor8' `factor9' `factor10' `factor11' `factor12' `factor13' `factor14' `factor15' `riskfreerate'{
                gen `cum_`v'' = `v'
                by `1': replace `cum_`v'' = `cum_`v'' + `cum_`v''[_n-1] if `cum_periods' > 1 & `cum_periods' != . & `cum_`v''[_n-1] != .
                replace `cum_`v'' = `cum_`v'' / sqrt(`cum_periods')
            }    
            gen `cum_`returns'' = `returns' / sqrt(`cum_periods')
        }
    this part which now lies below
    Code:
            if "`riskfreerate'" != ""{
            replace `returns' =  `returns' - `riskfreerate'
            replace `marketreturns' =  `marketreturns' - `riskfreerate'
        }
    . These changes should be applied in the ado file.
    Also, below is a code provided by Thomas that applies returns and log-returns:
    Code:
    use "security_returns.dta", clear
    
    gen logReturn = ln(1+Return)
    
    preserve
        keep Date
        duplicates drop
        set seed 1000
        gen rf = uniform()/10/365
        gen logrf = ln(1+rf)
        save logrf, replace    
    restore
    
    sort Security_id Date
    
    merge m:1 Date using logrf, nogen
    
    gen logReturn_minus_logrf = logReturn - logrf
    
    sort Security_id Date
    
    save security_returns_mod.dta, replace
    
    
    use "factor_returns.dta", clear
    
    merge m:1 Date using logrf, nogen
    
    gen logMKT = ln(1+MKT)
    
    gen logMKT_minus_rf = logMKT - logrf
    
    save factor_returns_mod.dta, replace
    
    
    
    use "earnings_surprises.dta"
    
    
    eventstudy2 Security_id Date using Security_returns_mod if Ea > 0.05, ret(logReturn) car1LB(-1) car1UB(1) mod(FM) marketfile(Factor_returns_mod) mar(logMKT) idmar(Market_reference) risk(logrf) log replace
    
    
    eventstudy2 Security_id Date using Security_returns_mod if Ea > 0.05, ret(logReturn_minus_logrf) car1LB(-1) car1UB(1) mod(FM) marketfile(Factor_returns_mod) mar(logMKT_minus_rf) idmar(Market_reference) log replace
Working...
X