在Stata 中
- 每日价格数据,
permno
是公司标识符 - 对于每个
permno month
,我想要上个月底的价格
tsset permno date
gen m= mofd(date)
format m %tm
* price end of each month
bys permno m: gen prc_end= prc[_N]
* price end of the prior month
gen n=m-1
format n %tm
bys permno m: gen prc_endpm= prc_end if n==m[_n-1]
* no results
当前数据:
永久日期prc m prc_end n
10026 2019年1月24日145.8000031 2019m1 154.35 2018m12
10026 2019年1月25日144.5500031 2019m1 154.35 2018m12
10026 2019年1月28日140 2019m1 154.35 2018m12
10026 2019年1月29日156.8200073 2019m1 154.35 2018m12
10026 2019年1月30日150.5 2019m1 154.35 2018m12
10026 2019年1月31日154.3500061 2019m1 154.35 2018m12
10026 2019年2月1日154.8000031 2019m2 155.28 2019m1
10026 2019年2月4日158.4400024 2019m2 155.28 2019m1
10026 2019年2月5日158.2599945 2019m2 155.28 2019m1
10026 2019年2月6日158.2400055 2019m2 155.28 2019m1
10026 2019年2月7日156.4100037 2019m2 155.28 2019m1
为了让事情更清楚,考虑一个愚蠢的示例数据集。
clear
set obs 6
gen permno = 1
gen date = mdy(1 + (_n > 3), real(word("1 15 31 1 15 28", _n)), 2022)
format date %td
gen m = mofd(date)
format m %tm
gen n = m - 1
format n %tm
gen price = _n
list, sepby(permno m)
+-----------------------------------------------+
| permno date m n price |
|-----------------------------------------------|
1. | 1 01jan2022 2022m1 2021m12 1 |
2. | 1 15jan2022 2022m1 2021m12 2 |
3. | 1 31jan2022 2022m1 2021m12 3 |
|-----------------------------------------------|
4. | 1 01feb2022 2022m2 2022m1 4 |
5. | 1 15feb2022 2022m2 2022m1 5 |
6. | 1 28feb2022 2022m2 2022m1 6 |
+-----------------------------------------------+
现在
bys permno m: gen prc_end= price[_N]
可能会起作用,但这会更安全:
bys permno m (date): gen prc_end= price[_N]
时出现问题
bys permno m: gen prc_endpm= prc_end if n==m[_n-1]
by:
的作用是将计算限制在具有相同permno
和月日期的块中。这里的[_n-1]
是合法的,但它指的是同一观察块中的前一个观察(如果有,则有用;如果没有,则代码仍然合法(。
您希望[_n-1]
引用前一个月(以及相同的permno
(,但这不是您的语法含义。此外,该示例显示,尽管您的语法是合法的,但没有满足if
条件的观测结果,因为m
和n
在同一观测块内永远不相等。
你想要的可以用by:
来完成,但你需要跨越几个月。
这应该做到:
bysort permno (m date) : gen previous = price[_n-1] if m[_n-1] == m -1
bysort permno m (date) : replace previous = previous[1]
list, sepby(permno m)
+----------------------------------------------------------+
| permno date m n price previous |
|----------------------------------------------------------|
1. | 1 01jan2022 2022m1 2021m12 1 . |
2. | 1 15jan2022 2022m1 2021m12 2 . |
3. | 1 31jan2022 2022m1 2021m12 3 . |
|----------------------------------------------------------|
4. | 1 01feb2022 2022m2 2022m1 4 3 |
5. | 1 15feb2022 2022m2 2022m1 5 3 |
6. | 1 28feb2022 2022m2 2022m1 6 3 |
+----------------------------------------------------------+