Skip to content

Concepts

Background on the data, vocabulary, and conventions used by the 15-minute power volume views.

15-minute granularity

Power markets settle on 15-minute intervals (quarter-hours).

  • 96 periods per day — 24 hours × 4 = 96.
  • Period boundaries — :00, :15, :30, :45.
  • Period identity — every period is identified by its begin_utc (the UTC start timestamp). end_utc = begin_utc + 15 minutes.

A day always contains exactly 96 UTC periods, regardless of daylight saving. See Time zones and DST.

Delivery date vs trade date

delivery_date_utc is the UTC calendar date the power is delivered, not the date the deal was traded. Two trades booked on different days for the same delivery hour land on the same delivery_date_utc.

Business case

business_case categorises trading activity by strategy or desk. Common values: Intraday, Day-Ahead, Balancing. Sourced from the Endur Business Case transaction info field.

Grid / power control area

grid is the German power control area where electricity is delivered:

  • TenneT
  • 50Hertz
  • Amprion
  • TransnetBW

For Buy deals, grid is sourced from dim_point_of_receipt_location.power_control_area. For Sell deals, it's dim_point_of_delivery_location.power_control_area.

Buy / sell volumes

Volumes are exposed as two separate columns: volume_buy_mw and volume_sell_mw (both in MW). Net position is volume_buy_mw - volume_sell_mw. A single row never has both non-zero — each upstream deal contributes to one side based on its buy_sell flag.

Volumes are reported in MW (power), not MWh (energy). Multiply by 0.25 hours per period if you need energy.

VWAP vs index price

There are two price worlds, one for each fact family:

Fact family Price column Meaning
Fixed-price (fct_volume_pwr_15m, fct_ewe_volume_pwr_by_business_case*) buy_vwap_price_eur_per_mwh, sell_vwap_price_eur_per_mwh VWAP: volume-weighted average of the deal prices contributing to that period.
Floating / index (fct_volume_pwr_floating_15m, fct_ewe_volume_pwr_floating_by_business_case*) power_index_price_eur_per_mwh Index price for the period (e.g. EPEX intraday), sourced from core_endur_index_pricing_15m_daily.

VWAP is computed as:

VWAP = SUM(volume × price) / SUM(volume)

across all deals contributing to a single (combo, period) cell. If no buy volume contributes, buy_vwap_price_eur_per_mwh is 0 (not NULL). Same for sell. See Gap-filling for why.

Don't average VWAPs naively

AVG(buy_vwap_price_eur_per_mwh) over a day double-counts low-volume periods. To roll up VWAP correctly, re-compute from underlying volumes:

SUM(volume_buy_mw * buy_vwap_price_eur_per_mwh) / NULLIF(SUM(volume_buy_mw), 0)

Internal / external business unit

For floating volumes, the views surface both sides of the BU relationship:

  • internal_business_unit — the EWE entity booking the deal (e.g. EWE TR SHORT TERM BU).
  • external_business_unit — the counterparty's BU (e.g. ECC INTD BU, NORD POOL AS BU).

These come from sat_party_internal_bu_le_attribute and sat_party_external_bu_le_attribute joined via the deal attribute surrogate keys.

Instrument sub-type

The floating views filter to instrument_sub_type = 'PWR Index' — power deals priced against a published index rather than a fixed agreed price.

tran_status

Customer volume views handle tran_status in one of two ways, and which one a view uses matters for what you must filter yourself.

  • Allow-list views. The generic fct_volume_pwr_15m, fct_volume_pwr_15m_deal, fct_volume_pwr_floating_15m and fct_volume_pwr_floating_15m_deal views, the fct_ewe_volume_pwr_* wrappers and the quarter views pre-filter to tran_status IN ('Validated', 'Matured'). You don't need to filter on tran_status yourself: pending, cancelled and every other status are excluded upstream.
  • Cancelled-excluded views. The views listed in Cancelled and withdrawn deals remove deals whose current status is Cancelled and keep every other status (for example Pending, New, Deleted, Template, Amended). If you need only Validated and Matured deals from these views, filter on the status through the deal dimension yourself.

Cancelled and withdrawn deals

A deal does not stay Validated or Matured forever: it can be cancelled, withdrawn, or otherwise moved out of those statuses. How a view treats that depends on its group.

Allow-list views. The fct_volume_pwr_* 15-minute views, the fct_ewe_volume_pwr_* wrappers and the quarter views remove a deal's volume from the next load onward when the deal leaves Validated/Matured.

Views that exclude currently Cancelled deals. These ten views exclude every deal whose current status is Cancelled, and keep all other statuses:

  • fct_volume_15m and fct_volume_15m_deal
  • fct_volume_factor_deal
  • fct_volume_pwr_daily
  • fct_volume_pwr_15m_agg and fct_volume_pwr_floating_15m_agg (a bucket whose deal attribute is Cancelled is not shown)
  • fct_volume_gas_daily
  • fct_volume_daily and fct_volume_daily_old
  • fct_schedule

A deal is currently Cancelled when the current version of the deal has tran_status = 'Cancelled', the status that fct_deal shows. A deal that was cancelled in an earlier version but has another status now keeps its rows, and a deal with no status is not removed.

Views left unchanged by decision. fct_schedule_history and fct_volume_history_daily list every version of a deal, so they still show the versions of deals that are now Cancelled. P&L-style views are also unchanged.

This is a data-correctness guarantee, not a timing artefact: a deal that leaves scope will not leave behind residual volume in the views above, even though its delivery dates may be weeks in the past. The total volume you see for any (business_case, grid, delivery_date_utc) combination always reflects only the deals that are currently in scope for that view.

You never need to account for this yourself, and you will never see "leftover" rows from a cancelled deal in those views:

  • You don't filter on the Cancelled status. The views already exclude it.
  • You don't see internal bookkeeping rows. The mechanism the pipeline uses to clear a removed deal's volume is purely internal and is filtered out before any customer view. Querying a view returns only real, in-scope volume.

If a deal returns to a non-Cancelled status later (and, for the allow-list views, to Validated/Matured), its volume reappears automatically on the next load, with no manual action required.

Difference from the legacy account

The legacy account does not filter cancelled deals out of the volume views that were compared (the 15-minute, factor and daily volume views). Comparing a cancelled deal across the two accounts therefore shows its rows on the legacy side only. This is intended, and reconciliation reports attribute it to this rule.

Why this matters

Earlier in the pipeline's history, a cancelled deal could leave stale volume behind that inflated daily totals and broke the reconciliation checks. The current pipeline removes a deal's volume the moment it leaves scope, so totals stay correct between loads. The check_customer_views_exclude_cancelled_deals check reports any cancelled deal that reappears in one of these views.

Power index name

For floating deals, power_index_name identifies the published index used for settlement, e.g. PWR EPEX_DE_INTRADAY 15min. One floating deal generally pins to one index.