Last Update: February 12, 2020
Asset pricing models consist of estimating asset expected return through its expected risk premium linear relationship with factors portfolios expected risk premiums and macroeconomic factors.
This topic is part of Investment Portfolio Analysis with Python course. Feel free to take a look at Course Curriculum.
This tutorial has an educational and informational purpose and doesn’t constitute any type of trading or investment advice. All content, including code and data, is presented for personal educational use exclusively and with no guarantee of exactness of completeness. Past performance doesn’t guarantee future results. Please read full Disclaimer.
An example of asset pricing models is capital asset pricing model CAPM  which consists of estimating asset expected return through its expected risk premium linear relationship with market expected risk premium.
- CAPM Beta coefficient consists of estimating asset market systematic risk through the linear relationship between asset and market risk premiums.
- Jensen’s alpha  consists of estimating asset average realized excess return through the difference between asset average realized return and its estimated expected return using capital asset pricing model CAPM.
1. Formula notation.
1.1. Capital asset pricing model CAPM formula notation.
Where = asset expected return, = expected risk free return, = asset CAPM beta coefficient, = market expected risk premium.
1.2. CAPM Beta coefficient formula notation.
Where = risk free return, = constant, = asset CAPM beta coefficient, = asset and market returns covariance, = market returns variance, = asset and market risk premiums covariance, = market risk premiums variance.
1.3. Jensen’s alpha formula notation.
- Note: CAPM formula recasting using average realized returns (ex-post) instead of expected returns (ex-ante). For full reference, please read Jensen’s alpha .
Where = asset average realized excess return, = asset average realized return, = average realized risk free return, = asset CAPM beta coefficient, = market average realized return.
2. Python code example.
2.1. Import Python packages .
import numpy as np import pandas as pd import statsmodels.regression.linear_model as lm import statsmodels.tools.tools as ct
2.2. CAPM single factor model data reading.
- Data: S&P 500® index replicating ETF (ticker symbol: SPY) adjusted close prices and market portfolio  monthly arithmetic returns risk premiums (2007-2016).
returns = pd.read_csv('Data//CAPM-Single-Factor-Model-Data.txt', index_col='Date', parse_dates=True)
2.3. CAPM Single Factor Model Linear Regression Calculation and Output.
In: returns.loc[:, 'CT'] = ct.add_constant(returns) capm = lm.OLS(returns['SPY-RF'], returns[['CT', 'MKT-RF']], hasconst=bool).fit() print('== CAPM Linear Regression Summary ==') print('') print(capm.summary())
Out: == CAPM Linear Regression Summary == OLS Regression Results ============================================================================== Dep. Variable: SPY-RF R-squared: 0.992 Model: OLS Adj. R-squared: 0.992 Method: Least Squares F-statistic: 1.478e+04 Date: Thu, 24 Oct 2019 Prob (F-statistic): 7.80e-126 Time: 18:16:41 Log-Likelihood: 494.92 No. Observations: 120 AIC: -985.8 Df Residuals: 118 BIC: -980.3 Df Model: 1 Covariance Type: nonrobust ============================================================================== coef std err t P>|t| [0.025 0.975] ------------------------------------------------------------------------------ CT -0.0002 0.000 -0.439 0.661 -0.001 0.001 MKT-RF 0.9702 0.008 121.575 0.000 0.954 0.986 ============================================================================== Omnibus: 0.426 Durbin-Watson: 2.158 Prob(Omnibus): 0.808 Jarque-Bera (JB): 0.486 Skew: 0.138 Prob(JB): 0.784 Kurtosis: 2.856 Cond. No. 22.1 ============================================================================== Warnings:  Standard Errors assume that the covariance matrix of the errors is correctly specified.
2.4. CAPM Beta Calculation and Output.
In: print('CAPM Beta:', np.round((np.cov(returns['SPY-RF'], returns['MKT-RF'])/np.var(returns['MKT-RF'], ddof=1))[0, 1], 4))
Out: CAPM Beta: 0.9702
 Jack Treynor (1961, 1962), William F. Sharpe (1964), John Lintner (1965), Jan Mossin (1966). Craig W. French. “The Treynor Capital Asset Pricing Model”. Journal of Investment Management. 2003.
 Michael C. Jensen. “The Performance of Mutual Funds in the Period 1945-1964”. Journal of Finance. 1968.
 Travis E, Oliphant. “A guide to NumPy”. USA: Trelgol Publishing. 2006.
Stéfan van der Walt, S. Chris Colbert and Gaël Varoquaux. “The NumPy Array: A Structure for Efficient Numerical Computation”. Computing in Science & Engineering. 2011.
Wes McKinney. “Data Structures for Statistical Computing in Python.” Proceedings of the 9th Python in Science Conference. 2010.
Seabold, Skipper, and Josef Perktold. “Statsmodels: Econometric and statistical modeling with python.” Proceedings of the 9th Python in Science Conference. 2010.
 Eugene F. Fama and Kenneth F. French. “Common Risk Factors in the Returns on Stocks and Bonds,” Journal of Financial Economics. 1993.