Skip to content

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.

RankVariableLowBaseHighNPV at lowNPV at highRange (M RM)
1BESS CapEx (M RM/MWh)2.55.07.5−172−542370
2ICPT (RM/kWh)0.080.160.24−410−304106
3PV CapEx (M RM/MW)2.83.54.2−315−39984
4BESS year-10 augmentation fraction0.30.50.7−329−38556
5PV PR0.700.780.86−383−33152
6Annual GHI (kWh/m²/yr)1,4951,6611,827−382−33151
7Horizon (years)152025−385−33748
8Discount rate (WACC)0.060.080.10−334−37541
9Energy peak rate (RM/kWh)0.2700.3370.404−373−34033
10Energy off-peak rate (RM/kWh)0.1620.2020.242−373−34033
11BESS MD capture fraction0.300.480.70−368−34325
12PV in ETOU peak fraction0.100.180.30−364−34618
13MD charge (RM/kW/month)28.4035.5042.60−363−35112
14BESS cycles per year200250300−360−3537
15BESS RTE0.850.880.92−357−3561

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”.

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.

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.

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.

To find variables that, ALONE, could flip portfolio NPV from −357 to ≥ 0:

VariableRequired valueRealistic?
BESS CapEx≤ ~2.0 M RM/MWh2030+ per BNEF curve
Discount rate< 0%No
Horizon> 50 yearsNo
All othersOut of plausible rangeNo

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”:

Variable2030 favorable valueEffect
BESS CapEx2.0 M RM/MWh (BNEF 2030 curve)NPV +220 M
ICPT0.20 RM/kWh (continued post-2022 trajectory)NPV +50 M
PV CapEx2.8 M RM/MW (continued cost decline)NPV +42 M
CombinedNPV ≈ −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)”
  1. Tariff-floor clause in BTM PPA: hedges against ICPT subsidy reform. Highest-value single negotiation item — worth up to 105 M NPV.
  2. 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.
  3. Competitive PV EPC tender with ≥3 bidders + PR guarantee. Worth up to 80 M NPV.
  4. 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.
  5. Long PPA tenor (25y) if available. Worth ~25 M NPV.
  6. Senior-debt-heavy financing (lower WACC). Worth ~40 M NPV per 200 bps WACC reduction.
  7. Everything else: standard project finance items, no special focus.

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.

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.

PerturbationLP NPVTornado NPVDrift (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.
  • 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