Stata-计算面板数据中第一笔交易和最后一笔交易中给出的价格之间的差异

Stata-计算面板数据中第一笔交易和最后一笔交易中给出的价格之间的差异,stata,Stata,我使用Stata通过每个月第一笔交易和最后一笔交易中的公司价格计算回报数据。我想计算每日价格之间的差额,以获得每月回报 从视觉上看,一家公司的数据如下所示: id data Price 220432 08jul2000 .000 220432 31jan2001 0.156 220432 20mar2001 0.14 220432 10apr2001 0.13 220432 16apr2001

我使用Stata通过每个月第一笔交易和最后一笔交易中的公司价格计算回报数据。我想计算每日价格之间的差额,以获得每月回报

从视觉上看,一家公司的数据如下所示:

id         data       Price
220432   08jul2000    .000      
220432   31jan2001    0.156
220432   20mar2001    0.14    
220432   10apr2001    0.13    
220432   16apr2001    0.16    
220432   18apr2001    0.18    
220432   23apr2001    0.2    
220432   30apr2001    0.204    
220432   02may2001    0.206    
220432   14may2001    0.226    
220432   16may2001    0.24    
220432   21may2001    0.28    
220432   22may2001    0.305    
220432   23may2001    0.32    
220432   28may2001    0.33    
220432   29may2001    0.325
我需要计算每个月第一笔和最后一笔交易中给出的价格之间的差额。例如,2001年4月10日的第一笔交易价格为0.13,2001年4月30日的最后一笔交易价格为0.204。因此,月收益率的计算为=0.204-0.13/0.13

此外,很明显,在某些月份只有一笔交易,例如7月和6月,我们需要离开它或转移到另一个单元格

一个解决方案:首先,我提取日期、月份和年份,并使用“折叠”来获得回报,但我不知道这是否正确。我想我需要

collapse (...) price, by(id year month)
另一个问题是,如何使用“崩溃”或其他命令计算特定公司id在一个月内所有价格的几何平均数?

您可以使用bysort:前缀和订阅查看帮助和帮助订阅来完成此操作。例如:

clear all
set more off

*----- example data -----

input ///
id       str14 date        price
220432   08jul2000    .000
220432   31jan2001    0.156
220432   20mar2001    0.14
220432   10apr2001    0.13
220432   16apr2001    0.16
220432   18apr2001    0.18
220432   23apr2001    0.2
220432   30apr2001    0.204
220432   02may2001    0.206
220432   14may2001    0.226
220432   16may2001  0.24
220432   21may2001  0.28
220432   22may2001  0.305
220432   23may2001  0.32
220432   28may2001  0.33
220432   29may2001  0 .325
end

gen date2 = date(date, "DMY")
format date2 %td

list, sep(0)

*----- what you want -----

gen mon = month(date2)

bysort id mon (date2): gen return = (price[_N] / price[1]) - 1
by id mon: replace return = price if _N == 1

// uncomment to keep one observation per each id month
*by id mon: keep if _n == 1 

list, sep(0)
您在问题中提到了崩溃,所以我假设您希望每个id mon保留一个观察值。您只需在每个组中保留一个观察即可实现这一点。取消对代码中相应行的注释

我假设您没有任何缺少的值

另一个参考是

演讲状态:如何一步一步走:N.J.考克斯一步走。《国家统计局学报》第2卷第1期,2002年

关于几何平均数的问题应放在另一个位置。不过,我会在这里回答。您可以使用以下方法进行计算:

<snip>

*----- what you want -----

gen mon = month(date2)

bysort id mon: egen gmean = mean(ln(price))
replace gmean = exp(gmean)

list, sep(0)

阅读

中的更多详细信息要添加到RF的答案中,您可以通过三种方式在bysort之前获得答案:


对第一种方法进行了说明。第三个要求SSC提供egenmore

请记住相应地格式化您的答案,以便阅读。我已经为您编辑了格式。另外,不要在一篇文章中问两个问题。这个想法是,有类似问题的人可以搜索/找到相应的问题/解决方案。在一篇文章中嵌入多个问题让这变得很困难。在Stata,崩溃是一个命令,而不是一个等式@NickCox已在您的问题中更正了这一点。只需补充一点,如果要生成包含几何平均数的变量,则第二个解决方案需要处理存储的结果。请参阅help return.dimitry,记住在bysort前缀中包含id。
gen log_price = log(price)
regress log_price i.mon#i.id, eform(G.M.) nocons robust

bys id mon: ameans price

bys id mon: egen gm = gmean(price)