Regression Analysis for Financial Relationships › Multiple Regression and Factor Models
Quantitative FinanceAll chapters Regression Analysis for Financial Relationships › Multiple Regression and Factor ModelsOne section · Sections in this chapter7 / 12 ↓
While the market model uses a single factor, financial research has established that multiple factors explain cross-sectional return variation. The single-factor CAPM leaves significant patterns unexplained: small stocks earn higher average returns than large stocks, and value stocks (high book-to-market) earn more than growth stocks. These patterns motivated the development of multi-factor models that better capture the systematic risks in equity markets.
The Fama-French three-factor model adds size (SMB: Small Minus Big) and value (HML: High Minus Low) factors:
where:
- : excess return on asset
- : excess return on the market portfolio
- : Small Minus Big size factor, capturing the return premium of small stocks over large stocks
- : High Minus Low value factor, capturing the return premium of value stocks over growth stocks
- : intercept (abnormal return)
- : market beta
- : stock's sensitivity to the size factor
- : stock's sensitivity to the value factor
- : error term
Each coefficient represents exposure to a different systematic risk factor. The market beta captures overall equity market risk. The SMB loading indicates whether the stock behaves more like a small-cap or large-cap stock, regardless of its actual size. The HML loading reveals whether the stock exhibits value or growth characteristics in its return behavior. We'll explore these multi-factor models thoroughly in Part IV when we cover Arbitrage Pricing Theory.
Implementing Multi-Factor Regression
# Generate stock return with multiple factor exposures
np.random.seed(101)
n = 504
# Generate factor returns
mkt_factor = np.random.normal(0.0004, 0.012, n) # Market excess return
smb_factor = np.random.normal(0.0001, 0.008, n) # Size factor
hml_factor = np.random.normal(0.0001, 0.007, n) # Value factor
# True exposures: high market beta, positive size tilt, negative value tilt
true_betas = {"market": 1.15, "smb": 0.4, "hml": -0.25}
true_alpha_ff = 0.0001 # Small positive alpha
stock_ff = (
true_alpha_ff
+ true_betas["market"] * mkt_factor
+ true_betas["smb"] * smb_factor
+ true_betas["hml"] * hml_factor
+ np.random.normal(0, 0.012, n)
)
# Create DataFrame
ff_df = pd.DataFrame(
{
"excess_return": stock_ff,
"MKT": mkt_factor,
"SMB": smb_factor,
"HML": hml_factor,
}
)
# Fit three-factor model
X_ff = sm.add_constant(ff_df[["MKT", "SMB", "HML"]])
model_ff = sm.OLS(ff_df["excess_return"], X_ff).fit(
cov_type="HAC", cov_kwds={"maxlags": 4}
)Fama-French Three-Factor Model Results ============================================================ Factor True β Estimate Std Err t-stat p-value ------------------------------------------------------------ Alpha 0.0001 0.001172 0.000554 2.12 0.0344 Market 1.1500 1.0826 0.0458 23.62 2.3307e-123 SMB 0.4000 0.3942 0.0684 5.76 0.0000 HML -0.2500 -0.3324 0.0726 -4.58 0.0000 ------------------------------------------------------------ R-squared: 0.5526 Adjusted R-squared: 0.5499 F-statistic: 204.16 (p-value: 1.97e-86)
The results show significant exposure to all three factors. The stock has a market beta of approximately 1.15, meaning it's more volatile than the market. The positive SMB loading indicates a tilt toward small-cap characteristics, while the negative HML loading suggests growth rather than value exposure. Adding factors improves the model's explanatory power, as shown by the higher R-squared compared to a single-factor model.

Comparing Single and Multi-Factor Models
# Fit single-factor (CAPM) model for comparison
X_capm = sm.add_constant(ff_df["MKT"])
model_capm = sm.OLS(ff_df["excess_return"], X_capm).fit(
cov_type="HAC", cov_kwds={"maxlags": 4}
)Model Comparison: CAPM vs. Three-Factor --------------------------------------------- Metric CAPM 3-Factor --------------------------------------------- R-squared 0.5060 0.5526 Adjusted R-squared 0.5050 0.5499 Residual Std Err 0.013374 0.012752 Alpha (annualized) 31.81% 29.53%

