Ivo Welch, October 2023

Time-Series Method (BJSFF)

BJSFF is the principal method of learning the alpha (abnormal rate of return) of an x-sect investment strategy.

Fama-MacBeth Vs BJSFF

  • As in FM, BJSFF requires that signals (based on which portfolios are formed) must be known ex-ante to investigate subsequent rates of returns

  • FM is good at investigating one or more signals relatively quickly and efficiently

  • Yet, FM’s signals are not an investment strategy’s weights

  • You typically want to learn the rate of return of an investment strategy

  • Thus, for the most part, FM is used first for investigating signals, and BJSFF is used later for investigating investment strategies designed around the signals.


Alpha

  • You typically want to learn the performance (rate of return) of a different and novel investment strategy,

  • while controlling for / benchmarking to the performance of other already known stock-market rate-of-return regularities.

  • The alpha of your investment strategy is this abnormal performance, i.e., above and beyond normal performance given other known investment strategies.

  • You must choose the “normal performance” benchmarks.

  • For example, you may want to learn the alpha of your strategy

    • relative to a risk-neutral model (every asset has the same rate of return)
    • relative to a CAPM (every asset has the same rate of return after controlling for the overall stock market return)
    • relative to a Fama-French 3-Factor model (will be explained later)

Zero-Investment Portfolios For Comparisons

We can only compare apple-to-apple portfolios for performance. It makes no sense to compare one portfolio for which you have paid $100 with one for which you paid nothing.

  • All returns in BJSFF are on zero-investment portfolios:

    • The zero-investment requirement includes the dependent variable. If you only have a long leg, you must subtract a risk-free rate of return.

    • It means net-of-risk-free also for one independent variable, the stock market rate of return. It is quoted as $xr_{mt} \equiv r_{mt} - r_{ft}$.

    • If you mess this up, everything you do next will be wrong.

BJSFF Example

  • Recycle the old example data set from the Fama-Macbeth slides

  • Again, one signal, with one realization each for 4 stocks and 7 time periods

       # 1 signal, but one for each of 4 stocks, and 7 time periods
    > empgrowA <- c( 3,  4,  1, -3,  0,  2,  NA )
    >xretA <- c( NA, -6, 12, -1, -22, 6,  -6 )/100.0
      
    > empgrowB <- c(-2, -2,  1,  1,  2,  4,  NA )
    >xretB <- c( NA, -2,-34,  1,  13, 12, 36 )/100.0
      
    > empgrowC <- c(-1,  3, -4, -1,  4, -2,  NA )
    >xretC <- c( NA, -7, 25,  2, -19, -6, -10)/100.0
      
    > empgrowD <- c( 0,  4, -2,  2, -1,  1,  NA )
    >xretD <- c( NA, -2, 29, 11, -5, -30, 7  )/100.0
      
    > d <- data.frame( time=1:length(empgrowA),xretA,xretB,xretC,xretD, empgrowA, empgrowB, empgrowC, empgrowD )
    > print( d )
    
time xretA xretB xretC xretD empgrowA empgrowB empgrowC empgrowD
1         3 -2 -1 0
2 -0.06 -0.02 -0.07 -0.02 4 -2 3 4
3 0.12 -0.34 0.25 0.29 1 1 -4 -2
4 -0.01 0.01 0.02 0.11 -3 1 -1 2
5 -0.22 0.13 -0.19 -0.05 0 2 4 -1
6 0.06 0.12 -0.06 -0.30 2 4 -2 1
7 -0.06 0.36 -0.10 0.07        

Nerd Note: For convenience (and equivalence with the fama-macbeth exhibit), all returns here have already been quoted in terms of rates of return minus the risk-free rate of return. For a long-short strategy with zero dollar investment, they just cancel out ($\sum w_i xr_i = \sum w_i r_i$, because $\sum w_i r_f = 0$).

Step 1: Choose Your (Zero-Investment) Strategy

  • Your investment strategy maps your known empgrownals into your investment weights.

  • It is up to you to decide how your signal should map to your portfolio investment weights

  • The only portfolio constraint is that your investment weights must add to zero

    • BJSFF only works with zero-investment portfolios!
    • Typically, such strategies are normalized to \$1 long and \$1 short. This is what every reader will assume.
  • If your strategy is not long-short but long only, you must make it net-zero:

    • make all investments add up to 1.0 for your long leg.
    • for your short leg, use the risk-free rate of return,
    • so subtract the risk-free rate, with weight 1.0.
  • Note that the very same “long-short normalization” is also always done with the market factor and even in the CAPM. In other words, we work with $r_{mt} - r_{ft}$.

Interpretation

  • You can think of a “standard” long-short zero-investment strategy in terms of dollars rather than in terms of percent. (It makes little sense to think of a percent rate of return on a \$0 investment!)

  • All portfolio algebra still works for this. For example, if your \$1 long and \$1 short strategy then has a net rate of return of \$0.05, it means the strategy has earned 5 cents cash.

  • You can now accumulate rates of returns in many years or months. The returns must not be compounded, because you do not have an original \$1 investment, where you would use a (1+r) formula. Again, what is the rate of return on a \$0 investment? NaN?

  • If you wish, you can assign an interest rate to the cash accumulation into a side wallet.

  • The instant any stock in your portfolio moves, your portfolio is really no longer zero investment. However, your portfolio must only be zero investment at the beginning of the time-period. That is, every period, you must rebalance the investment to \$0.

    • PS: You can choose the time-period length. If it is short, you have many time units, many requirements to rebalance your portfolio back to zero (and put the cash into a piggy bank), and good measurement control of your exposures to your factors (beta controls). If it is long, you have few time units, do not need to rebalance as often, but lousy measurement control for benchmark factors.

Example Strategy

Map From Your signal to Your Investment Weights:

  • In each time period

    • invest –$0.75 (short) into the stock with the lowest signal,
    • invest –$0.25 (short) into the 2nd-lowest signal stock,
    • invest +$0.25 (long) into the 2nd-highest signal stock,
    • invest +$0.75 (long) into the highest signal stock.
    • If both signals within leg are the same, invest half-half
  • Call this strategy PSAM (haha)

  • PSAM is a zero-investment portfolio, because the weights add to zero (in every time period).

  • Zero-investment strategies scale in perfect markets.

    • it does not cost more money to scale up the rate of return
    • By convention, it is usually easiest for everyone to understand what you are doing by making it $1 long and $1 short
    • The two parts are called the long leg and the short leg.

Step 2: Calculate Your Actual Portfolio Investment Weights

  • Follow your deempgrowned strategy slavishly.

  • Calculate the net-of-risk-free rate of return on your portfolio.

  • For example, in the first period, your worst signal is -2 for B, the best signal is +3 for A, etc. In our example,

stock A B C D
weight +$0.75 -$0.75 -$0.25 +$0.25
  • The following code is R programming magic. Ignore the code details. Just verify that the investment weights are indeed set as the strategy requires:

    > empgrows <- subset(d, TRUE, select=startsWith(names(d),"empgrow"))
    > wghts <- matrix( NA, nrow=nrow(empgrows), ncol=ncol(empgrows) )
    > for (r in 1:(nrow(d)-1)) wghts[r,] <- (rank(empgrows[r,])-2.5)/2
    > wghts[nrow(d),] <- rep(0.0,4)
    > colnames(wghts) <- paste0("w", c("A","B","C","D"))
    > stopifnot( all( rowMeans(wghts) == 0 ))  ## sanity check --- overall zero investment
    > d <- cbind(d, wghts)
    > print( subset(d, TRUE, select=c("empgrowA", "empgrowB", "empgrowC", "empgrowD", "wA", "wB", "wC", "wD")) )
    
empgrowA empgrowB empgrowC empgrowD wA wB wC wD
3 -2 -1 0 0.75 -0.75 -0.25 0.25
4 -2 3 4 0.50 -0.75 -0.25 0.50
1 1 -4 -2 0.50 0.50 -0.75 -0.25
0 2 4 -1 -0.25 0.25 0.75 -0.75
2 4 -2 1 0.25 0.75 -0.75 -0.25
        0.00 0.00 0.00 0.00
  • We no longer need the signals, so we can remove them permanently:

    > d <- subset(d, TRUE, select= -c(empgrowA,empgrowB,empgrowC,empgrowD))
    

Step 3: Calculate the Portfolio’s Overall Rate of Return

  • Calculate the rate of return on the strategy in each time unit. For example, at time 2 (the first time unit when you can earn a rate of return),
\[\color{red} \$0.75 \cdot (-6\%) + (-\$0.75) \cdot (-2\%) + (-\$0.25) \cdot (-7\%) + (+\$0.25) \cdot (-2\%) = -\$0.0175\]
  • Nerdnote: \(\color{red} \$0.75 \cdot (-6\% +r_f) + (-\$0.75) \cdot (-2\% +r_f) + (-\$0.25) \cdot (-7\% +r_f) + (+\$0.25) \cdot (-2\% +r_f) = -\$0.0175\)

Step 3A: Align Timing

  • To calculate portfolio rates of return with code, line up the lagged investment choices correctly with their subsequently earned rates of return.

  • This was already done in the Fama-Macbeth example.

    > lagseries <- function( x ) c( NA, x[1:(length(x)-1)] )
    > d <- within(d, {
        lgwD <- lagseries(wD)
        lgwC <- lagseries(wC)
        lgwB <- lagseries(wB)
        lgwA <- lagseries(wA)
      })
    > print( d )
    
time xretA xretB xretC xretD lgwA lgwB lgwC lgwD
1 NA NA NA NA NA NA NA NA
2 -0.06 -0.02 -0.07 -0.02 0.75 -0.75 -0.25 0.25
3 0.12 -0.34 0.25 0.29 0.50 -0.75 -0.25 0.50
4 -0.01 0.01 0.02 0.11 0.50 0.50 -0.75 -0.25
5 -0.22 0.13 -0.19 -0.05 -0.75 0.25 -0.25 0.75
6 0.06 0.12 -0.06 -0.30 -0.25 0.25 0.75 -0.75
7 -0.06 0.36 -0.10 0.07 0.25 0.75 -0.75 -0.25
  • We no longer need the weights, so we can remove them permanently:

    d <- subset(d, TRUE, select= -c(wA,wB,wC,wD))
    

Step 3B: Calculate Your Portfolio Return

  • calculate the

    > d <- within(d,xretpsam <- round(lgwA*xretA + lgwB*xretB + lgwC*xretC + lgwD*xretD, 4))
    > print( d )
    
  • We no longer need the individual rates of returns or lag weights, so we can remove them:

    > d <- subset(d, TRUE, select= -c(xretA,xretB,xretC,xretD,lgwA,lgwB,lgwC,lgwD))
    > print( d )
    
  • All we really need are just the time-series of our own portfolio rate of return, and of the market rate of return, both zero-investment portfolios:

time xretpsam
1 NA
2 -0.0175
3 0.3975
4 -0.0425
5 0.2075
6 0.1950
7 0.3125
  • Note that all signals and all returns just boiled down to one time-series: the rate of return of your zero-investment strsategy.

  • Compare the years in which you made good money with our investment strategy in this BJSFF method vs. the good years in the FM method.

Step 3C: Merge in the Benchmark Factors from Another Data Base

  • We need a market rate of return net of the risk-free rate.

    In real life, we would just download this data from CRSP or Ken French’s “Fama/French 3 Factors TXT CSV Details”:

            Mkt-RF     SMB     HML      RF
    192607    2.96   -2.30   -2.87    0.22
    192608    2.64   -1.40    4.19    0.25
    ...
    

    In the example, we pretend that the market is an equal-weighted portfolio of the 4 stocks, so we can reuse earlier information:

    > d <- within(d, xretmkt <- rowMeans(subset(d, TRUE, select=startsWith(names(d),"xret")), na.rm=T))
    
time xretA xretB xretC xretD xretmkt
1 NA NA NA NA NaN
2 -0.06 -0.02 -0.07 -0.02 -0.0425
3 0.12 -0.34 0.25 0.29 0.0800
4 -0.01 0.01 0.02 0.11 0.0325
5 -0.22 0.13 -0.19 -0.05 -0.0825
6 0.06 0.12 -0.06 -0.30 -0.0450
7 -0.06 0.36 -0.10 0.07 0.0675
  • The equal-weighted market portfolio is already net of the risk-free rate, because its four ingredients were so, too.

Step 4: Merge The Factor(s) For Benchmark Control

  • Align the time-series of our own portfolio rate of return, and of the market rate of return, both zero-investment portfolios:
time xretmkt xretpsam
1 NaN NA
2 -0.0425 -0.0175
3 0.0800 0.3975
4 0.0325 -0.0425
5 -0.0825 0.2075
6 -0.0450 0.1950
7 0.0675 0.3125
  • Both PSAM and RETMKT were zero investment, specifically by borrowing at the risk-free rate.

Step 5: Run A Single Time-Series Regression (Possibly Multiple Regressors)

The rate of return of your own portfolio (xrpsam), always quoted net of the risk-free rate of course, is always the dependent variable.

The 1-Factor (CAPM) Model

  • The CAPM is also called the 1-factor model. Its only independent variable is the excess rate of return on the market MKT:

    > print( coef(summary(lm(xretpsam ~xretmkt, data=d ))) )
                Estimate Std. Error t value Pr(>|t|)
    (Intercept)   0.1736    0.07291  2.3812  0.07589
    xretmkt       1.0873    1.18661  0.9163  0.41137
    >
    
  • This intercept is what is called the alpha of your strategy with respect to the 1-Factor Model

  • The beta measures how much your portfolio is like the stock market.

    • you may or may not want to short SP500 futures to hedge out this exposure if you do not like market-risk
  • In the example, the alpha was almost statistically empgrownificant at the 5% level (T=2.37, p=7.7%).

    • surprising with only 7 time periods—ok, I cooked the example.

    • the abnormal performance was 17.31% per time unit, insanely large, except the example was cooked.

The 0-Factor (Risk-Neutral) Model

  • The abnormal performance relative to a “0-factor model” (i.e., if the world were risk-neutral) would have been $17.54\%$.

  • Q: What is this?

    > print( coef(summary(lm(xretpsam ~ 1, data=d ))) )
                Estimate Std. Error t value Pr(>|t|)
    (Intercept)   0.1754     0.0717   2.447  0.05819
    >
    
  • This is the same as the average (net-of-risk-free) rates of return, which are also the abnormal rates of return relative to a 0-factor model:

    print( colMeans( d, na.rm=TRUE ) )
        time  xretmkt xretpsam 
    4.000000 0.001667 0.175417 
    

    and here is the T-test:

    > print( t.test(d$xretpsam) )
    data:  d$xretpsam
    t = 2.4, df = 5, p-value = 0.06
    alternative hypothesis: true mean is not equal to 0
    95 percent confidence interval:
     -0.008896  0.359729
    sample estimates:
    mean of x 
       0.1754 
    >
    

Other Models

  • You can do the same procedure controlling for more than just the market factors, e.g., SMB, HML, RMW, UMD, etc., from Ken French’s website.

  • Even if these are not risk factors, the tests are then “does your portfolio strategy beat the already documented performances of their factors?” Does it offer anything new?

  • Q: What would this be?

    > print( coef( summary(lm(xretpsam ~xretmkt + xretsmb + xrethml, data=d )) ) )
    

Reflection

  • We had known signals and subsequent rates of return for each stock and time period.

  • We formed portfolios based on our signals

    • One portfolio formed at the end of each period.

    • Each portfolio ingredient weight was (based on) our investment strategy.

    • Our investment strategy translated our signal(s) into investment weights.

    • The weights added to zero.

    • We could have mapped signals into investment weights in other ways.

    • We could have done so with many signals: $w(s_{1,t},s_{2,t})= …$.

  • We calculated the post-portfolio formation rates of return on our portfolio.

  • These per-period returns were not necessarily ``abnormal’’ rates of return:
    • We had to define what is normal.
    • For example, our portfolio had a high beta, and all stocks had gone up at the same time?
  • So, we obtained a time-series of portfolios that reflect other signals’ performance. What are good examples?

    • SMB, HML, etc.. Go to French’s website.
  • We could have skipped the FM reg, but this would have required us to define the signal-to-weight map first. Usually, FM works nicely for useful signals even without the map. FM is a better exploratory tool.

A Bit More Formal

  • Run a single time-series regression. For example, if you want the CAPM or an extended model, use
\[\color{red} (r_{pt} - r_{ft}) = \alpha_p + \beta_p * \left( r_{mt} - r_{ft} \right) + ... + \epsilon_{pt}\]
  • Note the subscripts. Make sure you run such a regression once, so you understand their meaning.

  • Make sure that $r_{pt}$ here is long only, so the LHS is a net (zero investment!) rate of return.
    • If it is already zero investment, do not subtract the risk-free rate on the LHS.
  • Only use investable zero-investment portfolios into the BJSFF time-series regression.
    • Otherwise, alpha becomes meaningless.
  • Zero-investment portfolios are sometimes incorrectly called arbitrage portfolios.
    • They are absolutely not arbitrage, because they carry risk.
  • The interesting regression output is $\alpha_p$. You can use its OLS T-stats, etc. (They are often Newey-West heteroskedasticity adjusted for even better accuracy, but this is not required.)

  • BJSFF time-series regressions are not obsolete.
    • Every quant fund in the world runs these
    • When they talk about alpha, this is exactly what they mean.

Alpha or Beta?

  • Note that other investment regularities can be interesting, even if they have on average a true alpha of zero.

  • What if you have knowledge that taking on “SMB” risk earns higher rates of return, but your clients do not?

  • For example, consider your strategy relative to a CAPM. In any subperiod, the market may have gone up all the time or gone down all the time.

  • Even if the CAPM holds perfectly, and thus there is no alpha to be had on average, in your subperiod, this may not be true.

  • In the extreme, consider a case in which the (net-of-rf) stock market would randomly return +10% or -10%.

    • the average net-of-rf market rate of return is truly 0.

    • but you only test 1 period.

    • for example, in this period, the excess market return was 10%, your portfolio beta was 1, and your portfolio had a rate of return of 10%.

    • Ergo, your strategy had zero alpha, even though it had a great market-rate of return.

Conclusion

BJSFF time-series regressions can explain/decompose your investment portfolio performance into terms of other known investment strategies’ performances (each beta times the factor realization) plus your strategy’s idiosyncratic performance, i.e., its alpha.


Is Performance Deserved or Not?

This example may be more confusing than useful. It tries to show how you can get different alphas depending on the benchmark model you would use. If you omit important benchmark factors, you may think you outperformed, when in reality you did not.

  • Let’s say there are two important and uncorrelated pricing factors in the economy, $XMKT$ and $ABC$.

  • Your managed portfolio $p$ invests half in each factor, but also has a leak. Its returns are $xr_{pt} = 1/2 \cdot XMKT_t + 1/2 \cdot ABC_t - 0.01$.

    • Your performance sucks. You bought half of each portfolio, but there is an additional out-trickle of 1\%.
  • By pure chance, over your sample period, say $XMKT$ had a rate of return of $-10\%$, and $ABC$ had a rate of return of $+6\%$.

    • Your zero-investment portfolio therefore returns $xr_{pt} = -5\% + 3\% -1\% = -3\%$.
  • How did your portfolio perform relative to a the 0-Factor risk-free measurement model ?

    • The risk-free rate here was already subtracted out, so it is net zero. You had an alpha of $-3\%$.

    • Your portfolio is indicated to have sucked!

  • How did your portfolio perform relative to a the 1-Factor $XMKT$ measurement model ?

    • With an exposure of 0.5 to $XMKT$, the model thinks your portfolio should have earned $1/2 \cdot (-10\%)= -5\%$. It attributes an alpha of $+2\%$.

    • Your portfolio seems to have done great!

  • How did your portfolio perform relative to a the 1-Factor ABC measurement model ?

    • With an exposure of 0.5 to $ABC$, the model thinks your portfolio should have earned $1/2 \cdot (+6\%)= 3\%$. It attributes an alpha of $-5\%$.

    • Your portfolio is indicated to have sucked!

  • How did your portfolio perform relative to a the 2-Factor measurement model ?

    • With an exposure of 0.5 to each, the model thinks your portfolio should have earned $1/2 \cdot (-10\%) + 1/2 \cdot (+6\%)= -2\%$.

    • Ergo, it thinks that you underperformed: Alpha is $-$1\%$.

  • Reflect on this:

    • You can have positive alpha with respect to the $XMKT$ model. This says that your suck-portfolio outperformed the market. And indeed it did.

    • This is because your measurement model determines what is considered normal or not.

    • It is not uncommon to have positive alpha with respect to one model and negative alpha with respect to another.

    • You must understand what this does and does not mean.

  • In the real world, you can often hedge out exposures. For example, you could short a market future to remove the $XMKT$ exposure and performance. It should not affect your alpha. (In some sense, this is the intuition behind the logic here.)

  • As a manager, do you deserve credit for having avoided full exposure to the market?

  • As a manager, do you deserve credit for having taken exposure to the ABC factor?

  • (Do your investors know about these exposures? Do you add value this way?)

  • (You could use the BJSFF weight as a signal in a FM regression, but there is rarely a need to do so. It is more a conceptual point. Once you have the weights, you may as well use BJSFF.)

/teaching/asam/03-asam-bjsff.html Last modified: