BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
ivanpersie
Fluorite | Level 6

Hi guys,

I am sorting stock market data. Part of the process is to eliminate stocks that do not have continuous past 22 days daily returns data in a particular month. How can i code this down? I only wanna stay with stocks with that have data for continuous 22 days for every month. Please find attached data file

 

 

1 ACCEPTED SOLUTION

Accepted Solutions
Ksharp
Super User

I checked your data, none of stock satisfy your condition.

 

proc import datafile='c:\temp\Forum_RI.csv' out=temp dbms=csv replace;
run;

proc sort data=temp(where=(date is not missing)) out=have;
 by stock date;
run;

data have1;
 set have;
 by stock date;
 yymm=intnx('month',date,0);
 if first.date;
 format yymm yymmn6.;
run;

data have2;
 set have1;
 by stock;
 dif=dif(date);
 if first.stock then dif=1;
run;
/*
proc sql;
create table have3 as
 select *
  from have2
   group by stock,yymm
    having sum(dif ne 1)=0;
quit;
*/

View solution in original post

5 REPLIES 5
ChrisNZ
Tourmaline | Level 20

Give a small program to generate the sample data next time.

 

Like this?

 

data HAVE;
  do DATE=1 to 1000;
    do STOCKNO=1 to 200;
      VAL=( ranuni(0)<.96 );
      output;
     end;
  end;
  format DATE date9.; 
run;
proc sort data=HAVE out=SORTED;
  by STOCKNO DATE;
run;
data MARK_VALID; 
  set SORTED;
  by STOCKNO ;
  if STOCKNO=lag(STOCKNO) and month(DATE)=month(lag(DATE)) and VAL then VALID+1;
  else VALID=0;
  if VALID=22;
run;
proc sql; 
  create table WANT as
  select a.* 
  from SORTED       a
         inner join
       MARK_VALID   b
          on  a.STOCKNO    =  b.STOCKNO
          and put(a.DATE,monyy.)=  put(b.DATE,monyy.)
  order by STOCKNO, DATE;
quit;
  

 

 

Ksharp
Super User

I checked your data, none of stock satisfy your condition.

 

proc import datafile='c:\temp\Forum_RI.csv' out=temp dbms=csv replace;
run;

proc sort data=temp(where=(date is not missing)) out=have;
 by stock date;
run;

data have1;
 set have;
 by stock date;
 yymm=intnx('month',date,0);
 if first.date;
 format yymm yymmn6.;
run;

data have2;
 set have1;
 by stock;
 dif=dif(date);
 if first.stock then dif=1;
run;
/*
proc sql;
create table have3 as
 select *
  from have2
   group by stock,yymm
    having sum(dif ne 1)=0;
quit;
*/
ivanpersie
Fluorite | Level 6

Hi Ksharp. Thanks for your help. I really appreciate. Actually the data i gave you was a sample, so that's why probably it did not return data. Otherwise with the full data i have here, it all working. Thanks again.

hackathon24-white-horiz.png

2025 SAS Hackathon: There is still time!

Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!

Register Now

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 5 replies
  • 1613 views
  • 1 like
  • 4 in conversation