Including bond factors into the new Gaussian model

And fitting the new model of 5 asset classes with 4 market factors.

Update: We completely finished writing the full-model subfolder of my GitHub repository asarantsev/Gaussian-Innovations where we have files regarding our new 5-asset classes simulator. See the README file there for a detailed description. We have:

  1. model verification with analyzing residuals for Gaussian IID in checkFullModel.py
  2. printing out all regressions and the covariance and correlation matrix for residuals in model8.py
  3. simulating the five asset classes returns given time horizon and initial market factors in simFullModel.py
  4. simulating the wealth process from these series of returns and returning the graph in appFullModel.py
  5. and finally, testing the output by using these last two Python files in testFullModel.py

Files 3 and 4 will form the core of the future updated online financial simulator app. But for now, we leave them in the form of just Python files. The reason for that: We submitted a manuscript based on the current (in my view, outdated) version of the financial simulator with only 3 asset classes and non-Gaussian (but still IID) residuals. And we wish to publish it in a peer-reviewed journal before changing the online app.

Introduction. Recall this blog post where we modeled stock returns using bond spreads. It continues this blog post, which, in turn, improves upon this foundational post. I wish to include the risk spreads BAA-AAA or BAA-Long as factors for stock returns, continuing this research. We use the valuation measure based on one-year dividends instead of ten-year earnings. Also, we continue this blog post. Maybe these risk spreads will improve our prediction.

But we need to ensure that innovations and residuals are independent identically distributed and Gaussian.

Also, we include emerging markets (MSCI EM) alongside with international developed markets (MSCI EAFE 88% + MSCI Canada 12%).

Review of previous research. Recall the term spread Long-Short might be useful. But it does not fit our Gaussian assumptions for innovations. This is why we do not consider this here. But, as mentioned above, we use the valuation measure based on one-year dividends instead of ten-year earnings. It satisfies the autoregression of order 1 with stochastic volatility:

 H(t) - H(t-1) = -0.1738 H(t-1) + 0.1699 + V(t)W_H(t).

Also, recall the autoregression of order 1 for the volatility on the log scale:

 \ln V(t) - \ln V(t-1) = -0.3824 \ln V(t-1) + 0.8569 + W_V(t).

Treasury bond returns. Include Long in our model, since this will allow us to model long-term Treasury returns. Indeed, Long corresponds to 10-year yields but with coupons. This makes it difficult to compute returns explicitly. However, we have 10-year and 9-year zero-coupon bonds which have yields very close to these 10-year coupons. See the Federal Reserve Economic Data. Indeed, let  R(t) be the end-of-year (December daily average, more precisely) rate (assuming these three rates are the same). Then the price of a 10-year zero-coupon bond at end of year  t-1 is  P_0 = (1 + R(t-1)/100)^{-10} and it becomes a 9-year zero-coupon bond with rate  R(t) by end of year  t with price  P_1 = (1 + R(t)/100)^{-9} and the geometric returns are  Q = \ln(P_1/P_0). Of course, arithmetic returns, which we need for portfolios, are  A(t) = P_1/P_0 - 1.

Treasury bond rates. We can compute returns for zero-coupon bonds, because we compute its price explicitly. A big difficulty from this post is that Long rates do not have residuals which are independent identically distributed and Gaussian.

Note that, unfortunately, in our previous research we used the long rates which are time-inconsistent: DGS10 are taken to be end-of-year, but LTGOV which precede DGS10 are December monthly average. Only in a recent post we correct this, taking both to be monthly average, when we unsuccessfully fit autoregression for long-short bond spread (with and without volatility).

We denote by  R(t) and  L(t) the BAA average December daily rate and the long-term (10-year) Treasury average december daily rate.

The Python file and data.xlsx in the same GitHub repository shows that we tried to fit Long separately, with and without volatility, and failed. We also tried with (BAA, Long) with and without volatility as vector autoregression, and failed. Finally, we tried the BAA-Long spread, and also did not succeed.

Further tries to switch to log rates instead of rates failed for the Long and combined model. Except one: If we take log of spread, then this fits autoregression without volatility normalization. Together with the model for the BAA rate, this gives us the right model. In fact, we succeeded in our modeling: For  P_1(t) = \ln(R(t)) and  S(t) = \ln(\ln R(t) - \ln L(t)) we model

 \ln R(t) - \ln R(t-1) = 0.0708 - 0.0441\ln R(t-1) + W_{R}(t)V(t)

 S(t) - S(t-1) = -0.1980 -0.1873S(t-1) + W_{S}(t)

for Gaussian independent identically distributed  W_R, W_S. This is done in the file log-rates.py in the same GitHub repository.

The autoregression output for  \ln R(t) (uncentered, simply divide by the volatility) is given below: (uncentered)  R^2 = 3\% The Student T-test for  a = 0 (intercept) and for  b = 1 (slope) has high  10\% < p <20\%. It seems like this is close to random walk. We need to investigate this further. But now, we shall stick to this model. The autoregression output for  S(t) is given below:  R^2 = 66.3\% and the Student T-test for  c = 0 (intercept) and for  d = 1 (slope) has very low  p < 1\%.

S&P returns. Finally, we consider regression of US stock normalized returns upon the spreads. We try 12 versions, with various combinations of volatility, 6 with original spreads and 6 with log spreads. But we could accept only two versions out of these 12:  Q(t)/V(t) = m + S(t)/V(t) + W(t) with  S(t) standing for either the spread or the log spread. We prefer the model with the log spread because the p-values for the Ljung-Box test are further from 0.05. This is done in the file risk-spread.py in the same Github repository. This implies we should use this regression of log spreads divided by volatility as a factor in our further models.

Continuing this blog post, we add risk spread to the regression for the geometric normalized S&P stock returns, having also the following factors: duration and valuation. We have four cases: the spread between rates; spread between log rates; log spread; and log spread of logs. This is done in a separate file selection.py which requires import of the main file check-full-model.py

Results: All residuals pass IID Gaussian check.  R^2 = 48.1\% for spread of log rates or log spread of log rates, and even a bit higher  R^2 = 48.3\%-48.5\% for spread or log spread. Which is higher than  R^2 = 39\% for the previous regression, with only duration and valuation. Finally, the Student T-test has always high p-values, which fail to reject the null hypothesis. But it is the lowest for just spreads (without any logarithms). We then pick this factor. Results of this regression are:

 Q(t) = 0.2826 - 0.0110V(t) - 0.0609(R(t) - R(t-1)) - 0.0173(R(t-1) - L(t-1)) - 0.1440H(t-1) + V(t)Z_Q(t).

International markets. Now consider the normalized developed markets geometric returns. And regression vs risk spreads (difference between corporate and long-term Treasury rates), the new valuation measure, and the duration. We also have stochastic volatility. To compare, we run regression vs only duration. Adjusted  R^2 is higher for the full regression: 36% against 35.5%. But the Student T-test for the missing factors gives us high p-values: 41.1% for the valuation measure and 25.6% for the spread. Both regressions have residuals which pass IID Gaussian check. The results for the full regression, where  H is the new valuation measure based on one-year dividends, and  I(t) are geometric developed markets returns:

 I(t) = 0.2111 - 0.0316 (R(t) - R(t-1)) + 0.0387 (R(t-1) - L(t-1)) - 0.0641 H(t-1) - 0.0196V(t) + V(t)Z_I(t).

Doing the same for the emerging markets, we also have adjusted  R^2 higher for the full rather than the cut regression. Adjusted  R^2 is higher for the full regression: 26.3% against 27.8%. But the Student T-test for the missing factors gives us high p-values: 42.8% for the valuation measure and 11.2% for the spread. Both regressions have residuals which pass IID Gaussian check. The results for the full regression are, where , and  E(t) are geometric emerging markets returns:

 E(t) = 0.0544 - 0.0873 (R(t) - R(t-1)) + 0.1051 (R(t-1) - L(t-1)) + 0.1155 H(t-1) - 0.0233V(t) + V(t)Z_E(t).

I think we shall stick with the full regressions in all three cases: S&P, Developed, Emerging markets. We included this in our updated file check-full-model.py But these checks of IID Gaussian pass even using stronger criteria of exceeding 5%.

Corporate Bond Returns. We would like to remind the readers about regression of arithmetic corporate bond returns  B(t) Note an interesting combination of logarithms and returns.

 \ln(B(t) + 1 - 0.01R(t-1)) = -0.0596(R(t) - R(t-1)) + V(t)Z_B(t)

As discussed before, this passes the residual test for IID Gaussian, even with stricter standards.

Covariance matrix for residuals. Now we have 8 series of residuals: for normalized geometric stock returns of US (usa), developed (intl), and emerging (em) markets; for spreads, corporate bond rates; for log volatility; for the valuation measure with stochastic volatility; and for corporate bond returns with stochastic volatility. All of these series are IID Gaussian.

Let us present the covariance matrix: The order is usa, intl, em, corporate bond returns, log volatility, corporate bond rates, valuation measure, log risk spread of log rates:  Z_Q, Z_I, Z_E, Z_B, W_V, W_R, W_H, W_S.

2.007901 0.871748 0.062963 0.189373 -4.717176 -0.149295 2.047114 -11.318029
0.871748 2.840418 2.021680 0.012354 -1.856816 0.081476 0.922510 -15.840755
0.062963 2.021680 5.730955 -0.162911 -5.364283 0.079469 0.050172 -21.545696
0.189373 0.012354 -0.162911 0.113497 2.754026 -0.050806 0.261286 5.528466
-4.717176 -1.856816 -5.364283 2.754026 1338.685234 14.068448 -5.842714 534.213546
-0.149295 0.081476 0.079469 -0.050806 14.068448 1.935904 -0.844710 -4.628337
2.047114 0.922510 0.050172 0.261286 -5.842714 -0.844710 3.152435 -7.533901
-11.318029 -15.840755 -21.545696 5.528466 534.213546 -4.628337 -7.533901 1165.883591

Conclusion. We have built a closed model which allows us to build an entire new simulator with 5 instead of 3 asset classes: USA, developed, emerging stocks, 10-year Treasury and investment-grade corporate bonds; and 4 instead of 3 factors: lonng-term Treasury rate (measured via risk spread), BAA rate, valuation measure, and stock volatility. This is an improvement upon the previous post with 6-equation model, 3 asset classes, and 3 market factors (BAA rate, valuation, and volatility). See the same GitHub repository.

We would have 4+5 = 9 series of residuals, but in fact we have 8, because we consider the long-term Treasury returns to be deterministically dependent upon its Treasury rates. Thus, we have 9 equations but only 8 series of residuals.

Published by


Response

  1. New Valuation Measure based on Dividends – My Finance

    […] In the new blog post, we include not just the new valuation measure and duration but log risk spread of logs. This […]

    Like

Leave a comment