事件研究法python代码
 发布时间 
 阅读量: 
 阅读量 
事件研究法(event study)最初由Ball & Brown(1968)以及Famaetal(1969)发展而成。其理论基础建立在有效市场假设之上,并通过考察特定非预期事件发生前后的样本股票收益异常变动情况来探讨股票收益对市场信息披露反应的程度及其对股东财富价值的影响方向。
本文提供了一种python代码作为研究"811汇改"对中国银行股票收益率影响的研究案例
注意:本文采用了tushare的pro接口这一方式,并通过该接口获取数据需要一定的积分积累,在用户注册后可以通过完成相关任务来获得相应的积分权益。并附上官网注册链接:Tushare大数据社区
高校师生不妨与社区管理者取得联系,在完成认证后将可获取积分,并可从中获取大量数据。通常仅需不足24小时即可完成整个流程
我的tushareID:480696
 #事件研究法
    
  
    
 import pandas as pd
    
 import tushare as ts
    
 import matplotlib.pyplot as plt
    
 from sklearn.linear_model import LinearRegression #线性回归
    
 import csv
    
 import numpy as np
    
  
    
 plt.rcParams['font.sans-serif']=['SimHei'] #中文
    
 plt.rcParams['axes.unicode_minus'] = False
    
 pro = ts.pro_api('这里用你的token替换')
    
 plt.style.use('fivethirtyeight')
    
  
    
  
    
 #市场收益率Rm
    
 df = pro.index_daily(ts_code='000001.SH', start_date='20140101', end_date='20191231')
    
 df_index = df[['trade_date', 'pct_chg']].copy()
    
 df_index['trade_date'] = pd.to_datetime(df_index['trade_date'])
    
 df_index = df_index.sort_values("trade_date")
    
 df_index = df_index.reset_index().drop("index", axis=1)
    
 df_index['pct_chg'] = df_index['pct_chg'] / 100
    
  
    
  
    
 #企业收益率Ri
    
 ts_code='601988.SH'
    
 d2= pro.daily(ts_code=ts_code, start_date='20140101', end_date='20191231')
    
 d0 = d2[['trade_date', 'pct_chg']].copy()
    
 d0.columns = ['trade_date', 'return']
    
 d0['trade_date'] = pd.to_datetime(d0['trade_date'])
    
 d0 = d0.sort_values("trade_date")
    
 d0 = d0.reset_index().drop("index", axis=1)
    
 d0['return'] = d0['return'] / 100
    
  
    
  
    
 #合并Ri和Rm
    
 df_final = d0.merge(df_index, on='trade_date', how='left')
    
 df_final.to_excel("整理数据.xlsx")
    
  
    
  
    
 #计算预期收益率
    
 def get_OLS(X, y, pre_X):
    
     linear_m = LinearRegression().fit(X, y)
    
     r_2 = linear_m.score(X, y) #值越接近1拟合优度越好
    
     pre_y=linear_m.predict(X)
    
     Residual = sum((y - pre_y)**2)
    
     L_xx = len(X) * np.var(X)
    
     sigma = np.sqrt(Residual / (len(X)-2))
    
     t = linear_m.coef_ * np.sqrt(L_xx) / sigma
    
     t=round(float(t),4)
    
  
    
     print(f"构建模型,拟合优度为{round(r_2*100, 2)}%")
    
     print(f"Ri = {round(linear_m.intercept_,3)} + {round(linear_m.coef_[0],3)}Rm + e")
    
  
    
     if 1.65<=abs(t)<1.96:
    
     print(f'回归模型的t值为{t},回归系数在10%的置信水平下显著')
    
     elif 1.96<=abs(t)<2.58:
    
     print(f'回归模型的t值为{t},回归系数在5%的置信水平下显著')
    
     elif abs(t)>=2.58:
    
     print(f'回归模型的t值为{t},回归系数在1%的置信水平下显著')
    
     else:
    
     print(f'回归模型的t值为{t},回归系数不显著')
    
  
    
     return linear_m.predict(pre_X)
    
  
    
  
    
 #计算AR,CAR
    
 def get_data(event):
    
     print("事件日为: ", event)
    
     q,h = df_final[df_final['trade_date'] == event].index[0]-15, df_final[df_final['trade_date'] == event].index[0]+15 #事件窗口[-15,15]
    
     target = df_final.loc[q:h].copy()
    
     estimate = df_final.loc[q-195:q-6].copy() #估计窗口[-210,-21]
    
     X = estimate[['pct_chg']] #估计期市场回报率
    
     y = estimate['return'] #估计期企业回报率
    
     predict_X = target[['pct_chg']] #窗口期市场回报率
    
     target['E(Rt)'] = get_OLS(X, y, predict_X) #企业预期收益率
    
     target['ARt'] = target['return']-target['E(Rt)'] #企业异常收益率
    
     target['CARt'] =  target['ARt'].cumsum() #累计异常收益率 = 异常收益率在窗口期的求和
    
     return target
    
  
    
  
    
 #绘制图像
    
 def main(e):
    
     a = get_data(e)
    
     print(a)
    
     a.set_index('trade_date')[['ARt', 'CARt']].plot()
    
  
    
 #结果
    
 events = ['2015-08-11']
    
 for e in events:
    
     main(e)
    
  
    
 plt.title('中国银行')
    
 plt.savefig('.\中国银行.jpg',bbox_inches='tight')
        运行结果如下:

全部评论 (0)
 还没有任何评论哟~ 
