Skip to content
Preparing Python in your browser (about 6 MB, first visit only)

Event Study in Python: Abnormal Returns and CAR

Lesson 13 of 16 · Data Manipulation

advanced Python 18 minevent studyabnormal returncumulative abnormal return

Event Studies: Did the News Move the Stock?

Scene: a corporate-finance thesis on earnings surprises. On the day a firm beats its earnings forecast, its stock closes up 1.2%. Good news, modest reaction? Not so fast: that same day the market fell 2% on a macro surprise. The firm's shares would normally have fallen with it. The question your thesis must answer is not "what did the stock do?" but "what did the stock do beyond what the market would have made it do?" That gap is the abnormal return, and summing it around the event gives the cumulative abnormal return (CAR), the workhorse of empirical finance.

What it is: An event study measures the effect of a dated event (earnings, a merger announcement, a rating change, a central-bank decision) on a firm's value. It compares the actual return with a "normal" return predicted by a model fitted on calm days before the event.

The three windows

text
  estimation window            gap        event window
 [-130 .......... -11]   [-10 .. -6]   [-5 ... 0 ... +5]
  fit the market model    keep clean    measure AR and CAR

Day 0 is the event. The estimation window must end before the event window, so the model of "normal" behaviour is not contaminated by the news it is supposed to measure.

The formulas

text
Market model (estimation window):
  R_t = α + β · Rm_t + ε_t

Abnormal return:
  AR_t = R_t - (α̂ + β̂ · Rm_t)

Cumulative abnormal return:
  CAR[a, b] = AR_a + AR_(a+1) + ... + AR_b

Test statistic, over L = b - a + 1 days:
  t = CAR[a, b] / (σ_AR · √L)

σ_AR is the standard deviation of the market-model residuals over the estimation window (dividing by n - 2, since two parameters were estimated). Under the null of no effect, and with independent daily abnormal returns, the variance of a sum of L of them is L × σ², hence the √L.

Worked numbers (this lesson's data)

The market model fitted on days -130 to -11 gives α̂ = 0.046%, β̂ = 1.46, σ_AR = 1.22%.

On day 0 the market returned -2.00% and the stock +1.22%:

text
expected  = 0.046 + 1.46 × (-2.00) = -2.88%
AR_0      = 1.22 - (-2.88)          = +4.10%

Over days -1 to +1: AR = +1.37%, +4.10% and +3.16%, so CAR[-1,+1] = +8.62% (the parts round to 8.63) and

text
t = 8.62 / (1.22 × √3) = 8.62 / 2.11 = 4.08

Over the wider window -5 to +5, noise on the quiet days pulls CAR[-5,+5] down to +4.13%, with t = 1.02. Wider windows catch slow reactions and leaks, but they also add noise: the test loses power with every day you add.

Why not just subtract the market?

The quick shortcut, market-adjusted returns (AR = R - Rm), assumes β = 1. This stock's β is 1.46, so on a day the market falls 2% the shortcut expects -2.00% instead of -2.88% and understates the surprise: AR_0 comes out at +3.22% instead of +4.10%. The shortcut is defensible only when betas are close to 1 or the market barely moves.

Your Task

The starter computes everything, but YOUR TURN marks the line that sets the expected return to the market's return, the market-adjusted shortcut. Replace it with the market model's prediction, using the α and β the starter has already estimated.

Predict before you run: on day 0, with the market down 2% and β above 1, will the abnormal return rise or fall when you switch to the market model?

Related terms in the glossary