Versione vigente: v1.4.0
Versione inglese — la traduzione italiana è in preparazione.
Olea Price — Methodology v1.4.0
Published: 2026-08-18. In force. Changelog at the end.
The Olea Price is a daily composite index of the origin price of European olive oil, computed exclusively from publicly identified official and semi-official sources. This page is the normative specification: the IndexCalculator code implements exactly these formulas, and every published value stores its exact inputs (observation ids and applied weights) together with the methodology version, so that any historical value is reproducible bit for bit.
Published indices
| Code | Grade | Scope |
|---|---|---|
| OLEA-EVOO-ES | Extra virgin | Spain |
| OLEA-VIRGIN-ES | Virgin | Spain |
| OLEA-LAMP-ES | Lampante | Spain |
| OLEA-EVOO-IT | Extra virgin | Italy |
| OLEA-EVOO-EU | Extra virgin | EU composite (ES, IT, EL, PT) |
Unit: EUR/kg, 3 decimals. Publication: daily (also when the underlying sources are weekly).
Window and eligibility
For the index of day D, all non-quarantined price observations with observed_date within the window [D−13, D] (14 calendar days) are considered for the (grade, country) combination. Quarantined observations (outside the plausible range [0.5, 20] EUR/kg, future-dated, or deviating more than 4σ and more than 12% from the 90-day mean of their source series) never enter the computation without human review.
Cross-source corroboration (since v1.1.0)
A genuine market move is indistinguishable from an error when judged only against its own series' trailing mean. And because quarantined observations do not enter that mean, a rejected new price leaves the average anchored to the old level, which then rejects the next real price too — a ratchet that freezes the index away from the market.
An observation that trips the sigma test is therefore still published when a different source quotes the same grade and region at a comparable price:
same (grade, region) · different source · |Δ date| ≤ 10 days · |Δ price| ≤ 5%
A genuine move gets corroborated by independent sources; a parsing or unit error does not. Range violations and future dates remain unconditional quarantines.
Per-observation weighting
w = w_recency × w_tier × w_volume
w_recency = exp(−0.15 × age_in_days) # days between observed_date and D
w_tier = official: 1.0 | semi_official: 0.8 | cooperative: 0.7 | press: 0.5
w_volume = 1 + log10(1 + volume_tons) # 1.0 if the source reports no volume
Index value = weighted average of price_eur_kg, rounded to 3 decimals.
High-side basket cap (since v1.2.0, threshold revised in v1.3.0)
ISMEA quotes extravergine from boutique piazze (Abruzzo, inland Sicily) at twice the Puglia commodity level and reports no volume, so w_volume = 1 lets those piazze dominate the Italian print. With 3 or more observations in the window, quotes whose price exceeds P25 × 1.25 are dropped (high side only: origin premiums always raise the price, never lower it). If the filter would empty the basket it is skipped. The threshold is 3 rather than 4 because boutique bias is at its worst, not its mildest, when the basket is thin: at 4 the filter switched itself off in exactly the case it exists to correct. Excluded rows are stored in inputs.excluded_outliers for audit. /v1/regional still lists every piazza.
EU composite index (OLEA-EVOO-EU)
Average of the national EVOO values (computed with the formula above) weighted by the production share of the latest campaign:
ES 0.62 · IT 0.15 · EL 0.13 · PT 0.10
(Initial values from campaign production shares; they will be verified against IOC data at every methodology revision.) If a country has no data within the window — or, since v1.4.0, its basket falls below the 3-observation floor — it drops out of the computation and the remaining weights are renormalised; the lost coverage penalises confidence (see below).
Confidence (0–1)
Every value publishes an explicit confidence measure:
confidence = C_sources × C_freshness × C_dispersion (× 0.5 if degraded)
C_sources = min(1, distinct_sources / 3)
C_freshness = exp(−0.10 × weighted_mean_age_in_days)
C_dispersion = 1 / (1 + 2 × CV), CV = weighted_std_dev / mean
Degradation: with fewer than 2 sources the value is still published but its confidence is multiplied by 0.5. Since v1.4.0 a basket of fewer than 3 observations is no longer published as a fresh print at all: it carries forward (see "Insufficient basket"). When the resulting confidence is below 0.30, the print is flagged degraded in the API and UI (not a high-conviction commodity print). stale remains reserved for empty-window carry-forward.
For the EU composite: confidence = (Σ conf_country × weight_country / Σ weights) × coverage, where coverage = Σ available_weights / Σ total_weights.
Series continuity (stale)
If the 14-day window is empty, the index repeats the last published value flagged stale=true, with decayed confidence (previous_confidence × 0.8). The daily series never has gaps; consumers must treat stale=true as "no new information". When there is no prior value to carry, the series has not started on that date and nothing is published: a zero is not a market observation.
Insufficient basket (since v1.4.0)
A basket too thin to be a benchmark is treated the same as an empty one. If fewer than 3 observations survive the high-side cap, the index does not publish a fresh print: it carries the last value forward with stale=true and decayed confidence, exactly as for an empty window.
A single quote has no dispersion and nothing to corroborate it, so its confidence is not measurable: it is a price, not a benchmark. On 18 August 2026 the Italian index published 11.500 EUR/kg — the only quote left in the window, from a boutique piazza — because Borsa Merci di Bari suspends over the August break and its commodity prices had aged out of the 14 days. A price-reporting agency that cannot observe the market repeats its last assessment and says so; it does not invent one from whatever is left on the screen.
Reproducibility and audit
Every index_values row stores:
inputs: observation ids with their price and applied weight (or national values and weights, for the composite),methodology_version: the semver version of this document,confidence,observations_count,sources_count,stale.
The internal audit endpoint reconstructs any value from its inputs and verifies the match. A change to the formula, window, weights or sources requires a new methodology version; historical series from previous versions are never rewritten.
Sources (v1)
The indices are computed exclusively from identified official and semi-official source categories:
| Category | Tier | Cadence | Coverage |
|---|---|---|---|
| National agriculture ministry (ES) | official | weekly | national average prices by grade |
| Regional price observatory (ES) | official | weekly | origin prices by province |
| EU market data | official | weekly | ES/IT/EL/PT by grade, >20 years of history |
| National market institute (IT) | official | weekly | EVOO by piazza |
| Food-chain information agency (ES) | official | monthly | stocks/outflows/production (not part of the price index) |
The full operational source registry (bodies, endpoints, tier weights) is documented for subscribers and auditors on request: [email protected].
Changelog
-
1.4.0 (2026-08-18) — Basket floor: with fewer than 3 observations surviving the high-side cap, the index carries the last value forward as
staleinstead of publishing a fresh print. Prompted by OLEA-EVOO-IT at 11.500 EUR/kg off a single boutique quote (Chieti), with Borsa Merci di Bari on its August break and its commodity piazze outside the window. Historical series are not rewritten. -
1.3.0 (2026-08-17) — The high-side basket cap now applies from 3 observations (was 4): at 4 it switched itself off exactly when the basket was thin, which is when two or three boutique quotes ARE the whole print. The Italian index reached 9.244 EUR/kg (+47.7% on the week) off Chieti 11.50, Trapani 7.50 and Palermo 7.45 while Bari and Taranto traded at 4.55-4.80 just outside the window. A carry-forward with no prior value also no longer publishes 0.000 EUR/kg — it publishes nothing. Historical series are not rewritten.
-
1.2.0 (2026-08-14) — High-side cap on the commodity basket: with ≥4 observations, quotes above P25 × 1.25 are excluded (boutique ISMEA piazze that, with no tonnage, pulled OLEA-EVOO-IT 40%+ above the EU national print). Confidence < 0.30 is published with a
degradedflag. 1.1.0 series are not rewritten; daily calculation under this version uses the filtered basket (Italy and the EU composite must be recalculated). -
1.1.0 (2026-07-30) — Cross-source corroboration in the quarantine: an observation exceeding 4σ and 12% is published when a different, independent source quotes the same grade and region within ±10 days and ±5%. Fixes a ratchet that quarantined a real market move permanently (rejected values never enter the mean that judges them). Historical series are not rewritten; already-quarantined observations are re-evaluated under the new rule and released when they pass.
-
1.0.0 (2026-07-14) — Initial version.