楼主: voodoo
8264 22

利用指数日收盘数据计算指数周涨跌幅 [推广有奖]

11
jzhyue 发表于 2010-7-29 17:04:06
已修改,见8#

12
voodoo 发表于 2010-7-29 21:16:11
jzhyue 发表于 2010-7-29 17:04
已修改,见8#
不错,用新增的第1句和第2句让程序实现智能化。

加油啦,论坛高手们,看看是否有其它方法!
巫毒上传,必属佳品!
坛友下载,三思后行!

13
jzhyue 发表于 2010-7-29 23:02:43
tsset date
tsfill
gen dow=dow(dat)
sort dow dat
gen week=_n+1 if dow==0
sort dat
replace week=1 in 1
replace week=week[_n-1] if week==.
drop if clsprc==.
bys week (dow): gen isfinal=(_n==_N)
bys isfinal (dat):gen rate=clsprc/clsprc[_n-1]-1
replace rate=. if isfinal==0

14
voodoo 发表于 2010-7-31 10:30:00
jzhyue 发表于 2010-7-29 23:02
tsset date
tsfill
gen dow=dow(dat)
sort dow dat
gen week=_n+1 if dow==0
sort dat
replace week=1 in 1
replace week=week[_n-1] if week==.
drop if clsprc==.
bys week (dow): gen isfinal=(_n==_N)
bys isfinal (dat):gen rate=clsprc/clsprc[_n-1]-1
replace rate=. if isfinal==0
这个问题不具挑战性或通用性?!论坛上好多高手都不愿支招?!
个人认为坛友jzhyue的#8楼和#12楼答案已经很好,但我还想看看是否有其它解题思路。就再悬赏征集答案两天吧,至8月2日,请高手不吝支招啊!
巫毒上传,必属佳品!
坛友下载,三思后行!

15
voodoo 发表于 2010-7-31 10:39:50
顺道把我自己已有的答案贴出吧:
tsset date
tsfill
gen week = sum(dow(date)==0)
keep if !missing(clsprc)
bysort week (date): keep if _n == _N
gen ret = clsprc/clsprc[_n-1]-1
keep date ret
整体思路和jzhyue#12楼的答案一致。事实上,昨天jzhyue在另一帖子中问及“是否存在这样的命令?自动填充”,我就感觉他已经找到这个思路。:-)
巫毒上传,必属佳品!
坛友下载,三思后行!

16
sungmoo 发表于 2010-7-31 11:34:22
*找出数据库中的日期序列中的每周的最后一天。
(这只适用于一种特殊情形:date已由前及后排序,各自然周都有观测值,且各周末星期数总不小于下周初星期数)

keep if dow(date)>=dow(date[_n+1])

17
sungmoo 发表于 2010-7-31 11:49:29
voodoo 发表于 2010-7-31 10:39
tsset date
tsfill
gen week = sum(dow(date)==0)
对于一般情形,这三步(即使有等价的命令)恐怕是不可少的。

(我们总得把数据库中各日期所属的自然周找出来)

另外有个问题:若某个自然周,数据库中没有相应的观测值,该周是否应该有计算结果(比如,得到缺失值)?

18
voodoo 发表于 2010-7-31 12:00:49
sungmoo 发表于 2010-7-31 11:34
*找出数据库中的日期序列中的每周的最后一天。
(这只适用于一种特殊情形:date已由前及后排序,各自然周都有观测值,且各周末星期数总不小于下周初星期数

keep if dow(date)>=dow(date[_n+1])
加粗部分恐怕保证不了,如这周三开始停市,下周四复市。
巫毒上传,必属佳品!
坛友下载,三思后行!

19
jzhyue 发表于 2010-7-31 13:59:54
voodoo 发表于 2010-7-31 10:39
顺道把我自己已有的答案贴出吧:
tsset date
tsfill

整体思路和jzhyue#12楼的答案一致。事实上,昨天jzhyue在另一帖子中问及“是否存在这样的命令?自动填充”,我就感觉他已经找到这个思路。:-)
实事上以上自动填充命令找到之前,已想出三个比较迂回的方法,代码较多:其中心是先模拟日期,尔后合并
三个思路的各用到reshape、stack和merg
如:

gen d1=int(date/10)
gen d2=mod(date,10)
drop date
reshape wide clsprc,i(d1) j(d2)
reshape long
gen date=10*d1+d2
format date %td


可能有的日期并不能填充,但对于本例填充的数据已够用。

出于对代码的节约去寻找tsfill


不过,我真不明白stata提供的week()函数意义何在?不代表自然周,难道就为了说明7天为一周或是为了统计一年有52周半?

20
jzhyue 发表于 2010-7-31 14:01:47
voodoo 发表于 2010-7-31 10:39
gen week = sum(dow(date)==0)
这个方法较好!

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-25 19:05