ED.OMIE.BIDS
Raw OMIE day-ahead bidding behavior by technology — offered + cleared volumes, prices, clearing rate, marginal. Companion to ED.CURTAIL.ECON, no curtailment claim.
Signature
ED.OMIE.BIDS([tech], [start], [end], [agg], [zone], [headers])Description
Returns raw OMIE day-ahead market behavior per (bucket, tech): how much volume was offered, how much cleared, weighted-average prices on both sides, clearing rate, and the slot marginal — without any 'curtailment' interpretation. Use it for asset-management research on bid strategy across the full tech spectrum (renewables + flexible thermal + interconnects), where the strict-curtailment claim of ED.CURTAIL.ECON doesn't apply.
**Why this exists**: ED.CURTAIL.ECON deliberately rejects flexible techs (thermal_gas/nuclear/hydro/coal/cogen/bombeo/bess) because their unmatched offered reflects strategic bidding (safety bids near the price-cap), not curtailment in the APPA sense. ED.OMIE.BIDS surfaces the raw numbers anyway, so users can analyse market behavior across all techs and judge for themselves.
**Tech enum (18 accepted values)**:
- *Renewables*: solar, wind, vre (= solar+wind+renewable_other+vre_unspecified), hydro, bombeo, bess, hybrid.
- *Thermal*: nuclear, coal, thermal_gas, thermal_fueloil, thermal (alias for thermal_gas + thermal_fueloil), biomass, cogen.
- *Other*: autoprod.
- *Aggregator*: all (default) — every classified real tech, ex interconnects + non-generation labels.
- *Special*: interconnect — INVERTED filter; returns only MIEU/MIP/MIE with the tech bucket as the literal string 'interconnect'.
Rejected with 400 (with explanatory hints): placeholder, unknown, representation, venta_generica, and any other unrecognised string. These are uof_tech_map.tech labels for UOFs awaiting classification, aggregator wholesalers, or generic clearing entries — not real generating techs.
**Expansion semantics**: vre/all/thermal cause the output to spill ONE row per sub-tech (solar, wind, renewable_other, vre_unspecified for vre; the underlying real-tech set for all; thermal_gas+thermal_fueloil for thermal). Single-tech values keep the literal you asked for as the row label.
**Marginal column**: marginal_eur_mwh_avg is the AVG over the bucket's slots of MAX(price WHERE side='V', status='C'), computed ex-interconnects. It is **slot-weighted** — one entry per slot (averaged over slots with eligible volume > 0), not row-weighted — so a slot with many bids counts once. For tech=interconnect the marginal column is informative — the slot's real clearing price, NOT an interconnection-specific price.
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| tech | string | "all" | Tech filter. Default "all" (= every classified real tech). Accepted: "solar", "wind", "vre", "hydro", "bombeo", "bess", "hybrid", "nuclear", "coal", "thermal_gas", "thermal_fueloil", "thermal" (alias), "biomass", "cogen", "autoprod", "all", "interconnect" (special). |
| start | date | — | YYYY-MM-DD. Omit for end − 1 year. |
| end | date | — | YYYY-MM-DD. Omit for the first day after the last available month (OMIE publishes monthly with ~90-day lag). |
| agg | 1..7 | 6 | 1=hourly, 2=daily, 3=monthly, 4=quarterly, 5=semiannual, 6=annual (default), 7=total. String aliases H/D/M/Q/S/Y/T also accepted. |
| zone | "es" | "pt" | "iberian" | "es" | Geographic filter. es → pais IN ('ES','MI') (default), pt → pais IN ('PT','MI'), iberian → pais IN ('ES','PT','MI') (includes the MIBEL pais='MI' bucket). |
| headers | 0 | 1 | 0 | Set 1 for a header row. |
Valid values for `tech`
| Code | Description |
|---|---|
| all | Default. Every classified real tech via uof_tech_map, excluding interconnects, placeholder, unknown, representation, venta_generica. Output spills one row per real tech per bucket. |
| solar | Solar PV only. Filters uof_tech_map.tech = 'solar'. |
| wind | Wind only. Filters uof_tech_map.tech = 'wind'. |
| vre | Combined must-run renewables: solar, wind, renewable_other, vre_unspecified (Régimen Especial aggregator UOFs). Output spills one row per sub-tech. |
| hydro | Conventional hydro (run-of-river + reservoirs). Excludes pumped storage. |
| bombeo | Pumped storage (turbinación + bombeo). |
| bess | Battery energy storage. |
| hybrid | Hybrid plants (solar + storage, wind + storage, …). |
| nuclear | Nuclear baseload. Safety-bids ~35% of volume → clearing_rate typically < 100%. |
| coal | Coal-fired thermal. |
| thermal_gas | CCGT and other gas-fired thermal. Safety-bids ~48% of volume → clearing_rate well below 100% in typical hours. |
| thermal_fueloil | Fuel-oil thermal (mainland insular). |
| thermal | Alias for thermal_gas + thermal_fueloil. Output spills both sub-techs. |
| biomass | Biomass thermal. |
| cogen | Industrial cogeneration. |
| autoprod | Self-producer UOFs. |
| interconnect | **Special case**: INVERTED filter. Returns only MIEU/MIP/MIE (interconnect UOFs); tech bucket = literal 'interconnect'. mwh_offered is typically 0 (interconnects appear only as status='C' in OMIE data), mwh_cleared reflects net imports. n_uofs ∈ {1,2,3}. |
Returns
Spill matrix — 10 columns: [bucket, tech, mwh_offered, mwh_cleared, clearing_rate_pct, offered_price_avg_eur_mwh, cleared_price_avg_eur_mwh, marginal_eur_mwh_avg, n_slots, n_uofs]. One row per (bucket, tech) pair. For agg=7 (total) bucket is the literal string "TOTAL". For tech=interconnect the tech column is always the literal 'interconnect'.
Examples
=ED.OMIE.BIDS()— Last 12 months raw bidding all techs ES, yearly (all defaults)=ED.OMIE.BIDS("thermal_gas", "2024-10-01", "2025-01-01", 6, "es")— Annual thermal_gas Q4-2024 ES (clearing_rate likely < 100% — safety bidding)=ED.OMIE.BIDS("vre", "2024-01-01", "2024-12-31", 3, "iberian")— Monthly VRE 2024 Iberian (4 sub-techs spilling separately)=ED.OMIE.BIDS("interconnect", "2024-12-01", "2025-01-01")— Annual interconnect 2024 — tech bucket = 'interconnect', n_uofs ∈ {1,2,3}=ED.OMIE.BIDS("nuclear", "2024-01-01", "2024-12-31", 6, "es", 1)— Annual nuclear 2024 ES with header rowNotes
- **Raw vs strict curtailment**: this function makes NO curtailment claim.
ED.CURTAIL.ECONis the strict definition (offered ≤ slot_marginal − cleared) restricted to renewables;ED.OMIE.BIDSreturns the raw numbers across the full tech spectrum so the user can analyse without an econometric prior. Comparingmwh_offered − mwh_clearedhere to curtailment-in-the-APPA-sense for flexible techs would be misleading (their unmatched offered is strategic bidding). - **Special case
tech=interconnect**: filter is INVERTED — keeps only MIEU/MIP/MIE (the three OMIE interconnect aggregator codes). Tech bucket is the literal string'interconnect'.mwh_offeredis usually 0 (OMIE doesn't surface explicitstatus='O'rows for these UOFs);mwh_clearedreflects net imports.n_uofs∈ {1,2,3}. - **Marginal column semantics**:
marginal_eur_mwh_avgis the AVG over the bucket's slots ofMAX(price WHERE side='V', status='C')computed ex-interconnects. Fortech=interconnectthis column shows the slot's REAL clearing price, not the import-specific price (informative — interconnects don't set the marginal). - **Publication lag**: OMIE publishes monthly bid-curve data with ~90-day confidentiality lag. Queries for too-recent dates return 404 with the last-available month in the body (
last_available_mes). - **Expansion semantics**:
vre/all/thermalcause the output to spill ONE row per sub-tech. Single-tech literals (e.g.solar,wind,nuclear) keep that literal as the row label. - **Bucket format**:
YYYY-MMfor monthly,YYYY-MM-DDfor daily,YYYY-MM-DD HH:MMfor hourly,YYYY-Qnfor quarterly,YYYY-Hnfor semiannual,YYYYfor annual, literal'TOTAL'foragg=7. - **Column semantics**:
n_slotsis the count of distinct hourly slots that had any offered or cleared volume for the (bucket, tech);n_uofsis the count of distinct UOFs that contributed (useful for sizing the tech pool). - **Rejected tech values**:
placeholder,unknown,representation,venta_generica, or any other string → 400 with an explanatory message. These areuof_tech_map.techlabels for UOFs awaiting classification, aggregator wholesalers, or generic clearing entries — not real generating techs.