How to Compute a Base-Load Fee Price per MWh¶
This recipe turns a deal's fee price and capacity (MW) into a price per MWh — and a per-15-minute share — by combining the fee with the total delivered energy (MWh).
Scope: base-load only
This derivation assumes a base-load product — a constant MW capacity
across the whole delivery period. For shaped / peak / off-peak products the
single capacity figure is not representative; work from the 15-minute
volumes (fct_volume_pwr_15m) instead, where each row already carries
begin_utc / end_utc and a fixed quarter-hour.
Inputs¶
| Symbol | Meaning | Source view · column |
|---|---|---|
px |
Fee price (per-MW fee rate) | fct_deal_fee.fee |
volume_mw |
Base-load capacity (MW) | fct_deal_fee.volume |
total_volume_mwh |
Total delivered energy (MWh) | sum(fct_volume_pwr_daily.volume) |
fct_deal_fee carries one row per deal · side · fee; fct_volume_pwr_daily
carries daily power volume in MWh. They join on the deal, version and side
(tran_id, tran_version, side identifier).
The formula¶
total_fee_cflow = px × volume_mw [currency]
number_of_hours = total_volume_mwh / volume_mw [h] (MWh / MW = h)
price_per_mwh = px / number_of_hours [currency/MWh]
price_per_mwh_per_quarter = price_per_mwh / 4 [currency/MWh per 15-min]
number_of_hours is the base-load bridge between the two volume bases (MW and
MWh). Substituting it back shows the price per MWh is just the total fee spread
over the total energy:
A 15-minute interval at 1 MW delivers 0.25 MWh, so the quarter-hour share is
one quarter of the hourly value. For a general interval, multiply
price_per_mwh by interval_minutes / 60.
Query¶
with fee as (
-- fee price (px) and base-load capacity (MW), per deal · side · fee
select
deal_id,
tran_id,
tran_version,
param_seq_num as side_id,
fee_seq_num,
fee as px, -- per-MW fee rate
volume as volume_mw, -- base-load capacity in MW
currency,
fee_calc_unit,
price_unit,
volume_type
from fct_deal_fee
),
energy as (
-- total delivered energy (MWh), summed to deal · side
select
tran_id,
tran_version,
side_id,
sum(volume) as total_volume_mwh
from fct_volume_pwr_daily
group by tran_id, tran_version, side_id
)
select
f.deal_id,
f.side_id,
f.currency,
f.px,
f.volume_mw,
e.total_volume_mwh,
f.px * f.volume_mw as total_fee_cflow,
e.total_volume_mwh / nullif(f.volume_mw, 0) as number_of_hours,
(f.px * f.volume_mw) / nullif(e.total_volume_mwh, 0) as price_per_mwh,
((f.px * f.volume_mw) / nullif(e.total_volume_mwh, 0)) / 4 as price_per_mwh_per_quarter
from fee f
left join energy e
on f.tran_id = e.tran_id
and f.tran_version = e.tran_version
and f.side_id = e.side_id
-- where f.deal_id = <your base-load deal>
Check the unit assumptions¶
The arithmetic relies on three things being true for your deal — confirm them before relying on the result:
-
feeis a per-MW rate (sofee × MWis a cashflow) — checkfee_calc_unit/price_unit. Iffeeis already a total cashflow, use it directly astotal_fee_cflowand skip the first multiplication. -
fct_volume_pwr_daily.volumeis MWh for the product (it is, by definition, for power) and covers the same delivery period as the fee. - One base-load fee per side — a side may carry several
fee_seq_numrows (different charge types); filter to the fee you intend to price. - Direction — decide whether you want signed (pay vs receive) or absolute magnitudes before aggregating.
Worked example¶
A base-load deal of volume_mw = 10 MW, a fee px = 50 (currency/MW), and a
full non-leap year of delivery (total_volume_mwh = 10 MW × 8,760 h = 87,600 MWh):
total_fee_cflow = 50 × 10 = 500 currency
number_of_hours = 87,600 / 10 = 8,760 h
price_per_mwh = 50 / 8,760 ≈ 0.005708 currency/MWh
price_per_mwh_per_quarter = 0.005708 / 4 ≈ 0.001427 currency/MWh per 15-min
Cross-check: total_fee_cflow / total_volume_mwh = 500 / 87,600 ≈ 0.005708 —
matches price_per_mwh.