楼主: 索索~
25123 22

[数据管理求助] 怎样在stata中用股票月收益率计算年收益率,是从每年的五月份到次年四月份 [推广有奖]

  • 3关注
  • 2粉丝

已卖:44份资源

本科生

79%

还不是VIP/贵宾

-

威望
0
论坛币
21044 个
通用积分
1.3500
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1077 点
帖子
61
精华
0
在线时间
142 小时
注册时间
2013-11-17
最后登录
2024-11-11

楼主
索索~ 发表于 2015-3-4 21:26:08 |AI写论文
30论坛币
数据处理中遇到一个难题。是这样子的,我需要计算年度股票收益率的值,要用每年5月开始的(1+月股票收益率连乘)一直到次年的4月来计算年度股票收益率,不知道应该用什么循环语句或者是直接来做这个,还有一个问题是,下载的数据并不是每年都能保证是12个月都有的,是不是先要剔除不满足12个月数据的公司,要不然循环过程是不是会出问题,那如何剔除不满足十二个月的公司呢
数据如下:
stkcd月股票收益率yearmonth

1

0.043142

2001

5

1

-0.054938

2001

6

1

-0.096669

2001

7

1

-0.080983

2001

8

1

0.003147

2001

9

1

0.083137

2001

10

1

-0.02824

2001

11

1

-0.087183

2001

12

1

-0.140408

2002

1

1

-0.036087

2002

2

1

0.0867

2002

3

1

0.042611

2002

4

1

-0.029565

2002

5

1

0.344086

2002

6

1

0.010667

2002

7

1

0.025983

2002

8

1

-0.105844

2002

9

1

-0.05955

2002

10

1

-0.065637

2002

11









最佳答案

yangyuzhou 查看完整内容

首先要剔除可能出现的缺月份现象,除去最初的一年只有8个月和最后的一年只有4个月之外,其他的每年应该都有12个月,那么闲对这部分应该12个月都存在的年份进行筛选: 因为12个月份数字相加是78,这样便看出哪些年出了问题。然后删除掉这些年相关的月份。记得从上一个5月开始删除。 而最开始的8个月和最后的4个月肉眼之间可以筛选。 然后求年收益率,设月收益率的变量名为month_re 按照月收益率对年收益率的求法,我认为最后年收 ...
关键词:Stata 年收益率 tata 收益率 股票收益率 收益率

沙发
yangyuzhou 发表于 2015-3-4 21:26:09
首先要剔除可能出现的缺月份现象,除去最初的一年只有8个月和最后的一年只有4个月之外,其他的每年应该都有12个月,那么闲对这部分应该12个月都存在的年份进行筛选:
  1. sort stkcd year month
  2. by year, sort : egen monthsum = sum(month)
  3. tab monthsum
复制代码
因为12个月份数字相加是78,这样便看出哪些年出了问题。然后删除掉这些年相关的月份。记得从上一个5月开始删除。
而最开始的8个月和最后的4个月肉眼之间可以筛选。
然后求年收益率,设月收益率的变量名为month_re
  1. gen id = ceil(_n/12)
  2. lnmonth_re = ln(1 + month_re)
  3. by id , sort : egen lnyear_re = sum(lnmonth_re)
  4. gen year_re = exp(lnyear_re) - 1
复制代码
按照月收益率对年收益率的求法,我认为最后年收益率还要减去1,如果不是这样你再将最后一步调整一下吧。


已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
浩荡古今同一体7 + 1 + 1 + 1 精彩帖子
索索~ + 1 + 1 + 1 精彩帖子
hustchen2012 + 10 + 10 + 2 + 2 + 1 精彩帖子

总评分: 经验 + 10  论坛币 + 10  学术水平 + 4  热心指数 + 4  信用等级 + 3   查看全部评分

藤椅
索索~ 发表于 2015-3-5 10:59:34
yangyuzhou 发表于 2015-3-5 01:22
首先要剔除可能出现的缺月份现象,除去最初的一年只有8个月和最后的一年只有4个月之外,其他的每年应该都有 ...
你好,谢谢你的热心解答呢,我还有点不是太清楚的是,如果某一个ID2003不满足12月,那要如何剔除从去年五月份开始的数据呢

板凳
yangyuzhou 发表于 2015-3-5 11:03:25
索索~ 发表于 2015-3-5 10:59
你好,谢谢你的热心解答呢,我还有点不是太清楚的是,如果某一个ID2003不满足12月,那要如何剔除从去年五 ...
我的笨办法就是既然已经知道哪一年出了问题,直接在数据表中找到对应的行数删除掉就行了

报纸
索索~ 发表于 2015-3-5 12:12:15
yangyuzhou 发表于 2015-3-5 11:03
我的笨办法就是既然已经知道哪一年出了问题,直接在数据表中找到对应的行数删除掉就行了
倒是可以,就是数据挺多的,这样做也可以,希望能有大神给出一个直接的循环语句呢

地板
刘坤鹏 发表于 2017-6-11 15:46:57
yangyuzhou 发表于 2015-3-4 21:26
首先要剔除可能出现的缺月份现象,除去最初的一年只有8个月和最后的一年只有4个月之外,其他的每年应该都有 ...
你好,

by id , sort : egen lnyear_re = sum(lnmonth_re)
gen year_re = exp(lnyear_re) - 1
算的是从1月到12月,并不是今年5月到明年4月,不知道是否是我理解错了

7
黃河泉 在职认证  发表于 2017-6-12 07:55:02
刘坤鹏 发表于 2017-6-11 15:46
你好,

by id , sort : egen lnyear_re = sum(lnmonth_re)
1. 我猜你应该是指
  1. by id year, sort : egen lnyear_re = sum(lnmonth_re)
复制代码
2. 你理解的没错!

8
黃河泉 在职认证  发表于 2017-6-12 17:23:22
可以試試
  1. // Noncalendar years: http://www.stata-journal.com/sjpdf.html?articlenum=st0394
  2. * Example generated by -dataex-. To install: ssc install dataex
  3. clear
  4. input int id str10 Date double RET
  5. 14593 "1998/01/30"                 .395
  6. 14593 "1998/02/27"                  .29
  7. 14593 "1998/03/31"                 .164
  8. 14593 "1998/04/30"                -.005
  9. 14593 "1998/05/29"                -.027
  10. 14593 "1998/06/30"                 .077
  11. 14593 "1998/07/31"   .20700000000000002
  12. 14593 "1998/08/31"                -.099
  13. 14593 "1998/09/30"                 .222
  14. 14593 "1998/10/30" -.026000000000000002
  15. 14593 "1998/11/30"                 -.14
  16. 14593 "1998/12/31"   .28200000000000003
  17. 14593 "1999/01/29"                 .006
  18. 14593 "1999/02/26"                -.155
  19. 14593 "1999/03/31"                 .032
  20. 14593 "1999/04/30"                  .28
  21. 14593 "1999/05/28"                -.042
  22. 14593 "1999/06/30"  .051000000000000004
  23. 14593 "1999/07/30"                 .202
  24. 14593 "1999/08/31"   .17200000000000001
  25. 14593 "1999/09/30"                 -.03
  26. 14593 "1999/10/29"                 .266
  27. 14593 "1999/11/30"                 .222
  28. 14593 "1999/12/31"                  .05
  29. 14593 "2000/01/31"  .009000000000000001
  30. 14593 "2000/02/29"                 .105
  31. 14593 "2000/03/31"                 .185
  32. 14593 "2000/04/28"  -.08700000000000001
  33. 14593 "2000/05/31"                -.323
  34. 14593 "2000/06/30"                 .247
  35. 14593 "2000/07/31"                 -.03
  36. 14593 "2000/08/31"                 .199
  37. 14593 "2000/09/29"                -.577
  38. 14593 "2000/10/31"                 -.24
  39. 14593 "2000/11/30"                -.157
  40. 14593 "2000/12/29"                -.098
  41. end

  42. * convert to monthly date
  43. gen mdate = mofd(daily(Date,"YMD"))
  44. format %tm mdate
  45. isid id mdate, sort

  46. // from May to April
  47. gen FY = year(dofm(mofd(daily(Date, "YMD")) - 4))

  48. * no product function in Stata, sum logs instead
  49. gen double lret = log(1+RET)
  50. rangestat (sum) lret (count) lret, interval(mdate -11 0) by(id FY)
  51. gen wanted = exp(lret_sum) - 1 if lret_count == 12
  52. list Date FY wanted, sepby(FY)
复制代码
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
xiuxiu202 + 5 + 1 + 1 + 1 精彩帖子
潇潇木枼 + 3 + 3 + 3 精彩帖子

总评分: 论坛币 + 5  学术水平 + 4  热心指数 + 4  信用等级 + 4   查看全部评分

9
刘坤鹏 发表于 2017-6-21 09:29:37
黃河泉 发表于 2017-6-12 07:55
1. 我猜你应该是指2. 你理解的没错!
谢谢你的回复,我使用拆分合并的办法解决了~

10
刘坤鹏 发表于 2017-6-21 09:29:44
黃河泉 发表于 2017-6-12 07:55
1. 我猜你应该是指2. 你理解的没错!
谢谢你的回复,我使用拆分合并的办法解决了~

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-7 05:10