Great Deal! Get Instant $10 FREE in Account on First Order + 10% Cashback on Every Order Order Now

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...

1 answer below »
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
Answered 1 days After Oct 21, 2021

Solution

Sathishkumar answered on Oct 22 2021
125 Votes
solutions/forecast.ipyn
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"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": 2,
"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": 99,
"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>='1926-12-01'\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": 100,
"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": 101,
"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": 102,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"IS R^2 = 0.402\n",
"OOS R^2 = -0.942\n"
]
}
],
"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": 103,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Difference in Certainty Equivalence = 0.1519\n"
]
}
],
"source": [
"print('Difference in Certainty Equivalence = %7.4f'%(100*(CE-CE_Hist)))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#Recompute the out-of-sample R2 and ∆CEV in part (1) by forcing the predicted market risk premium to be nonnegative."
]
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"IS R^2 = 0.402\n",
"OOS R^2 = -0.942\n",
"Difference in Certainty Equivalence = -0.0046\n"
]
}
],
"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\n",
"\n",
"# 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\")\n",
"\n",
"# 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 = ['svar','dfr','lty','ltr','infl','tbl','dfy','DP','DY','EP','
m','ntis']\n",
"\n",
"# Use the data from 1926/12 to 2020/12\n",
"subperiod = df_monthly.index>='1926-12-01'\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)\n",
"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\n",
"\n",
"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)\n",
"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))\n",
"print('Difference in Certainty Equivalence = %7.4f'%(100*(CE-CE_Hist)))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#median of various forecasts "
]
},
{
"cell_type": "code",
"execution_count": 104,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"IS R^2 = 0.402\n",
"OOS R^2 = -0.162\n",
"Difference in Certainty Equivalence = 0.6681\n"
]
}
],
"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\n",
"\n",
"# 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\")\n",
"\n",
"# 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 = ['svar','dfr','lty','ltr','infl','tbl','dfy','DP','DY','EP','
m','ntis']\n",
"\n",
"# Use the data from 1926/12 to 2020/12\n",
"subperiod = df_monthly.index>='1926-12-01'\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_median = np.asa
ay(df[dep_var].expanding().median().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_median[M+1:])**2)\n",
"\n",
"# Benchmark Certainty Equivalence\n",
"w0 = ((1/gam)*(Hist_median/Hist_Variance)).clip(None,1.5);\n",
"r0 = df[dep_var]*w0\n",
"CE_Hist = np.median(r0[M+1:])-gam/2*np.var(r0[M+1:],ddof=1)\n",
"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\n",
"\n",
"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.median(r1[M+1:])-gam/2*np.var(r1[M+1:],ddof=1)\n",
"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))\n",
"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.8.8"
}
},
"nbformat": 4,
"nbformat_minor":...
SOLUTION.PDF

Answer To This Question Is Available To Download

Related Questions & Answers

More Questions »

Submit New Assignment

Copy and Paste Your Assignment Here