Commodity Mean-Reversion Calculator (Schwartz)
Model mean-reverting commodity prices with the Schwartz (1997) one-factor model. Build the futures curve, half-life, and terminal price distribution instantly.
Commodity Mean Reversion Calculator
A clear path from inputs to results.
Model a commodity price that is pulled back toward a long-run level over time, using the Schwartz (1997) one-factor mean-reverting model. It produces the futures-price term structure, the probability distribution of the future spot price, and uncertainty bands, which helps energy and commodity analysts and students see how mean reversion shapes forward curves.
How to use
- Set the current spot price S0 and the long-run mean of the log price a — the level (in log terms) the price gravitates toward.
- Set the mean-reversion speed kappa; larger values pull the price back to the long-run level faster and shorten the half-life.
- Set the volatility sigma, the instantaneous volatility of the log price.
- Set the market-price-of-risk shift A; the model uses the risk-adjusted mean a* = a - A in the futures formula to move from real-world to pricing dynamics.
- Choose the horizon T (years) and, optionally, the fan-chart quantile and surface resolution to control the plotted distribution.
- Read the metric cards: the futures price at the horizon, the asymptotic (long-maturity) futures level, the log-price half-life, and the terminal spot-price standard deviation.
The formula
Reference: Schwartz, E. S. (1997), "The Stochastic Behavior of Commodity Prices: Implications for Valuation and Hedging," Journal of Finance 52(3), 923-973 (Model 1).
Worked example
Oil-like commodity, 5-year futures and terminal distribution
- Spot S0 = 62; long-run mean log price a = ln(70) = 4.248495; mean-reversion speed kappa = 1.35; volatility sigma = 0.28; market-price-of-risk shift A = 0.05; horizon T = 5 years.
- 1
The risk-adjusted long-run mean is a* = a - A = 4.248495 - 0.05 = 4.198495. The conditional mean of the log price at T = 5 is E[ln S_T] = ln(62)*e^{-1.35*5} + 4.198495*(1 - e^{-1.35*5}) = 4.198412, and its variance is Var[ln S_T] = (0.28^2 / (2*1.35))*(1 - e^{-2*1.35*5}) = 0.029037. The futures price is F = exp(E + Var/2) = exp(4.198412 + 0.014519) = 67.5542. The long-maturity asymptote is exp(a* + sigma^2/(4*kappa)) = 67.5598, and the half-life of a deviation is ln(2)/1.35 = 0.5134 years (about 6.2 months). The lognormal 5% and 95% spot quantiles are 50.31 and 88.12.
5-year futures price 67.55 (versus a 62 spot), an asymptotic futures level of 67.56, a 0.513-year mean-reversion half-life, and a 90% terminal spot range of roughly 50.3 to 88.1.
Interpreting the result
Because the spot (62) sits below the risk-adjusted long-run level (exp(a*) = 66.59), the futures curve slopes upward toward that level, and by 5 years it has essentially arrived — the 5-year futures (67.55) is already at the long-maturity asymptote (67.56). The half-life tells you how quickly deviations decay: with kappa = 1.35 a shock is half-corrected in about six months. The small gap between the median and the mean futures price is the lognormal convexity adjustment (+Var/2); mean reversion caps how fast the terminal variance grows, which is why the fan bands widen quickly then stabilize.
Assumptions & limitations
- A single factor drives the price with constant parameters; it ignores stochastic volatility, seasonality, and stochastic convenience yield that matter for many real commodities.
- The log price is a Gaussian Ornstein-Uhlenbeck process, so the spot price is exactly lognormal at every horizon.
- The market price of risk enters only as a constant shift A to the long-run mean; it is not calibrated to a live futures curve inside the tool.
- Futures and forward prices are treated as equal, which assumes deterministic (or independent) interest rates.
- Curves and bands are the model's analytic mean, variance, and quantiles, not simulated sample paths, and parameters are user inputs rather than fitted to historical data.
Frequently asked questions
What does mean reversion mean for a commodity price?
It means the price is pulled back toward a long-run equilibrium level rather than wandering freely like a stock. Economically, high prices encourage extra supply and demand destruction that push the price down, while low prices do the opposite. The Schwartz model captures this with a restoring force kappa*(a - X) on the log price.
Why is the futures price different from the spot price?
Under mean reversion the futures price reflects where the price is expected to drift, not just today's spot. Here the spot (62) is below the risk-adjusted long-run level, so the futures curve rises toward it, reaching about 67.55 at 5 years. If the spot were above the long-run level the curve would slope downward instead.
How does this one-factor model differ from two-factor commodity models?
This is Schwartz Model 1, with a single mean-reverting factor. Model 2 and the Schwartz-Smith model add a second factor (a stochastic convenience yield or a long-term equilibrium level), which lets the long end of the futures curve move and improves fits for commodities with persistent trends. The one-factor version is simpler and ideal for understanding the core mean-reversion mechanics.
What is the half-life and how is it computed?
The half-life is the time for a deviation from the long-run mean to shrink by half, equal to ln(2)/kappa. With kappa = 1.35 it is about 0.513 years, or roughly six months. A larger kappa means faster reversion and a shorter half-life, which flattens the far end of the futures curve more quickly.
What is the market-price-of-risk shift A?
A adjusts the real-world long-run mean a down to the risk-neutral (pricing) mean a* = a - A used for futures valuation. It compensates for the risk premium embedded in commodity forward prices. Setting A = 0 makes the risk-neutral and real-world means coincide, which generally over- or under-states market futures prices.
Why is the terminal spot distribution lognormal?
The model makes the log price X = ln S a Gaussian Ornstein-Uhlenbeck process, so X_T is normally distributed and therefore S_T = exp(X_T) is lognormal. That is why the tool can report exact 5% and 95% spot quantiles (50.31 and 88.12 here) and an exact terminal standard deviation without simulation.
Methodology last reviewed 2026-10-06. Results are informational and not financial or engineering advice — see our disclaimer.