ModelRisk example · Oil and gas
Oil Price Forecast from History
Which price deck should the five-year plan use? Three time-series models fitted to ten years of prices, weighted by the evidence.
From the model’s saved run
Price deck for the plan
Annual average price of the model-averaged forecast.
| Measure | Unit | 10th pct | Median | 90th pct | Mean |
|---|---|---|---|---|---|
| 2027 average price | US$/bbl | 53.7 | 64.8 | 79.5 | 65.9 |
| 2028 average price | US$/bbl | 45.6 | 63.6 | 93.5 | 67.4 |
| 2029 average price | US$/bbl | 42.0 | 62.9 | 105.3 | 69.7 |
| 2030 average price | US$/bbl | 39.4 | 62.8 | 116.0 | 72.5 |
| 2031 average price | US$/bbl | 37.2 | 62.7 | 128.7 | 76.4 |
Line chart: 90th percentile, Median, Mean, 10th percentile.
The business question
The five-year plan needs a price deck: an expected oil price for each year and a sensible range around it. The company has ten years of monthly prices. A random walk (geometric Brownian motion) says that today's price is the best guide to the future and that the range keeps widening.
A mean-reverting model says that prices are pulled back towards a long-run level, so the range stops growing. Both are standard, they fit the history almost equally well, and they disagree sharply about 2031.
Rather than pick one and hide the choice, the model fits three candidates with ModelRisk's time-series fit functions, measures the evidence for each with the Schwarz information criterion (SIC), and averages their forecasts by that evidence. The uncertainty of the fitted parameters is included too, because ten years of data pin down the long-run level only loosely.
- Who it is for
- Planners, commercial and finance teams who set price decks, and analysts who forecast commodity prices or exchange rates.
- Main outputs
- Monthly price forecast with a 10th–90th percentile band · annual average prices for the plan · the chance that each year's average falls below the budget price · the evidence for each model and what each one implies for year 5.
How the model works
Five sheets after this one, read from left to right. Each one feeds the next.
Inputs sheet
The budget price to test and a prior weight for each model (equal by default). Two switches: include parameter uncertainty, and average the models or use only the best one. The first forecast year is the year after the history ends.
History sheet
Ten years of months and monthly average prices, with their log returns. Paste your own months and prices over the yellow cells, ending in a December; everything after it updates.
Models sheet
VoseTimeGBMFitObject, VoseTimeGBMVRFitObject and VoseTimeGBMAJVRFitObject fit a random walk, a mean-reverting model and a mean-reverting model with jumps to the prices. VoseSIC scores each fit, penalising extra parameters (lower is better). Each model's support is its prior weight × exp(−ΔSIC / 2). Its evidence weight is its share of the total support, the standard approximation to the probability that it is the right model.
Forecast sheet
In every iteration VoseTimeSimulate draws a 60-month path from each fitted model. The random walk and mean-reversion fits also sample their parameters from their uncertainty. VoseDiscrete picks one model with probability equal to its weight, and that model's path is the forecast. Annual averages turn the path into a price deck.
Results sheet
Percentiles of the monthly and annual prices, the chance that each year's average falls below the budget price, and the year-5 price under each model and under the average.
ModelRisk techniques
Find similar models
- Product
- Type
- Application
- Uses
The results in detail
The budget price
Chance that a year's average price is below the budget price on the Inputs sheet.
| Measure | Unit | Value |
|---|---|---|
| Budget price (Inputs sheet) | US$/bbl | 60.0 |
| Year | Probability |
|---|---|
| 2027 average below the budget price | 30.3% |
| 2028 average below the budget price | 41.3% |
| 2029 average below the budget price | 43.8% |
| 2030 average below the budget price | 44.7% |
| 2031 average below the budget price | 44.8% |
Which model? The evidence, and what each model says about year 5
SIC and weights from the Models sheet; year-5 average price under each model and under the average.
S-curve (cumulative probability) of Model average, Random walk (GBM), Mean reversion (GBMVR), With jumps (GBMAJVR) from the saved simulation.
| Model | SIC | ΔSIC | Weight used |
|---|---|---|---|
| Random walk (GBM) | −264.9 | 0.0 | 51.1% |
| Mean reversion (GBMVR) | −264.8 | 0.1 | 48.7% |
| Mean reversion with jumps (GBMAJVR) | −253.8 | 11.1 | 0.2% |
| Measure | Unit | 10th pct | Median | 90th pct | Mean |
|---|---|---|---|---|---|
| Random walk (GBM) | US$/bbl | 30.4 | 72.9 | 167.8 | 90.3 |
| Mean reversion (GBMVR) | US$/bbl | 43.5 | 59.5 | 81.5 | 61.4 |
| Mean reversion with jumps (GBMAJVR) | US$/bbl | 45.4 | 58.4 | 75.2 | 59.6 |
| Model average (the price deck) | US$/bbl | 37.2 | 62.7 | 128.7 | 76.4 |
How to read these results
- The history cannot tell the random walk from mean reversion: their SIC values are almost equal, so each gets about half the weight. Yet they disagree sharply about year 5. The random walk's range keeps widening. Mean reversion's levels off around the long-run level.
- Averaging the models carries that disagreement into the price deck instead of hiding it. Picking the best model alone (set 'Average the models' to 0) would rest the whole plan on an SIC difference of a fraction of a point.
- Parameter uncertainty widens the random walk's range the most: ten years of data leave its drift uncertain by about ±0.7% a month, which compounds over five years. It changes the mean-reversion forecast much less. Set 'Include parameter uncertainty' to 0 to compare.
- The chance of falling below the budget price is the planning risk of that budget: a budget price with a 40% chance of not being reached in a year is a stretch target, not a base case.
- ModelRisk's VoseTimeBMA function performs Bayesian model averaging of fitted time series in one array formula. This model spells the steps out so that every weight can be seen and changed.
See it move. Open the workbook, change an input on the Inputs sheet and run the simulation: every table and chart on this page updates in Excel.
Inputs and assumptions
Every assumption in the model, with its uncertainty and where it comes from. The figures are illustrative.
Plan settings 3 inputs
The budget price is tested against the forecast, which starts in the January after the history ends.
| Assumption | Unit | Value | Uncertainty |
|---|---|---|---|
| Budget pricePrice assumed in the budget. The Results sheet gives the chance that each year's average falls below it. | US$/bbl | 60.0 | Fixed |
| First forecast yearThe year after the last month of history (History sheet). The forecast runs five calendar years from January. | year | 2027 | Calculated |
| Include parameter uncertainty1 samples the parameters of the random walk and mean-reversion fits in every iteration (the fit functions' Uncertainty argument); 0 uses their best fit. | 1 = yes, 0 = no | 1 | Fixed |
Model averaging 4 inputs
How the three fitted models are combined into one forecast.
| Assumption | Unit | Value |
|---|---|---|
| Average the models1 averages the models by their evidence weights; 0 uses only the model with the lowest SIC. | 1 = yes, 0 = no | 1 |
| Prior weight: random walk (GBM)Your weight for each model before looking at the data. Equal weights let the data decide. | relative | 1.00 |
| Prior weight: mean reversion (GBMVR)Economic argument (producers respond to prices) often favours mean reversion for commodities. | relative | 1.00 |
| Prior weight: mean reversion with jumps (GBMAJVR)Set a model's weight to 0 to leave it out. | relative | 1.00 |
Units and conventions
- Prices
- US$/bbl, monthly averages of a crude-oil benchmark (synthetic data); nominal prices, no inflation adjustment.
- Log return
- ln(price this month ÷ price last month): close to the percentage change for small moves.
- SIC
- Schwarz information criterion = k·ln(n) − 2·ln(maximum likelihood); lower is better. A difference below 2 is weak evidence for the better model, above 6 strong evidence.
- Percentiles
- 10th percentile: a 10% chance of a lower value. 90th percentile: a 10% chance of a higher value.
Key assumptions and limitations
- Models
- Three candidates. Others, such as GARCH models with changing volatility, can be added the same way: fit, score, include in the weights.
- Parameter uncertainty
- Included for the random walk and mean-reversion fits. The jump model, which carries almost no weight, is fitted at its best estimate to keep the simulation fast.
- Weights
- Evidence weights use the SIC approximation to Bayesian model averaging, with equal prior weights unless you change them.
- History
- The last ten years are taken as representative: structural change, producer policy and the energy transition are not modelled explicitly.
- Data
- The price series is synthetic, generated for this example. It resembles, but does not reproduce, real oil prices.
How to use it
- Paste your own months and monthly prices over the History sheet (120 months, oldest first, ending in a December) and set the budget price on the Inputs sheet.
- Read the Models sheet: the SIC and the evidence weights show how strongly the history favours each model.
- Press F9 on the Forecast sheet to see different paths, then run a simulation from the ModelRisk ribbon (10,000 samples, fixed seed).
- Set 'Average the models' to 0 to use only the best model, or change the prior weights, and simulate again.
Simulate this model with ModelRisk’s classic engine: it does not run in Turbo mode yet.
ModelRisk functions used
- VoseTimeGBMFitObject, VoseTimeGBMVRFitObject, VoseTimeGBMAJVRFitObject
- Fit the three time-series models to the prices. With Uncertainty = TRUE each recalculation samples the parameters.
- VoseSIC, VoseTimeOptimalFitObject
- The Schwarz information criterion of each fit, and the model with the lowest SIC.
- VoseTimeGBMFitP, VoseTimeGBMVRFitP, VoseTimeGBMAJVRFitP
- The best-fit parameters, shown on the Models sheet.
- VoseTimeSimulate
- Draws a forecast path from a fitted time-series object.
- VoseDiscrete
- Picks the model used in each iteration, with probability equal to its weight.
- VoseInput, VoseOutput
- Name the model drawn and the forecast outputs: every monthly price, the annual averages and year 5 by model.
- VoseSimPercentile, VoseSimMean, VoseSimProbability
- Statistics of the simulation for the tables and charts on the Results sheet.
Further reading
- Monte Carlo simulation explained (Vose guide)
- Hoeting, J. A., Madigan, D., Raftery, A. E. and Volinsky, C. T. (1999). Bayesian model averaging: a tutorial. Statistical Science 14(4), 382–417.
- Vose, D. (2008). Risk Analysis: A Quantitative Guide, 3rd edition. Wiley — chapter on time series.
- Pindyck, R. S. (1999). The long-run evolution of energy prices. The Energy Journal 20(2), 1–27.
Download the workbook and run it yourself. It opens in Excel with ModelRisk. The free trial runs every example model.
Related example models
- ModelRisk★★★★★Production Forecast with Decline UncertaintyHow much more will well K-12 produce?Fits a decline to production history, carries the uncertainty of the fit into the forecast and adds a risk event.
- ModelRisk★★★★★Exploration Portfolio with Shared Play RiskWhich wells should we drill next year?Compares drilling programmes built from eight prospects whose success depends on shared play risk.
- ModelRisk★★★★★Exploration Prospect EconomicsShould we drill the exploration well?Several sheets, correlated inputs, a risk event, a stochastic price path and a 30-year cash flow.
An illustrative example: the figures are invented for teaching and do not describe a real company, project or asset. Last updated 9 October 2026.