楼主: jianlamhua
51084 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
拉您入交流群
GMT+8, 2025-12-30 06:15