楼主: whut001
7324 13

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

  • 0关注
  • 2粉丝

已卖:29份资源

本科生

48%

还不是VIP/贵宾

-

威望
0
论坛币
2207 个
通用积分
0.2082
学术水平
3 点
热心指数
4 点
信用等级
2 点
经验
904 点
帖子
55
精华
0
在线时间
98 小时
注册时间
2006-3-20
最后登录
2019-12-29

楼主
whut001 发表于 2012-4-9 21:22:47 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

我有一个数据表的前两列如下所示,现在我想进一步筛选出其中的一些数据,想法是:依据“窗口”数据,提取出各只股票分别在第0天前后各2个交易日内的数据来(每只股票总共要5个交易日的数据),想问下sas中有没有sql语言能实现这个步骤呀?谢谢了!!

      股票          窗口                        

300137

-3

300137

-2

300137

-1

300137

0

300137

4

300151

-4

300151

-1

300151

0

300151

1

300151

2

300151

3

300152

-4

300152

-1

300152

0

300152

1

300152

2

300152

3

300156

-1

300156

0

300156

1

300156

2

300159

-4

300159

-3

300159

-2

300159

1

300159

2

300159

3

300159

4

300170

-4

300170

-3

300170

-2

300170

-1

300170

0

300170

3

300170

4

300180

-4

300180

-1

300180

0

300180

1

300180

2

300180

3

300217

-2

300217

-1

300217

0

300217

1

300217

2

300218

-4

300218

-1

300218

0

300218

1

300218

2

300218

3



以如下股票为例,

300152

-4

300152

-1

300152

0

300152

1

300152

2

300152

3

我想将其进一步筛选成

300152

-4

300152

-1

300152

0

300152

1

300152

2

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:窗口期 sql语言 交易日 数据表 筛选出 窗口期 sql语言 交易日 数据表 如何

沙发
louka99 发表于 2012-4-9 22:45:30
股票:gp 窗口:ck 数据集为 a
proc sort data=a;
    by gp descending ck;
run;
data a;
   set a;
     retain t 0;
      if gp=lag(gp) and ck=0 then t+1;
      if gp^=lag(gp) then t=0;
         t1=t;
          if t^=0 then t2+1;
          if t=0 then t2=0;
          if t2>3 then t1=0;
            drop t t2;
               
run;
proc sort data=a;
   by gp ck;
run;
data a;
    set a;
           retain k 0;
              if gp=lag(gp) and ck=0 then k+1;
      if gp^=lag(gp) then k=0;
         k1=k;
          if k^=0 then k2+1;
          if k=0 then k2=0;
          if k2>3 then k1=0;
            drop k k2;
run;
data b;
   set a;
      if t1=0 or k1=0 then delete;
          drop t1 k1;
run;
数据集b就是你想要得~
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
whut001 + 1 + 1 + 1 热心帮助其他会员

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

藤椅
chendonghui1987 发表于 2012-4-9 23:50:51
股票:gp 窗口:ck 数据集为 a

/*每支股票必须大于等于5条记录*/
proc sql noprint;
        create table work.b as
                select *,
                        count(name) as cnt
                from work.a
                group by name
                having cnt>=5
                order by name,sum;
quit;

/*每支股票只取前五条*/
data work.c(drop = i cnt);
        set work.b;
        by name sum;
        if first.name then do;
                i = 1;
                retain i;
        end;else do;
                i = i+1;
                retain i;
        end;
        if i>=6 then delete;
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
whut001 + 1 + 1 + 1 热心帮助其他会员

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

板凳
whut001 发表于 2012-4-10 09:30:38
louka99 发表于 2012-4-9 22:45
股票:gp 窗口:ck 数据集为 a
proc sort data=a;
    by gp descending ck;
谢谢好心人的帮助,祝你万事如意!

报纸
whut001 发表于 2012-4-10 09:32:07
chendonghui1987 发表于 2012-4-9 23:50
股票:gp 窗口:ck 数据集为 a

/*每支股票必须大于等于5条记录*/
谢谢好心人的帮助,祝你万事如意!

地板
louka99 发表于 2012-4-10 10:24:24
chendonghui1987 发表于 2012-4-9 23:50
股票:gp 窗口:ck 数据集为 a

/*每支股票必须大于等于5条记录*/
这个好像不行吧?他得本意是要提前0前后的两个数据,如果小于0的数据小于2个,那么最后可能就是4个数据。如果确实是要严格每支股票5个数据,那么你程序的第一步筛选是没错的。第二步程序提前5条,那么有可能是-4 -3 -2 0 1,不符合本意~

7
chendonghui1987 发表于 2012-4-10 10:32:26
如果数据时-5 -4 -3 -2 0,怎么办?该股票舍弃掉

8
chendonghui1987 发表于 2012-4-10 10:34:23
那么是以0为中心,前后各取两个,有没有特殊情况?

9
louka99 发表于 2012-4-10 10:40:47
chendonghui1987 发表于 2012-4-10 10:32
如果数据时-5 -4 -3 -2 0,怎么办?该股票舍弃掉
只提前 -3 -2 0,如果严格需要5个数据,那么把提前后小于5的股票删除~特殊情况暂时没有发现,在编程时已经考虑,当然可能也会遗漏~希望你能够找出来,便于讨论~

10
chendonghui1987 发表于 2012-4-10 11:13:40
你看看是不是你需要的.

股票:name 窗口:sum  数据集为 a

/*每支股票必须大于等于5条记录*/
proc sql noprint;
    create table work.b as
            select *,
                    count(name) as cnt
            from work.a
            group by name
            having cnt>=5
            order by name,sum;
quit;

/*给股票记录sum为0的数据加上标识*/
data work.c;
        set work.b;
        by name sum;
        if first.name then do;
                i = 1;
        end;else do;
                i+1;
        end;

        if sum = 0 then do;
                zero = "true";
        end;
run;

/*只要0前后的两条,每个股票最多为5条记录,最少为3条*/
proc sql noprint;
       
        create table work.d as
                select a.name,
                        a.sum
                from work.c as a ,(select *
                                                                from work.c
                                                                where not missing(zero)) as b
                where a.name = b.name and a.i between b.i-2 and b.i+2
                order by name,sum;
quit;

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

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