Counterfactual

Counterfactual simulation engine

The fitted model becomes a scenario tool. Fix a driver with a do(·) intervention, propagate the change through the structural equations, and read the revised demand path against the baseline.

What demand would have done without the event

Each event is removed from history with do(·) interventions on the fitted structural model. Blue is what happened, green is the path without the event, the shaded window is the event itself.

No COVID-19 pandemic: 2020-03-13 → 2021-06-25 (68 weeks)

Every driver the pandemic moved is set to the path it was on before March 2020: the demand-shock flag off, mobility, employment and industrial production continuing their pre-pandemic seasonal paths, crude at its pre-pandemic level, refinery utilization likewise. Weather and retail prices are left as observed; the price path runs through WTI so gasoline's retail-price term is not counted a second time.

FuelActual → without the eventChangeCumulativeMargin exposure
Gasoline8,206 → 7,847 kb/d-359 kb/d (-4.38%)-165.4 mb (-20.2 days of demand)+14,594 $M
Distillate (diesel)3,773 → 3,825 kb/d+52 kb/d (+1.38%)+17.7 mb (+4.7 days of demand)+8,732 $M
Jet fuel1,049 → 1,283 kb/d+234 kb/d (+22.33%)+113.8 mb (+108.5 days of demand)+1,727 $M
do(·) interventions on the fitted structural model (6 columns)
InterventionCausal pathRuleWeeks changedMean: actual → counterfactual
do(ev_demand)Event residualzero2020-03-13 → 2021-06-25 (68w)0.235 → 0.000
do(vmt)Activitycontinue2020-03-13 → 2021-06-25 (68w)244,308.926 → 218,225.985
do(emp)Activitycontinue2020-03-13 → 2021-06-25 (68w)147,392.294 → 155,942.809
do(ipi)Activitycontinue2020-03-13 → 2021-06-25 (68w)95.516 → 95.293
do(wti)Price pass-throughcontinue2020-03-13 → 2021-06-25 (68w)45.673 → 44.332
do(util)Supplycontinue2020-03-13 → 2021-06-25 (68w)78.690 → 88.919

Model from2005_h12 · test MASE 0.783 · structural spread over 8 fitted runs

Channels: vmt_l0, ev_demand_l0, wti_dowhy, interaction. Lag tail 8 weeks. Not part of gasoline's demand model, so this event's change doesn't apply here: employment level.

Direction & magnitude
-359 kb/d (-4.38%)
peak -1,454 kb/d in week ending 2021-06-18
Top causal path
Activity
83% of effect · vehicle miles travelled (mobility)
Uncertainty
±224 kb/d (parameter)
structural range 661 kb/d over 8 fits
Decision translation
-165.4 mb
-20.2 days of demand · margin +14,594 $M
1Direction and magnitude
Horizon into the eventWeek endingActualWithout the eventSigned change95% parameter band
week 42020-04-035,0656,110+1,045 kb/d (+20.63%)6,034 – 6,187
week 82020-05-016,6647,325+661 kb/d (+9.92%)7,238 – 7,412
week 122020-05-297,5498,182+633 kb/d (+8.38%)7,172 – 8,280
week 242020-08-219,1618,857-304 kb/d (-3.32%)8,598 – 8,882
week 522021-03-058,7267,389-1,337 kb/d (-15.32%)7,277 – 7,504
end of window (week 68)2021-06-259,1737,770-1,403 kb/d (-15.30%)7,647 – 8,376
peak2021-06-189,4407,986-1,454 kb/d (-15.40%)7,860 – 8,519
average over window8,2067,847-359 kb/d (-4.38%)7,568 – 8,015
2Attribution: which causal path carries the effect
Path / channelMean changeCumulativeShareSourceCoefficient
Activity-388 kb/d-206.17 mb83%
vmt_l0 vehicle miles travelled (mobility)-388 kb/d-206.17 mbSARIMAX coefficient+0.4486 (significant)
Event residual+78 kb/d+41.47 mb17%
ev_demand_l0 demand-shock weeks+78 kb/d+41.47 mbSARIMAX coefficient-0.05019 (significant)
Price pass-through-2 kb/d-1.02 mb0%
wti_dowhy WTI crude price-2 kb/d-1.02 mbDoWhy estimate (8-week lag)-0.0162 (significant)
Interaction+1 kb/d+0.35 mb0%
interaction joint effect minus the sum of the single channels (channels combine multiplicatively)+1 kb/d+0.35 mb-
3Uncertainty
SourceSize
Parameter uncertainty±224 kb/d95% band, mean over the window
Model choice661 kb/d rangesame event re-run on 8 fits
DoWhy: WTI +25% -> gasoline demand (8-week lag)[-0.1545, -0.0162]range across backdoor sets and the confounder sweep
Held fixedeach week's unexplained noise, seasonality, trend, weather, and any driver not listed as an intervention
4Decision translation
QuantityValue
Demand-165.4 mb-20.2 days of demand
Refinery output+299 kb/d+142.4 mb cumulative · utilization -10 pts -> gasoline output: coefficient +0.0034 per utilization point (DoWhy)
Market balance+658 kb/dmore barrels available · +307.8 mb, +37.5 days
Days of supply (week 12)-7.2 dend of window 26.5 → 71.9 d
Margin exposure+14,594 $Mcrack +3.5 $/bbl on average · crack* = crack + +0.3396 $/bbl per utilization point x (util* - util)
Checkcomputed days of supply vs EIA column 'dos_gas': mean abs difference 0.02 days

Model from2000_h12 · test MASE 0.872 · structural spread over 8 fitted runs

Channels: ev_demand_l0, wti_dowhy, ipi_dowhy, interaction. Lag tail 8 weeks. Not part of diesel's demand model, so this event's change doesn't apply here: employment level, vehicle miles travelled (mobility).

Direction & magnitude
+52 kb/d (+1.38%)
peak +583 kb/d in week ending 2020-06-19
Top causal path
Event residual
78% of effect · demand-shock weeks
Uncertainty
±201 kb/d (parameter)
structural range 94 kb/d over 8 fits
Decision translation
+17.7 mb
+4.7 days of demand · margin +8,732 $M
1Direction and magnitude
Horizon into the eventWeek endingActualWithout the eventSigned change95% parameter band
week 42020-04-033,8074,003+196 kb/d (+5.14%)3,891 – 4,118
week 82020-05-013,1293,582+453 kb/d (+14.48%)2,850 – 3,685
week 122020-05-292,7183,111+393 kb/d (+14.44%)2,294 – 3,200
week 242020-08-213,9584,004+46 kb/d (+1.16%)3,830 – 4,004
week 522021-03-054,4874,496+9 kb/d (+0.19%)4,475 – 4,496
end of window (week 68)2021-06-254,1703,938-232 kb/d (-5.56%)3,938 – 4,680
peak2020-06-193,4664,049+583 kb/d (+16.81%)2,399 – 4,165
average over window3,7733,825+52 kb/d (+1.38%)3,608 – 4,009
2Attribution: which causal path carries the effect
Path / channelMean changeCumulativeShareSourceCoefficient
Event residual+37 kb/d+19.89 mb78%
ev_demand_l0 demand-shock weeks+37 kb/d+19.89 mbSARIMAX coefficient-0.05014 (significant)
Activity-7 kb/d-3.89 mb15%
ipi_dowhy industrial production-7 kb/d-3.89 mbDoWhy estimate (4-week lag)+0.6295 (significant)
Interaction+3 kb/d+1.35 mb5%
interaction joint effect minus the sum of the single channels (channels combine multiplicatively)+3 kb/d+1.35 mb-
Price pass-through+1 kb/d+0.35 mb1%
wti_dowhy WTI crude price+1 kb/d+0.35 mbDoWhy estimate (8-week lag)+0.0106 (not significant)
3Uncertainty
SourceSize
Parameter uncertainty±201 kb/d95% band, mean over the window
Model choice94 kb/d rangesame event re-run on 8 fits
DoWhy: WTI +25% -> distillate demand (8-week lag)[-0.1027, +0.0106]range across backdoor sets and the confounder sweep
DoWhy: IPI -5% -> distillate demand (4-week lag)[-0.8530, +0.6295]range across backdoor sets and the confounder sweep
Held fixedeach week's unexplained noise, seasonality, trend, weather, and any driver not listed as an intervention
4Decision translation
QuantityValue
Demand+17.7 mb+4.7 days of demand
Refinery output+491 kb/d+233.9 mb cumulative · utilization -10 pts -> distillate output: coefficient +0.0098 per utilization point (DoWhy)
Market balance+439 kb/dmore barrels available · +216.2 mb, +57.3 days
Days of supply (week 12)+2.2 dend of window 34.6 → 92.3 d
Margin exposure+8,732 $Mcrack +3.5 $/bbl on average · crack* = crack + +0.3396 $/bbl per utilization point x (util* - util)
Checkcomputed days of supply vs EIA column 'dos_dst': mean abs difference 0.02 days

Model from2010_h12 · test MASE 0.774 · structural spread over 8 fitted runs

Channels: vmt_l0, emp_l4, ev_demand_l0, wti_dowhy, interaction. Lag tail 8 weeks.

From 2020-06-12, the stock path implied by this event goes negative - the market would have rebalanced through prices, trade or higher runs this model doesn't capture. Trust the balance gap over the stock level after that date.

Direction & magnitude
+234 kb/d (+22.33%)
peak +1,302 kb/d in week ending 2020-05-22
Top causal path
Activity
72% of effect · vehicle miles travelled (mobility), employment level
Uncertainty
±66 kb/d (parameter)
structural range 250 kb/d over 8 fits
Decision translation
+113.8 mb
+108.5 days of demand · margin +1,727 $M
1Direction and magnitude
Horizon into the eventWeek endingActualWithout the eventSigned change95% parameter band
week 42020-04-037551,157+402 kb/d (+53.29%)1,121 – 1,195
week 82020-05-015151,278+763 kb/d (+148.15%)1,217 – 1,342
week 122020-05-29385867+482 kb/d (+125.24%)743 – 906
week 242020-08-211,1421,520+378 kb/d (+33.08%)1,444 – 1,561
week 522021-03-05849833-16 kb/d (-1.94%)795 – 872
end of window (week 68)2021-06-251,4351,238-197 kb/d (-13.73%)1,182 – 1,370
peak2020-05-228602,162+1,302 kb/d (+151.39%)1,830 – 2,270
average over window1,0491,283+234 kb/d (+22.33%)1,207 – 1,340
2Attribution: which causal path carries the effect
Path / channelMean changeCumulativeShareSourceCoefficient
Activity+154 kb/d+82.06 mb72%
vmt_l0 vehicle miles travelled (mobility)-63 kb/d-33.25 mbSARIMAX coefficient+0.5363 (significant)
emp_l4 employment level+217 kb/d+115.32 mbSARIMAX coefficient+3.864 (significant)
Event residual+51 kb/d+26.96 mb24%
ev_demand_l0 demand-shock weeks+51 kb/d+26.96 mbSARIMAX coefficient-0.2629 (significant)
Interaction+10 kb/d+5.16 mb5%
interaction joint effect minus the sum of the single channels (channels combine multiplicatively)+10 kb/d+5.16 mb-
Price pass-through-1 kb/d-0.35 mb0%
wti_dowhy WTI crude price-1 kb/d-0.35 mbDoWhy estimate (8-week lag)+0.0141 (not significant)
3Uncertainty
SourceSize
Parameter uncertainty±66 kb/d95% band, mean over the window
Model choice250 kb/d rangesame event re-run on 8 fits
DoWhy: WTI +25% -> jet demand (8-week lag)[-0.1144, +0.0141]range across backdoor sets and the confounder sweep
Held fixedeach week's unexplained noise, seasonality, trend, weather, and any driver not listed as an intervention
4Decision translation
QuantityValue
Demand+113.8 mb+108.5 days of demand
Refinery output+149 kb/d+70.8 mb cumulative · utilization -10 pts -> jet output: coefficient +0.0156 per utilization point (DoWhy)
Market balance-85 kb/dextra draw · -43.0 mb, -41.0 days
Days of supply (week 12)-69.5 dend of window 33.7 → 3.5 d
Margin exposure+1,727 $Mcrack +3.5 $/bbl on average · crack* = crack + +0.3396 $/bbl per utilization point x (util* - util)
Checkcomputed days of supply vs EIA column 'dos_jet': mean abs difference 0.03 days

Supply side of the same event: refinery utilization on its no-event path moves output (DoWhy utilization → output), the crack spread (edge equation) and, with demand, the stock path. Positive balance means more barrels available without the event.

FuelDemand changeOutput changeBalance gapStocks at endMargin exposure
Gasoline-359 kb/d+299 kb/d+658 kb/d+313.3 mb+14,594 $M
Distillate (diesel)+52 kb/d+491 kb/d+439 kb/d+209.0 mb+8,732 $M
Jet fuel+234 kb/d+149 kb/d-85 kb/d-40.7 mb+1,727 $M
No supply disruption (longest ev_supply run): 2021-02-12 → 2021-03-19 (6 weeks)

Supply-event flag off and refinery utilization on its pre-event path (output, crack and stocks follow). Rename this event once the dates in the flagged-runs table below are matched to the disruption.

FuelActual → without the eventChangeCumulativeMargin exposure
Gasoline8,258 → 8,261 kb/d+4 kb/d (+0.04%)+0.2 mb (+0.0 days of demand)+1,267 $M
Distillate (diesel)4,047 → 4,190 kb/d+143 kb/d (+3.54%)+6.0 mb (+1.5 days of demand)+573 $M
Jet fuel1,056 → 1,081 kb/d+25 kb/d (+2.35%)+1.0 mb (+1.0 days of demand)+164 $M
do(·) interventions on the fitted structural model (2 columns)
InterventionCausal pathRuleWeeks changedMean: actual → counterfactual
do(ev_supply)Event residualzero2021-02-12 → 2021-03-19 (6w)1.000 → 0.000
do(util)Supplycontinue2021-02-12 → 2021-03-19 (6w)72.400 → 82.383

Model from2005_h12 · test MASE 0.783 · structural spread over 10 fitted runs

Channels: ev_supply_l0. Lag tail 0 weeks.

Direction & magnitude
+4 kb/d (+0.04%)
peak +4 kb/d in week ending 2021-03-05
Top causal path
Event residual
100% of effect · supply-disruption weeks
Uncertainty
±103 kb/d (parameter)
structural range 189 kb/d over 10 fits
Decision translation
+0.2 mb
+0.0 days of demand · margin +1,267 $M
1Direction and magnitude
Horizon into the eventWeek endingActualWithout the eventSigned change95% parameter band
week 42021-03-058,7268,730+4 kb/d (+0.04%)8,622 – 8,840
end of window (week 6)2021-03-198,6168,620+4 kb/d (+0.04%)8,513 – 8,728
peak2021-03-058,7268,730+4 kb/d (+0.04%)8,622 – 8,840
average over window8,2588,261+4 kb/d (+0.04%)8,159 – 8,365
2Attribution: which causal path carries the effect
Path / channelMean changeCumulativeShareSourceCoefficient
Event residual+4 kb/d+0.16 mb100%
ev_supply_l0 supply-disruption weeks+4 kb/d+0.16 mbSARIMAX coefficient-0.0004479 (not significant)
3Uncertainty
SourceSize
Parameter uncertainty±103 kb/d95% band, mean over the window
Model choice189 kb/d rangesame event re-run on 10 fits
Held fixedeach week's unexplained noise, seasonality, trend, weather, and any driver not listed as an intervention
4Decision translation
QuantityValue
Demand+0.2 mb+0.0 days of demand
Refinery output+293 kb/d+12.3 mb cumulative · utilization -10 pts -> gasoline output: coefficient +0.0034 per utilization point (DoWhy)
Market balance+289 kb/dmore barrels available · +12.2 mb, +1.5 days
Margin exposure+1,267 $Mcrack +3.4 $/bbl on average · crack* = crack + +0.3396 $/bbl per utilization point x (util* - util)
Checkcomputed days of supply vs EIA column 'dos_gas': mean abs difference 0.02 days

Model from2020_h12 · test MASE 0.829 · structural spread over 10 fitted runs

Channels: ev_supply_l0. Lag tail 0 weeks.

Direction & magnitude
+143 kb/d (+3.54%)
peak +159 kb/d in week ending 2021-03-05
Top causal path
Event residual
100% of effect · supply-disruption weeks
Uncertainty
±167 kb/d (parameter)
structural range 142 kb/d over 10 fits
Decision translation
+6.0 mb
+1.5 days of demand · margin +573 $M
1Direction and magnitude
Horizon into the eventWeek endingActualWithout the eventSigned change95% parameter band
week 42021-03-054,4874,646+159 kb/d (+3.54%)4,464 – 4,835
end of window (week 6)2021-03-193,5923,719+127 kb/d (+3.54%)3,574 – 3,870
peak2021-03-054,4874,646+159 kb/d (+3.54%)4,464 – 4,835
average over window4,0474,190+143 kb/d (+3.54%)4,026 – 4,360
2Attribution: which causal path carries the effect
Path / channelMean changeCumulativeShareSourceCoefficient
Event residual+143 kb/d+6.02 mb100%
ev_supply_l0 supply-disruption weeks+143 kb/d+6.02 mbSARIMAX coefficient-0.03479 (not significant)
3Uncertainty
SourceSize
Parameter uncertainty±167 kb/d95% band, mean over the window
Model choice142 kb/d rangesame event re-run on 10 fits
Held fixedeach week's unexplained noise, seasonality, trend, weather, and any driver not listed as an intervention
4Decision translation
QuantityValue
Demand+6.0 mb+1.5 days of demand
Refinery output+363 kb/d+15.2 mb cumulative · utilization -10 pts -> distillate output: coefficient +0.0098 per utilization point (DoWhy)
Market balance+219 kb/dmore barrels available · +9.2 mb, +2.3 days
Margin exposure+573 $Mcrack +3.4 $/bbl on average · crack* = crack + +0.3396 $/bbl per utilization point x (util* - util)
Checkcomputed days of supply vs EIA column 'dos_dst': mean abs difference 0.03 days

Model from2010_h12 · test MASE 0.774 · structural spread over 10 fitted runs

Channels: ev_supply_l0. Lag tail 0 weeks.

Direction & magnitude
+25 kb/d (+2.35%)
peak +30 kb/d in week ending 2021-02-26
Top causal path
Event residual
100% of effect · supply-disruption weeks
Uncertainty
±37 kb/d (parameter)
structural range 77 kb/d over 10 fits
Decision translation
+1.0 mb
+1.0 days of demand · margin +164 $M
1Direction and magnitude
Horizon into the eventWeek endingActualWithout the eventSigned change95% parameter band
week 42021-03-05849869+20 kb/d (+2.35%)840 – 899
end of window (week 6)2021-03-191,0371,061+24 kb/d (+2.35%)1,026 – 1,098
peak2021-02-261,2851,315+30 kb/d (+2.35%)1,271 – 1,361
average over window1,0561,081+25 kb/d (+2.35%)1,045 – 1,118
2Attribution: which causal path carries the effect
Path / channelMean changeCumulativeShareSourceCoefficient
Event residual+25 kb/d+1.04 mb100%
ev_supply_l0 supply-disruption weeks+25 kb/d+1.04 mbSARIMAX coefficient-0.0232 (not significant)
3Uncertainty
SourceSize
Parameter uncertainty±37 kb/d95% band, mean over the window
Model choice77 kb/d rangesame event re-run on 10 fits
Held fixedeach week's unexplained noise, seasonality, trend, weather, and any driver not listed as an intervention
4Decision translation
QuantityValue
Demand+1.0 mb+1.0 days of demand
Refinery output+157 kb/d+6.6 mb cumulative · utilization -10 pts -> jet output: coefficient +0.0156 per utilization point (DoWhy)
Market balance+132 kb/dmore barrels available · +5.5 mb, +5.3 days
Margin exposure+164 $Mcrack +3.4 $/bbl on average · crack* = crack + +0.3396 $/bbl per utilization point x (util* - util)
Checkcomputed days of supply vs EIA column 'dos_jet': mean abs difference 0.02 days

Supply side of the same event: refinery utilization on its no-event path moves output (DoWhy utilization → output), the crack spread (edge equation) and, with demand, the stock path. Positive balance means more barrels available without the event.

FuelDemand changeOutput changeBalance gapStocks at endMargin exposure
Gasoline+4 kb/d+293 kb/d+289 kb/d+12.2 mb+1,267 $M
Distillate (diesel)+143 kb/d+363 kb/d+219 kb/d+9.2 mb+573 $M
Jet fuel+25 kb/d+157 kb/d+132 kb/d+5.5 mb+164 $M
No crude-price shock (longest geo run): 2007-01-05 → 2011-04-29 (226 weeks)

WTI follows its pre-window path; the effect reaches demand through the DoWhy backdoor elasticities (8-week lag). Retail prices are not touched. Rename once the dates are matched to the shock.

FuelActual → without the eventChangeCumulativeMargin exposure
Gasoline9,147 → 9,163 kb/d+16 kb/d (+0.17%)+28.4 mb (+3.1 days of demand)+0 $M
Distillate (diesel)3,941 → 3,937 kb/d-5 kb/d (-0.12%)-8.4 mb (-2.1 days of demand)+0 $M
Jet fuel1,482 → 1,480 kb/d-2 kb/d (-0.15%)-4.0 mb (-2.7 days of demand)+0 $M
do(·) interventions on the fitted structural model (1 columns)
InterventionCausal pathRuleWeeks changedMean: actual → counterfactual
do(wti)Price pass-throughcontinue2007-01-05 → 2011-04-29 (226w)79.769 → 68.213

Model from2005_h12 · test MASE 0.783 · structural spread over 4 fitted runs

Channels: wti_dowhy. Lag tail 8 weeks.

Direction & magnitude
+16 kb/d (+0.17%)
peak +98 kb/d in week ending 2008-08-08
Top causal path
Price pass-through
100% of effect · WTI crude price
Uncertainty
±153 kb/d (parameter)
structural range 0 kb/d over 4 fits
Decision translation
+28.4 mb
+3.1 days of demand · margin +0 $M
1Direction and magnitude
Horizon into the eventWeek endingActualWithout the eventSigned change95% parameter band
week 42007-01-269,0909,090+0 kb/d (+0.00%)9,090 – 9,090
week 82007-02-239,1219,121+0 kb/d (+0.00%)9,121 – 9,121
week 122007-03-239,2509,215-35 kb/d (-0.38%)8,922 – 9,215
week 242007-06-159,5919,569-22 kb/d (-0.23%)9,382 – 9,569
week 522007-12-289,2869,354+68 kb/d (+0.74%)9,354 – 9,960
end of window (week 226)2011-04-298,9439,007+64 kb/d (+0.72%)9,007 – 9,573
peak2008-08-089,4469,544+98 kb/d (+1.04%)9,544 – 10,426
average over window9,1479,163+16 kb/d (+0.17%)9,083 – 9,388
2Attribution: which causal path carries the effect
Path / channelMean changeCumulativeShareSourceCoefficient
Price pass-through+17 kb/d+28.43 mb100%
wti_dowhy WTI crude price+17 kb/d+28.43 mbDoWhy estimate (8-week lag)-0.0162 (significant)
3Uncertainty
SourceSize
Parameter uncertainty±153 kb/d95% band, mean over the window
Model choice0 kb/d rangesame event re-run on 4 fits
DoWhy: WTI +25% -> gasoline demand (8-week lag)[-0.1545, -0.0162]range across backdoor sets and the confounder sweep
Held fixedeach week's unexplained noise, seasonality, trend, weather, and any driver not listed as an intervention
4Decision translation
QuantityValue
Demand+28.4 mb+3.1 days of demand
Refinery output+0 kb/d+0.0 mb cumulative · utilization not intervened - output as observed
Market balance-16 kb/dextra draw · -28.4 mb, -3.1 days
Days of supply (week 12)+0.2 dend of window 22.5 → 19.6 d
Margin exposure+0 $Mcrack +0.0 $/bbl on average · crack spread unchanged (utilization not intervened or util->crack edge missing)
Checkcomputed days of supply vs EIA column 'dos_gas': mean abs difference 0.03 days

Model from2000_h12 · test MASE 0.872 · structural spread over 4 fitted runs

Channels: wti_dowhy. Lag tail 8 weeks.

Direction & magnitude
-5 kb/d (-0.12%)
peak -30 kb/d in week ending 2008-08-08
Top causal path
Price pass-through
100% of effect · WTI crude price
Uncertainty
±54 kb/d (parameter)
structural range 0 kb/d over 4 fits
Decision translation
-8.4 mb
-2.1 days of demand · margin +0 $M
1Direction and magnitude
Horizon into the eventWeek endingActualWithout the eventSigned change95% parameter band
week 42007-01-264,5404,540+0 kb/d (+0.00%)4,540 – 4,540
week 82007-02-234,7104,710+0 kb/d (+0.00%)4,710 – 4,710
week 122007-03-234,3484,359+11 kb/d (+0.25%)4,245 – 4,359
week 242007-06-154,0864,092+6 kb/d (+0.15%)4,027 – 4,092
week 522007-12-284,3404,319-21 kb/d (-0.48%)4,319 – 4,547
end of window (week 226)2011-04-293,8933,875-18 kb/d (-0.47%)3,875 – 4,073
peak2008-08-084,4064,376-30 kb/d (-0.68%)4,376 – 4,705
average over window3,9413,937-5 kb/d (-0.12%)3,909 – 4,017
2Attribution: which causal path carries the effect
Path / channelMean changeCumulativeShareSourceCoefficient
Price pass-through-5 kb/d-8.36 mb100%
wti_dowhy WTI crude price-5 kb/d-8.36 mbDoWhy estimate (8-week lag)+0.0106 (not significant)
3Uncertainty
SourceSize
Parameter uncertainty±54 kb/d95% band, mean over the window
Model choice0 kb/d rangesame event re-run on 4 fits
DoWhy: WTI +25% -> distillate demand (8-week lag)[-0.1027, +0.0106]range across backdoor sets and the confounder sweep
Held fixedeach week's unexplained noise, seasonality, trend, weather, and any driver not listed as an intervention
4Decision translation
QuantityValue
Demand-8.4 mb-2.1 days of demand
Refinery output+0 kb/d+0.0 mb cumulative · utilization not intervened - output as observed
Market balance+5 kb/dmore barrels available · +8.4 mb, +2.1 days
Days of supply (week 12)-0.1 dend of window 37.4 → 39.4 d
Margin exposure+0 $Mcrack +0.0 $/bbl on average · crack spread unchanged (utilization not intervened or util->crack edge missing)
Checkcomputed days of supply vs EIA column 'dos_dst': mean abs difference 0.03 days

Model from2005_h12 · test MASE 0.793 · structural spread over 4 fitted runs

Channels: wti_dowhy. Lag tail 8 weeks.

Direction & magnitude
-2 kb/d (-0.15%)
peak -15 kb/d in week ending 2008-08-08
Top causal path
Price pass-through
100% of effect · WTI crude price
Uncertainty
±23 kb/d (parameter)
structural range 0 kb/d over 4 fits
Decision translation
-4.0 mb
-2.7 days of demand · margin +0 $M
1Direction and magnitude
Horizon into the eventWeek endingActualWithout the eventSigned change95% parameter band
week 42007-01-261,5911,591+0 kb/d (+0.00%)1,591 – 1,591
week 82007-02-231,5321,532+0 kb/d (+0.00%)1,532 – 1,532
week 122007-03-231,5181,523+5 kb/d (+0.33%)1,478 – 1,523
week 242007-06-151,7311,734+3 kb/d (+0.20%)1,703 – 1,734
week 522007-12-281,5901,580-10 kb/d (-0.64%)1,580 – 1,675
end of window (week 226)2011-04-291,4741,465-9 kb/d (-0.62%)1,465 – 1,550
peak2008-08-081,6741,659-15 kb/d (-0.90%)1,659 – 1,801
average over window1,4821,480-2 kb/d (-0.15%)1,468 – 1,514
2Attribution: which causal path carries the effect
Path / channelMean changeCumulativeShareSourceCoefficient
Price pass-through-2 kb/d-4.05 mb100%
wti_dowhy WTI crude price-2 kb/d-4.05 mbDoWhy estimate (8-week lag)+0.0141 (not significant)
3Uncertainty
SourceSize
Parameter uncertainty±23 kb/d95% band, mean over the window
Model choice0 kb/d rangesame event re-run on 4 fits
DoWhy: WTI +25% -> jet demand (8-week lag)[-0.1144, +0.0141]range across backdoor sets and the confounder sweep
Held fixedeach week's unexplained noise, seasonality, trend, weather, and any driver not listed as an intervention
4Decision translation
QuantityValue
Demand-4.0 mb-2.7 days of demand
Refinery output+0 kb/d+0.0 mb cumulative · utilization not intervened - output as observed
Market balance+2 kb/dmore barrels available · +4.0 mb, +2.7 days
Days of supply (week 12)-0.1 dend of window 27.2 → 29.8 d
Margin exposure+0 $Mcrack +0.0 $/bbl on average · crack spread unchanged (utilization not intervened or util->crack edge missing)
Checkcomputed days of supply vs EIA column 'dos_jet': mean abs difference 0.02 days

Supply side of the same event: refinery utilization on its no-event path moves output (DoWhy utilization → output), the crack spread (edge equation) and, with demand, the stock path. Positive balance means more barrels available without the event.

FuelDemand changeOutput changeBalance gapStocks at endMargin exposure
Gasoline+16 kb/d+0 kb/d-16 kb/d-25.1 mb+0 $M
Distillate (diesel)-5 kb/d+0 kb/d+5 kb/d+7.5 mb+0 $M
Jet fuel-2 kb/d+0 kb/d+2 kb/d+3.6 mb+0 $M
No SPR release (longest ev_spr run): 2021-09-10 → 2023-01-06 (70 weeks)

The fitted demand model has no direct SPR channel; a release can only reach demand through the crude price, so WTI is set to its pre-window path. If WTI did not move in the window the effect is zero by construction.

FuelActual → without the eventChangeCumulativeMargin exposure
Gasoline8,800 → 8,808 kb/d+8 kb/d (+0.09%)+2.0 mb (+0.2 days of demand)+0 $M
Distillate (diesel)3,953 → 3,951 kb/d-2 kb/d (-0.06%)-0.6 mb (-0.1 days of demand)+0 $M
Jet fuel1,531 → 1,530 kb/d-1 kb/d (-0.08%)-0.3 mb (-0.2 days of demand)+0 $M
do(·) interventions on the fitted structural model (1 columns)
InterventionCausal pathRuleWeeks changedMean: actual → counterfactual
do(wti)Price pass-throughcontinue2021-09-10 → 2023-01-06 (70w)90.019 → 87.568

Model from2005_h12 · test MASE 0.783 · structural spread over 10 fitted runs

Channels: wti_dowhy. Lag tail 8 weeks.

Direction & magnitude
+8 kb/d (+0.09%)
peak -48 kb/d in week ending 2023-03-03
Top causal path
Price pass-through
100% of effect · WTI crude price
Uncertainty
±55 kb/d (parameter)
structural range 0 kb/d over 10 fits
Decision translation
+2.0 mb
+0.2 days of demand · margin +0 $M
1Direction and magnitude
Horizon into the eventWeek endingActualWithout the eventSigned change95% parameter band
week 42021-10-019,4279,427+0 kb/d (+0.00%)9,427 – 9,427
week 82021-10-299,5049,504+0 kb/d (+0.00%)9,504 – 9,504
week 122021-11-268,7968,814+18 kb/d (+0.21%)8,814 – 8,974
week 242022-02-188,6578,650-7 kb/d (-0.08%)8,595 – 8,650
week 522022-09-028,7278,731+4 kb/d (+0.04%)8,731 – 8,762
end of window (week 70)2023-01-067,5587,549-9 kb/d (-0.12%)7,471 – 7,549
peak2023-03-038,5628,514-48 kb/d (-0.55%)8,119 – 8,514
average over window8,8008,808+8 kb/d (+0.09%)8,788 – 8,898
2Attribution: which causal path carries the effect
Path / channelMean changeCumulativeShareSourceCoefficient
Price pass-through+4 kb/d+1.98 mb100%
wti_dowhy WTI crude price+4 kb/d+1.98 mbDoWhy estimate (8-week lag)-0.0162 (significant)
3Uncertainty
SourceSize
Parameter uncertainty±55 kb/d95% band, mean over the window
Model choice0 kb/d rangesame event re-run on 10 fits
DoWhy: WTI +25% -> gasoline demand (8-week lag)[-0.1545, -0.0162]range across backdoor sets and the confounder sweep
Held fixedeach week's unexplained noise, seasonality, trend, weather, and any driver not listed as an intervention
4Decision translation
QuantityValue
Demand+2.0 mb+0.2 days of demand
Refinery output+0 kb/d+0.0 mb cumulative · utilization not intervened - output as observed
Market balance-8 kb/dextra draw · -2.0 mb, -0.2 days
Days of supply (week 12)-0.1 dend of window 27.4 → 26.9 d
Margin exposure+0 $Mcrack +0.0 $/bbl on average · crack spread unchanged (utilization not intervened or util->crack edge missing)
Checkcomputed days of supply vs EIA column 'dos_gas': mean abs difference 0.03 days

Model from2020_h12 · test MASE 0.829 · structural spread over 10 fitted runs

Channels: wti_dowhy. Lag tail 8 weeks.

Direction & magnitude
-2 kb/d (-0.06%)
peak +13 kb/d in week ending 2023-02-10
Top causal path
Price pass-through
100% of effect · WTI crude price
Uncertainty
±20 kb/d (parameter)
structural range 0 kb/d over 10 fits
Decision translation
-0.6 mb
-0.1 days of demand · margin +0 $M
1Direction and magnitude
Horizon into the eventWeek endingActualWithout the eventSigned change95% parameter band
week 42021-10-014,3654,365+0 kb/d (+0.00%)4,365 – 4,365
week 82021-10-293,6863,686+0 kb/d (+0.00%)3,686 – 3,686
week 122021-11-264,2094,203-6 kb/d (-0.14%)4,203 – 4,265
week 242022-02-184,2334,235+2 kb/d (+0.05%)4,213 – 4,235
week 522022-09-023,6243,623-1 kb/d (-0.03%)3,623 – 3,634
end of window (week 70)2023-01-063,8213,824+3 kb/d (+0.08%)3,792 – 3,824
peak2023-02-103,8943,907+13 kb/d (+0.33%)3,771 – 3,907
average over window3,9533,951-2 kb/d (-0.06%)3,943 – 3,983
2Attribution: which causal path carries the effect
Path / channelMean changeCumulativeShareSourceCoefficient
Price pass-through-1 kb/d-0.55 mb100%
wti_dowhy WTI crude price-1 kb/d-0.55 mbDoWhy estimate (8-week lag)+0.0106 (not significant)
3Uncertainty
SourceSize
Parameter uncertainty±20 kb/d95% band, mean over the window
Model choice0 kb/d rangesame event re-run on 10 fits
DoWhy: WTI +25% -> distillate demand (8-week lag)[-0.1027, +0.0106]range across backdoor sets and the confounder sweep
Held fixedeach week's unexplained noise, seasonality, trend, weather, and any driver not listed as an intervention
4Decision translation
QuantityValue
Demand-0.6 mb-0.1 days of demand
Refinery output+0 kb/d+0.0 mb cumulative · utilization not intervened - output as observed
Market balance+2 kb/dmore barrels available · +0.6 mb, +0.1 days
Days of supply (week 12)+0.1 dend of window 32.4 → 32.7 d
Margin exposure+0 $Mcrack +0.0 $/bbl on average · crack spread unchanged (utilization not intervened or util->crack edge missing)
Checkcomputed days of supply vs EIA column 'dos_dst': mean abs difference 0.02 days

Model from2010_h12 · test MASE 0.774 · structural spread over 10 fitted runs

Channels: wti_dowhy. Lag tail 8 weeks.

Direction & magnitude
-1 kb/d (-0.08%)
peak +8 kb/d in week ending 2023-03-03
Top causal path
Price pass-through
100% of effect · WTI crude price
Uncertainty
±9 kb/d (parameter)
structural range 0 kb/d over 10 fits
Decision translation
-0.3 mb
-0.2 days of demand · margin +0 $M
1Direction and magnitude
Horizon into the eventWeek endingActualWithout the eventSigned change95% parameter band
week 42021-10-011,6941,694+0 kb/d (+0.00%)1,694 – 1,694
week 82021-10-291,6821,682+0 kb/d (+0.00%)1,682 – 1,682
week 122021-11-261,7271,724-3 kb/d (-0.18%)1,724 – 1,753
week 242022-02-181,4761,477+1 kb/d (+0.07%)1,468 – 1,477
week 522022-09-021,4321,431-1 kb/d (-0.04%)1,431 – 1,436
end of window (week 70)2023-01-061,4061,407+1 kb/d (+0.11%)1,394 – 1,407
peak2023-03-031,6511,659+8 kb/d (+0.49%)1,587 – 1,659
average over window1,5311,530-1 kb/d (-0.08%)1,526 – 1,544
2Attribution: which causal path carries the effect
Path / channelMean changeCumulativeShareSourceCoefficient
Price pass-through-1 kb/d-0.29 mb100%
wti_dowhy WTI crude price-1 kb/d-0.29 mbDoWhy estimate (8-week lag)+0.0141 (not significant)
3Uncertainty
SourceSize
Parameter uncertainty±9 kb/d95% band, mean over the window
Model choice0 kb/d rangesame event re-run on 10 fits
DoWhy: WTI +25% -> jet demand (8-week lag)[-0.1144, +0.0141]range across backdoor sets and the confounder sweep
Held fixedeach week's unexplained noise, seasonality, trend, weather, and any driver not listed as an intervention
4Decision translation
QuantityValue
Demand-0.3 mb-0.2 days of demand
Refinery output+0 kb/d+0.0 mb cumulative · utilization not intervened - output as observed
Market balance+1 kb/dmore barrels available · +0.3 mb, +0.2 days
Days of supply (week 12)+0.1 dend of window 22.3 → 22.7 d
Margin exposure+0 $Mcrack +0.0 $/bbl on average · crack spread unchanged (utilization not intervened or util->crack edge missing)
Checkcomputed days of supply vs EIA column 'dos_jet': mean abs difference 0.03 days

Supply side of the same event: refinery utilization on its no-event path moves output (DoWhy utilization → output), the crack spread (edge equation) and, with demand, the stock path. Positive balance means more barrels available without the event.

FuelDemand changeOutput changeBalance gapStocks at endMargin exposure
Gasoline+8 kb/d+0 kb/d-8 kb/d-4.0 mb+0 $M
Distillate (diesel)-2 kb/d+0 kb/d+2 kb/d+1.1 mb+0 $M
Jet fuel-1 kb/d+0 kb/d+1 kb/d+0.6 mb+0 $M

Stage 04Counterfactual simulation engine

What goes into this stage, what happens, and what comes out.

What goes in

  • The fitted causal model per fuel
  • A scenario: a driver, a shock size and a start week
  • For historical counterfactuals, the event flag to remove

What happens

  • Run the Baseline, Oil Shock, Refinery Down and Slowdown branches
  • Rewrite history without a flagged event to see the path demand would have taken
  • Attribute the effect to the causal paths that carry it
  • Report parameter and structural uncertainty side by side

What comes out

  • Signed change against baseline per fuel and horizon
  • Attribution: which paths carry the effect
  • Confidence bands and decision translation: volumes, days of cover and margin exposure
do(·) interventionsFour branchesHistorical rewriteAttributionSee all four stages on the home page →