楼主: whut001
7325 13

[原创博文] 求助!如何解决事件窗口期内的股票停牌、休市等的影响啊 [推广有奖]

11
whut001 发表于 2012-4-10 14:39:32
chendonghui1987 发表于 2012-4-10 11:13
你看看是不是你需要的.

股票:name 窗口:sum  数据集为 a
同学,我想问你对如下的思路的看法,会不会有疏漏?

第一步:先去窗口数据位0,1,2的股票数据
proc sql noprint;
        create table work.B1 as
                select *,
                        count(name) as cnt
                from work.a
                group by name
                having cnt>=5
                order by Stkcd,F18;
quit;
data work.B2;
        set work.B1;
        by name sum;
        if sum=0 then do;
                i = 0;
                retain i;
        end;if sum>0 then do;
                i=i+1;
                retain i;
        end;
        if i>=3 then delete;
                if sum<0 then delete;
run;

第二部去窗口数据位0,-1,-2的股票数据
proc sql noprint;
        create table work.B3 as
                select *,
                        count(name) as cnt
                from work.a
                group by name
                having cnt>=5
                order by name,sum;
quit;
proc sort data=work.B3;
    by name descending sum;
run;
data work.B4;
        set work.B3;
        if sum=0 then do;
                i = 0;
                retain i;
        end;if sum<0 then do;
                i = i-1;
                retain i;
        end;
                if i<=-3 then delete;
                if sum>0 then delete;
run;

最后再把B2和B4文件合并到一起就是窗口-2,-1,0,1,2的数据,这样是不是可以得到我要的结果?但是我不知道最后合并B2和B4时该怎么弄,两个文件应该不是用join语句,该用什么呢?

12
whut001 发表于 2012-4-10 14:41:41
louka99 发表于 2012-4-10 10:40
只提前 -3 -2 0,如果严格需要5个数据,那么把提前后小于5的股票删除~特殊情况暂时没有发现,在编程时已经 ...
同学,我想问你对如下的思路的看法,会不会有疏漏?

第一步:先去窗口数据位0,1,2的股票数据
proc sql noprint;
        create table work.B1 as
                select *,
                        count(name) as cnt
                from work.a
                group by name
                having cnt>=5
                order by name,sum;
quit;
data work.B2;
        set work.B1;
        by name sum;
        if sum=0 then do;
                i = 0;
                retain i;
        end;if sum>0 then do;
                i=i+1;
                retain i;
        end;
        if i>=3 then delete;
                if sum<0 then delete;
run;

第二部去窗口数据位0,-1,-2的股票数据
proc sql noprint;
        create table work.B3 as
                select *,
                        count(name) as cnt
                from work.a
                group by name
                having cnt>=5
                order by name,sum;
quit;
proc sort data=work.B3;
    by name descending sum;
run;
data work.B4;
        set work.B3;
        if sum=0 then do;
                i = 0;
                retain i;
        end;if sum<0 then do;
                i = i-1;
                retain i;
        end;
                if i<=-3 then delete;
                if sum>0 then delete;
run;

最后再把B2和B4文件合并到一起就是窗口-2,-1,0,1,2的数据,这样是不是可以得到我要的结果?但是我不知道最后合并B2和B4时该怎么弄,两个文件应该不是用join语句,该用什么呢?

13
louka99 发表于 2012-4-10 16:06:51
whut001 发表于 2012-4-10 14:41
同学,我想问你对如下的思路的看法,会不会有疏漏?

第一步:先去窗口数据位0,1,2的股票数据
第一:把删除小于5行的数据放在最后,因为如果-3 -2 -1 0 1也是5个数据,你删除不了。
第二:合并B2和B4程序:
       data a;
         set b2 b4;
        run;就可以了,最多再按照sort 排序sum
第三:程序有个小问题,就是第一行如果是-4 -3 -2 0那么第一行的数据你无法删除-4。

第四:把删除小于5行的数据放在我之前编的程序最后,就提取所有股票为5的数据。
      把我的程序看懂就可以了,你自己编的程序问题不止一个,提取不了你想要的数据

14
whut001 发表于 2012-4-10 16:55:41
louka99 发表于 2012-4-10 16:06
第一:把删除小于5行的数据放在最后,因为如果-3 -2 -1 0 1也是5个数据,你删除不了。
第二:合并B2和B4 ...
非常感谢你的热心帮助,我试了下,我发现自己弄的粗糙程序也还是能用的,主要怪我没交待清楚。我自己的思路下用的数据是更粗糙的窗口期没经过筛选原始数据,每只股票最起码都有几十个窗口数据了,不再局限于(-4,4)的窗口下了,可能是歪打误撞,你说的问题可能被我分别在第一步中“升序排序时删除负值的窗口数据“,第二步中”降序时删除正值的窗口数据”给解决的。总之还是你们写的程序漂亮,短短几句就搞定了,厉害!!!!。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-27 12:49