楼主: lilylini
7122 8

[编程问题求助] event study,每个公司可能有多个观测事件的程序 [推广有奖]

  • 0关注
  • 3粉丝

硕士生

2%

还不是VIP/贵宾

-

威望
0
论坛币
820 个
通用积分
3.1800
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
524 点
帖子
43
精华
0
在线时间
179 小时
注册时间
2008-5-30
最后登录
2025-8-13

楼主
lilylini 发表于 2013-9-1 08:21:21 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
最近在学习做event study,在论坛上找了课件event study with stata,课件帮我理清了大体思路,但课件中的程序应该是针对每个公司在观测期间内,观测事件只发生了一次的情况,由以下程序便可看得出来      sortcompany_id date

bycompany_id: gen datenum=_n

bycompany_id: gen target=datenum if date==event_date

egentd=min(target), by(company_id)

droptarget

gendif=datenum-td


但我现在碰到的问题是每个公司可能有一个或多个观测事件的,截取部分数据如下:

stkcddate

6

2007-4-17

19

2009-6-25

19

2009-12-4

23

2010-6-29

23

2010-8-27

29

2007-5-25

32

2007-11-8

32

2007-12-6

32

2007-12-21


请教论坛里的各位老师,这种情况该如何编程呢?之前我看有人说论坛以前有说过这问题,但我仔细搜过也没找到那帖子,或者把帖子的链接告诉我一下也行。谢谢各位老师了!



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:event study Event study vent Even 程序

本帖被以下文库推荐

沙发
xingxf 发表于 2013-9-9 21:27:35
你说的课件是普林斯顿大学的那个吧,那个材料是根据比较老的版本Stata做的,现在Stata 12更新了许多命令,比如merge的语法已经不一样了,另外新增加的joinby命令非常有用。你说做event study,主要是想计算abnormal return吧。比较常用的方法是利用market model计算abnormal return。计算采用两步法,第一步利用pre-event period计算market model的系数alpha和beta。第二部,在event period内根据已经获得的alpha和beta计算abnormal returns。

用Stata编程解决这个问题的难点在第一步,最重要的命令是joinby。你手上应该有两个数据文件,一个数据文件记录了event,具体说有这个event的编号,公司代码和事件发生的时间。另一个数据文件包含了所有公司的daily data,通常是公司代码,时间,daily return。用joinby命令对两个数据文件进行合并,你需要仔细察看joinby的帮助文档,你就明白它的作用了。生成新的数据文件,在新的数据文件中生成一个新变量gap,gap等于event发生时间与公司daily时间的差值,如果你的estimation period定为event发生前的【-365,-28】时间窗口,那么,你keep gap为这个天数之内的观察值。然后,用statsby结合reg生成每个firm-event的alpha和beta。第一步解决了以后,第二步就很简单了,abnormal return=return - beta*(market return)- alpha。以上思路是不受一个公司多次事件影响的。但是,对于数据量大的情况,joinby命令会生成一个很大的数据文件,因此,需要你的电脑内存比较大。

解决实证问题,最主要要明白基本原理,然后要熟悉软件命令,编程的问题,每个人思路不一样,程序不一样,但是结果是一样的。
已有 5 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
sophiejxy + 1 + 1 + 1 精彩帖子
sherry19911106 + 1 + 1 + 1 精彩帖子
momingqimiao7 + 2 + 2 + 2 精彩帖子
crasteham + 5 + 3 + 3 + 3 精彩帖子
crystal8832 + 10 + 10 + 1 + 1 + 1 热心帮助其他会员

总评分: 经验 + 10  论坛币 + 15  学术水平 + 8  热心指数 + 8  信用等级 + 8   查看全部评分

藤椅
lilylini 发表于 2013-9-11 20:15:59
xingxf 发表于 2013-9-9 21:27
你说的课件是普林斯顿大学的那个吧,那个材料是根据比较老的版本Stata做的,现在Stata 12更新了许多命令,比 ...
好的,谢谢老师,感谢您的详细答复

板凳
geniusy 发表于 2013-9-16 01:41:05
xingxf的思路是完全正确的,不过如果碰到数据量特别大,事件数比较大的,估计alpha和beta的时候速度会特别慢,这时候推荐用sas来估计。以我做过的一篇论文来说,事件有6万个左右,i5的cpu+8G内存估计参数要超过1小时,sas只需要10秒钟就搞定了。
已有 1 人评分经验 热心指数 收起 理由
crystal8832 + 10 + 1 热心帮助其他会员

总评分: 经验 + 10  热心指数 + 1   查看全部评分

报纸
xingxf 发表于 2014-6-26 23:10:26
后来和geniusy在另一个帖子里讨论个这个问题。需要指出的是,通过程序优化,具体来说,把大样本分组,估算系数后再合并,6000个回归系数的估算8分钟以内就可以完成。用SAS进行估算也不会比Stata快,10秒完成是不现实的。
已有 1 人评分论坛币 学术水平 热心指数 收起 理由
crystal8832 + 20 + 1 + 1 补偿

总评分: 论坛币 + 20  学术水平 + 1  热心指数 + 1   查看全部评分

地板
beanyao 学生认证  发表于 2017-8-25 12:32:34
geniusy 发表于 2013-9-16 01:41
xingxf的思路是完全正确的,不过如果碰到数据量特别大,事件数比较大的,估计alpha和beta的时候速度会特别慢 ...
你好,请问能分享下这个操作的sas code吗?

7
refound 学生认证  发表于 2019-8-24 10:10:23
请问楼主这个问题解决了吗?

8
榴莲不是臭香蕉 发表于 2022-4-11 13:29:57
请问解决了吗?

9
赵安豆 发表于 2024-8-19 20:46:32
在进行事件研究(event study)时,如果一个公司可能经历多个事件,处理方式确实需要一些调整。原程序假设每个公司只有一个事件日期,因此直接比较日期和event_date来生成target变量是不够的。

对于你的情况,每家公司有多个观测事件,你需要为每个事件创建一个窗口,通常是围绕该事件前后的若干天。以下是一种可能的方法:

1. **首先确定每个公司的所有事件日期**:在数据中标识出哪些是事件日期。

2. **为每个事件生成时间差变量(td)**: 你可以在原程序基础上进行修改,在循环中为每个event_date创建窗口并计算时间差,比如这样:

```stata
* 假设 event_date 是事件的日期列
sort stkd date

by stkd: gen datenum=_n if date == event_date // 这一步需要改变以适应多个事件的情况
egen max_datenum = max(datenum), by(stkd)
egen min_datenum = min(datenum), by(stkd)

* 对于每个公司,为每个事件日期生成td变量(这里使用循环)
foreach i in `=min_datenum' `=max_datenum' {
    quietly by stkd: gen target`i' = 1 if datenum == `i'
    replace target`i' = . if missing(target`i')
    egen td`i' = min(target`i'), by(stkd)
}
```

但是,上面的代码并不完美,因为它假设了事件日期在datenum列中的位置。更好的方法是为每个事件直接计算时间差,例如:

```stata
* 为每个事件生成一个特定的td
gen td_1 = .
gen td_2 = .

sort stkd date

by stkd: gen first_event = _n if date == event_date[1]
replace td_1 = _n - first_event if !missing(first_event)

by stkd: gen second_event = _n if date == event_date[2] & missing(td_1)
replace td_2 = _n - second_event if !missing(second_event)
```

这样,你可以为每个事件生成一个特定的时间差变量。但是请注意,这种方法假设你已经知道了每个公司有多少个事件,并且你需要根据具体的数据调整代码。

3. **计算事件窗口**:使用生成的td_1, td_2等来定义你的事件窗口并进行后续分析。

4. **删除不必要的临时变量**。

需要注意的是,Stata处理多事件的情况时,可能需要更多手动操作和定制化的代码。上述方法提供了基础框架,但具体实现将取决于数据的具体结构和需求。务必检查生成的td值以确保它们准确地反映了你想要的时间窗口。

希望这能帮助你开始解决这个问题!如果还有其他问题或需要进一步的帮助,请随时提问。
```

此文本由CAIE学术大模型生成,添加下方二维码,优先体验功能试用



您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-8 23:32