Arte SheetsLearn. Try. Understand.

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 RoleComputed Value
Feller Ratio 2*a*b / sigma^2Strictly positive short-rate gate (>= 1)5.0000 (FELLER_POSITIVE)
Duration Factor B(5)Sensitivity -d ln P / dr_01.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)) / 50.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.

Further reading