News & Sentiment
The News section adds a contextual layer to EPF: a continuously refreshed feed of energy market headlines, each scored by an automated sentiment analysis. It answers a question the price chart cannot — why the market might be moving the way it is.
Where you see it
The news layer appears in three places throughout the dashboard.
1. News panel on the Market Price page
The right-hand column of the Market Price page includes a compact Market News panel showing the 30 most recent relevant headlines for the selected country plus global supply-shock stories. Each item displays:
- A colored sentiment dot (green = positive, grey = neutral, red = negative)
- The publishing source (e.g. Reuters, Politico, MSN)
- Relative time (“2h ago”)
- The headline (clipped to 2 lines)
Click any headline to open the full article in a new tab. Click “View all →” to jump to the dedicated News page.
2. The dedicated News page
Accessible from the sidebar, the Market News page is a full-width view of all collected articles. It is organized into category columns with filtering controls at the top.
Sentiment trend chart — A stacked bar chart at the top of the page breaks down article volume by date and category. Each bar carries a sentiment arrow marker:
- ↑ — predominantly positive articles that day
- → — neutral or mixed
- ↓ — predominantly negative articles that day
Click any bar to filter the article list below to that date and category combination. A dismissable filter pill appears above the list showing the active filter.
Country filter — A multi-select dropdown lets you toggle coverage by country: ES / PT / FR / DE / GLOBAL (global supply shocks). Use “Select all” and “Clear” buttons to switch quickly.
Date filter — Preset tabs (Today / 7d / Month / Year) plus a MonthYearPicker for navigating to specific historical months or years.
Tag chips — The top 12 tags present in the current filtered view appear as toggleable chips. Selecting one narrows the article list to that tag.
Category columns — Articles are organized into predefined category columns (geopolitics, renewables, grid/regulation, commodities, markets, other). Each column shows up to 6 cards by default with an expand button for more.
3. Sentiment badge on the Market Price page
The Market Price page includes an inline sentiment pill in the page header that surfaces the 24-hour news sentiment at a glance:
📰 News NEGATIVE · 9 #gas #outageThe badge color matches the sentiment label. Clicking it routes to the full News page. It hides itself if zero articles have been collected in the last 24 hours.
How sentiment is calculated
EPF uses a fully local, zero-cost natural language pipeline. No external AI APIs are called — every score is computed on the EPF server using two open-source components.
Step 1: Source ingestion
Google News RSS queries are polled every 15 minutes across multiple country and topic combinations:
| Query focus | Catches |
|---|---|
| Iberian electricity market | Spain power, OMIE, “iberian market” coverage from Reuters, Politico, MSN, Recharge News, Euractiv, etc. |
| Operators & regulators | Red Eléctrica, ENTSO-E reports, regulatory announcements |
| EU energy (PT/FR/DE) | Portuguese, French, and German electricity market coverage |
| Global supply shocks | LNG, TTF, oil supply events with cross-border price impact |
Google News is used as the aggregator because direct publisher RSS feeds are either offline (ENTSO-E) or paywalled (Reuters Energy). The actual publisher name is parsed from each article title.
Step 2: Relevance filtering
Each fetched article is scored against a curated keyword dictionary spanning 5 categories:
| Category | Example keywords |
|---|---|
| Core electricity | electricity, power, grid, kWh, MWh, blackout, outage |
| Fuel | gas, TTF, LNG, coal, carbon, ETS, oil, Brent |
| Renewables | wind, solar, hydro, photovoltaic, battery, storage |
| Nuclear | nuclear, reactor, EDF, uranium |
| Markets | OMIE, EPEX, ENTSO-E, interconnection, day-ahead, intraday, balancing |
To pass the filter, an article must:
- Mention at least one market-specific keyword for the relevant country or region
- Match at least 2 of the 5 categories
This combination filters out roughly 90% of the raw RSS feed (sports, politics unrelated to energy, US-only headlines, etc.) while keeping the signal-rich energy news.
The article’s relevance_score is the fraction of categories matched (0.0 to 1.0). Higher scores indicate more deeply on-topic articles.
Step 3: Sentiment scoring
Each kept article’s headline is scored by VADER (Valence Aware Dictionary and sEntiment Reasoner), a rule-based sentiment analyzer designed for short-form text like news headlines.
VADER returns a compound score between −1.0 (most negative) and +1.0 (most positive), based on a lexicon of words with associated valence weights and a set of grammatical rules for negation, intensifiers (“very”, “extremely”), and contrastive conjunctions (“but”). EPF then maps the compound score to a label:
| Compound score | Label | Color |
|---|---|---|
| ≥ +0.05 | POSITIVE | Green |
| −0.05 to +0.05 | NEUTRAL | Grey |
| ≤ −0.05 | NEGATIVE | Red |
VADER scores the headline only, not the article body. RSS bodies tend to be either boilerplate or truncated, and the headline is what an analyst actually reads when scanning a feed.
Step 4: Tag extraction
A keyword-to-tag dictionary assigns each article one or more tags from a fixed vocabulary:
| Tag | Triggers on |
|---|---|
nuclear | nuclear, reactor, uranium |
gas | gas, TTF, LNG |
renewable | wind, solar, photovoltaic |
regulation | regulator, policy, subsidy, tariff, law |
outage | outage, blackout, shutdown, maintenance, force majeure |
weather | heatwave, cold snap, storm, drought |
carbon | carbon, ETS, emissions |
interconnection | interconnection, interconnector, cross-border |
intraday | intraday, balancing, ancillary |
spike | surge, spike, record high, soar |
negative | negative price |
An article can carry multiple tags. Tags drive the filter chips on the News page and the dominant-tags display in the sentiment badge.
How to read the sentiment label
The sentiment label is a sentiment about the news content itself, not a direct prediction of price direction. Headlines with negative sentiment (outages, blackouts, regulatory penalties, supply disruptions) often correlate with upward price pressure, but the relationship is not mechanical.
A few examples to build intuition:
| Headline | VADER label | What it suggests |
|---|---|---|
| ”Spain has Europe’s cheapest electricity” | NEGATIVE | VADER reads “cheapest” as a negative valence word, even though the market implication is positive. Read scores in context — sentiment ≠ price direction. |
| ”Iberian blackout caused by voltage control failure” | NEGATIVE | A genuinely negative event with likely upward price impact. |
| ”Spain announces tax cuts on fuel and electricity” | POSITIVE | Genuinely positive — relief measures during a crisis. |
| ”Wind and solar break new generation record” | POSITIVE | Renewable surplus typically pushes prices down. |
This is why the dashboard shows the label, the article count, and the dominant tags together — the tags often clarify what kind of story is driving the sentiment in either direction. A “NEGATIVE / 12 articles / #gas #outage” snapshot is more actionable than the label alone.
What it is not (yet)
The current News & Sentiment layer is display-only. The model that produces the day-ahead and strategic price forecasts does not consume sentiment as a feature. EPF deliberately ships the data layer first so the team can validate offline whether sentiment movements actually predict price residuals before wiring them into the model.
If validation shows a useful signal, a future version of the production model may incorporate sentiment as one of its inputs. Until then, the news feed is exactly what it appears to be: a contextual reference for human analysts working alongside the forecast.
Refresh cadence
| Layer | Frequency |
|---|---|
| Backend collection cron | Every 15 minutes |
| Frontend polling (all 3 surfaces) | Every 5 minutes |
If a story breaks and matches the relevance filter, it will appear in the dashboard within ~20 minutes of publication on the originating site (Google News indexing latency + EPF cron + frontend poll).
Coverage and limitations
- Four markets covered: ES, PT, FR, DE. Use the country filter on the News page to scope coverage. The GLOBAL category captures cross-border supply shock stories (LNG, TTF, oil) relevant to all markets.
- English-language sources. The Google News queries are configured for English coverage; non-English outlets are surfaced when an English version exists.
- Headlines, not full articles. Sentiment is scored on headlines only. The body excerpt shown on the News page is whatever the RSS feed exposes (usually a 1–2 sentence summary).
- VADER is a rule-based scorer. It catches sentiment about 70% of the time on news headlines and can be fooled by industry-specific jargon (the “cheapest electricity” example above). Treat the label as a hint, not an oracle.
Related sections
- Market Price — the forecast itself. The compact news panel on this page shows the same feed scoped to the selected country.
- Multi-Country — the landing page. Includes a multi-country news section showing coverage across all four markets.