1 Introduction

The yield spread of U.S. government bond is the difference in the yield between two treasury bonds issued by the Federal Government. It is widely used as an indicator of economic recession or recovery. Typically, a negative yield spread has been viewed as a predictor of a recessionary period. For historical reference, the negative yield spread in late 2006 signaled the Great Ression in 2008. The last time the spread went negative was late 2019, which has brought much concern that market will go bearish in 2020. On the other hand, unemployment rate is also a reliable predictor of economic recession and can reflect the maturing point of a business cycle.

In this report, we will investigate the cyclical pattern in 10 year-3 month treasury yield spread and unemployment rate, and furthermore model their relationship through time series models. Our goal is to justify whether the two indicators both have potential in predicting the turning point of business cycle.

2 Time Domain Analysis

2.1 Time Series Plot

The 10 year-3 month treasury yield spread data is collected by Federal Reserve Bank of St. Louis. The unit is percent and no seasonality adjustment is applied. Monthly average is taken to reduce data length. The unemployment data is collected by U.S. Bureau of Labor Statistics. The frequancy and unit are the same as yield spread data. The time window is from Jan. 1982 to Jan. 2020.

The time series plot clearly reveals some cyclical behavior of the yield spread and the unemployment rate. Moreover, they seem to track each other over the past 30 years with period of around 7 to 11 years. This is also called “Juglar cycle” in fixed investment field. It has come to our attention that the yield spread curve also exhibit some smaller cycles. The unemployment rate demonstrates a declining trend, while there is no visible trend in yield spread.

2.2 Extracting Business Cycles

To better investigate the association between the yield spread and unemployment rate, we further analyze the two time series with Local linear regression (Loess) approach. Since business cycles typically have mid-range frequency, we decompose them into tree different components: trend, noise and cycles. Both yield spread and unemployment rate show a declining trend after 2010.

Here we only extract large business cycles, so there is still small cycles remaining in the noise part, especially for the yield spread curve. The cyclical pattern in the two curves match well in the 1990 to 2010 time window, and shows some deviation both at the beginning and end of the selected time window. Generally, the extracted business cycles almost have same period.

date = seq(from=1982,length=length(dat$DATE),by=1/12)

par(mfrow=c(1,2))
bond_trend = ts(loess(dat$T10Y3M~date,span=0.8)$fitted,start=1982,frequency=12)
bond_noise = ts(dat$T10Y3M - loess(dat$T10Y3M~date,span=0.2)$fitted,start=1982,frequency=12)
bond_cycles = dat$T10Y3M - bond_trend - bond_noise
u1 = ts.union(dat$T10Y3M,bond_trend,bond_noise,bond_cycles)
colnames(u1) = c('Raw','Trend','Noise','Cycles')

unrate_trend = ts(loess(dat$UNRATE~date,span=0.8)$fitted,start=1982,frequency=12)
unrate_noise = ts(dat$UNRATE - loess(dat$UNRATE~date,span=0.2)$fitted,start=1982,frequency=12)
unrate_cycles = dat$UNRATE - unrate_trend - unrate_noise
u2 = ts.union(dat$UNRATE,unrate_trend,unrate_noise,unrate_cycles)
colnames(u2) = c('Raw','Trend','Noise','Cycles')

plot(ts.union(u1,u2),main='Decomposition of yield spread (left) and unemployment rate (right)')

2.3 Time Series Models

We fit a linear regression with ARMA errors model below to study the relationship between the yield spread and unemployment rate.

\[Y_n = \alpha + \beta U_n + \epsilon_n \] where \(Y_n\) and \(U_n\) denote the business cycles series of the yield spread and unemployment rate, respectively, and \(\epsilon_n\) is a Gaussian ARMA\((p,q)\) model.

We construct the AIC table below to select the optimal \((p,q)\) pair. The top three candidates with smallest AIC value are ARMA\((5,3)\), ARMA\((4,2)\) and ARMA\((5,5)\). We pick the smallest model ARMA\((4,2)\) to do further analysis.

MA0 MA1 MA2 MA3 MA4 MA5
AR0 779.25 158.83 -456.32 -1057.82 -1613.05 -2098.61
AR1 -1651.67 -2270.03 -2863.57 -3366.50 -3774.52 -4060.44
AR2 -3861.47 -4434.92 -4717.76 -4820.04 -4866.82 -4887.14
AR3 -4616.98 -4908.67 -4908.96 -4908.44 -4908.02 -4906.99
AR4 -4776.00 -4909.37 -4914.35 -4905.24 -4912.80 -4909.06
AR5 -4804.73 -4909.48 -4910.09 -4918.42 -4913.16 -4913.76

We set up a likelihood ratio test to test the significance of the coefficient. The null hypothesis is \[H^{\langle 0 \rangle}: \beta = 0\] and the alternative hypothesis is \[H^{\langle 1 \rangle}: \beta \neq 0\]. Under the null hypothesis, we have \(\ell^{\langle1\rangle} - \ell^{\langle0\rangle} \approx1/2 \chi_d^2\) where \(d=1\) for our case. Because the log-likelihood ratio is much larger than the cutoff value at 0.95 significance level, we can reject the null hypothesis.

log_lik_ratio = as.numeric(
   logLik(arima(bond_cycles,order=c(4,0,2),xreg=unrate_cycles,optim.control=list(maxit=500))) -
   logLik(arima(bond_cycles,order=c(4,0,2),optim.control=list(maxit=500)))
)
log_lik_ratio
## [1] 238.0854
qchisq(0.95,df=1)/2
## [1] 1.920729

2.4 Diagnostic Analysis

We generate ACF plot of residuals to do model diagnosis. The ACF plot of ARIMA\((4,0,2)\) model residuals has non-negligible value at lag = 13 and 14, so we add seasonal part to the model based on the fact that SARIMA\((0,1,1) \times (0,1,1)_{12}\) model is often used for monthly time series in economics.

arma_model = arima(bond_cycles,order=c(4,0,2),xreg=unrate_cycles,
                   optim.control=list(maxit=500))
sarma_model = arima(bond_cycles,order=c(4,0,2),xreg=unrate_cycles,
                   seasonal=list(order=c(0,1,1), period=12),
                   optim.control=list(maxit=500))

a1 = acf(arma_model$residuals,lag.max=24,plot=FALSE)
a1$lag = a1$lag*12
plot(a1,main='ACF of ARIMA(4,0,2) residuals')

The ACF plot of SARIMA\((4,0,2) \times(0,1,1)_{12}\) seems to improve a little bit at lag = 13, but not much. Generally, there is no prominent seasonal component now.

sarma_model
## 
## Call:
## arima(x = bond_cycles, order = c(4, 0, 2), seasonal = list(order = c(0, 1, 1), 
##     period = 12), xreg = unrate_cycles, optim.control = list(maxit = 500))
## 
## Coefficients:
##          ar1      ar2     ar3      ar4     ma1      ma2     sma1
##       3.5868  -4.8528  2.9425  -0.6767  0.2024  -0.6635  -0.9804
## s.e.  0.0514   0.1666  0.1679   0.0531     NaN      NaN   0.0230
##       unrate_cycles
##              0.9477
## s.e.         0.0328
## 
## sigma^2 estimated as 1.251e-06:  log likelihood = 2368.79,  aic = -4719.59

Based on the analysis till now, we can obtain the following model:

\[Y_n = 0.9477 U_n + \epsilon_n \] where \[(1-3.5868B+4.8528B^2-2.9425B^3+0.6767B^4)(1-B^{12}) \epsilon_n = (1+0.2024B-0.6635B^2)(1-0.9804B^{12}) \omega_n\] and \(\omega_n \sim N[0, 1.251E{-6}]\).

The residual plot demonstrates some heteroskedasticiy. The normal Q-Q plot tells us that the distribution of residuals have heavier tails than normal.

To complete the study, we also fit an ordinary least square (OLS) model below and perform diagnosis on the residuals. Compared to time series model, the residuals of ordinary least square model still have some cyclical pattern. Clearly, OLS model fails to capture the relationship between historical and current data.

3. Frequency Domain analysis

Finally, we do spectrum analysis on the yield spread and unemployment rate. The most prominent frequency component is 0.125 and 0.1 cycles per year, which corresponding to a period of 8 and 10 years, respectively.

s = spectrum(ts.union(bond_cycles,unrate_cycles),span=c(3,5,3),main='Smoothed Periodogram')
legend('top', legend=c('Yield spread (10Y-3M)','Unemployment rate'), col=c('black','red'), lty=c(1,2), cex=0.8)

s$freq[which.max(s$spec[,1])]
## [1] 0.125
s$freq[which.max(s$spec[,2])]
## [1] 0.1

4. Conclusion

In this report, we have investigated the relationship between the 10-year minus 3-month bond yield spread and unemployment rate. Since we mainly concern about the large business cycles, we first decompose the time series into three parts: trend, noise and cycle, and use ARMA errors model to quantitatively explain the relationship between the two cyclical curves.

We can draw the following conclusions:

5. Reference

[1] Data source: https://fred.stlouisfed.org/series/UNRATE#0

[2] Bonds Through the Cycle: https://seekingalpha.com/article/4125637-bonds-through-cycle

[3] Using the yield spread to forecast recessions and recoveries: https://journal.firsttuesday.us/using-the-yield-spread-to-forecast-recessions-and-recoveries/2933/

[4] Business cycles: https://en.wikipedia.org/wiki/Business_cycle

[5] Edward L. Ionides, Stats 531 (Winter 2020) ‘Analysis of Time Series’ class notes: https://ionides.github.io/531w20/