楼主: 阿狸与桃子
2454 6

[数据管理求助] stata中某一值分入多组 [推广有奖]

  • 8关注
  • 5粉丝

副教授

16%

还不是VIP/贵宾

-

威望
0
论坛币
15879 个
通用积分
179.3255
学术水平
31 点
热心指数
34 点
信用等级
19 点
经验
2473 点
帖子
379
精华
0
在线时间
747 小时
注册时间
2013-11-13
最后登录
2020-1-31

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。



关键词:Stata tata RETURN month mont return 收益率 倒数
沙发
wfldragon 发表于 2014-7-9 14:48:13 |只看作者 |坛友微信交流群
做个循环1/60,然后替换,最后选择第12个月的数据就可以了
forvalues j = 1(1)60 {
replace return_min=max(return, return[_n - j])
}
第二低的加上一个条件就是大于return_min
已有 1 人评分经验 热心指数 收起 理由
crystal8832 + 10 + 1 热心帮助其他会员

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

使用道具

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的比较结果

使用道具

个人觉得这是一个组内滚动求最小值的问题。就是在组内如何固定取相隔60行的距离,然后求每个60行内的最小值等。

使用道具

我好像自己弄出来了,贴出来供有需要的人参考:
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比较结果各较小值中的最小值,即达成目标。
已有 1 人评分论坛币 热心指数 收起 理由
crystal8832 + 20 + 1 分析的有道理

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

使用道具

地板
wfldragon 发表于 2014-7-10 10:18:41 |只看作者 |坛友微信交流群
gen return_min=return
forvalues j = 1(1)60 {
replace return_min=max(return_min, return[_n -` j'])
}
应该就可以了

使用道具

7
wfldragon 发表于 2014-7-10 10:21:37 |只看作者 |坛友微信交流群
对啦,应该是min。没有数据没啥感觉

使用道具

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

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-6-19 15:17