SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 823|回复: 8
打印 上一主题 下一主题

排序临时变量相关问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-11-19 22:57:34 | 只看该作者

排序临时变量相关问题

大家给个参考程序,要求如下:
1.将数据集按股票代码、交易日期、交易小时、交易分钟和交易秒钟排序。
2、用by语句激活排序临时变量firt.变量和last.变量,以此为基础用累加语句求出股票600766在2005年6月1日开盘后半小时的平均股价。交易价格为0的不计入。用retain语句计算该日开盘后半小时的最高股价。
3、在600766股票2005年6月1日10:03:19后添加5个空白记录。

(注:该数据只是高频数据中的一部分,也就是说股票代码和交易日期接下来还可以是600767,600768....;6月2号,3号......)

STKCD        TDATE        TTIME        CP
600766        20050601        092528        0
600766        20050601        093040        0
600766        20050601        093119        0
600766        20050601        093404        0
600766        20050601        093559        0
600766        20050601        093613        0
600766        20050601        094031        0
600766        20050601        094150        0
600766        20050601        094229        0
600766        20050601        094541        0
600766        20050601        094602        0
600766        20050601        094720        1.51
600766        20050601        094808        1.51
600766        20050601        094902        1.51
600766        20050601        094905        1.51
600766        20050601        094935        1.51
600766        20050601        095021        1.51
600766        20050601        095026        1.51
600766        20050601        095053        1.51
600766        20050601        095059        1.51
600766        20050601        095218        1.5
600766        20050601        095503        1.5
600766        20050601        095539        1.5
600766        20050601        095554        1.5
600766        20050601        095603        1.5
600766        20050601        095609        1.5
600766        20050601        095615        1.5
600766        20050601        095700        1.5
600766        20050601        095712        1.5
600766        20050601        095727        1.5
600766        20050601        095742        1.5
600766        20050601        095909        1.5
600766        20050601        095951        1.5
600766        20050601        100030        1.5
600766        20050601        100131        1.5
600766        20050601        100316        1.5
600766        20050601        100319        1.49
600766        20050601        100337        1.49
600766        20050601        100422        1.49
600766        20050601        100440        1.49
600766        20050601        100510        1.49
600766        20050601        100604        1.49
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-11-20 08:25:14 | 只看该作者

Re: 排序临时变量相关问题

会第3问的也行,即怎样在某个股票交易时间后插入空白记录;大家给个参考程序,谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-11-20 10:28:16 | 只看该作者

Re: 排序临时变量相关问题

[code:1ywow3gn]data raw;
        retain STKCD TDATE TTIME CP;
        input stkcd $1-6 tdate:yymmdd8. h 17-18 m 19-20 s 21-22 cp;
        ttime=hms(h,m,s);
        format tdate yymmdd10. ttime time8.;
        drop h m s;
datalines;
600766 20050601 092528 0
600766 20050601 093040 0
600766 20050601 093119 0
600766 20050601 093404 0
600766 20050601 093559 0
600766 20050601 093613 0
600766 20050601 094031 0
600766 20050601 094150 0
600766 20050601 094229 0
600766 20050601 094541 0
600766 20050601 094602 0
600766 20050601 094720 1.51
600766 20050601 094808 1.51
600766 20050601 094902 1.51
600766 20050601 094905 1.51
600766 20050601 094935 1.51
600766 20050601 095021 1.51
600766 20050601 095026 1.51
600766 20050601 095053 1.51
600766 20050601 095059 1.51
600766 20050601 095218 1.5
600766 20050601 095503 1.5
600766 20050601 095539 1.5
600766 20050601 095554 1.5
600766 20050601 095603 1.5
600766 20050601 095609 1.5
600766 20050601 095615 1.5
600766 20050601 095700 1.5
600766 20050601 095712 1.5
600766 20050601 095727 1.5
600766 20050601 095742 1.5
600766 20050601 095909 1.5
600766 20050601 095951 1.5
600766 20050601 100030 1.5
600766 20050601 100131 1.5
600766 20050601 100316 1.5
600766 20050601 100319 1.49
600766 20050601 100337 1.49
600766 20050601 100422 1.49
600766 20050601 100440 1.49
600766 20050601 100510 1.49
600766 20050601 100604 1.49
;

proc sort data=raw;
        by stkcd tdate ttime;
run;

data temp(drop=i avg_n);
        do _n_=1 by 1 until(last.tdate);
                set raw;
                by stkcd tdate;
                if '9:30:00't<ttime<='10:00:00't and cp ne 0 then
                        do;
                                cp_avg=sum(cp_avg,cp);
                                avg_n+1;
                                cp_max=max(cp_max,cp);
                        end;
        end;
        cp_avg=round(cp_avg/avg_n,.01);
        do _n_=1 to _n_;
                set raw;
                if ttime='10:03:19't then
                        do;
                                call missing(stkcd,tdate,ttime,cp);
                                do i=1 to 5;
                                        output;
                                end;
                        end;
                else output;
        end;
run;[/code:1ywow3gn]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-11-20 13:16:43 | 只看该作者

Re: 排序临时变量相关问题

谢谢,几个问题:
1。cp_avg和cp_max输出显示能不能只到10:00:00结束,因为只需求半个小时的均值和最大值,结果能否保留5位小数
2。因为是需要在600766股票2005年6月1日10:03:19后添加5个空白记录,不是覆盖这个记录,所给程序输出时10:03:19记录已经消失
3。因为我这是截取数据,也就是说股票代码和交易日期接下来还可以是600767,600768....;6月2号,3号......31号的交易记录。遇到这种情况,怎么让程序只取600766在2005年6月1号前半小时的交易记录作相关统计,你所给语句do _n_=1 by 1 until(last.tdate)只是针对我的截取数据;如果真实数据如下类似怎么办:
STKCD        TDATE        TTIME        CP
600766        20050601        092528        0
600766        20050601        093028        0
600766        20050601        093040        0
600766        20050601        093119        0
600766        20050601        094602        0
600766        20050601        094720        1.51
600766        20050601        094808        1.51
600766        20050601        094902        1.51
600766        20050601        094905        1.51
600766        20050601        095742        1.5
600766        20050601        095909        1.5
600766        20050601        095951        1.5
600766        20050601        100030        1.5
600766        20050601        100131        1.5
600766        20050601        100316        1.5
600766        20050601        100319        1.49
600766        20050601        100337        1.49
600766        20050601        100422        1.49
600766        20050601        100440        1.49
600766        20050601        100510        1.49
600766        20050601        100604        1.49
600766        20050601        110236        1.48
600766        20050601        110303        1.48
600766        20050601        110324        1.48
600766        20050601        130637        1.47
600766        20050601        130737        1.47
600766        20050601        130943        1.47
600766        20050601        131135        1.46
600766        20050601        135703        1.43
600766        20050601        135918        1.43
600766        20050601        140224        1.43
600766        20050601        140321        1.43
600766        20050601        140324        1.43
600766        20050601        145753        1.44
600766        20050601        145903        1.44
600766        20050601        145932        1.44
600766        20050602        092526        0
600766        20050602        093044        0
600766        20050602        095807        1.44
600766        20050602        095824        1.44
600766        20050602        095952        1.44
600766        20050602        100037        1.43
600766        20050602        100131        1.43
600766        20050602        150000        1.43
600766        20050602        150030        1.42
600766        20050603        092532        0
600766        20050603        093018        1.42
600766        20050603        093034        1.42
600766        20050603        093207        1.42
600766        20050603        093211        1.42
600766        20050630        145903        1.68
600766        20050630        145946        1.68
600766        20050630        150000        1.68
600767        20050601        092528        1.52
600767        20050601        093028        1.52
600767        20050601        093034        1.52
600767        20050601        093040        1.52
600767        20050601        093043        1.52
600767        20050601        093055        1.52
600767        20050601        093110        1.49
600767        20050601        093119        1.49
600767        20050630        145912        1.36
600767        20050630        145922        1.36
600768        20050601        092528        10.79
600768        20050601        093028        10.79
600768        20050601        093034        10.79
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-11-20 14:39:49 | 只看该作者

Re: 排序临时变量相关问题

由于我的能力有限,未能对您的行业应用提供准确、圆满的解决方案,对此我深表歉意。
祝顺利。谢谢。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-11-20 23:25:37 | 只看该作者

Re: 排序临时变量相关问题

那能否就在600766股票2005年6月1日10:03:19后添加5个空白记录这一问题写个程序
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-11-23 11:33:26 | 只看该作者

Re: 排序临时变量相关问题

你自己不学习,估计没人帮你的。大家来是交流来的,不是你的劳动力。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-11-23 15:55:37 | 只看该作者

Re: 排序临时变量相关问题

[code:32lxiyn3]
data tmp;
        input STKCD TDATE yymmdd8. time $ CP;
        h=substr(time,1,2);
        m=substr(time,3,2);
        s=substr(time,5,2);
        ttime=hms(h,m,s);
        format tdate yymmdd8. ttime time8.;
        datalines;
600766 20050601 092528 0
600766 20050601 093040 0
600766 20050601 093119 0
600766 20050601 093404 0
600766 20050601 093559 0
600766 20050601 093613 0
600766 20050601 094031 0
600766 20050601 094150 0
600766 20050601 094229 0
600766 20050601 094541 0
600766 20050601 094602 0
600766 20050601 094720 1.51
600766 20050601 094808 1.51
600766 20050601 094902 1.51
600766 20050601 094905 1.51
600766 20050601 094935 1.51
600766 20050601 095021 1.51
600766 20050601 095026 1.51
600766 20050601 095053 1.51
600766 20050601 095059 1.51
600766 20050601 095218 1.5
600766 20050601 095503 1.5
600766 20050601 095539 1.5
600766 20050601 095554 1.5
600766 20050601 095603 1.5
600766 20050601 095609 1.5
600766 20050601 095615 1.5
600766 20050601 095700 1.5
600766 20050601 095712 1.5
600766 20050601 095727 1.5
600766 20050601 095742 1.5
600766 20050601 095909 1.5
600766 20050601 095951 1.5
600766 20050601 100030 1.5
600766 20050601 100131 1.5
600766 20050601 100316 1.5
600766 20050601 100319 1.49
600766 20050601 100337 1.49
600766 20050601 100422 1.49
600766 20050601 100440 1.49
600766 20050601 100510 1.49
600766 20050601 100604 1.49
;
proc sort data=tmp out=tmp2;
        by stkcd tdate ttime;
run;
data tmp3(drop=h m s time n sum i);
        set tmp2 ;
        by stkcd tdate ttime;
        retain max sum n;
        array tm _numeric_;
        if ttime >= '09:30:00't and ttime <= '10:00:00't then
        do;
                if cp>0 then do;
                        n+1;
                        sum+cp;
                        max=max(max,cp);
                        mean=round(sum/n,0.00001);
                end;
        end;
        if ttime>'10:00:00't then max=.;
        output;
        if ttime = '10:03:19't then
        do i=1 to 5;
                do over tm;
                        tm=.;
                end;
                output;
        end;
run;
[/code:32lxiyn3]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2009-11-24 11:57:02 | 只看该作者

Re: 排序临时变量相关问题

谢谢lwien001回复,简洁效果都达到了,array好像是矩阵语言,firt.变量和last.变量程序中好像没看到。
re:tonyleung,我刚学sas,自己也在编程,以下是我自己编的,5个记录覆盖了原记录,程序没用firt.变量和last.变量。个人觉得如果单用by语句激活排序临时变量firt.变量和last.变量来做,我觉得有些困难。


data Sza.Test2a;
set Sza.highfretest;
date1=substrn(tdate,1,4) || '/' || substrn(tdate,5,2) || '/' ||substrn(tdate,7,2);
time1=substrn(ttime,1,2) || ':' || substrn(ttime,3,2) || ':' ||substrn(ttime,5,2);
/*把交易日期和时间转化为sas能识别的形式*/
num_tdate=input(date1,yymmdd10.);
num_ttime=input(time1,time8.);
/*把交易日期和时间转化为数值形式*/
hour=hour(num_ttime);
minute=minute(num_ttime);
second=second(num_ttime);
/*调出交易时间的小时、分钟和秒的值*/
run;

proc sort data= Sza.Test2a;
by stkcd date1 hour minute second;
/*将数据集按股票代码、交易日期、交易小时、交易分钟和交易秒钟排序*/
run;

data Sza.Test2b;
set Sza.Test2a;
do;
where input(stkcd,6.)=600766 & day(input(date1,yymmdd10.))=1 & hour=9;
/*调出600766在2005年6月1日开盘后半小时的数据*/
total_cp+cp;
/*累加求和*/
if cp^=0 then do;
n+1;
/*求出价格不为0的交易笔数*/
end;
if cp ^=0 then avr_prc=total_cp/n;
/*求出价格不为0的交易平均股价*/
retain max_cp;
max_cp=max(max_cp,cp);
/*计算开盘半小时后的最高股价*/
end;
drop total_cp n;
run;
data Sza.Test2c;
set Sza.highfretest;
if _n_=49 then do;
/*_n_=49对应时间10:03:19*/
do _n_=50 to 54;
stkcd=.;tdate=.;ttime=.;cp=.;
/*在10:03:19后添加5个空白记录*/
output;
end;
end;
else output;
run;
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-6 06:20 , Processed in 0.085914 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表