| 
 | 
 
proc format; 
   value $TckName 
    '^DJI'='Dow Jones' 
    '^IXIC'='NASDAQ' 
    '000001.SS'='Shanghai' 
        '399001.SZ'='Shenzhen' 
        ; 
 run; 
%macro ReadStockData(Ticker, FromDate, ToDate); 
   %local ImpNum; 
   %let Ticker=%sysfunc(upcase(&Ticker)); 
    /** Add a proxyserver= option here if you need to run this from behind a firewall **/ 
   FileName YaHoo url "http://ichart.finance.yahoo.com/table.csv?s=&Ticker"; 
   data Temp; 
   label Index_Name='Index Name'  
             Date='Date' 
             Open='Open' 
             High='High' 
             Low='Low' 
             Close='Close' 
         Volume='Volume' 
             Adj_Close='Adjusted Close' 
         ; 
   attrib  
      Index_Name length=$11 
      Date length=8 informat=yymmdd10. format=mmddyy10. 
      High Low Close Volume Adj_Close length=8 format=best25. 
      ; 
   Index_Name=put("&Ticker",$TckName.); 
   infile YaHoo dlm=',' missover firstobs=2 dsd ; 
   /** The ?? modifier suppresses error/notes when reading invalid data **/ 
   input 
    Date       : ?? yymmdd10. 
    Open       : ?? comma15. 
    High       : ?? comma15. 
    Low        : ?? comma15. 
    Close      : ?? comma15. 
    Volume     : ?? comma15. 
    Adj_Close  : ?? comma15. 
     ; 
    if &FromDate <= Date <= &ToDate and Adj_Close>0 then output;   
  run; 
  FileName YaHoo clear; 
  proc sql noprint; 
   select count(*) into :ImpNum 
   from Temp; 
  quit; 
 
 %if %sysevalf(&ImpNum >0) %then %do; 
  proc sort data=Temp; 
   by Date; 
  run; 
  data Temp (drop=PreClose); 
   label Index_Name='Index Name' 
         Year='Year' 
             Month='Month' 
         Date="Date" 
                 Day='Week Day' 
         Adj_Close='Adjusted Close Price' 
             Return='Return' 
        ; 
   format Date mmddyy10. Adj_Close comma15.4 Return percentn9.2; 
        ; 
  set Temp (keep=Index_Name Date Adj_Close); 
   retain PreClose 0; 
   Year=Year(Date); 
   Month=Month(Date); 
   Day=strip(put(Date,downame.));  
   if _n_=1 then do; 
     PreClose=Adj_Close; 
     Return=.; 
   end; 
   else do; 
    Return=(Adj_Close-PreClose)/PreClose; 
    PreClose=Adj_Close; 
   end; 
   if Return ne . then output; 
   run; 
   proc append base = Commbined_Stock_Data 
            data = Temp; 
   run; 
   quit; 
  %end; 
    proc sql; 
    drop table Temp; 
    quit; 
  %mend ReadStockData; 
 
  %ReadStockData(000001.SS, '01JAN2015'd, '16MAY2016'd) 
  %ReadStockData(399001.SZ, '01JAN2015'd, '16MAY2016'd) 
  %ReadStockData(^DJI, '01JAN2015'd, '16MAY2016'd) 
  %ReadStockData(^IXIC,'01JAN2015'd, '16MAY2016'd) |   
 
 
 
 |