全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
2766 6
2014-07-08
悬赏 50 个论坛币 未解决
我有1991-2013每年12个月的数据,现在想从1996年起,针对每年12月前的60个月(含该年12月)分别找出这60个月中收益率最低、倒数第3、倒数第6低的三个值,并分别生成新变量var1 var2 var3。现在的问题在于我怎样才可以直接通过在stata里编写code来比较方便快捷的实现这一过程,使得每年12月分那一行刚好能对应var1 var2 var3。
我不太明白的地方在于怎样方便地把每年12月前的60个月分组再按收益率排序,不要先只保存每年12前的60个月数据再排序,然后再对所需的每年重复操作这种笨办法(当然,我也不确定是否真的有比较方便的其他方法)。

个人认为把这一问题弄懂就可以为以后类似工作省下很多力气了,还望大牛们解答~


假定日期变量为date, 表示到月(如1996-12),当然可以生成年变量year和月变量month,收益率为return。



二维码

扫码加我 拉你入群

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

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

全部回复
2014-7-9 14:48:13
做个循环1/60,然后替换,最后选择第12个月的数据就可以了
forvalues j = 1(1)60 {
replace return_min=max(return, return[_n - j])
}
第二低的加上一个条件就是大于return_min
二维码

扫码加我 拉你入群

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

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

2014-7-9 21:39:12
wfldragon 发表于 2014-7-9 14:48
做个循环1/60,然后替换,最后选择第12个月的数据就可以了
forvalues j = 1(1)60 {
replace return_min=m ...
试了以下,好像有点问题。
max(return,return[_n-j])求出来的是_n和_n-j这两个值中的最小值。也就是在循环的时候其他值与_n的比较结果都被舍弃了,只留下了_n和_n-60的比较结果
二维码

扫码加我 拉你入群

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

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

2014-7-9 21:41:06
个人觉得这是一个组内滚动求最小值的问题。就是在组内如何固定取相隔60行的距离,然后求每个60行内的最小值等。
二维码

扫码加我 拉你入群

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

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

2014-7-9 22:08:35
我好像自己弄出来了,贴出来供有需要的人参考:
sort stkcd year month
forvalue i=1/60{
bys stkcd:gen minret`i'=min(monret[_n] ,monret[_n-`i'])
}
egen minret=rowmin(minret*)

其中stkcd是股票代码,monret是股票收益率
循环表示对每行Monret与其前面60行的比较分别生成一个新变量表示其中的较小值
egen的命令代表对每行(即每个观测值)生成一个新变量等于其与前60比较结果各较小值中的最小值,即达成目标。
二维码

扫码加我 拉你入群

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

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

2014-7-10 10:18:41
gen return_min=return
forvalues j = 1(1)60 {
replace return_min=max(return_min, return[_n -` j'])
}
应该就可以了
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群