Updated Simulator of S&P, International Stocks, Corporate Bonds, with Rate and Volatility as Factors

See my GitHub repository simulator-current for the HTML frontend pages, Python backend code in Flask, Excel data file, and Python code for validation of the model described below.

Continuing the previous post, we updated the financial simulator to make for geometric returns instead of arithmetic returns. We had mistakenly made linear regression for arithmetic returns, but this does not work well, since such returns can be only greater than  -100\% . Thus we replaced returns of all three asset classes (US stocks, developed-markets stocks, US bonds) from arithmetic to geometric. To compute portfolio returns, we later convert these geometric returns to arithmetic returns. The updated version is specified below.

  1. Description and system of equations.
  2. Testing innovations for white noise.
  3. Testing innovations for normality.

Description and system of equations

We use the following autoregression equation for annual volatility for S&P 500 and its predecessor, S&P 90, computed by Angel Piotrowski:

 \ln V(t) = \alpha + \beta \ln V(t) + W(t) with \alpha = 0.847850 and \beta = 0.620146.

Next, we use the following autoregression for BAA rate, following previous research:

 \ln R(t) = \gamma + \theta \ln R(t-1) + Z(t) with  \gamma = 0.107208 and \theta = 0.942062.

We use the logarithm because otherwise the rate might become negative, even with very small probability.

We consider three classes of assets and denote their annual geometric total returns (multiplied by 100 for normalization):

  • USA stocks, measured by Standard & Poor 500 index and its predecessor, the Standard & Poor 90 index  Q_1(t)
  • International stocks, measured by MSCI EAFE (Europe/Australasia/Far East) index  Q_2(t)
  • USA corporate investment-grade bonds, measured by Bank of America ICE index (ratings AAA, AA, A, BBB)  Q_0(t)

We normalize the two stock returns by dividing them by annual volatility. But we do not normalize the bond returns. We have the following equations for these three classes of assets:

  • For USA corporate bonds, following this blog post, we get:  Q_0(t) - R(t-1) = a_0 - c_0(R(t) - R(t-1)) + \delta_0(t) with  a_0 = -1.661125 and  c_0 = 5.588353
  • For USA stocks, following this blog post, we get:  Q_1(t) = a_1 - b_1V(t) - c_1(R(t) - R(t-1)) + \delta_1(t) with  a_1 = 21.206735 and  b_1 = 1.088812 and  c_1 = 6.211856.
  • For international stocks, similarly to USA stocks, we get:  Q_2(t) = a_2 - b_2V(t) - c_2(R(t) - R(t-1)) + \delta_2(t) with  a_2 = 27.494934 and  b_2 = 1.929750 and  c_2 = 3.996489.

Thus all three classes of assets have returns highly dependent upon change in interest rates, with duration (regression coefficient)  c_i for returns  Q_i. Note that  Q_1 and  Q_2

All five series of residuals  \delta_0, \delta_1, \delta_2, Z, W are well-modeled by independent identically distributed random variables, judging by Monte Carlo simulation. I present the autocorrelation plots for them and their absolute values below.

Unfortunately, they are not normal. Namely,  Z and  W (the innovations for factor autoregressions) are closer to skew-normal. I did not yet pursue this direction of research. But the other three residual series  \delta_0, \delta_1, \delta_2 are Gaussian. I discuss their normality below.

However, I still modeled these five series as multivariate Gaussian with mean vector zero and the following empirical covariance matrix.

 \begin{bmatrix} 0.132753 & -0.063165 & -0.054849 & 0.014952 & 0.072379 \\ -0.063165 & 2.2129 & 0.913203 & -0.028769 & 1.531643 \\ -0.054849 & 0.913203 & 3.018478 & -0.00741 & -0.174603 \\ 0.014952 & -0.028769 & -0.00741 & 0.01842 & -0.057425 \\ 0.072379 & 1.531643 & -0.174603 & -0.057425 & 6.892802 \\ \end{bmatrix}

We consider only nominal, not real returns. To compensate for that, withdrawals/contributions can change annually.

We allow for constant split between US and international stocks. Bond and overall stock percentages might change from year to year linearly. This is to allow for a more conservative portfolio as time goes.

Also, and very importantly, we added a separate web page with a simplified version of this simulator. We describe it in a separate post.

Initial value for volatility is taken as average daily close VIX June 1, 2024 – May 31, 2025. The initial value for the BAA rate is taken as average daily May 2025.

Testing innovations for white noise

Below are autocorrelation function plots for the five series of innovations. Original and absolute in the captions refer to whether innovations are taken as is or after taking absolute values.

  •  W(t) has tag ln-vol
  •  Z(t) has tag ln-baa
  •  \delta_0(t) has tag bonds
  •  \delta_1(t) has tag usa-stocks
  •  \delta_2(t) has tag intl-stocks

Also, we compute L1 norms for first 5 values of the ACF, for original innovations and their absolute values. Comparing with these threshold values, we see that it is reasonable to model these as independent identically distributed.

N Data Points9697529755
Innovations W(t)  Z(t)  \delta_0(t)  \delta_1(t)  \delta_2(t)
Original  x 0.400.180.880.480.49
Absolute  |x| 0.240.360.710.430.58

Testing innovations for normality

Similarly, we plot the five quantile-quantile plots versus the normal distribution below. Tags are the same.

Also, see p-values for statistical testing for normality: Shapiro-Wilk (SW) and Jarque-Bera (JB) testing.

Test W(t)  Z(t)  \delta_0(t)  \delta_1(t)  \delta_2(t)
SW0.9%0.6%86%42%99%
JB6.1%0.009%80%66%90%

Finally, let us provide skewness and kurtosis for these innovations, normalized so that for the normal distribution they are 0.

Function W(t)  Z(t)  \delta_0(t)  \delta_1(t)  \delta_2(t)
Skewness0.590.810.190.23-0.13
Kurtosis0.0571.40.240.0680.13

Summary:  \delta_i(t) are well modeled by normal, but  W(t) and  Z(t) are not.

Published by


Responses

  1. Simplified Simulator Version – My Finance

    […] The main simulator gives users a choice of portfolio: US stocks, international stocks, and bonds. Moreover, the main choice in the portfolio is the proportion of stocks and bonds. In the newest version, we allowed this proportion to vary and not to be fixed throughout these simulated years. For example, at the start of 30 years, the stock/bond split can be 80/20, and at the end, 50/50. This is done to make room for retirement planning. Usually, people choose to invest more in risky assets at the start of their savings journey, and to make it less risky when they become closer to retirement. […]

    Like

  2. Bubble Measure and Long-Short Spread in the Simulator – My Finance

    […] fit the corporate bond returns (geometric) denoted by in the same way as above. Namely, This makes sense in the context of bond markets, even though we use geometric instead of […]

    Like

  3. Simulator Final Update – My Finance

    […] simulator to include the bubble measure involving earnings growth, and the long-short spread. The previous version included only the BAA rate and stock volatility as […]

    Like

Leave a reply to Simplified Simulator Version – My Finance Cancel reply