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

时间:2014-08-21 21:55:24

标签: stata

我使用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

我需要计算每个月第一次和最后一次交易中给出的价格之间的差异。例如,我们将10apr2001的价格0.13作为2001年4月的第一笔交易,将0.204作为30apr2001的最后一笔交易。所以每月回报的计算是=(0.204-0.13)/0.13。

此外,很明显,在几个月内只有一次交易(例如7月和6月),我们需要离开它或转移到另一个单元格。

解决方案:首先我将日期提取到(日,月和年)并使用collapse来获得返回,但我不知道这是否正确。我想我需要

collapse (...) price, by(id year month)

另一个问题是如何使用id或其他命令在一个月内计算特定公司(collapse)的所有价格的几何平均值?

2 个答案:

答案 0 :(得分:1)

您可以使用bysort:前缀和下标(请参阅help byhelp subscripting)来执行此操作。一个例子:

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)

您在提问时提到collapse,因此我假设您希望每id mon个观察一次。您只需keep每个组中的一个观察即可实现此目的。 (取消注释代码中的相应行。)

我认为你没有任何遗漏的价值。

另一个参考是

Speaking Stata:如何逐步推动:N. J. Cox继续前进。 Stata Journal第2卷第1期,2002年。http://www.stata-journal.com/sjmatches.html?authorname=Nicholas%20J.%20Cox

关于几何平均值的问题应放在不同的帖子中。不过,我会在这里回答。您可以使用以下方式进行计算:

<snip>

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

gen mon = month(date2)

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

list, sep(0)

(详见http://www.stata.com/statalist/archive/2013-06/msg00519.html

答案 1 :(得分:1)

要添加到RF的答案,您可以在bysort之前以三种方式获取方法:

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)

解释了第一种方法here。第三个需要来自SSC的egenmore