// RStudio: “Use Knit”
NOTE: BJSFF = Black-Jensen-Scholes (1972) = Fama-French (1993)
In all methods, signals must be known ex-ante to investigate subsequent rates of returns
FM is good at investigating one or more signals
Yet, a signal is not an investment strategy
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 FF is used later for investigating investment strategies designed around the signals.
You typically want to learn the rate of return of an investment strategy,
while controlling for the performance of other stock-market rate of return regularities.
The alpha of your investment strategy is the 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
Recycle the old example data set from the Fama-Macbeth slides
Returns are always quoted net-of-risk-free:
# 1 signal, but one for each of 4 stocks, and 7 time periods
sigA <- c( 3, 4, 1, -3, 0, 2, NA )
retA <- c( NA, -6, 12, -1, -22, 6, -6 )/100.0
sigB <- c(-2, -2, 1, 1, 2, 4, NA )
retB <- c( NA, -2,-34, 1, 13, 12, 36 )/100.0
sigC <- c(-1, 3, -4, -1, 4, -2, NA )
retC <- c( NA, -7, 25, 2, -19, -6, -10)/100.0
sigD <- c( 0, 4, -2, 2, -1, 1, NA )
retD <- c( NA, -2, 29, 11, -5, -30, 7 )/100.0
d <- data.frame( time=1:length(sigA), retA, retB, retC, retD, sigA, sigB, sigC, sigD )
p(d)
Your investment strategy maps your known signals 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
If your strategy is not long-short but long only, you must make it net-zero:
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 \(E(r_m)-r_f\).
You can think of a “standard” long-short strategy in terms of dollars rather than in terms of percent.
All portfolio algebra 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 it earned 5 cents cash.
You can now accumulate this over many months. It is not compounded, because you do not have an original $1 investment, where you would use a (1+r) formula.
You can assign an interest rate to the cash accumulation.
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.
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.
Map From Your Signal to Your Investment Weights:
In each time period
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.
Follow your designed 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 |
sigs <- subset(d, TRUE, select=startsWith(names(d),"sig"))
wghts <- matrix( NA, nrow=nrow(sigs), ncol=ncol(sigs) )
for (r in 1:(nrow(d)-1)) wghts[r,] <- (rank(sigs[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)
p( subset(d, TRUE, select=c("sigA", "sigB", "sigC", "sigD", "wA", "wB", "wC", "wD")) )
d <- subset(d, TRUE, select= -c(sigA,sigB,sigC,sigD))
\[ R_{t=2} = \$0.75\cdot(-6\%) + (-\$0.75)\cdot (-2\%) + (-\$0.25)\cdot(-7\%) + (+\$0.25)\cdot (-2\%) = -\$0.0175 \]
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, {
lwD <- lagseries(wD)
lwC <- lagseries(wC)
lwB <- lagseries(wB)
lwA <- lagseries(wA)
})
p(d)
d <- subset(d, TRUE, select= -c(wA,wB,wC,wD))
d <- within(d, retmkt <- round( rowMeans(subset(d, TRUE, select=startsWith(names(d),"ret")), na.rm=T),4))
d <- within(d, retpsam <- round(lwA*retA + lwB*retB + lwC*retC + lwD*retD, 4))
p(d)
d <- subset(d, TRUE, select= -c(retA,retB,retC,retD,lwA,lwB,lwC,lwD))
print(coef(summary(lm( retpsam ~ retmkt, data=d ))))
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.1736 0.07291 2.3812 0.07589
## retmkt 1.0873 1.18661 0.9163 0.41137
The abnormal performance relative to a “0-factor model” (i.e., if the world were risk-neutral) would have been 17.54%
You can do the same procedure controlling for more than just the market factors, e.g., SMB, HML, RMW, UMD, etc.
Q: What is this?
print(coef(summary(lm( retpsam ~ 1, data=d ))))
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.1754 0.0717 2.447 0.05819
Compare 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 retmkt retpsam
## 4.000000 0.001667 0.175417
print(t.test(d$retpsam))
##
## One Sample t-test
##
## data: d$retpsam
## 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
print( coef( summary(lm( retpsam ~ retmkt + retsmb + rethml, data=d )) ) )
We had known signals and subsequent rates of return for each stock and time period.
We formed portfolios based on our signals
We calculated the post-portfolio formation rates of return on our portfolio.
These per-period returns were not necessarily ``abnormal’’ rates of return:
So, we obtained a time-series of portfolios that reflect other signals’ performance. What are good examples?
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.
Run a single time-series regression. For example, if you want the CAPM or an extended model, use
\[ (r_{pt} - r_{ft}) = \alpha_p + \beta_p \cdot \left( M_{it} - 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.
Only use investable zero-investment portfolios into the FF time-series regression.
Zero-investment portfolios are sometimes incorrectly called arbitrage portfolios.
The interesting regression output is \(\alpha_p\). You can use its OLS T-stats, etc. (They are often Newey-West adjusted.)
BJSFF time-series regressions are not obsolete.
Note that other investment regularities can be interesting, even if they have on average a true alpha of zero.
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%.
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.
Let’s say there are two important and uncorrelated pricing factors in the economy. XMKT and ABC.
Your managed portfolio \(p\) returns \(r_p = 1/2\cdot XMKT + 1/2\cdot ABC - 0.01\).
By pure chance, over your sample period, XMKT had a rate of return of \(-10%\), and ABC had a rate of return of \(+6%\).
How did your portfolio perform relative to a the 0-Factor risk-free measurement model ?
How did your portfolio perform relative to a the 1-Factor XMKT measurement model ?
How did your portfolio perform relative to a the 1-Factor ABC measurement model ?
How did your portfolio perform relative to a the 2-Factor measurement model ?
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?)