* options nosource nodate nocenter nonumber ps=max ls=72; title ' '; /* SETS HOME DIRECTORY WHERE DATA FILES AND OUTPUT PLACE */ libname BANK "C:\RDATA" ; /* TO RUN DAILY STOCK RETURN DATA SET DOWNLOADED FROM WRDS AND OTHER SOURCES AS A CSV FILE */ proc IMPORT datafile="C:\RDATA\CRSPtest.csv" out=tempdata DBMS=csv replace ; getnames = yes ; run ; data tempsas ; set tempdata ; enddate = 20060103 ; futdate = 20061231 ; /* CHOOSE WHETHER TO USE RAW RETURNS OR LN OF PRICE RELATIVES */ pr = ret ; vwpr = vwretd ; sppr = sprtrn ; smbpr = smb ; hmlpr = hml ; umdpr = umd ; rfpr = rf ; xspr = ret - rf ; rpm = vwretd - rf ; * if pr = 0 then pr = pr + .00001 ; * else pr = pr ; /* pr = log(1 + ret) ; vwpr = log(1 + vwretd) ; sppr = log(1 + sprtrn) ; smbpr = log(1 + smb) ; hmlpr = log(1 + hml) ; umdpr = log(1 + umd) ; rfpr = log(1 + rf) ; xspr = log(1 + ret - rf) ; rpm = log(1 + vwretd - rf) ; */ prlag = lag1(pr); xsprlag = lag1(xspr); vwlag = lag1(vwpr); splag = lag1(sppr); rpmlag = lag1(rpm); vwpr2 = vwpr * vwpr ; sppr2 = sppr * sppr ; run ; /* COMPUTES SUMMARY STATISTICS AND THEN PRINTS OUT ALL OBSERVATIONS FOR EACH VARIABLE */ proc means data=tempsas ; run ; proc print data=tempsas label; run ; /* TEST 1. OLS MARKET MODEL USING CRSP VALUE WEIGHTED TOTAL RETURN INDEX */ proc reg data=tempsas ; title 'Test 1. Example of using OLS market model with CRSP Value-Weighted Index' ; model pr = vwpr / dw acov ; output out=fitdata p=prhat r=prerror ; test intercept = 0 ; test vwpr = 0 ; where date < enddate ; run ; /* TEST 2. ALTERNATIVE OLS MARKET MODEL USING S&P 500 INDEX */ proc reg data=tempsas ; title 'Test 2. Example of using OLS market model with S&P 500' ; model pr = sppr / dw acov ; output out=fitdata2 p=prhat2 r=prerr2 ; test intercept = 0 ; test sppr = 0 ; where date < enddate ; run ; /* TEST 3. OLS CAPM USING CRSP VALUE WEIGHTED TOTAL RETURN INDEX */ proc reg data=tempsas ; title 'Test 3. Example of using OLS CAPM with CRSP Value-Weighted Index' ; model xspr = rpm / dw acov ; output out=fitdata p=prhat r=prerror ; /* INTERCEPT T-TEST (ADJUSTED FOR HETERO): INDICATES WHETHER CAPM HOLDS FOR THIS STOCK */ test intercept = 0 ; test rpm = 0 ; where date < enddate ; run ; /* TEST 4. RUNS 3 OLS SCHOLES-WILLIAMS REGRESSIONS TO ADJUST BETA FOR NON-SYNCHRONOUS TRADING */ proc reg data=tempsas ; title 'Test 4.a. Example of Scholes-Williams Leading Beta' ; model prlag = vwpr / dw acov ; test vwpr = 0; where date < enddate ; run ; proc reg data=tempsas ; title 'Test 4.b. Example of Scholes-Williams Lagging Beta' ; model pr = vwlag / dw acov ; test vwlag = 0; where date < enddate ; run ; proc reg data=tempsas ; title 'Test 4.c. Example of Scholes-Williams Contemporaneous Beta' ; model pr = vwpr / dw acov ; test vwpr = 0; where date < enddate ; run ; /* TEST 5. RUNS A PURELY AUTOREGRESSIVE / RANDOM WALK-TYPE MODEL */ proc autoreg data=tempsas ; title 'Test 5. Example using pure Autoreg AR(n) process' ; model pr = prlag / nlag=5 backstep ; where date < enddate ; run ; /* TEST 6. RE-RUNS MARKET MODEL with ARCH(p,q) FUNCTION AND INCLUDES HETEROSKEDASTICITY, AUTOCORRELATION, AND JARQUE-BERA NORMALITY TESTS */ proc autoreg data=tempsas ; title 'Test 6. Example using Autoreg AR(n) and ARCH(p,q) process' ; model pr = vwpr / nlag=2 garch=(p=2,q=2) archtest dwprob normal backstep ; where date < enddate ; run ; /* TEST 7. RUNS OLS CAPM WITH FORECAST AND THEIL STATISTICS */ proc model data=tempsas outmodel=model0 ; title 'Test 7. Uses Proc Model with CAPM to create Forecasts and Theil stats' ; xspr = a0 + b1 * rpm ; fit xspr / ols dw breusch= (rpm) dw=5 white godfrey=5 normal ; where date < enddate ; solve xspr / dynamic stats theil ; where date < enddate ; run ; proc model data=tempsas model=model0 ; range date = 20060103 to 20061231 ; solve xspr / dynamic out=future0 stats theil ; run ; proc print data=future0 ; run ; /* TEST 8. RUNS OLS / GMM MULTIPLE FACTOR MODEL (E.G., FAMA-FRENCH 3-FACTOR MODEL + MOMENTUM) */ proc model data=tempsas outmodel=model1 ; title 'Test 8. Uses Proc Model with Multi-factor model to create Forecasts and Theil stats' ; xspr = a0 + b1 * rpm + b2 * smbpr + b3 * hmlpr + b4 * umdpr ; fit xspr / ols gmm dw breusch= (rpm smbpr hmlpr umdpr) dw=5 white godfrey=5 normal collin ; where date < enddate ; instruments rpm smbpr hmlpr umdpr ; solve xspr / dynamic stats theil ; where date < enddate ; run ; proc model data=tempsas model=model1 ; range date = 20060103 to 20061231 ; solve xspr / dynamic out=future1 stats theil ; run ; proc print data=future1 ; run ; /* TEST 9. RUNS OLS / GMM MARKET MODEL (BASED ON MARKOWITZ MEAN-VARIANCE MODEL) */ proc model data=tempsas outmodel=model2 ; title 'Test 9. Uses Proc Model with Single-factor Market Model to create Forecasts and Theil stats' ; pr = a0 + b1 * vwpr ; fit pr / ols gmm dw breusch= (vwpr) dw=5 white godfrey=5 normal collin ; instruments vwpr ; where date < enddate ; solve pr / dynamic stats theil ; where date < enddate ; run ; proc model data=tempsas model=model2 ; range date = 20060103 to 20061231 ; solve pr / dynamic out=future2 stats theil ; run ; proc print data=future2 ; run ; /* TEST 10. RUNS VECTOR AUTOREGRESSION (VAR) VERSION OF MARKET MODEL WITH N-LAGS OF DEPENDENT VARIABLE */ proc model data=tempsas outmodel=model3 ; title 'Test 10. Uses Proc Model with VAR model to create Forecasts and Theil stats' ; parms a0 b1 ; pr = a0 + b1 * vwpr ; * TO RUN PURE AUTOREGRESSIVE MODEL, REPLACE ABOVE EQUATION WITH THIS ONE: pr = a0 ; %ar( pr, 5, type=v) ; fit pr / list ; where date < enddate ; solve pr / dynamic stats theil ; where date < enddate ; run ; proc model data=tempsas model=model3 ; range date = 20060103 to 20061231 ; solve pr / dynamic nahead=1 out=future3 stats theil ; run ; proc print data=future3 ; run ; /* PLOTS INDIVIDUAL STOCK RETURNS AGAINST STOCK MARKET OR TIME */ /* proc gplot data=tempsas ; plot pr*vwpr = '+' / vref=0 href=0 ; * symbol1 i=join v=none ; run ; */