## Constructing equally weighted returns for Fama French factors

Hi guys,  I have a dataset called crsp3 that contains a time series of stock returns, prices and other variables of interest. I tried to build portfolios based on market equity and B/M by rebalancing every June from 1985 till 2019. I first started by value-weighting all stocks ( check code below) but I am not sure how I can do the same by equally weighting these stocks. Any ideas how I can do this?

```data crsp4 (keep=permno date retadj weight_port ME exchcd shrcd cumretx)
decme (keep = permno date ME rename=(me=DEC_ME) )  ;
set crsp3;
by permno date;
retain weight_port cumretx me_base; /* portfolio weights and cumulative returns*/
Lpermno=lag(permno);
LME=lag(me);
if first.permno then do;
LME=me/(1+retx); cumretx=sum(1,retx); me_base=LME;weight_port=.;end;
else do;
if month(date)=7 then do;
weight_port= LME;
me_base=LME; /* lag ME also at the end of June */
cumretx=sum(1,retx);
end;
else do;
if LME>0 then weight_port=cumretx*me_base;
else weight_port=.;
cumretx=cumretx*sum(1,retx);
end; end;
output crsp4;
if month(date)=12 and ME>0 then output decme;
run;```
4 REPLIES 4

## Re: Constructing equally weighted returns for Fama French factors

If you are looking to construct an equal-weight portfolio, read this recent SASGF 2020 paper. It provides an example on page 14:  https://www.sas.com/content/dam/SAS/support/en/sas-global-forum-proceedings/2020/4306-2020.pdf

Best of luck,

Shelley

## Re: Constructing equally weighted returns for Fama French factors

You program doesn't actually calculate weighted returns.  It calculates individual returns for each PERMNO.  And yes, it also makes a variable ME_BASE, starting each July that you would presumably use to generate portfolio value at the end of each June.

So, for equal-weighted you would have a constant analog to "ME_BASE" to start each July.   If that constant analog is 1, this in turn means, all you have to do get the geometric mean of CUMRETX (and finally substract one to get the actual return) over all permno's in each June. That would be the portfolio return for equal-weighted components.

--------------------------
The hash OUTPUT method will overwrite a SAS data set, but not append. That can be costly. Consider voting for Add a HASH object method which would append a hash object to an existing SAS data set

Would enabling PROC SORT to simultaneously output multiple datasets be useful? Then vote for
Allow PROC SORT to output multiple datasets

--------------------------

## Re: Constructing equally weighted returns for Fama French factors

I would first like to thank you for your time. Just to be clear; should I create a new variable in my dataset, for instance, "const" and assigned it constant value x for all permnos across time, then on top of the previous code add an if statement, where I tell sas to find the geometric average and subtract one if const= x in june? I say June because I´m supposed to rebalance every July.

## Re: Constructing equally weighted returns for Fama French factors

```data crsp4b (keep=permno date retadj  retx weight_port ME me_base LME exchcd shrcd cumretx)
decme (keep = permno date ME rename=(me=DEC_ME) )  ;
set crsp3;
by permno date;
retain weight_port cumretx me_base; /* portfolio weights and cumulative returns*/
Lpermno=lag(permno);
LME=lag(me);
if first.permno then do;
LME=me/(1+retx); cumretx=sum(1,retx); me_base=1;weight_port=.;end;
else do;
if month(date)=7 then do;
weight_port= geomean( cumretx)-1;
me_base=1; /* lag ME also at the end of June */
cumretx=sum(1,retx);
end;
else do;
if LME>0 then weight_port=cumretx*me_base;
else weight_port=.;
cumretx=cumretx*sum(1,retx);
end; end;
output crsp4b;
if month(date)=12 and ME>0 then output decme;
run;```

Is this what you meant?

Discussion stats
• 4 replies
• 920 views
• 1 like
• 3 in conversation