avatar

【python】利用python实现事件研究法

❔什么是事件研究法

事件分析法 (Event Study Methodology, ESM) 是一种用于研究重大事件对公司层面变量短期影响的计量方法。在以往研究中,该方法主要应用于金融领域,且主要用来衡量某一特定事件对公司股票价格的影响。但是在最近的研究中,由于具有逻辑清晰,分析过程简单等优点,该方法越来越多的受到研究者的关注,也开始逐渐被应用于其他领域研究。


❔在研究前需要准备什么

✔确定一个事件日

✔获取研究公司事件日前后一段时间(越长越好)的个股收益率

✔获取目标公司所在证券市场额市场收益率(与个股收益率的日期相重合)


📈了解并且确定相关参数

  1. 事件日:特定事件发生的日期 。
  2. 事件窗口期:对事件涉及到的股票价格进行考察的时间段。
  3. 估计窗口:估计窗口一般选择为事件发生前一段时间,通常是窗口期前150个交易日。
  4. 正常收益 ER:为了考察特定事件对公司股价的影响,我们首先需要知道,如果没有该事件发生,股票收益率应该是多少,这也就是我们需要估计正常收益率的原因。
  5. 异常收益率 AR: 每只股票实际收益率与正常收益率的差值,异常收益率能够反映该事件的经济影响。
  6. 累积异常收益率 CAR:每只股票在事件窗口内异常收益率的简单加总。
  7. 研究模型:目前学术界存在市场模型、市场调整模型等。这里我们选择最简单的市场模型。

🔍相关计算原理

首先,假设个股股票的收益率与市场收益率之间存在线性关系,计算公式为

在该方程式中,Ri,t指单个股票i在t时期的收益率,即个股正常收益率;Rm,t指市场指数t时期的收益率,即市场收益率。ɑi指回归截距,β*i指回归斜率。即上式,继而计算窗口期的预期收益率,计算公司为:

通过测算,即可计算出窗口期的预期收益率ERi,t将窗口期每天实际的个股收益率Ri,t减去每天的预期收益率,即可得到每天的超额收益率ARi,t,,将窗口期内每天的超额收益率相加,总和即为累计超额收益率CARi,t。

相关计算过程就是这样。我不想用excel,也不想用state和spss,想到一个好点子,试试python能否实现。


💻python代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import pandas as pd
import numpy as np
from statsmodels.api import OLS, add_constant

# 读取 Excel 文件
df = pd.read_excel('C:/Users/chenhe/Desktop/2016事件.xlsx') # 替换为你的文件路径

# 确保 'Date' 列是日期类型
df['Date'] = pd.to_datetime(df['Date'])

# 将 'Date' 设置为索引
df.set_index('Date', inplace=True)

# 定义事件日期
event_date = pd.to_datetime('2017-03-10') # 替换为你的事件日期

# 定义估计窗口和事件窗口相对于事件日期
estimation_window = (-160, -10)
event_window = (-20, 20)

# 获取估计窗口和事件窗口的数据
estimation_data = df.loc[event_date + pd.DateOffset(days=estimation_window[0]):
event_date + pd.DateOffset(days=estimation_window[1])]

event_data = df.loc[event_date + pd.DateOffset(days=event_window[0]):
event_date + pd.DateOffset(days=event_window[1])]

# 估计正常收益
X = add_constant(estimation_data['Market_Returns'])
y = estimation_data['Stock_Returns']
model = OLS(y, X).fit()

# 预测事件窗口的正常收益
X_event = add_constant(event_data['Market_Returns'])
normal_returns = model.predict(X_event)

# 计算异常收益
event_data['Abnormal_Returns'] = event_data['Stock_Returns'] - normal_returns

# 计算累积异常收益
event_data['CAR'] = event_data['Abnormal_Returns'].cumsum()

# 输出结果到 Excel 文件
event_data.to_excel('C:/Users/chenhe/Desktop/2016事件.xlsx') # 替换为你的输出路径

print(event_data)

值得一提的是,为了识别excel里的原始数据,原始excel的表头应该如下设计:

表头

在一切准备就绪的时候,便可运行python程序,最终输出结果为:

表头2

哈哈,大功告成👀


ps:当然这串代码并不是十全十美,它并不能识别空缺日期。例如,如果我的窗口期有20天,可能导出的实际天数只有15天,这是因为股市并不是每天都开市,其中有几天没有收益率数据,所以我的代码依靠实际日期划分窗口期时,其中空缺的几天就没有被计算,从而导致实际计算结果数与窗口期日期数不相等。

解决办法:人为的扩大窗口期使实际计算数据等于理想的窗口期。在理论上扩大窗口期并不会影响最终的计算结果。

文章作者: 陈贺俊泽
文章链接: http://example.com/2024/09/10/%E3%80%90python%E3%80%91%E5%88%A9%E7%94%A8python%E5%AE%9E%E7%8E%B0%E4%BA%8B%E4%BB%B6%E7%A0%94%E7%A9%B6%E6%B3%95/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小陈的个人博客
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论