基于 Python 的事件研究法

type
Post
status
Published
date
Nov 25, 2025
slug
summary
tags
category
Python实际应用
icon
password
网址
作者
标签
文章链接
发布时间
来源
本人构建了一个基于 Python 的事件研究法(Event Study)计算与分析项目,用于计算上市公司在特定事件发生前后的异常收益率(AR)和累积异常收益率(CAR),并进行统计检验。本项目支持多进程并行计算,能够高效处理大规模的事件数据。

项目获取途径

事件研究法(Event Study)

什么是事件研究法?

事件研究法是经济学、金融学、会计学中常用的一种分析方法,被用于研究某一特定事件对上市公司股票收益率的影响。 特定事件可以是公司控制范围内的事件,例如宣布股票分割、定增计划、并购重组等,也可以是公司不可控的事件,例如某个法案的通过、监管处罚、或者国际事件(俄乌冲突)等。这些事件都可能直接或间接的影响公司经营。

短期事件研究法依赖的三个基本假设:

  • 根据有效市场假说 (Efficient Markets Hypothesis, EMH) , 金融市场是有效的, 即股票价格反映所有已知的公共信息
  • 所研究的事件是市场未预期到的,因此这种异常收益可以度量股价对事件发生或信息披露异常反应的程度
  • 在事件发生的窗口期间无其他事件的混合效应

事件研究法的基本步骤:

  • 整理事件列表,事件列表中包含了公司名称和事件发生日期。
  • 整理事件列表中的公司在事件发生日前后的收益率数据和同一时期的市场收益率数据。
  • 根据模型估计事件窗口期的预期收益率并比较公司在事件窗口期的实际收益率与预期收益率的差异。
  • 通过回归来检验特定事件对公司股票收益率是否有显著的影响(t检验)。

本代码相关信息

✨ 功能特点

核心功能

  • 异常收益率计算:基于管理学中最常见的资本资产定价模型(CAPM)计算个股的异常收益率(AR)和累积异常收益率(CAR)
  • 多进程并行计算:利用 Python multiprocessing 模块实现多核心并行处理,显著提升计算速度
  • 断点续传:自动跳过已处理的事件,支持中断后继续运行,避免重复计算
  • 实时进度显示:使用 tqdm 显示实时进度条,包括处理速度、成功/失败统计等信息

数据处理

  • 窗口配置:支持自定义事件窗口(Event Window)和估计窗口(Estimation Window)的长度及间隔. 如果将事件日在时间轴上视为0点,那么默认事件窗口为[-3, 5](即事件日前3与后5个交易日),默认估计窗口为[-128, -9](即120个交易日).
    • 💡
      当事件日当天不是股市交易日时(事件日在节假日),自动使用事件日后的第一个交易日作为0点
  • 多种指数支持默认是沪深300,可以自动根据股票代码匹配对应的市场指数(上证综指、深证综指、沪深300),也支持自定义指数
  • 数据持久化:使用 SQLite 数据库存储股票日行情数据,提高查询效率

统计分析

  • 统计检验:提供详细的统计检验脚本,包括:
    • 检验(检验均值是否为0)
    • Wilcoxon 符号秩检验(检验中位数是否为0)
    • 二项式符号检验(检验正负比例是否为0.5)
  • 结果可视化:生成 AR 和 CAR 的趋势图,支持显示均值和中位数

🏗️ 技术框架

核心算法

  • 市场模型(Market Model):使用 OLS 回归估计正常收益率
    • 其中:
    • :股票 日的收益率
    • :市场指数在 日的收益率
    • :通过估计窗口的 OLS 回归得到
    • :残差项
  • 异常收益率(AR)计算
    • 累计异常收益率(CAR)计算:

      技术栈

      • 数据处理:pandas, numpy
      • 统计分析:statsmodels, scipy
      • 数据库:SQLite3
      • 并行计算:multiprocessing
      • 可视化:matplotlib
      • 进度显示:tqdm

      📁 项目结构

      🔧 环境依赖

      Python 版本

      • Python 3.7+

      必需的 Python 库

      内置模块

      • sqlite3(Python 标准库)
      • multiprocessing(Python 标准库)
      • logging(Python 标准库)

      📦 安装指南

      1. 克隆或下载项目

      2. 安装依赖

      3. 准备数据文件

      确保以下数据文件存在于正确的位置:
      • 事件数据Event study_data/event info.csv
        • 必须包含列:company_code(公司代码)、event_date(事件时间)
        • 可选列:company_year(公司年份)、industry_code(公司行业代码)、company_province(公司省份)、company_city(公司城市)(会被添加到结果中)
      • 股票数据公司数据集/日个股回报率/TRD_Daily_20150101-20250101.csv
        • 从 CSMAR 数据库下载的日个股回报率数据(数据量太大,故使用csv格式加快读取速度)
      • 指数数据公司数据集/指数文件1990-12-19 - 2025-04-24/TRD_Index.xlsx
        • 从 CSMAR 数据库下载的市场指数数据

      🚀 使用说明

      步骤 1:导入数据到 SQLite 数据库

      首先,将 CSV 格式的股票数据导入到 SQLite 数据库中,以提高后续查询效率:
      功能说明
      • 读取 公司数据集/日个股回报率/TRD_Daily_20150101-20250101.csv
      • 创建 SQLite 数据库:Event study_data/stock_daily_data.db
      • 建立索引以优化查询性能
      • 显示导入进度
      注意事项
      • 如果数据库已存在,脚本会先删除旧数据库再创建新的
      • 导入过程可能需要较长时间,取决于数据量大小
      上一篇
      结构洞发挥作用的约束条件
      下一篇
      固定效应模型可以加入被解释变量的滞后项作为控制变量么?
      Loading...
      文章列表
      Practice makes perfect
      文献集锦
      如何理论创新?
      管理学理论集锦
      Python实际应用
      聚类标准误与固定效应
      巫师3:狂猎
      Stata应用技巧
      Python知识与技巧
      双重差分法(DID)
      创新文献阅读与摘要
      计量经济学
      Python绘图相关
      遗漏变量偏误检验