楼主: jianlamhua
47771 62

[数据管理求助] 由月回报率算出年回报率时,数据如何处理? (连乘运算、连乘函数)   [推广有奖]

21
eblog 发表于 2009-5-4 20:54:00 |只看作者 |坛友微信交流群

有人发短信问,现补上运用连乘函数的运算过程:

gen year = substr(month,1,4)
sort code year
gen r2=1+r
egen r3 = prod(r2), by(code year)
gen R=r3-1

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
txje + 2 + 2 + 2 精彩帖子

总评分: 学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

使用道具

22
蓝色 发表于 2009-5-4 21:23:00 |只看作者 |坛友微信交流群
以下是引用eblog在2009-5-4 20:54:00的发言:

有人发短信问,现补上运用连乘函数的运算过程:

gen year = substr(month,1,4)
sort code year
gen r2=1+r
egen r3 = prod(r2), by(code year)
gen R=r3-1

egen的命令特别有用

所以,大家一定要把egen里面的东西搞清楚。

使用道具

23
voodoo 发表于 2009-5-5 00:18:00 |只看作者 |坛友微信交流群

安装dm71.pkg后,viewsource _gprod.ado,发现其思路更接近“变连乘为连加”,并通过abs()避免ln()无法取负值的问题。








[此贴子已经被作者于2009-5-5 0:21:32编辑过]

巫毒上传,必属佳品!
坛友下载,三思后行!

使用道具

24
voodoo 发表于 2009-5-5 00:23:00 |只看作者 |坛友微信交流群
以下是引用eblog在2009-5-4 19:06:00的发言:

呵呵,不知道楼上耗时多少秒是怎么得出的?


set rmsg on啊。




巫毒上传,必属佳品!
坛友下载,三思后行!

使用道具

25
vincent829 发表于 2009-7-8 21:40:41 |只看作者 |坛友微信交流群
eblog 发表于 2009-5-4 20:26
以下是引用jianlamhua在2009-5-4 0:23:00的发言:voodoo的方法很巧。stata好像还没有连乘的函数。以后碰到乘法,就可以变成加法了。谢啦!Stata有连乘函数,需要安装net install dm71.pkghelp prod使用连乘函数将简化计算过程
新的变量是所有连乘的结果,所以观测值都是一样的,有没有running product,动态的,每个观测值不一样?谢谢

使用道具

26
voodoo 发表于 2009-7-8 22:12:23 |只看作者 |坛友微信交流群
vincent829 发表于 2009-7-8 21:40

新的变量是所有连乘的结果,所以观测值都是一样的,有没有running product,动态的,每个观测值不一样?谢谢
你要的是这个?

sungmoo的方法:
g year=substr(month,1,4)
g t=r+1
sort code year month
by code year: replace t=(1+r)*t[_n-1] if _n>=2
g R=t-1

voodoo的方法:
gen year = substr(month,1,4)
sort code year month
by code year: gen t = sum(ln(1+r))
gen R = exp(t)-1
巫毒上传,必属佳品!
坛友下载,三思后行!

使用道具

27
vincent829 发表于 2009-7-8 22:22:14 |只看作者 |坛友微信交流群
voodoo 发表于 2009-7-8 22:12
vincent829 发表于 2009-7-8 21:40

新的变量是所有连乘的结果,所以观测值都是一样的,有没有running product,动态的,每个观测值不一样?谢谢
你要的是这个?

gen year = substr(month,1,4)
sort code year month
by code year: gen t = sum(ln(1+r))
gen R = exp(t)-1
我要求和LZ有点区别,我只是想把月回报率不断累乘,每个月份对应的值都是前面累乘值的结果,可以新设一个变量a
by code: g a=_n
by code a: gen t=sum(ln(1+r))
gen R=exp(t)-1
我试着用上述方法运行了一遍,发现R和r的值是一样的,不知什么原因。

使用道具

28
voodoo 发表于 2009-7-8 22:52:32 |只看作者 |坛友微信交流群
vincent829 发表于 2009-7-8 22:22

我要求和LZ有点区别,我只是想把月回报率不断累乘,每个月份对应的值都是前面累乘值的结果,可以新设一个变量a
by code: g a=_n
by code a: gen t=sum(ln(1+r))
gen R=exp(t)-1
我试着用上述方法运行了一遍,发现R和r的值是一样的,不知什么原因。
你把简单事情搞复杂了,直接用:
sort code year month
by code: gen R=exp(sum(ln(1+r)))-1           // by code后面无需a!将原来两个语句合成一个语句。

顺道问一句,你是在进行long-run performance研究吗?
巫毒上传,必属佳品!
坛友下载,三思后行!

使用道具

29
vincent829 发表于 2009-7-9 10:32:29 |只看作者 |坛友微信交流群
28# voodoo

我试过了,这样的命令R和r观测值都是一样的
我是在做了long-term performance

使用道具

30
voodoo 发表于 2009-7-9 13:15:48 |只看作者 |坛友微信交流群
vincent829 发表于 2009-7-9 10:32
28# voodoo

我试过了,这样的命令R和r观测值都是一样的
我是在做了long-term performance
怎么会一样呢?
// 生成模拟数据
set obs 10
gen code = _n
expand 10
bysort code: gen year = _n + 1998
expand 12
bysort code year: gen month = _n
gen r = 0.1 * rnormal()

// main
sort code year month
by code: gen R=exp(sum(ln(1+r)))-1

// list to check
list in 1/12, clean
巫毒上传,必属佳品!
坛友下载,三思后行!

使用道具

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

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

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

GMT+8, 2024-5-1 12:57