概要

本项目基于事件研究法(Event Study)分析股票异常事件对收益率的影响,计算并绘制事件窗口内的平均异常收益率变化趋势。首先,通过回归模型分解股票收益率,提取异常收益率(Abnormal Return,AR);接着,基于成交量的前10%定义异常事件月份;随后,对每个异常事件的前后10个月窗口内的AR进行分析,计算每月的平均值以量化事件的影响;最后,通过可视化展示事件窗口(T- 10至T+10) 内异常收益率的变化,为评估事件的短期和长期市场影响提供依据。

整体架构流程

首先,从原始数据中读取股票的交易信息和收益率数据,并进行预处理,将日期格式化并计算市场平均收益率作为基准;其次,针对每只股票构建回归模型,提取异常收益率(AR)作为分析变量;接着,通过成交量的前10%定义异常事件并标记对应的事件日期;随后,对每个异常事件前后10个月(事件窗口)的异常收益率进行聚合分析,计算每月的平均异常收益率;最后,将结果通过可视化呈现,绘制事件窗口内异常收益率的变化趋势图,以直观展示异常事件对市场的短期和长期影响。

技术细节

部分数据基本情况:
在这里插入图片描述
数据集大小:1000000
在这里插入图片描述

完整代码

data = readtable('data_final.xlsx', 'Sheet', 'data_final', 'ReadVariableNames', true);
code = data.code;
date = data.date;
volume = data.volume;
ret = data.ret;
data.groupRank = zeros(height(data), 1);
uniqueCodes = unique(code);

for i = 1:length(uniqueCodes)
    currentCode = uniqueCodes(i);
    idx = find(code == currentCode);
    [~, sortedIdx] = sort(volume(idx), 'descend');
    rankIdx = zeros(size(sortedIdx));
    rankIdx(sortedIdx) = 1:length(sortedIdx);
    data.groupRank(idx) = rankIdx;
end
abnormalEvents = data(data.groupRank <= 10, :);
[uniqueDates, ~, dateIdx] = unique(date);
marketReturns = accumarray(dateIdx, ret, [], @mean);
data.marketRet = marketReturns(dateIdx);
data.abnormalRet = data.ret - data.marketRet;
eventWindow = -10:10;
avgAbnormalRet = zeros(size(eventWindow));

for i = 1:length(eventWindow)
    windowOffset = eventWindow(i);
    abnormalReturnsInWindow = [];

    for j = 1:height(abnormalEvents)
        eventCode = abnormalEvents.code(j);
        eventDate = abnormalEvents.date(j);

        % 找到事件窗口的月份
        targetDate = eventDate + windowOffset;

        % 匹配事件窗口数据
        matchIdx = find(data.code == eventCode & data.date == targetDate);
        if ~isempty(matchIdx)
            abnormalReturnsInWindow = [abnormalReturnsInWindow; data.abnormalRet(matchIdx)];
        end
    end

    % 计算窗口内的平均异常收益率
    avgAbnormalRet(i) = mean(abnormalReturnsInWindow, 'omitnan');
end
figure;
plot(eventWindow, avgAbnormalRet, '-o', 'LineWidth', 1.5);
hold on;
yline(0, '--k', 'LineWidth', 1.2); % 添加参考线
title('Abnormal Return Over Event Window');
xlabel('Event Window (Months)');
ylabel('Average Abnormal Return');
grid on;

效果展示

在这里插入图片描述
左边是老师给出的参考图,右边是上述代码的运行结果图

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐