楼主: voodoo
8262 22

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

已卖:14047份资源

院士

70%

还不是VIP/贵宾

-

威望
0
论坛币
3787 个
通用积分
1496.7001
学术水平
324 点
热心指数
365 点
信用等级
253 点
经验
63754 点
帖子
1814
精华
1
在线时间
6559 小时
注册时间
2007-1-5
最后登录
2025-12-19

楼主
voodoo 发表于 2010-7-29 11:09:29 |AI写论文
188论坛币
手头有指数日行情序列,想计算周涨跌幅(即“每周最后一个交易日的收盘价/前一周最后一个交易日收盘价-1”)。本以为在Stata中很简单就可实现,结果并非如此——至少我目前找到的方法并不直观,现发悬赏贴(188个论坛币不多,也就是个鼓励),希望广大坛友积极献策,谢谢先啦。

// 生成模拟数据
version 11
clear
set obs 365
gen date = td(31dec2008) + _n
format date %td
gen ddrop = inlist(dow(date), 0, 6)
replace ddrop = (runiform()<=0.05) if ddrop == 0
replace ddrop = (runiform()<=0.2) if ddrop[_n-1] == 1 & ddrop == 0
drop if ddrop
drop ddrop
gen clsprc = 1000 in 1
replace clsprc = clsprc[_n-1]*(1+0.05*rnormal()) in 2/L

keep date clsprc

最佳答案

sungmoo 查看完整内容

*找到一种简单办法,以自然周区分各日期。 *考虑到1960年1月3日是周日,且其数值对应"2"。 g week=int((date-2)/7) *以上即可区分出各日期的自然周,不必使用tsfill,且date可以是1960年1月3日及以后任一天。
关键词:涨跌幅 replace Uniform Version format 数据 指数 收盘 涨跌幅
巫毒上传,必属佳品!
坛友下载,三思后行!

沙发
sungmoo 发表于 2010-7-29 11:09:30
*找到一种简单办法,以自然周区分各日期。
*考虑到1960年1月3日是周日,且其数值对应"2"。

g week=int((date-2)/7)

*以上即可区分出各日期的自然周,不必使用tsfill,且date可以是1960年1月3日及以后任一天。
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
jzhyue + 1 + 1 + 1 对论坛有贡献

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

藤椅
ki_ki_shen 发表于 2010-7-29 11:14:12
可以直接下载周数据的吧 呵呵

板凳
voodoo 发表于 2010-7-29 11:21:00
ki_ki_shen 发表于 2010-7-29 11:14
可以直接下载周数据的吧 呵呵
当然可以直接用周数据,但当时我手头就只有日数据,所以才有这个问题。

事实上我自己已经找到解法(共8行程序代码,但个人感觉思路并不直观),考虑到这问题具有一定的普遍性,所以想征集一下更好的答案。
巫毒上传,必属佳品!
坛友下载,三思后行!

报纸
jzhyue 发表于 2010-7-29 11:49:28
*date 是连续的
gen ddow=dow(date)
keep if ddow==5
sort date
gen rate=clsprc/clsprc[_n-1]-1

地板
voodoo 发表于 2010-7-29 12:00:58
jzhyue 发表于 2010-7-29 11:49
*date 是连续的
gen ddow=dow(date)
keep if ddow==5
sort date
gen rate=clsprc/clsprc[_n-1]-1
date是不连续的,有些周星期五是法定节假日股市休市,如在我模拟数据中有很多周的最后一个交易日不是星期五。
巫毒上传,必属佳品!
坛友下载,三思后行!

7
jzhyue 发表于 2010-7-29 13:02:11
问题的关键:如何确认某日在某周,而函数week()计算出的周是从元月1日开始的,与实际的不相吻合

8
voodoo 发表于 2010-7-29 14:14:48
jzhyue 发表于 2010-7-29 13:02
问题的关键:如何确认某日在某周,而函数week()计算出的周是从元月1日开始的,与实际的不相吻合
我最开始时就犯了这个错误:用函数week()。
巫毒上传,必属佳品!
坛友下载,三思后行!

9
jzhyue 发表于 2010-7-29 16:02:29
*专业不同,可能理解有所偏差,试试
gen datbin=date((string(year(date))+"\1\1"),"YMD")
gen dd=dow(datbin)
gen dweek=year(date+dd)*100+week(date+dd)
bys dweek (date):gen wfinal=(_n==_N)
bys wfinal (date):gen rate=clsprc/clsprc[_n-1]-1
replace rate=. if wfinal==0
sort date


*若不考虑对数据的破坏
gen datbin=date((string(year(date))+"\1\1"),"YMD")
gen dd=dow(datbin)
gen dweek=year(date+dd)*100+week(date+dd)
bys dweek (date):keep if_n==_N
gen rate=clsprc/clsprc[_n-1]-1


对以上代码的错误的说明:
上面代码对一年数据是有效的,但对多年数据可能是错误的(如果多年数据在元旦前后(最少前后3天)如果闭市,那么也是有效的。
事实上,只要有week()的出现,就会有这样的结果,week()函数有个错误,如果在跨年度的时间在元旦前后结果是错误的,得出周的天数可能不是七天,可能8、9天等

10
voodoo 发表于 2010-7-29 16:15:45
jzhyue 发表于 2010-7-29 16:02
*专业不同,可能理解有所偏差,试试
gen dweek=year(date-3)*100+week(date-3) //  对模拟数据而言,若任意年份,需要指明第第一周少几日
bys dweek (date):gen wfinal=(_n==_N)
bys wfinal (date):gen rate=clsprc/clsprc[_n-1]-1
replace rate=. if wfinal==0
drop dweek wfinal
sort date
嗯,谢谢!就是感觉第一句还不够智能,程序对多年数据来言通用性还不够强,继续征集答案中……。

Big THANKS to jzhyue all the same!
巫毒上传,必属佳品!
坛友下载,三思后行!

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

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