Dear all,
Could you please advise me if there is a way to estimate t-stats for portfolio returns using White’s heteroskedasticity-adjusted standard errors, especially in proc means.
Thansk in advancefor your help.
Best Regards,
Cheema
I can answer the second part of your question: convert the data from wide form to long form and then use BY-group processing to process all the variables with one procedure call. For your example that has two variables:
data stack;
set have(keep=date port1 rename=(port1=port))
have(keep=date port2 rename=(port2=port) in=g);
group = g+1;
run;
ods graphics off;
proc model data=stack;
by group;
endo port ;
instruments / intonly;
port=b0;
fit port / gmm kernel=(bart, 1, 0);
run;
quit;
We'll need more details (structure of data?) to offer anything concrete. I think these estimates are also called "sandwich estimates" (?). They aren't part of PROC MEANS but you can get them in SAS/STAT procedures such as GENMOD.
Hi Rick,
Thanks for your response. Please find the data given below, basically its its average monthly returns of two portfolios (time-series). In the past, I used to estimate Newey West t-statistics and found online that t-stat using White’s heteroskedasticity-adjusted standard error is similar, but not sure since it provided me the same answer like simple t-stat. Furthermore, is it possible to code it in a way that I can get White’s heteroskedasticity-adjusted for both the portfolios at once instead of running the model for each portfolio seperately?
data have;
infile cards expandtabs truncover;
input date : yymmn6. port1 port2 ;
format date yymmn6.;
cards;
199501 -12.8774 -15.9533
199502 2.3605 1.2441
199503 11.3115 3.8817
199504 -7.5567 -6.0238
199505 4.861 1.463
199506 -8.4025 -5.5822
199507 7.877 10.0285
199507 3.8999 2.2173
199508 2.8722 5.5666
199508 4.7494 2.9481
199509 -0.1961 -0.967
199509 -0.906 -3.0715
199510 2.2826 1.3475
199510 1.2008 1.9409
199511 -7.8011 -7.7997
199511 -5.1886 -3.1171
199512 -12.0533 -12.5316
199512 -6.8809 -9.8692
199601 -2.6321 -3.3365
199601 -4.6634 -4.5228
199602 3.352 3.9263
199602 3.082 2.4645
199603 0.1532 2.1435
199603 -1.9428 0.0755
199604 27.5239 25.988
199604 34.4729 42.8569
199605 -5.9426 -9.9524
199605 1.3499 -0.6048
199606 21.3006 15.486
199606 18.1896 13.6956
199607 5.852 5.1746
199607 33.8655 42.5136
199608 -3.3695 0.6106
199608 5.7739 -1.5214
199609 5.857 5.1485
199609 6.3112 0.6669
199610 12.395 7.9307
199610 42.0208 51.5401
199611 5.7496 6.882
199611 15.4236 10.3373
199612 -12.608 -10.3824
199612 -21.5054 -29.4552
run;
**** proc means for simple t-stat;
proc means data=have n mean t probt maxdec=5;
var port1 port2;
run;
**** proc model for White's heteroskedasticity adjusted t-stat of Port1;
proc model data=have;ods graphics off;
endo port1 ;
instruments / intonly;
port1=b0;
fit port1 / gmm kernel=(bart, 1, 0);
run;
quit;
**** proc model for White's heteroskedasticity adjusted t-stat of Port2;
proc model data=have;ods graphics off;
endo port2 ;
instruments / intonly;
port2=b0;
fit port2 / gmm kernel=(bart, 1, 0);
run;
quit;
Thanks for your help.
Regards,
Cheema
I can answer the second part of your question: convert the data from wide form to long form and then use BY-group processing to process all the variables with one procedure call. For your example that has two variables:
data stack;
set have(keep=date port1 rename=(port1=port))
have(keep=date port2 rename=(port2=port) in=g);
group = g+1;
run;
ods graphics off;
proc model data=stack;
by group;
endo port ;
instruments / intonly;
port=b0;
fit port / gmm kernel=(bart, 1, 0);
run;
quit;
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
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.