Gas storage: facility value under an optimised operating policy
PricingLab by Raganel Consulting, powered by MatLogica AADC
What it values
A gas storage facility makes money by buying gas when it is cheap, usually in summer, injecting it underground, and withdrawing and selling it when it is dear, usually in winter. How much it earns depends on how well it is run: every day the operator decides whether to inject, withdraw or wait, within the facility’s limits on volume and daily flow. This model runs the facility for one year with an operating policy that has been optimised for it, over thousands of simulated price paths, and reports the average profit. It returns how that value moves with the forward price of gas for each of the twelve months and with the interest rate. Alongside, it reports the intrinsic value: what the best fixed injection and withdrawal schedule would earn against today’s forward curve, ignoring the fact that prices will move.
Who uses this kind of number
Storage owners and operators, utilities, gas trading houses and banks that hold or lease storage capacity. They use the value to price a storage lease or a capacity auction bid, and the monthly sensitivities to hedge: the sensitivity to the December forward says how much December gas to sell forward to lock in today’s value.
Inputs
| Name | Unit | Default | Meaning |
|---|---|---|---|
max_capacity | MMBtu | 1,000,000 | Working gas capacity |
min_capacity | MMBtu | 50,000 | Cushion gas (minimum inventory) |
max_injection_rate | MMBtu/day | 10,000 | Maximum injection per day |
max_withdrawal_rate | MMBtu/day | 15,000 | Maximum withdrawal per day |
injection_cost | USD/MMBtu | 0.10 | Variable injection cost |
withdrawal_cost | USD/MMBtu | 0.05 | Variable withdrawal cost |
start_inventory | MMBtu | 500,000 | Inventory at contract start |
base_price | USD/MMBtu | 3.0 | Average forward price level |
winter_premium | USD/MMBtu | 0.6 | Winter-over-summer forward premium |
shift | USD/MMBtu | 0.0 | Parallel shift of the forward curve at valuation (policy kept fixed) |
n_eval | count | 4,096 | Monte Carlo valuation paths (4,096 at most on the free hosted service) |
MMBtu is a million British thermal units, the standard unit of US natural gas. Every input has a supported range; describe_model lists it. Any input you leave out takes its default.
On the free hosted service the facility and the shape of the forward curve are fixed at the defaults; you can change the parallel shift and the number of paths. A new facility or curve shape needs its own operating policy, which is trained on first use: about 75 seconds on two cores. The local install does this for any facility.
Outputs
- Value: average operating profit over the 365-day contract, in USD, under the optimised policy.
- Standard error of that average across the simulated paths.
- delta_jan … delta_dec: change in value per 1 USD/MMBtu rise in the forward price for that month (twelve figures).
- rho: change in value per 1.00 change in the interest rate (per 0.01, divide by 100).
- Intrinsic value on the forward curve: the best fixed schedule against today’s forward curve, with no price uncertainty.
- Timing, in milliseconds, for setting up the calculation and for the value with all sensitivities.
How the sensitivities are computed
The model simulates 4,096 price paths for a year, day by day, and on each day the policy decides how much to inject or withdraw. All thirteen sensitivities, one for each monthly forward plus rho, come from that same run, in one forward pass and one backward pass over the calculation (adjoint algorithmic differentiation).
The operating policy is held fixed while the sensitivities are taken. Because the policy is already optimised, small changes in how it would trade have no first-order effect on the value, which is the standard result for optimised decisions (the envelope theorem). The sensitivities are therefore first-order and most accurate for price moves close to the curve the policy was trained on.
How they are checked
Every sensitivity can be recomputed by bump-and-revalue: move each monthly forward up and down by 0.05 USD/MMBtu (and the rate by 0.005), re-run on the same policy and the same 4,096 paths, and take the difference. The check_against_bumping tool does this on demand and reports each gap.
Measured on 5 November 2026 at the default inputs, on two cores of an Intel Xeon 8280L:
| Sensitivity | One pass | Bump-and-revalue | Gap (relative to the largest sensitivity) |
|---|---|---|---|
| delta_jan | 239,930 | 239,930 | 0.0000006% |
| delta_feb | 211,163 | 211,163 | 0.0000009% |
| delta_mar | 2.4 | 2.4 | 0.000002% |
| delta_apr | 22.5 | 22.9 | 0.00008% |
| delta_may | −17,296 | −17,306 | 0.002% |
| delta_jun | −213,739 | −212,368 | 0.29% |
| delta_jul | −298,112 | −297,840 | 0.06% |
| delta_aug | −295,594 | −295,683 | 0.02% |
| delta_sep | −107,440 | −107,847 | 0.09% |
| delta_oct | −2,961 | −2,834 | 0.03% |
| delta_nov | 12,675 | 12,661 | 0.003% |
| delta_dec | 474,211 | 473,934 | 0.06% |
| rho | −320,393 | −320,397 | 0.0009% |
All agree within the 2% tolerance the check applies. Gaps are measured against the largest sensitivity because several months sit near points where the policy switches between injecting, waiting and withdrawing; there the bump, not the one-pass result, carries the larger error. The one-pass value with all thirteen sensitivities took 783 ms; bump-and-revalue needs 26 valuations.
What the model includes
- One storage facility over a 365-day contract, operated daily, with capacity, cushion gas, daily injection and withdrawal limits, and variable injection and withdrawal costs. A fixed storage cost of USD 500 a day is charged, and each day’s cash flow is discounted at an interest rate of 5%.
- A seasonal forward curve with twelve monthly prices: the base price plus the winter premium, highest in January and lowest in July, joined in a straight line between months, and shifted in parallel by
shift. - Daily gas prices from a two-factor model (Schwartz–Smith): a short-term factor that pulls back quickly towards the curve, and a slower long-term factor.
- An operating policy that decides each day’s injection or withdrawal from the date, the inventory and the current price. It starts from the best fixed schedule on the forward curve and is then optimised over 256 training paths. The default facility ships with its policy already trained.
It is designed to value a storage contract under a realistic, optimised operating policy and to give the full monthly hedge in the same calculation.
Worked example (default inputs)
Run on 5 November 2026 with every input at its default and 4,096 paths:
| Output | Result |
|---|---|
| Facility value | USD 680,029 (standard error 4,612) |
| Intrinsic value on the forward curve | USD 656,421 |
| delta_dec | 474,211 per USD 1/MMBtu |
| delta_jan | 239,930 per USD 1/MMBtu |
| delta_jul | −298,112 per USD 1/MMBtu |
| delta_aug | −295,594 per USD 1/MMBtu |
| rho | −320,393 per 1.00 of rate (about −3,204 per percentage point) |
Reading it: the optimised policy earns about USD 23,600 more than the best fixed schedule, because it can react as prices move. The value rises with winter forwards (December, January, February) and falls with summer forwards (June to September), the months in which the facility sells and buys. A 10-cent rise in the December forward adds about USD 47,400; a 10-cent rise in July takes away about USD 29,800. Setting up the calculation took 1,001 ms and the value with all thirteen sensitivities took 1,345 ms.
Three ways to use it
1. From an AI tool, through the hosted MCP endpoint. In any MCP client, add a remote server with this address and no authentication:
https://mypricinglab.com/lab/mcp
Then ask, for example: “Price the gas storage model, then with the forward curve shifted up by 0.25, and compare the December deltas.” The tools are list_models, describe_model, price_model, check_against_bumping and run_model_function. The hosted service is free, needs no login, and runs the default facility.
2. In Excel. Install the PricingLab add-in and open the workbook PricingLab_GasStorage.xlsx. Instructions and downloads: https://mypricinglab.com/excel
3. On your own machine. The local install runs the same tools for any facility and curve shape, with no size caps, and your inputs never leave your machine. It is sent on request (Linux x86-64 today; ask about Mac and Windows): write to info@mypricinglab.com. Once installed:
pricinglab mcp # MCP server for a local MCP client
pricinglab serve # local web server for the Excel workbook
Details: https://mypricinglab.com/install
With login
A private hosted service, with your own facilities, forward curves and larger runs, is available. Contact us.
Contact
PricingLab by Raganel Consulting, powered by MatLogica AADC. To run this on your own book, inside your own network, write to info@mypricinglab.com.