事件研究法(EventStudy)用于评估某一事件的发生或信息的发布,是否会改变投资人的决策,进而影响股票价格或交易量的变化。事件研究法应用于金融领域,借助金融市场数据分析某一特定经济事件对该公司价值或市场产生的影响,即是否产生超常收益(AbnormalReturns)。其理论基础在于,如果市场是有效的,那么此事件的影响会迅速反映到资产的价格上。
在本章节中,采用前文描述的事件分析法分析浑水做空中概股事件发生后的一个月股价的影响。我将估计窗口设定为事件发生前60日,事件的窗口设为报告发布前的10日+事件后20日总共30日。考虑到浑水报告发布前,这些公司的股价就发生了异常波动,极有可能部分消息提前进入了市场,所以我将事件发生日前10日包括当日也纳入到事后检验。
建模采用的是单变量线性回归模型,因变量为个股当日涨跌幅,采用的自变量为市场指数(标普500)的当日涨跌幅。建模考虑的情况较少,建模效果并不尽如人意,姑且暂用这个方法初步模拟事件分析法的分析效果。
考虑到样本量较小,每个事件的校验样本少于100,校验方法采用了T校验,对每次事件发生过程中股价变化的显著性进行检验。
# coded by LY(伊玛目的门徒)
import pandas_datareader as pdr
import datetime
# 获取公司
start=datetime.datetime(2021,6,1)
end= datetime.datetime(2022,6,1)
df = pdr.get_data_tiingo('BEKE', start,end,api_key='你的tlingo key')
#轴向转化函数 解决分组索引问题
df1=df.stack(0)
df1=df1['BEKE'].unstack()
#市场收益率Rm
# 获取标普五百
start=datetime.datetime(2019,1,1)
end= datetime.datetime(2022,4,1)
dfzs = pdr.get_data_tiingo('SPY', start,end,api_key='你的tlingo key')
#轴向转化函数 解决分组索引问题
dfzs1=dfzs.stack(0)
dfzs1=dfzs1['SPY'].unstack()
#计算收益率
dfzs1['pct_chg'] = (dfzs1['adjClose'] - dfzs1['adjClose'].shift(1)) / dfzs1['adjClose'].shift(1)
df_index = dfzs1[['pct_chg']].copy()
df_index['trade_date'] = df_index.index
#计算收益率
df1['return'] = (df1['adjClose'] - df1['adjClose'].shift(1)) / df1['adjClose'].shift(1)
#企业收益率Ri
d0 = df1[['return']].copy()
d0['trade_date'] = d0.index
# 指数DF和公司DF合并
df_final = d0.merge(df_index, how='left',on='trade_date')
# 避免第一天空值Nan影响建模
df_final.ix[0,'return']=0
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression #线性回归
import csv
import numpy as np
#计算预期收益率
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]-10, df_final[df_final['trade_date'] == event].index[0]+20 #事件窗口[-15,15]
# 30天窗口期
q,h = df_final[df_final['trade_date'] == event].index[0]-10, df_final[df_final['trade_date'] == event].index[0]+20 #事件窗口[-10,20]
target = df_final.loc[q:h].copy()
#estimate = df_final.loc[q-195:q-6].copy() #估计窗口[-210,-21]
# 60天估计期
estimate = df_final.loc[q-60:q].copy() #估计窗口[-210,-21]
#print (estimate)
#估计期 指数涨幅
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 = ['2021-12-16']
for e in events:
main(e)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文字体设置-黑体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
plt.title('IQ CARt累计异常收益率,ARt单日异常收益率 ')
plt.savefig('.爱奇艺.jpg',bbox_inches='tight')
事件日为: 2021-12-16 构建模型,拟合优度为0.77% Ri = -0.002 + 0.564Rm + e 回归模型的t值为0.6749,回归系数不显著



