Skip to content
All library documents

CIR Nonnegativity, the Feller Condition, and Simulation Discretization

Article Quant Q&A · Author: Oscar

Summary

The document explains why the Cox–Ingersoll–Ross (CIR) short-rate process is associated with nonnegative values and why a numerical simulation may still produce negative rates. The Feller condition relates the mean-reversion speed, long-run mean, and volatility; when satisfied, it ensures the continuous-time process does not reach zero under the model’s assumptions.

A basic Euler discretization can nonetheless step into negative territory, especially when volatility is high, because a finite time step does not preserve the process’s boundary behavior. The answer suggests flooring the value at zero inside the square-root volatility term as a simple safeguard and points to more sophisticated simulation methods. This adjustment prevents invalid square roots, but the document does not assess its bias or compare numerical schemes. The distinction is between a property of the continuous model and behavior introduced by its numerical approximation.

Key ideas

  • The Feller condition governs whether a continuous-time CIR process stays strictly positive under the model’s assumptions.
  • A discrete Euler simulation can produce negative values even when the continuous process is nonnegative.
  • High volatility and finite time steps can expose discretization problems near the zero boundary.
  • Clipping values at zero inside the square-root term is a simple safeguard, while more advanced schemes are available.

Tags

Full text
# Negative values in CIR model


# Negative values in CIR model












I'm having difficulty understanding the well known property of the CIR model that it can't go below zero. Wikipedia says that this is because the random shock on the rate will grow very small as r moves closer to zero, but won't the drift term also do so? Especially if the volatility term is high, isn't it possible for the random shock to be of a greater negative value than the drift is positive even as r goes to zero?

I'm trying to implement the method in matlab currently but it happens to me that r becomes negative if I increase the volatility. Could it be a problem with the discretization as well perhaps? The code snippet is below if it's of interest.

```
theta=0.5; %Long run mean
sigma=14; %Volatility of drawdowns
k = 7.326; %Mean reversion constant
n = 100; %number of time steps, t.
dt = T/n; %time step
M=10^3; %Number of realizations
d0 = theta;
d=ones(M,1).*d0;%Starting value for d
for i = (j-1:n)
    dW = sqrt(dt)*randn(M,1); % Wiener increments
    d(:,i+1) = d(:,i) + k.*(theta-d(:,i)).*dt + sigma.*sqrt(d(:,i)).*dW; %drawdown rate
end

```
```

## Answer by user39119 (score 1)

https://quant.stackexchange.com/a/51019

Analytically the Feller condition ($ 2 \kappa \theta > \sigma ^2)$ guarantees that the process doesn't become negative but this is not enough when you are simulating. Even if you choose parameters that satisfy the Feller condition, you still may have the problem of getting negative values inside the square root giving bad results. This is a consequence of the discretization. The easiest way to solve the problem is to substitute in your code sqrt(d(:,i)) by sqrt(max(d(:,i),0)). There are other more sophisticated ways to deal with this, you can see here https://www.deriscope.com/docs/Andersen_Jaeckel_Kahl_2010.pdf

## Answer by Valometrics.com (score 0)

https://quant.stackexchange.com/a/51018

If you don't want that your CIR process goes below zero, this condition should be satisfied: $$2k\theta>\sigma^2$$ Thus, you can't choose a very big value for volatility. It is limited by this condition.

Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.