Financial Modeling
Cox-Ingersoll-Ross (CIR) Short-Rate Zero-Coupon Bond Price, Yield & Feller Condition
Price affine zero-coupon bonds under the Cox-Ingersoll-Ross (1985) square-root diffusion dr = a(b - r)dt + sigma*sqrt(r)dW with closed-form A(T), B(T), and Feller positivity ratio 2ab / sigma^2.
Why CIR prevents Vasicek’s negative-rate diffusion via square-root volatility
Whereas Oldrich Vasicek’s Ornstein-Uhlenbeck process applies constant volatility sigma even as short rate r_t approaches zero, John Cox, Jonathan Ingersoll, and Stephen Ross (1985) scaled diffusion volatility by SQRT(r_t): dr_t = a * (b - r_t) dt + sigma * SQRT(r_t) dW_t. As r_t nears zero, Brownian shock amplitude vanishes, and whenever Feller’s ratio 2 * a * b / sigma^2 >= 1 holds, upward drift strictly prevents r_t from ever hitting zero.
Like Vasicek, CIR remains an affine term-structure model with exact closed-form zero-coupon bond price P(0, T) = A(T) * EXP(-B(T) * r_0), where h = SQRT(a^2 + 2*sigma^2), denom = 2*h + (a + h)*(EXP(h*T) - 1), B(T) = 2*(EXP(h*T) - 1) / denom, and A(T) = (2*h*EXP((a + h)*T / 2) / denom)^(2*a*b / sigma^2).
| CIR Quantity (r0=4%, a=0.5, b=5%, sigma=10%, T=5y) | Formula Role | Computed Value |
|---|---|---|
| Feller Ratio 2*a*b / sigma^2 | Strictly positive short-rate gate (>= 1) | 5.0000 (FELLER_POSITIVE) |
| Duration Factor B(5) | Sensitivity -d ln P / dr_0 | 1.8130 years |
| Zero-Coupon Price P(0, 5) | A(5) * EXP(-B(5) * r_0) | 0.7949 per $1 par |
| Continuously Compounded Spot Yield | -LN(P(0, 5)) / 5 | 0.0459 (4.59%) |
CIR Affine Bond Price P(0, T) Formula
Bind h_val = SQRT(a^2 + 2*sigma^2), exp_ht = EXP(h_val * T), and denom inside LET to compute B(T), A(T), and P(0, T) without intermediate rounding.
=LET(r_now, B2, kappa, B3, theta, B4, sig, B5, mat_t, B6, h_val, SQRT((kappa ^ 2) + 2 * (sig ^ 2)), exp_ht, EXP(h_val * mat_t), denom, 2 * h_val + (kappa + h_val) * (exp_ht - 1), b_fac, 2 * (exp_ht - 1) / denom, a_fac, ((2 * h_val * EXP((kappa + h_val) * mat_t / 2)) / denom) ^ ((2 * kappa * theta) / (sig ^ 2)), ROUND(a_fac * EXP(-b_fac * r_now), 4))Feller Non-Negativity Diagnostic & Maturity Boundary Check
Evaluate 2 * B3 * B4 / (B5 ^ 2) to verify whether upward drift dominates boundary diffusion, and test T = 0 (B6 = 0) where B(0) = 0 and P(0, 0) = 1.0000.
=IF((2 * B3 * B4) >= (B5 ^ 2), "FELLER_POSITIVE", "ZERO_BOUNDARY_REACHABLE")Try the example
Use the original values or change them to test your understanding.