UNIVERSITY OF TORONTO
Rotman School of Management
RSM316 PROBLEM SET #3 Raymond Kan
The file PredictorData2020.xlsx contains the data for the Welch and Goyal (RFS 2008)
paper, but updated to the end of 2020. The data is from Professor Amit Goyal’s website.
We will be using only the monthly data for this problem set. A demo Jupyter notebook
hw3 demo.ipynb demonstrates how to read the data from this spreadsheet and replicates
some of the figures in the paper.
1. Consider the following predictive regression
t = α + βxt−1 + ϵt, t = 1927/1, . . . , 2020/12,
where rt is the excess (simple arithmetic) return of the value-weighted market portfolio
(in excess of risk-free rate), and xt−1 is a predictive variable. Run this predictive
egression for each one from the following set of predictive variables: d/e, svar, dfr,
lty, ltr, infl, tms, tbl, dfy, d/p, d/y, e/p,
m, and ntis. For each predictive regression,
eport (1) In-sample R2, (2) Out-of-sample R2 (using expanding window with an initial
estimation period of 240 months), (3) ∆CEV for a mean-variance investor with γ = 3
(and a maximum weight of 150% on the market portfolio). Also perform this with a
kitchen-sink predictive regression that includes all the predictive variables. For this
multiple regression, drop d/e and tms to avoid multicollinearity issue.
2. Recompute the out-of-sample R2 and ∆CEV in part (1) by forcing the predicted
market risk premium to be nonnegative.
3. Consider two combination forecasts from the various predictive regressions with single
predictor. The first combination forecast is based on the median of various forecasts and
the second combination forecast is based on the mean of various forecasts. Compute
the out-of-sample R2 and ∆CEV for these two combination forecasts.
1
{
"cells": [
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# Import the modules\n",
"import pandas as pd\n",
"import numpy as np\n",
"from datetime import datetime\n",
"from tqdm import tqdm_notebook as tqdm\n",
"import statsmodels.api as sm"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"# Import Data\n",
"df_monthly = pd.read_excel('PredictorData2020.xlsx',sheet_name=\"Monthly\")\n",
"# Parse the dates properly\n",
"time = [str(d) for d in df_monthly.yyyymm]\n",
"df_monthly.index = pd.to_datetime(time,format=\"%Y%m\")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"# Variable construction\n",
"df_monthly['ExRet'] = df_monthly['CRSP_SPvw']-df_monthly['Rfree']\n",
"df_monthly['DP'] = np.log(df_monthly['D12'])-np.log(df_monthly['Index'])\n",
"df_monthly['DY'] = np.log(df_monthly['D12'])-np.log(df_monthly['Index'].shift())\n",
"df_monthly['EP'] = np.log(df_monthly['E12'])-np.log(df_monthly['Index'])\n",
"df_monthly['DE'] = np.log(df_monthly['D12'])-np.log(df_monthly['E12'])\n",
"df_monthly['tms'] = df_monthly['lty']-df_monthly['tbl']\n",
"df_monthly['dfr'] = df_monthly['corpr']-df_monthly['ltr']\n",
"df_monthly['dfy'] = df_monthly['BAA']-df_monthly['AAA']\n",
"\n",
"# infl needs to be lagged one more month\n",
"df_monthly['infl'] = df_monthly['infl'].shift().copy()\n",
"\n",
"# Construction of dependent and independent variables\n",
"dep_var = 'ExRet'\n",
"indep_vars = ['DE','svar','dfr','lty','ltr','infl','tms','tbl','dfy','DP','DY','EP','
m','ntis']\n",
"\n",
"# Use the data from 1926/12 to 2020/12\n",
"subperiod = df_monthly.index>=' XXXXXXXXXX'\n",
"df = df_monthly[subperiod]\n",
"M = 240 # Initial length of estimation window\n",
"gam = 3 # risk aversion coefficient\n",
"\n",
"# Create the benchmark using historical average\n",
"Hist_Mean = np.asa
ay(df[dep_var].expanding().mean().shift())\n",
"Hist_Variance = np.asa
ay(df[dep_var].expanding().var().shift())\n",
"\n",
"# Benchmark SSE (Historical Average)\n",
"OOS_SSE_Hist = np.sum((df[dep_var][M+1:]-Hist_Mean[M+1:])**2)\n",
"\n",
"# Benchmark Certainty Equivalence\n",
"w0 = ((1/gam)*(Hist_Mean/Hist_Variance)).clip(None,1.5);\n",
"r0 = df[dep_var]*w0\n",
"CE_Hist = np.mean(r0[M+1:])-gam/2*np.var(r0[M+1:],ddof=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### The following codes demonstrate how to compute OOS $R^2$ and CEV for one predictive regression (using DY)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"Y = np.asa
ay(df[dep_var])\n",
"X = np.asa
ay(df['DY'])\n",
"Y_Hat = np.full(len(Y), np.nan)\n",
"X = sm.add_constant(X)\n",
"# Note that we start the index at M+1 because the first element of predicted return is at t=M+2.\n",
"for i in range(M+1,len(Y)):\n",
" Y1 = Y[1:i]\n",
" X1 = X[0:i-1,:] \n",
" reg = sm.OLS(Y1, X1, missing='drop').fit()\n",
" Y_Hat[i] = reg.predict(X[i-1,:]) # The predicted value is based on the observation before"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"OOS_SSE = np.sum((Y[M+1:]-Y_Hat[M+1:])**2)\n",
"OOS_R2 = 1-OOS_SSE/OOS_SSE_Hist\n",
"w1 = ((1/gam)*(Y_Hat/Hist_Variance)).clip(None,1.5);\n",
"r1 = Y*w1\n",
"CE = np.mean(r1[M+1:])-gam/2*np.var(r1[M+1:],ddof=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### In-sample $R^2$ and out-of-sample $R^2$"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"IS R^2 = XXXXXXXXXXn",
"OOS R^2 = XXXXXXXXXXn"
]
}
],
"source": [
"reg1 = sm.OLS(Y[1:],X[0:len(Y)-1,:],missing='drop').fit()\n",
"IS_R2 = reg1.rsquared\n",
"print(\"IS R^2 = %6.3f\"%(100.0*IS_R2))\n",
"print(\"OOS R^2 = %6.3f\"%(100.0*OOS_R2))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### $\\Delta CEV$"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Difference in Certainty Equivalence = XXXXXXXXXXn"
]
}
],
"source": [
"print('Difference in Certainty Equivalence = %7.4f'%(100*(CE-CE_Hist)))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemi
or_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Monthly
yyyymm Index D12 E12
m tbl AAA BAA lty ntis Rfree infl ltr corpr svar csp CRSP_SPvw CRSP_SPvwx
187101 4.44 0.2600 0.4000 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
187102 4.50 0.2600 0.4000 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187103 4.61 0.2600 0.4000 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187104 4.74 0.2600 0.4000 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187105 4.86 0.2600 0.4000 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187106 4.82 0.2600 0.4000 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187107 4.73 0.2600 0.4000 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187108 4.79 0.2600 0.4000 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187109 4.84 0.2600 0.4000 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187110 4.59 0.2600 0.4000 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187111 4.64 0.2600 0.4000 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187112 4.74 0.2600 0.4000 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187201 4.86 0.2633 0.4025 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187202 4.88 0.2667 0.4050 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187203 5.04 0.2700 0.4075 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187204 5.18 0.2733 0.4100 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187205 5.18 0.2767 0.4125 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187206 5.13 0.2800 0.4150 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187207 5.10 0.2833 0.4175 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187208 5.04 0.2867 0.4200 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187209 4.95 0.2900 0.4225 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187210 4.97 0.2933 0.4250 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187211 4.95 0.2967 0.4275 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187212 5.07 0.3000 0.4300 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187301 5.11 0.3025 0.4325 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187302 5.15 0.3050 0.4350 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187303 5.11 0.3075 0.4375 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187304 5.04 0.3100 0.4400 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187305 5.05 0.3125 0.4425 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187306 4.98 0.3150 0.4450 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187307 4.97 0.3175 0.4475 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187308 4.97 0.3200 0.4500 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187309 4.59 0.3225 0.4525 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187310 4.19 0.3250 0.4550 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187311 4.04 0.3275 0.4575 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187312 4.42 0.3300 0.4600 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187401 4.66 0.3300 0.4600 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187402 4.80 0.3300 0.4600 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187403 4.73 0.3300 0.4600 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187404 4.60 0.3300 0.4600 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187405 4.48 0.3300 0.4600 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187406 4.46 0.3300 0.4600 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187407 4.46 0.3300 0.4600 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187408 4.47 0.3300 0.4600 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187409 4.54 0.3300 0.4600 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187410 4.53 0.3300 0.4600 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187411 4.57 0.3300 0.4600 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187412 4.54 0.3300 0.4600 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187501 4.54 0.3275 0.4517 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187502 4.53 0.3250 0.4433 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187503 4.59 0.3225 0.4350 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187504 4.65 0.3200 0.4267 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187505 4.47 0.3175 0.4183 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187506 4.38 0.3150 0.4100 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187507 4.39 0.3125 0.4017 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187508 4.41 0.3100 0.3933 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187509 4.37 0.3075 0.3850 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187510 4.30 0.3050 0.3767 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187511 4.37 0.3025 0.3683 NaN NaN NaN NaN NaN NaN XXXXXXXXXX NaN NaN NaN NaN NaN NaN NaN
187512 4.37 0.3000 0.3600 NaN NaN NaN NaN NaN NaN 0