Sensitivity tornado — assumption ranking
Generated: 2026-05-07. Base case: 60 MW PV + 60 MWh BESS @ 100 MW DC, ICPT 16 sen, Tariff E3, LP-optimal dispatch. Base NPV = −357 M RM (PV-only: +24 M RM). Each variable swept low/high in plausible ranges; ranked by absolute NPV impact.
Tornado ranked
Section titled “Tornado ranked”| Rank | Variable | Low | Base | High | NPV at low | NPV at high | Range (M RM) |
|---|---|---|---|---|---|---|---|
| 1 | BESS CapEx (M RM/MWh) | 2.5 | 5.0 | 7.5 | −172 | −542 | 370 |
| 2 | ICPT (RM/kWh) | 0.08 | 0.16 | 0.24 | −410 | −304 | 106 |
| 3 | PV CapEx (M RM/MW) | 2.8 | 3.5 | 4.2 | −315 | −399 | 84 |
| 4 | BESS year-10 augmentation fraction | 0.3 | 0.5 | 0.7 | −329 | −385 | 56 |
| 5 | PV PR | 0.70 | 0.78 | 0.86 | −383 | −331 | 52 |
| 6 | Annual GHI (kWh/m²/yr) | 1,495 | 1,661 | 1,827 | −382 | −331 | 51 |
| 7 | Horizon (years) | 15 | 20 | 25 | −385 | −337 | 48 |
| 8 | Discount rate (WACC) | 0.06 | 0.08 | 0.10 | −334 | −375 | 41 |
| 9 | Energy peak rate (RM/kWh) | 0.270 | 0.337 | 0.404 | −373 | −340 | 33 |
| 10 | Energy off-peak rate (RM/kWh) | 0.162 | 0.202 | 0.242 | −373 | −340 | 33 |
| 11 | BESS MD capture fraction | 0.30 | 0.48 | 0.70 | −368 | −343 | 25 |
| 12 | PV in ETOU peak fraction | 0.10 | 0.18 | 0.30 | −364 | −346 | 18 |
| 13 | MD charge (RM/kW/month) | 28.40 | 35.50 | 42.60 | −363 | −351 | 12 |
| 14 | BESS cycles per year | 200 | 250 | 300 | −360 | −353 | 7 |
| 15 | BESS RTE | 0.85 | 0.88 | 0.92 | −357 | −356 | 1 |
Key reads
Section titled “Key reads”Tier 1 — single dominant lever: BESS CapEx (370 M RM range)
Section titled “Tier 1 — single dominant lever: BESS CapEx (370 M RM range)”BESS CapEx alone moves the bottom line by more than the entire base case. At 2.5 M RM/MWh (USD 500/kWh, achievable ~2028 per BNEF curve), NPV is still negative at −172 M RM but less than half the base. At 7.5 M RM/MWh (supply-chain stress scenario), NPV is −542 M RM.
Takeaway: the BESS investment decision is fundamentally a capex-timing bet — every other lever combined doesn’t move NPV more than BESS CapEx alone. The right commercial structure pre-commits BESS contracts only at capex threshold triggers — e.g., “lock procurement when 4-h LFP installed quote is below 2.5 M RM/MWh”.
Tier 2 — ICPT (106 M RM range)
Section titled “Tier 2 — ICPT (106 M RM range)”ICPT is the second-most influential lever and is policy-driven, not technology-driven. Halving ICPT (from 16 to 8 sen — possible if the MY government extends the domestic subsidy framework to industrial users) eliminates the entire favorability of the post-2022 BTM PV case. Doubling ICPT (to 24 sen, fuel-shock scenario) makes BESS NPV gap close 30% on its own.
Takeaway: negotiate tariff-floor clauses in any BTM PPA — this is the highest-value contract clause for a BTM PV+BESS project. Without them, an ICPT subsidy reform can wipe out the project’s entire economic basis. With a floor, the downside risk halves.
Tier 3 — PV CapEx (84 M RM range)
Section titled “Tier 3 — PV CapEx (84 M RM range)”PV CapEx ±20% moves NPV by ±42 M RM. Moderate impact, well-modelled by EPC competitive bidding.
Takeaway: run a competitive PV EPC tender with at least 3 bidders. Each ~5% capex reduction is worth ~10 M RM NPV.
Tiers 4–7 — physical / financial assumption cluster
Section titled “Tiers 4–7 — physical / financial assumption cluster”PV physics (PR, annual GHI, horizon, WACC) cluster between 41–56 M RM range each. None individually dominant. Collectively they bound the project’s “intrinsic uncertainty” floor.
Takeaway: these are cost-of-information items. Better climate data (more years of POWER + ERA5 + ground sensors), better EPC quotes (real PR guarantees), cheaper financing — each adds value but none decisively.
Tiers 8–15 — minor levers
Section titled “Tiers 8–15 — minor levers”Tariff peak/off-peak rates (TNB pricing), MD charge, BESS technical parameters (RTE, cycles, MD capture), peak share of PV — all individually move NPV by ≤ 33 M RM. Worth modelling correctly but not worth fighting hard for in negotiations.
Where the NPV sign flip would happen
Section titled “Where the NPV sign flip would happen”To find variables that, ALONE, could flip portfolio NPV from −357 to ≥ 0:
| Variable | Required value | Realistic? |
|---|---|---|
| BESS CapEx | ≤ ~2.0 M RM/MWh | 2030+ per BNEF curve |
| Discount rate | < 0% | No |
| Horizon | > 50 years | No |
| All others | Out of plausible range | No |
No single non-BESS-capex variable in plausible range can flip the sign. BESS CapEx falling below 2.0 M RM/MWh (USD ~430/kWh) is the necessary condition. This timing aligns with the 2028–2030 BNEF curve.
Combined sensitivity — the realistic 2030 scenario
Section titled “Combined sensitivity — the realistic 2030 scenario”Stacking Tier-1, Tier-2, and Tier-3 favorable assumptions to model “plausible 2028–2030 best case”:
| Variable | 2030 favorable value | Effect |
|---|---|---|
| BESS CapEx | 2.0 M RM/MWh (BNEF 2030 curve) | NPV +220 M |
| ICPT | 0.20 RM/kWh (continued post-2022 trajectory) | NPV +50 M |
| PV CapEx | 2.8 M RM/MW (continued cost decline) | NPV +42 M |
| Combined | NPV ≈ −45 M (close to break-even) |
A 2030 base case is near breakeven on pure BTM, and a modest VPP service contract (~50 k RM/MW/month) on top clears the gap.
Commercial team negotiation playbook (priority order)
Section titled “Commercial team negotiation playbook (priority order)”- Tariff-floor clause in BTM PPA: hedges against ICPT subsidy reform. Highest-value single negotiation item — worth up to 105 M NPV.
- BESS procurement timing: pre-negotiate framework agreement, lock only when capex < 2.5 M RM/MWh trigger. Worth up to 200 M NPV by waiting 2-3 years.
- Competitive PV EPC tender with ≥3 bidders + PR guarantee. Worth up to 80 M NPV.
- Hyperscaler resilience PPA premium (2.6 sen/kWh markup, see vpp_service_revenue_required.md). Worth ~150 M NPV when stacked with BESS at 2030 capex.
- Long PPA tenor (25y) if available. Worth ~25 M NPV.
- Senior-debt-heavy financing (lower WACC). Worth ~40 M NPV per 200 bps WACC reduction.
- Everything else: standard project finance items, no special focus.
What NOT to argue
Section titled “What NOT to argue”The bottom 5 levers (RTE, cycles per year, MD charge ±20%, peak share, PV in ETOU peak fraction) collectively move NPV by < 70 M RM in any combination. Don’t over-engineer dispatch optimization or precision load shape modelling for the commercial pitch — diminishing returns relative to the capex-and-policy levers above.
LP cross-validation (added 2026-05-07)
Section titled “LP cross-validation (added 2026-05-07)”Re-ran the LP at the low/high bound of each top-tariff variable to test whether the analytical model holds at extremes. Result:
Recalibrated against the cooling-CDH-aware LP base
(pv_calibration = 0.9322, bess_md_capture = 0.5045). Pre-recalibration
the analytical model was uniformly conservative by ~8 M RM (cooling effect);
post-recalibration the base is matched to 0.01 M RM and residual drift is
zero-mean noise from the LP’s intra-window dispatch flexibility.
| Perturbation | LP NPV | Tornado NPV | Drift (M RM) |
|---|---|---|---|
| Base (60 MW PV + 60 MWh BESS @ ICPT 16 sen) | −348.8 | −348.8 | +0.0 |
| Peak rate −20% (0.270) | −368 | −365.6 | +2.4 |
| Peak rate +20% (0.404) | −330 | −331.9 | −1.9 |
| Off-peak rate −20% (0.162) | −363 | −365.7 | −2.8 |
| Off-peak rate +20% (0.242) | −335 | −331.8 | +3.2 |
| MD rate −20% (28.40) | −358 | −355.1 | +2.9 |
| MD rate +20% (42.60) | −340 | −342.4 | −2.4 |
| ICPT 0.08 RM/kWh (low) | −399 | −402.8 | −3.8 |
| ICPT 0.24 RM/kWh (high) | −299 | −294.7 | +4.3 |
Findings:
- Base case drift is now ~0 (recalibrated against LP-w-cooling).
- Residual nonlinearity at extremes is ±4 M RM (≤ 1.2% of base NPV) and is now zero-mean — the analytical model neither systematically over- nor under-estimates LP. The tornado holds at the bounds.
Implications for the playbook above:
- Rank ordering is preserved at all sampled extremes. Top-3 levers remain BESS CapEx > ICPT > PV CapEx.
- Absolute NPV numbers are now within ±4 M RM of LP truth at any sampled parameter perturbation. For commercial commitments at non-base parameter sets, re-running the LP at that point is still cheap (~3 s) and recommended for the final number.
Caveats
Section titled “Caveats”- Linear analytical model calibrated to LP base case. Cross-effects between variables are not captured; e.g., higher ICPT plus lower BESS capex compound non-linearly via the dispatch decisions LP would make. For final commercial figures, re-run the full LP at the chosen parameter set.
- Augmentation modelled as single 50% capex hit at year 10. Real augmentation curves are smoother; tornado overestimates this lever’s impact by ~15% relative to a smooth degradation model.
- All ranges are author-judgment intervals. For specific tender commitments, replace with vendor-quoted range or external benchmarks.
- This report:
reports/sensitivity_tornado.md - Raw rankings:
reports/sensitivity_tornado.json - Source code:
src/jb_vpp/models/tornado.py - Related:
reports/btm_economics_dc100.md,reports/vpp_service_revenue_required.md,reports/aggregator_portfolio.md