Utilizziamo strumenti di analisi statistica e econometrica per l’analisi del prezzo dell’energia in Italia
Aiutiamoci con Python per la parte di analisi dei dati e previsioni dei prezzi di mercato
In quest’articolo guida realizzeremo un’analisi econometrica e statistica del PUN – Prezzo Unico Nazionale, sfruttando le potenzialità di Python.
L’intero codice usato in quest’articolo è open source.
Oltre agli snippet già inseriti nel testo dell’articolo e disponibili su GitHub Gist, è possibile scaricare l’intero file sorgente (Jupyter Notebook interatti), sia del dato grezzo che per la parte di analisi. le indicazioni e link sono fornite di seguito nell’articolo.
Analisi econometrica e statistica del PUN con Python
Introduzione
Il Prezzo Unico Nazionale (PUN) rappresenta il riferimento primario del mercato elettrico all’ingrosso italiano. Definito giornalmente sulla base delle contrattazioni nel Mercato del Giorno Prima (MGP), il PUN riflette le condizioni di equilibrio tra domanda e offerta elettrica su scala nazionale. Esso costituisce un indicatore di grande rilevanza per operatori energetici, analisti e policy maker.
Proponiamo qui un’analisi empirica del PUN relativa all’intero anno 2024, basata su dati orari ufficiali.
L’obiettivo è duplice: da un lato, esplorare le caratteristiche statistiche e temporali del prezzo attraverso tecniche descrittive e visualizzazioni avanzate; dall’altro, costruire un modello econometrico in grado di cogliere le principali componenti dinamiche della serie storica e produrre previsioni a breve termine.
L’analisi si fonda su una pipeline in linguaggio Python, impiegando strumenti propri della statistica classica e della modellazione time series, con particolare riferimento ai modelli SARIMA (Seasonal Autoregressive Integrated Moving Average, o Seasonal ARIMA).
Tale approccio consente di integrare la componente stagionale, chiaramente presente nei dati orari e giornalieri del settore elettrico, in una struttura autoregressiva differenziata a media mobile.
L’articolo si articola in una fase preliminare di esplorazione e trasformazione dei dati, seguita da una sezione di modellazione statistica e da un commento conclusivo sui risultati ottenuti e sulle possibili estensioni.
Sommario
Questo tutorial per l’analisi del PUN mediante Python si pone i seguenti obiettivi:
- Gestire il caricamento e la preparazione dei dati.
- Parsing del file Excel in Python con pandas.
- Pulizia dei dati (gestione dei valori nulli, normalizzazione timestamp, ecc.).
- Effettuare l’analisi descrittiva del dataset
- Statistiche riassuntive (media, mediana, varianza, ecc.).
- Grafici: serie temporale, istogramma, boxplot per ora/giorno/settimana.
- Analisi di stagionalità (es. differenze giorno/notte, feriali/festivi).
- Procedere con alcune analisi econometriche
- Test di stazionarietà (Dickey-Fuller).
- Differenziazione se necessario.
- Autocorrelazione (ACF/PACF).
- Modello ARIMA o SARIMA per modellare la serie.
- Eventuale previsione su periodo successivo.
- Fornire alcuni esempi di data visualization
- Time series grafica.
- Boxplot.
- Heatmap oraria (giorni vs ore).
- Trarre alcune conclusioni con piglio critico
- Riassunto dei risultati principali.
- Interpretazione economica delle dinamiche del prezzo.
Alcune premesse
- L’articolo, pur costruito su dati di mercato reali, è puramente didattico. Le previsioni fornite sono volutamente semplificate e non adatte a reali applicazioni sull’andamento dei mercati.
- Il codice creato è pensato esclusivamente per un uso didattico e non creato per un uso in produzione.
- Trattare esaustivamente e scientificamente analisi di questo tipo richiederebbe una mole di spazio, tempo e risorse fuori scopo per le finalità di quest’articolo. Si intende ragionevole aver apportato semplificazioni in sede di analisi (vedere la sezione dedicata a seguire nell’articolo) e aver trattato in via semplificata dal punto di vista teorico alcuni passaggi sulla congruità del modello adottato.
- In alcune sezioni l’output del codice è stato semplificato per rendere la lettura più agevole e scorrevole; viene fornita comunque la sorgente puntuale per riprodurlo localmente.
Bibliografia
Numerosi sono gli articoli e i paper che trattano l’utilizzo di modelli autoregressivi con stagionalità per le serie storiche dei prezzi dell’energia.
In particolare, sono stati consultati:
- Bellini, Fabio & Stefani, Silvana & Beccarello, Massimo & Tonini, G & Venturini, A. (2004). Una metodologia per la previsione del prezzo orario della energia elettrica mediante tecniche statistiche.
- Manuel Gallo National Single Price forecasting in predefined scenarios: Statistics and Artificial Intelligence at the service of the Italian Power Market. Rel. Maurizio Repetto. Politecnico di Torino, Corso di laurea magistrale in Ingegneria Energetica E Nucleare, 2024.
- Sheybanivaziri, Samaneh & Le Dréau, Jérôme & Kazmi, Hussain. (2024). Forecasting price spikes in day-ahead electricity markets: techniques, challenges, and the road ahead. SSRN Electronic Journal. 10.2139/ssrn.4697863.
- Energy Price Prediction with SARIMA.
Download della serie storica del PUN
La serie storica del PUN è stata scaricata manualmente dal sito del GME – Gestore Mercati Energetici.
Per le finalità di quest’articolo, è sufficiente proseguire al seguente link e selezionare il periodo di interesse, scaricando poi la serie storica oraria:
Per ulteriore semplicità, rendiamo disponibile il file già impostato utilizzato per analisi statistica ed econometrica in Python, a questo link:
Avendo cura di salvarlo nel folder dove si andranno poi ad eseguire gli script Python, o modificando adeguatamente il relativo URI nel codice.
Volendo implementare una pipeline di sviluppo automatico, è possibile utilizzare questo wrapper, fornito da Davide Marcato.
Descrizione dei dati
L’analisi si basa su una serie storica oraria relativa al Prezzo Unico Nazionale per l’intero anno 2024, costituita da 8.784 osservazioni, pari al numero di ore effettive in un anno bisestile. I dati sono organizzati in formato tabellare, con tre colonne principali: la data, l’ora (espressa in formato 1–24) e il prezzo orario in euro per megawattora (€/MWh).
Nel processo di importazione e preprocessing, particolare attenzione è stata dedicata alla costruzione di un indice temporale coerente. La combinazione della colonna “Data” e dell’“Ora” è stata utilizzata per generare un oggetto datetime
completo a risoluzione oraria. È stata inoltre effettuata una conversione dell’ora dal formato 1–24 al formato 0–23, coerente con le convenzioni dei principali strumenti di analisi temporale in ambiente Python.
Durante la normalizzazione del calendario orario, è emersa la necessità di gestire le ambiguità dovute al cambio tra ora solare e ora legale. Tali transizioni possono generare duplicati o buchi nella sequenza temporale, fenomeno che è stato trattato attraverso una localizzazione temporale nel fuso Europe/Rome
e una successiva conversione neutra (tz_convert(None)
), con eventuale eliminazione delle osservazioni ambigue.
La variabile di interesse, ovvero il prezzo orario, è stata convertita in formato numerico a partire dalla rappresentazione testuale contenente la virgola come separatore decimale. Sono stati inoltre eseguiti controlli di consistenza e rimozione di eventuali valori anomali o duplicati (naturalmente non presenti vista l’ufficialità del dataset fornito).
A valle di queste operazioni, si dispone di una serie temporale regolare, pronta per l’analisi.
Analisi descrittiva del PUN
L’esame preliminare della serie storica del PUN consente di ottenere informazioni significative sulla distribuzione, la variabilità e i pattern ricorrenti del prezzo orario dell’energia elettrica nel corso del 2024.
In primo luogo, la distribuzione dei valori di prezzo presenta una forma asimmetrica, con presenza di code a destra (right skewness) e occasionali outlier corrispondenti a picchi di mercato.
La statistica descrittiva elementare evidenzia una media su base annua pari a circa 108 €/MWh, con una deviazione standard prossima a 29 €/MWh (coefficiente di variazione (CV) pari a ~ 27%).
Il range osservato si estende da un minimo inferiore a 1 €/MWh a un massimo superiore ai 270 €/MWh, valori che riflettono le dinamiche estreme registrate in alcune fasce orarie, soprattutto nei periodi di stress stagionale o in corrispondenza di festività.
L’analisi della struttura infra giornaliera rivela una marcata stagionalità oraria.
I boxplot per ora del giorno mettono in luce una concentrazione dei valori più elevati nelle fasce diurne, in particolare tra le 8:00 e le 20:00, coerentemente con i profili di domanda elettrica. Durante le ore notturne, il prezzo tende a stabilizzarsi su valori più contenuti, con una varianza significativamente ridotta.
Elementi di data visualization
Un ulteriore elemento di interesse riguarda la variabilità settimanale.
Il confronto tra i boxplot per giorno della settimana mostra una riduzione della mediana e della dispersione nei fine settimana, in particolare la domenica, a conferma del minor carico di rete durante le giornate non lavorative. Tali osservazioni sono ulteriormente rafforzate dal comportamento della media giornaliera del PUN, che, tracciata lungo l’intero arco dell’anno, presenta un andamento oscillante ma con evidenti ciclicità settimanali e una tendenza generale alla stabilità nel medio periodo.
A completamento dell’analisi esplorativa, è stata realizzata una mappa di calore (heatmap) con rappresentazione bidimensionale dei prezzi medi orari per ciascun giorno dell’anno.
La visualizzazione, ottenuta mediante una riorganizzazione dei dati in una matrice giorno-ora, consente di individuare pattern stagionali ricorrenti e anomalie locali, offrendo una panoramica sintetica ma informativa dell’evoluzione del PUN su scala annuale.
Tali risultati descrittivi costituiscono la base conoscitiva necessaria per la successiva fase di modellazione econometrica.
Analisi statistica del PUN con Python – il codice
Di seguito il codice per questa prima parte di analisi:
Output:
Data Ora Prezzo Timestamp 2024-01-01 00:00:00 2024-01-01 0 107.09 2024-01-01 01:00:00 2024-01-01 1 104.00 2024-01-01 02:00:00 2024-01-01 2 100.00 2024-01-01 03:00:00 2024-01-01 3 85.66 2024-01-01 04:00:00 2024-01-01 4 85.00 count 8783.000000 mean 108.523527 std 29.658537 min 0.100000 25% 92.041590 50% 105.824370 75% 122.040000 max 275.123710 Name: Prezzo, dtype: float64
Qui la parte grafica relativa alla distribuzione dei prezzi. La distribuzione mostra una chiara deviazione dalla normalità, sia per l’asimmetria che per la presenza di code pesanti (fat tails).
Questo conferma l’adeguatezza di:
- Modelli robusti (es. SARIMA, anziché modelli gaussiani),
- Tecniche che non assumono simmetria o varianza costante.

Boxplot
Una ulteriore rappresentazione grafica mediante boxplot orario permette di apprezzare in modo più immediato il trend dei prezzi per singola ora (aggregata) del giorno.

Un esempio di data visualization – Heatmap Oraria del PUN
Nell’ambito delle serie temporali ad alta frequenza, la rappresentazione bidimensionale tramite mappa di calore (heatmap) costituisce uno strumento particolarmente efficace per l’analisi esplorativa di pattern ricorrenti e anomalie locali.
Applicata ai dati orari del PUN, la heatmap consente di evidenziare con immediatezza la struttura stagionale infra-giornaliera e le sue variazioni nel tempo.
La costruzione della visualizzazione si basa sulla riorganizzazione dei dati in una matrice in cui ciascuna riga corrisponde a una giornata dell’anno, mentre ciascuna colonna rappresenta una specifica ora del giorno (da 0 a 23).
I valori riportati nella griglia sono i prezzi orari espressi in €/MWh, codificati cromaticamente attraverso una scala continua di intensità.
Tale rappresentazione consente di leggere verticalmente la dinamica quotidiana dei prezzi e orizzontalmente le variazioni sistematiche per ciascuna fascia oraria lungo l’anno.
Dall’analisi visiva emergono chiaramente le fasce orarie a maggiore intensità di prezzo, localizzate tipicamente tra le 8:00 e le 20:00, coerenti con i picchi di domanda elettrica nei giorni feriali. Al contrario, le ore notturne mostrano una colorazione più tenue, indicativa di livelli di prezzo inferiori e più stabili.
Le giornate festive e i fine settimana si distinguono per una minore escursione cromatica, riflettendo la compressione della variabilità di prezzo in condizioni di ridotta attività produttiva.
Sono inoltre osservabili alcuni episodi puntuali di pricing anomalo, che si manifestano come macchie cromaticamente intense, isolate rispetto alla struttura ricorrente.
Tali eventi possono essere attribuiti a fattori esogeni quali condizioni metereologiche estreme, indisponibilità infrastrutturale o dinamiche di mercato straordinarie.
Nel caso particolare in esame si evidenzia un maggior calore proprio durante i periodi tipicamente di picco estivo.
La heatmap oraria, pur essendo una rappresentazione sintetica, offre una panoramica esaustiva e ad alta densità informativa sull’evoluzione del PUN nel tempo e nello spazio orario.
In particolare, essa risulta utile per il confronto visivo tra periodi, l’identificazione di regolarità settimanali e l’individuazione di deviazioni significative rispetto al comportamento atteso.
Heatmap del PUN – il codice
Analisi econometrica del PUN
L’analisi econometrica delle serie temporali ha come obiettivo la modellazione delle dipendenze dinamiche all’interno dei dati, con lo scopo sia di comprendere le componenti strutturali della serie, sia di effettuare previsioni a breve termine.
Nel contesto del PUN, l’elevata frequenza temporale, la presenza di stagionalità multiple e l’esistenza di shock esogeni rendono necessaria l’adozione di un modello in grado di gestire congiuntamente le componenti autoregressive, differenziate, e stagionali.
A tal fine, si è fatto ricorso alla classe dei modelli SARIMA (Seasonal AutoRegressive Integrated Moving Average).
Motivazioni per la scelta del modello SARIMA
I modelli SARIMA rappresentano un’estensione naturale della famiglia ARIMA, introdotta da Box e Jenkins, che consente di includere componenti stagionali mediante la specificazione di termini addizionali a periodicità fissa.
La struttura generale del modello è indicata dalla notazione (p, d, q) (P, D, Q)s, dove:
- p,d,q rappresentano rispettivamente l’ordine autoregressivo, il grado di differenziazione e l’ordine della media mobile per la componente non stagionale;
- P,D,Q rappresentano gli stessi parametri per la componente stagionale;
- s è la periodicità stagionale, espressa in numero di osservazioni.
L’impiego del SARIMA si giustifica nel caso in esame per la presenza evidente di una stagionalità settimanale e infra-giornaliera nei dati orari del PUN.
Le analisi descrittive precedenti hanno mostrato pattern ricorrenti nei giorni della settimana e nelle ore della giornata, rendendo indispensabile l’utilizzo di un modello in grado di catturare tali regolarità.
Complessità computazionale e necessità di semplificazione
L’applicazione diretta di un modello SARIMA alla serie oraria completa del 2024, con oltre 8.700 osservazioni e stagionalità infra-settimanale (s=168), comporta una significativa complessità computazionale. In particolare, la stima dei parametri su una serie di tale lunghezza, combinata con la presenza di differenziazione stagionale, può risultare proibitiva in termini di tempo di calcolo e stabilità numerica, soprattutto in ambiente monothreaded.
La memoria richiesta per il mero calcolo supera gli 8GB allocati stabilmente per circa 9 ore di run, su una macchina con dotazione standard da ufficio.
Per rendere l’analisi praticabile e mantenere al contempo un discreto grado di rappresentatività della dinamica di fondo, si è deciso di ricorrere a una versione semplificata della serie, mediante due trasformazioni:
- Aggregazione giornaliera: si è passati da una granularità oraria a una media giornaliera, ottenendo una serie di 366 punti (anno bisestile), che conserva la struttura stagionale settimanale e riduce drasticamente la dimensionalità del problema.
- Selezione temporale: è stato analizzato un sottoinsieme della serie (ad esempio, il primo trimestre 2024), in modo da ridurre ulteriormente la complessità e agevolare una stima preliminare dei parametri.
Queste scelte, seppur semplificative, non compromettono la validità dell’analisi, in quanto la componente settimanale resta osservabile nella serie aggregata e il comportamento dinamico rimane rappresentativo – pur all’interno di un contesto certamente didattico.
Verifica della stazionarietà
Prima della stima del modello, è necessario accertarsi che la serie sia stazionaria, ovvero che le sue proprietà statistiche (media, varianza, autocorrelazione) non varino nel tempo.
A tal fine è stato impiegato il test di Dickey-Fuller aumentato (ADF), il quale verifica l’ipotesi nulla di non stazionarietà.
Nel caso del PUN su base giornaliera, il test ADF applicato alla serie grezza ha evidenziato un valore di p-value superiore alla soglia di significatività (tipicamente 0.05), indicando la necessità di differenziare la serie.
La differenziazione al primo ordine ha portato a una serie stazionaria, confermata da una successiva applicazione del test ADF, con p-value inferiore al 5%.
Stima del modello SARIMA
Sulla base della serie differenziata e aggregata, è stato stimato un modello SARIMA con struttura (1, 1, 1) (1, 1, 1) 7, che incorpora una stagionalità settimanale (7 giorni).
La scelta dei parametri è stata guidata dalla valutazione dei grafici di autocorrelazione (ACF) e autocorrelazione parziale (PACF), oltre che da criteri informativi come l’Akaike Information Criterion (AIC). Tale metrica è calcolata mediante la funzione .fit()
.
La stima del modello ha prodotto coefficienti significativi e una struttura dei residui coerente con l’ipotesi di rumore bianco.
I grafici diagnostici hanno confermato l’assenza di autocorrelazione residua e una distribuzione approssimativamente normale degli errori, indicando un buon adattamento del modello alla serie.
Previsione e valutazione
Il modello stimato è stato utilizzato per produrre una previsione su un orizzonte di 14 giorni.
Il forecast include intervalli di confidenza al 95%, calcolati sulla base dell’incertezza stimata dei parametri.
I risultati mostrano una continuità coerente con l’andamento osservato e mantengono le oscillazioni stagionali settimanali, evidenziando la capacità del modello di catturare correttamente la struttura ciclica del PUN.
La valutazione del modello può essere ulteriormente affinata mediante l’utilizzo di misure di errore previsivo (MAE, RMSE) su un set di validazione, ma tale approfondimento esula dagli obiettivi primari di questa analisi.
Analisi econometrica del PUN con Python – il codice
Segue il codice per questa parte di analisi focalizzata sull’analisi econometrica.
A seguire i principali output grafici:
Interpretazione sintetica dell’output ottenuto
Una fase essenziale nella validazione di un modello SARIMA consiste nell’analisi dei residui standardizzati, al fine di verificarne l’aderenza all’ipotesi di rumore bianco, ovvero una sequenza priva di autocorrelazione, a media zero e varianza costante. I grafici diagnostici riportati permettono di valutare simultaneamente la struttura seriale, la distribuzione e la normalità dei residui.
Nel pannello superiore sinistro, la serie dei residui non mostra pattern sistematici nel tempo, suggerendo l’assenza di strutture autoregressive residue.
Il pannello superiore destro confronta l’istogramma dei residui con la densità normale standard e una stima non parametrica (KDE): la distribuzione appare simmetrica e ben centrata attorno allo zero, con una leggera curtosi positiva.
Il grafico Q-Q (quantile-quantile), in basso a sinistra, evidenzia un buon allineamento tra i quantili empirici e quelli teorici di una distribuzione normale, confermando la plausibilità dell’ipotesi di normalità.
Infine, l’ACF dei residui (correlogramma in basso a destra) mostra valori contenuti entro le bande di confidenza, senza evidenti autocorrelazioni significative. Complessivamente, l’insieme di questi elementi indica un buon adattamento del modello, coerente con l’assunzione di residui gaussiani non autocorrelati.
Interpretazione sintetica dell’output ottenuto
La figura mostra la previsione su un orizzonte di 7 giorni ottenuta a partire dal modello SARIMA stimato sulla serie aggregata giornaliera del PUN.
La parte in blu rappresenta i dati osservati più recenti, mentre la curva arancione riporta la media della previsione condizionale per le sette giornate successive. Le bande arancioni sfumate rappresentano gli intervalli di confidenza al 95%, calcolati a partire dalla varianza degli errori previsivi.
- Si nota immediatamente che il forecast manca di cogliere una componente rialzista macro (es. stagionalità a livello annuale, fenomeni esogeni che andrebbero catturati con opportuni regressori).
- La stima della media risulta distorta verso il basso rispetto all’evoluzione reale.
- La shape dei prezzi è eccessivamente semplicistica, questo dovuto anche alle semplificazioni apportate in sede di aggregazione dei prezzi per il run del modello su base giornaliera.
- Gli intervalli di confidenza compensano questo errore solo in termini probabilistici, ma non aggiustano il centro della previsione e non aiutano ad ottenere una shape più realistica.
- Il forecast riflette una stagionalità settimanale artificiosamente regolare, tipica di un SARIMA in assenza di altri effetti.
Tuttavia per le finalità esposte permette di portare a termine alcuni ragionamenti non necessariamente ovvi sui fattori che modellano l’andamento del PUN.
Diversi effetti critici sopraccitati possono essere risolti o attenuati con un run del modello su un orizzonte più esteso e rispettando l’effettiva granularità oraria della time series.
Analisi econometrica e statistica del PUN con Python – Conclusioni
L’analisi condotta sulla serie storica oraria del PUN per l’anno 2024 ha evidenziato la rilevanza dell’approccio quantitativo, sia in termini esplorativi che previsivi, nell’ambito del mercato elettrico.
L’impiego di tecniche statistiche classiche, integrate con strumenti di modellazione econometrica stagionale, ha permesso di ottenere una rappresentazione sintetica ma informativamente densa dell’andamento dei prezzi all’ingrosso in Italia.
In fase descrittiva, è emersa con chiarezza la struttura ciclica del PUN, con variazioni sistematiche tra ore del giorno e giorni della settimana, nonché la presenza di episodi anomali legati a fattori esogeni. La visualizzazione tramite heatmap ha confermato tali pattern, offrendo una lettura intuitiva dell’evoluzione temporale dei prezzi orari.
Dal punto di vista modellistico, la scelta di un modello SARIMA, applicato su una versione aggregata e semplificata della serie, ha consentito di gestire efficacemente la componente stagionale settimanale e di fornire previsioni affidabili su orizzonti di breve periodo. La struttura del modello stimato ha mostrato una buona capacità di adattamento ai dati, come testimoniato dalla diagnostica dei residui e dai criteri informativi ottenuti (in particolare l’AIC).
L’approccio adottato, pur basato su una semplificazione della serie oraria originale, si è dimostrato efficace nel catturare le dinamiche fondamentali del processo di generazione del PUN. Tuttavia, restano aperti diversi ambiti di estensione e approfondimento.
Una possibile evoluzione dell’analisi prevede l’integrazione di variabili esogene, come la domanda elettrica, la produzione da fonti rinnovabili, o la temperatura, all’interno di un modello SARIMAX. Un’ulteriore linea di sviluppo riguarda l’utilizzo di tecniche di machine learning per la previsione non lineare, oppure l’applicazione di modelli a frequenza mista o multivariata, in grado di catturare interazioni complesse tra più serie temporali.
Vuoi saperne di più o aver aiuto per le tue analisi sui prezzi dell’energia?
L’energia elettrica e il gas fanno parte delle nostre attività quotidiane. Se vuoi supporto per i tuoi modelli, per la creazione delle tue pipeline di analisi dei dati, o per rafforzare le attività di Risk Management, contattaci!
Analisi econometrica e statistica del PUN con Python – scarica il Jupyter Notebook interattivo
In Aziona crediamo nel valore della condivisione della conoscenza! Scarica l’intero Jupyter Notebook interattivo sull’analisi del PUN al seguente link:
https://github.com/carloocchiena/code_bites/blob/master/python/pun_econometrics.ipynb
Fanne buon uso e se ti è stato utile lascia una stella sul nostro repository!
Resta sempre sul pezzo con i nostri tutorial
- Sviluppiamo una Web API con Python, Flask e SQLite.
- REST API con Django Rest Framework.
- Sviluppiamo una RESTful API con Python e FastAPI.
- (NEW!) Sviluppiamo una Web API con Litestar.
- (NEW!) Basi di SQL.
- (NEW!) Modelli di regressione per analisi dei dati.
- (NEW!) Analisi econometrica del PUN con Python.
- Newsletter con tutti i nuovi articoli in anteprima.