欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

事件研究法python代码

时间:2023-08-30

事件研究法(event study)由Ball & Brown(1968)以及Famaetal(1969)开创,其原理是基于有效市场假说,通过研究某一未预期到的事件发生前后样本股票收益率的异常波动,揭示股票收益率对市场披露信息的反应程度,以及对股东财富价值的正向或负向影响。

本文给出的python代码以研究“811汇改”对中国银行股票收益率带来的影响为例。

注意:本文使用的是tushare的pro接口,利用该接口获取数据需要一定积分,积分可以在注册后通过完成任务获取。附官网注册链接:Tushare大数据社区

高校学生或老师也可以联系社区管理员进行认证,认证完成即可获得一定积分,然后就可以使用一些(我觉得还挺多的)里面的数据。认证只需不到24h,很方便!

我的tushareID:480696

#事件研究法import pandas as pdimport tushare as tsimport matplotlib.pyplot as pltfrom sklearn.linear_model import LinearRegression #线性回归import csvimport numpy as npplt.rcParams['font.sans-serif']=['SimHei'] #中文plt.rcParams['axes.unicode_minus'] = Falsepro = ts.pro_api('这里用你的token替换')plt.style.use('fivethirtyeight')#市场收益率Rmdf = 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#企业收益率Rits_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和Rmdf_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,CARdef 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')

运行结果如下:

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。