I'd recommend the following sequence:
Make sure your dataset is sorted by ID/YEAR
Make a data set VIEW containing all the needed squares and cross-products - call it SQ_CP_BY_IDYEAR
Run a proc expand to generate 10-year rolling SSCP values for each firm
Run proc summary to pool data over all firms
Convert the rolling sscp into a TYPE=SSCP dataset, which PROC REG can process
The code here applies that process to sashelp.stocks (10 days instead of 10 years)
For a 10-year window this process of making 10-year rolling SSCP may not be particlularly faster than making 10-year rolling oriiginal data windows, but for daily and monthly data, where each window commonly has more records, it becomes notably superior.
proc sort data=sashelp.stocks
out=stocks (rename=(close=y open=ylag1 high=x1 low=x2 volume=x3 adjclose=x4));
by stock date;
run;
/* Make a data set view of squares and cross-products */
data sqcp /view=sqcp;
set stocks;
array vars {7} intercept y ylag1 x1-x4;
retain intercept 1;
array sqcp {7,7};
do r=1 to 7;
sqcp{r,r}=vars{r}**2;
if r<7 then do c=r+1 to 7;
sqcp{r,c}=vars{r}*vars{c};
sqcp{c,r}=sqcp{r,c};
end;
end;
drop r c;
run;
/* Make rolling sscp (SUM of squares & cross-prods) data for 10-day windows */
proc expand data=sqcp out=rsscp_data2 (where=(intercept=10)) method=none;
by stock;
id date;
convert _numeric_ / transform=(movsum 10);
run;
/* Pool sscp data over all stocks */
proc summary data=rsscp_data nway;
class date;
var _numeric_;
output out=pooled_rsscp_data (drop=_TYPE_ _FREQ_) sum=;
run;
/* Reformat the data as a TYPE=SSCP data set, ready for PROC REG */
data pooled_rolling_sscp (type=SSCP drop=sqcp: n v);
length _TYPE_ $8 _NAME_ $32;
set pooled_rsscp_data;
array vars {7} intercept y ylag1 x1-x4;
array sqcp {7,7};
array vnames {7} $32 _temporary_ ;
if _n_=1 then do v=1 to dim(vars); vnames{v}=vname(vars{v}); end;
_TYPE_='SSCP';
do n=1 to 7;
_NAME_=vnames{n};
do v=1 to 7; vars{v}=sqcp{n,v}; end;
output;
end;
_type_='N';
_NAME_=' ';
do v=1 to 7; vars{v}=sqcp{1,1}; end;
output;
run;
proc reg data=pooled_rolling_sscp (obs=8);
var y ylag1 x1-x4;
model y=ylag1 x1-x4;
run;
quit;
... View more