(金融会计领域)计算累计超额收益率 (CAR)

发布于:2024-04-16 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、每股正常收益率的计算

        1)风险系数的计算。计算股票的正常收益率,首先需要用市场模型计算出股票的系统风险,即股票的\beta系数。股票收益率的市场模型为:

r_{\mathrm{~it}}=_{\alpha_i}+_{\beta_i}r_{\mathrm{~m~t}}+\varepsilon_{\mathrm{~it}} 

其中r_{it}为股票i在交易日t的收益率; r_{mt}为市场在交易日t的收益率; \beta_i为股票i的系统风险; \varepsilon_{it}是随机误差项。 

由股票的日收益率对市场日收益率进行回归可求出每只股票的B系数。
正常收益率的计算。正常收益率的计算采用资本资产定价模型(CAPM),模型如下: 

E(r_{\mathrm{~it}})=r_{\mathrm{~f}}+\beta_{\mathrm{~i}}(r_{\mathrm{~m~t}}-r_{\mathrm{~f}}) 

其中r_f为无风险利率,以银行1年期利率(1.98%)作为无风险的报酬率; E(r_{it})为股票i在时期r的正常收益率。 

二、累计超额收益率的计算与确定

日超额收益率AR_{it}的计算公式如下: 

AR_{\mathrm{~it~}}=_{r_{\mathrm{~it}}}-E(r_{\mathrm{~it}})

对于每一个样本总体,平均日超额收益率AAR为:

为了反映事件在公告日前后影响股票价格的全过程,从而衡量市场的反应,还需计算累计超额收益率 (CAR),计算公式如下: 

\begin{aligned}CAR_{\mathrm{~it}}=&(1/\mathrm{n})\sum_{\lambda=-20}^\mathrm{n}AR_{\mathrm{~i\lambda}}(\mathrm{t}=-20,-19,\cdots19,20)\end{aligned}

三、代码实现

import numpy as np
import statsmodels.api as sm

# 假设已有数据:
# stock_returns 是一个字典或者DataFrame,键或列名是股票代码,值是日收益率列表
# market_returns 是日市场收益率的列表
# risk_free_rate 是无风险利率,这里设置为1.98%的年化利率

risk_free_rate = 0.0198  # 无风险利率

# (2) 计算每只股票的β系数和正常收益率
def calculate_beta(stock_returns, market_returns):
    beta_values = {}
    market_returns = sm.add_constant(market_returns) # 为市场收益率添加常数项
    for stock, returns in stock_returns.items():
        model = sm.OLS(returns, market_returns).fit() # 使用最小二乘法进行回归
        beta_values[stock] = model.params[1] # 提取β系数
    return beta_values

def calculate_normal_return(stock_beta, market_return):
    """
    计算正常收益率,使用CAPM模型。
    """
    return risk_free_rate + stock_beta * (market_return - risk_free_rate)

# (3) 计算超额收益率和累计超额收益率
def calculate_AR(stock_return, normal_return):
    """
    计算日超额收益率 AR。
    """
    return stock_return - normal_return

def calculate_AAR(stock_returns, normal_returns):
    """
    计算平均日超额收益率 AAR。
    """
    return np.mean([calculate_AR(r, n) for r, n in zip(stock_returns, normal_returns)])

def calculate_CAR(stock_returns, event_window):
    """
    计算累计超额收益率 CAR,给定事件窗口。
    """
    ARs = [calculate_AR(r, n) for r, n in zip(stock_returns, normal_returns)]
    CAR = np.sum(ARs[event_window[0]:event_window[1]+1])
    return CAR

# 假设我们有股票代码 'ABC' 的日收益率和市场收益率
stock_code = 'ABC'
stock_returns = stock_returns[stock_code] # 假设这是 'ABC' 的日收益率列表
market_return = np.mean(market_returns) # 假设这是市场日均收益率

# 计算 'ABC' 股票的β系数
betas = calculate_beta(stock_returns, market_returns)
stock_beta = betas[stock_code]

# 计算 'ABC' 股票的正常收益率
stock_normal_return = calculate_normal_return(stock_beta, market_return)

# 计算一个时间窗口内的AR和CAR
event_window = (-20, 20)
stock_AR = calculate_AR(stock_returns, stock_normal_return)
stock_CAR = calculate_CAR(stock_returns, event_window)

# 打印结果
print(f"Stock Beta: {stock_beta}")
print(f"Normal Return: {stock_normal_return}")
print(f"Cumulative Abnormal Return (CAR) for event window {event_window}: {stock_CAR}")