SAS中文论坛

标题: 请教各位大大一个问题 [打印本页]

作者: shiyiming    时间: 2008-6-5 18:48
标题: 请教各位大大一个问题
有一个数据集
rq        name        zqdm        cjsl        sysl
19970105        zttc03091232        600019        6000        6000
19970106        zttc03091232        600019        -3000        3000
19970107        zttc03091232        600019        2000        5000
19970108        zttc03091232        600019        -4000        1000
19970110        zttc03091232        600019        3000        4000
19970113        zttc03091232        600019        -2000        2000

现在想得到
rq        name        zqdm        cjsl        sysl        holdday
19970105        zttc03091232        600019        6000        6000        0
19970106        zttc03091232        600019        -3000        3000        1
19970107        zttc03091232        600019        2000        5000        1.2
19970108        zttc03091232        600019        -4000        1000        2.2
19970110        zttc03091232        600019        3000        4000        1.05
19970113        zttc03091232        600019        -2000        2000        4.05


其中holdday计算规则:
if cjsl>0 and sysl-cjsl=0 then holdday=0
if cjsl>0 and sysl-cjsl>0 then holdday=(sysl-cjsl)*(上一条记录的holdday+本次与上条记录距离之间的rq差)/sysl

if cjsl<=0 then holdday=上一条记录的holdday+本次与上条记录距离之间的rq差

定义:上条记录是指同一个帐户name对同一只股票zqdm的买卖记录按照时间排序,在本次记录上面的一条交易记录。

[size=200:1qo2x8et][b:1qo2x8et]如果想要得到每一天每一个投资者对于每一个股票的holdday,怎么写程序啊?[/b:1qo2x8et][/size:1qo2x8et]
作者: shiyiming    时间: 2008-6-5 19:25
标题: Re: 请教各位大大一个问题
data a;                                                                                                                                 
input rq name $12. zqdm cjsl sysl;                                                                                                      
cards;                                                                                                                                 
19970105 zttc03091232 600019 6000 6000                                                                                                  
19970106 zttc03091232 600019 -3000 3000                                                                                                
19970107 zttc03091232 600019 2000 5000                                                                                                  
19970108 zttc03091232 600019 -4000 1000                                                                                                
19970110 zttc03091232 600019 3000 4000                                                                                                  
19970113 zttc03091232 600019 -2000 2000                                                                                                
;                                                                                                                                       
run;                                                                                                                                    
                                                                                                                                       
data b(drop=lag_rq);                                                                                                                    
        set a;                                                                                                                          
        lag_rq=lag(rq);                                                                                                                 
        retain holdday 0;                                                                                                               
        if cjsl>0 and sysl-cjsl=0 then holdday=0;                                                                                       
        else if cjsl>0 and sysl-cjsl>0 then holdday=(sysl-cjsl)*(holdday+rq-lag_rq)/sysl;                                               
        else if cjsl<=0 then holdday+rq-lag_rq;                                                                                         
run;                                                                                                                                    
proc print;run;
作者: shiyiming    时间: 2008-6-5 20:59
标题: Re: 请教各位大大一个问题
谢谢ls的
但是ls的你只做了一个投资者一只股票的
我想要的是每一天每一个投资者对于每一只股票的。有联系方式吗?
作者: shiyiming    时间: 2008-6-5 22:16
标题: Re: 请教各位大大一个问题
对不起,怪我没有表述清楚。现在数据集是
rq name zqdm cjsl sysl
19970105 zttc03091232 600019 6000 6000
19970106 zttc03091232 600019 -3000 3000
19970107 zttc03091232 600019 2000 5000
19970108 zttc03091232 600019 -4000 1000
19970109 zttc03091232 600019 3000 4000
19970112 zttc03091232 600019 0 4000
19970113 zttc03091232 600019 -2000 2000
19970105 zttc03091232 600020 6000 6000
19970106 zttc03091232 600020 -3000 3000
19970107 zttc03091232 600020 2000 5000
19970108 zttc03091232 600020 -4000 1000
19970109 zttc03091232 600020 0 1000
19970112 zttc03091232 600020 3000 4000
19970113 zttc03091232 600020 -2000 2000
19970105 zttc03091233 600020 6000 6000
19970106 zttc03091233 600020 -3000 3000
19970107 zttc03091233 600020 2000 5000
19970108 zttc03091233 600020 -4000 1000
19970109 zttc03091233 600020 3000 4000
19970112 zttc03091233 600020 0 4000
19970113 zttc03091233 600020 -2000 2000

现在想要得到
rq        name        zqdm        cjsl        sysl        holdday
19970105        zttc03091232        600019        6000        6000        0
19970106        zttc03091232        600019        -3000        3000        1
19970107        zttc03091232        600019        2000        5000        1.2
19970108        zttc03091232        600019        -4000        1000        2.2
19970109        zttc03091232        600019        3000        4000        0.8
19970112        zttc03091232        600019        0        4000        3.8
19970113        zttc03091232        600019        -2000        2000        4.8
19970105        zttc03091232        600020        6000        6000        0
19970106        zttc03091232        600020        -3000        3000        1
19970107        zttc03091232        600020        2000        5000        1.2
19970108        zttc03091232        600020        -4000        1000        2.2
19970109        zttc03091232        600020        0        1000        3.2
19970112        zttc03091232        600020        3000        4000        1.505
19970113        zttc03091232        600020        -2000        2000        2.505
19970105        zttc03091233        600020        6000        6000        0
19970106        zttc03091233        600020        -3000        3000        1
19970107        zttc03091233        600020        2000        5000        1.2
19970108        zttc03091233        600020        -4000        1000        2.2
19970109        zttc03091233        600020        3000        4000        0.8
19970112        zttc03091233        600020        0        4000        3.8
19970113        zttc03091233        600020        -2000        2000        4.8
计算规则还和上面的一样。
结果是每一个投资者每天对于每一只股票的holdday
作者: shiyiming    时间: 2008-6-5 23:28
标题: Re: 请教各位大大一个问题
什么叫[quote:3l0wcna2]每一个投资者每一天对每一支股票的holdday[/quote:3l0wcna2]
既然是每一天,那holdday就是1咯。
作者: shiyiming    时间: 2008-6-5 23:40
标题: Re: 请教各位大大一个问题
cjsl就是当天成交数量
sysl表示当天结束以后的剩余数量
cjsl=sysl的时候表示当天开始持有这只股票啊
作者: shiyiming    时间: 2008-6-5 23:48
标题: Re: 请教各位大大一个问题
不好意思。您说的是对的。
应该是0.8


[quote="lili83xu":753h37ct]依然是上面那个程序,我不知道这是不是巧合,但想问下“cjsl”和“sysl”是什么意思?在按照name与zqdm顺序排列后每一个投资者持有的每一个股票出现后,cjsl”和“sysl”都为6000,自然“holdday”就为0了,所以原来的程序就可以用了。
还有我发现怎么运算出来的结果和你的不一样。
e.g.:第五条记录[quote:753h37ct]19970109 zttc03091232 600019 3000 4000[/quote:753h37ct]
则,holdday=(4000-3000)*(2.2+1)/4000=0.8,怎么会是1.05?
类似的下面也有一些holdday计算出来不同。[/quote:753h37ct]
作者: shiyiming    时间: 2008-6-5 23:49
标题: Re: 请教各位大大一个问题
那么还就是那个code
作者: shiyiming    时间: 2008-6-5 23:51
标题: Re: 请教各位大大一个问题
[quote="lili83xu":2nmccikn]那么还就是那个code[/quote:2nmccikn]

但是看不到那个日期的循环啊?而且如果年份发生跨年转换,还能有效吗?
可以吗?
我的qq:20523543
希望和您交流一下
作者: shiyiming    时间: 2008-6-6 13:05
标题: Re: 请教各位大大一个问题
我想你是不是这个意思,e.g.:我把第7条记录的年份由1997修改为1998,则新记录为“19980113 zttc03091232 600019 -2000 2000”。
[code:632vtnym]data a;   
input rq :yymmdd8. name $12. zqdm cjsl sysl;
format rq yymmdd10.;
cards;  
19970105 zttc03091232 600019 6000 6000  
19970106 zttc03091232 600019 -3000 3000
19970107 zttc03091232 600019 2000 5000
19970108 zttc03091232 600019 -4000 1000
19970109 zttc03091232 600019 3000 4000
19970112 zttc03091232 600019 0 4000
19980113 zttc03091232 600019 -2000 2000
19970105 zttc03091232 600020 6000 6000
19970106 zttc03091232 600020 -3000 3000
19970107 zttc03091232 600020 2000 5000
19970108 zttc03091232 600020 -4000 1000
19970109 zttc03091232 600020 0 1000
19970112 zttc03091232 600020 3000 4000
19970113 zttc03091232 600020 -2000 2000
19970105 zttc03091233 600020 6000 6000
19970106 zttc03091233 600020 -3000 3000   
19970107 zttc03091233 600020 2000 5000
19970108 zttc03091233 600020 -4000 1000
19970109 zttc03091233 600020 3000 4000
19970112 zttc03091233 600020 0 4000
19970113 zttc03091233 600020 -2000 2000  
;
run;

proc sort data=a;
by name zqdm;
run;
                                                                                                                                       
data b(drop=lag_rq);
set a;
lag_rq=lag(rq);
retain holdday 0;  
if cjsl>0 and sysl-cjsl=0 then holdday=0;  
else if cjsl>0 and sysl-cjsl>0 then holdday=(sysl-cjsl)*(holdday+rq-lag_rq)/sysl;  
else if cjsl<=0 then holdday+rq-lag_rq;   
run;
proc print;run;[/code:632vtnym]
只要将输入时间的格式改一下就可以了。
作者: shiyiming    时间: 2008-6-6 21:34
标题: Re: 请教各位大大一个问题
呵呵。我昨晚看懂了程序,稍微改了一下。不过对您的帮助真的非常感谢。




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2