Sapere come calcolare la volatilità valutaria è ciò che distingue un'applicazione multivaluta che assorbe in silenzio un movimento del 2% da un giorno all'altro da una che ti sveglia alle 3 di notte. La volatilità è l'unico numero che ti dice quanta strada è probabile che faccia un tasso di cambio — e quasi ogni decisione pratica in un sistema che tratta valute dipende da essa: per quanto tempo resta valida una quotazione, quanto margine aggiungere a un prezzo, quando coprirsi e quando lanciare un alert.
La parte scomoda è che la maggior parte dei tutorial sul calcolo della volatilità è stata scritta per le azioni. Presuppongono un prezzo di chiusura giornaliero, un anno di 252 giorni di contrattazione e una quotazione unica e non ambigua. Il mercato dei cambi non ha nulla di tutto questo. È aperto 24 ore su 24, cinque giorni su sette, su un mercato OTC decentralizzato senza chiusura ufficiale, e il "prezzo" di EUR/USD dipende da come scegli di quotare la coppia.
Questa guida ripercorre la matematica vera e propria, le trappole specifiche del forex e codice funzionante in Python e JavaScript che calcola la volatilità realizzata a partire da dati storici sui tassi di cambio.
Perché la volatilità valutaria conta proprio adesso
Settembre 2026 è un momento insolitamente buono per riflettere sulla volatilità, perché il mercato ha passato quasi tutto l'anno in un regime sospettosamente tranquillo — per poi smettere di esserlo, brevemente.
Per tutta l'estate le valute dei mercati emergenti sono state meno volatili di quelle del G7 per quasi 200 sedute consecutive, una serie che secondo Bloomberg sarebbe la più lunga dal 2000 se dovesse proseguire. I carry trade finanziati in dollari hanno messo insieme la serie positiva più lunga dal 2008, e un paniere molto seguito finanziato in euro composto da real brasiliano, peso colombiano e lira turca risultava in rialzo di circa il 19% da inizio anno — il miglior andamento da inizio anno dal 2005. Le strategie di carry funzionano solo su mercati tranquilli, quindi la loro performance è essa stessa un segnale di volatilità.
Poi, ai primi di settembre, lo yen è balzato di oltre il 2% contro il dollaro in una sola seduta, toccando 155,28, il livello più forte dall'inizio di agosto, mentre gli operatori si posizionavano in vista di ulteriori interventi del Ministero delle Finanze giapponese. Era seguito a un intervento congiunto Stati Uniti-Giappone del 31 luglio e a un record di ¥11,73 trilioni (circa 73 miliardi di dollari) di interventi del MOF tra aprile e maggio, dopo che USD/JPY aveva superato quota 160.
Il contrasto è tutta la lezione. La volatilità media era bassa. La volatilità realizzata in un giorno specifico è stata enorme. Un sistema che avesse dimensionato i propri margini FX su una media annuale mobile avrebbe sbagliato clamorosamente proprio nel giorno che contava. Misurare la volatilità in modo corretto — e continuo — è ciò che impedisce che accada.
Che cosa misura davvero la volatilità valutaria
La volatilità è la deviazione standard dei rendimenti, espressa su base annualizzata. Non è una previsione di direzione, e non è l'ampiezza di un movimento. È una misura di dispersione: quanto i rendimenti giornalieri di una coppia valutaria sono distribuiti attorno alla loro media.
Contano due varianti:
- Volatilità realizzata (storica) — calcolata a ritroso sui tassi effettivamente osservati. È quella che puoi calcolare da solo a partire da una serie storica, ed è quella di cui si occupa questa guida.
- Volatilità implicita — ricavata dai prezzi delle opzioni sui cambi. È la stima prospettica del mercato. Non la puoi derivare dai tassi spot: serve un feed di dati sulle opzioni.
Per la maggior parte degli sviluppatori applicativi — pricing, fatturazione, dashboard di tesoreria, alert di rischio — la volatilità realizzata è sufficiente e gratuita da calcolare se hai già i tassi storici.
Un'idea approssimativa degli ordini di grandezza: le coppie principali come EUR/USD si sono tipicamente collocate tra il 5% e il 10% annualizzato nelle fasi calme e tra il 10% e il 15% in quelle di stress. Le coppie dei mercati emergenti viaggiano abitualmente su valori due o tre volte superiori. Queste fasce si spostano nel tempo, ed è proprio per questo che conviene misurare invece di dare per scontato.
La formula: rendimenti logaritmici, deviazione standard, annualizzazione
Il calcolo si articola in tre passaggi.
Passo 1 — Convertire i tassi in rendimenti logaritmici.
r_t = ln(P_t / P_t-1)Passo 2 — Calcolare la deviazione standard di quei rendimenti sulla finestra che hai scelto (usa la deviazione standard campionaria, dividendo per n − 1).
Passo 3 — Annualizzare moltiplicando per la radice quadrata del numero di osservazioni per anno.
annualised_volatility = stdev(r) * sqrt(N)Messo tutto insieme:
σ_annual = stdev( ln(P_t / P_t-1) ) × √NPerché i rendimenti logaritmici invece della variazione percentuale
La semplice variazione percentuale è asimmetrica: un movimento da 1,10 a 1,20 è +9,09%, ma il ritorno da 1,20 a 1,10 è −8,33%. Dovrebbero essere uguali e di segno opposto. Con i rendimenti logaritmici lo sono: ln(1.20/1.10) e ln(1.10/1.20) differiscono solo per il segno.
Nel forex questo pesa molto più che nell'azionario, a causa dell'inversione della quotazione. EUR/USD e USD/EUR descrivono lo stesso mercato. Se calcoli la volatilità con le variazioni percentuali ottieni due risultati leggermente diversi a seconda del verso in cui hai quotato la coppia, il che è evidentemente sbagliato. I rendimenti logaritmici sono simmetrici rispetto all'inversione: ln(1/x) = −ln(x), e la deviazione standard ignora il segno. Stessa coppia, stessa volatilità, in entrambi i versi.
I rendimenti logaritmici sono inoltre additivi nel tempo, il che rende banale l'aggregazione su più giorni.
Perché √N — e quale N usare nel forex
La volatilità scala con la radice quadrata del tempo perché la varianza scala linearmente con il tempo (sotto la consueta ipotesi di random walk). Per convertire la volatilità giornaliera in annuale, moltiplica per √(days per year).
I tutorial azionari usano 252, il numero approssimativo di giorni di contrattazione delle borse statunitensi. Il forex è diverso. Il mercato è aperto senza interruzioni dalla domenica sera al venerdì sera — all'incirca 260 sedute infrasettimanali all'anno, meno una manciata di festività a scambi ridotti. La maggior parte dei fornitori di dati FX pubblica tassi ogni giorno feriale, anche quando il mercato di un singolo paese è chiuso.
La regola pratica: N deve corrispondere alla frequenza di campionamento dei tuoi dati, non a una convenzione presa in prestito da un'altra asset class.
| Frequenza dei dati | N (fattore di annualizzazione) |
|---|---|
| Giornaliera (giorni feriali, convenzione FX) | 260 |
| Giornaliera (convenzione azionaria a 252 giorni) | 252 |
| Settimanale | 52 |
| Mensile | 12 |
| Oraria (24×5) | ~6.240 |
Passo 1: procurarsi dati storici puliti sui tassi di cambio
La volatilità vale quanto la serie che sta sotto. Recupera una serie giornaliera con una sola chiamata all'endpoint /v1/timeseries:
curl -G "https://api.finexly.com/v1/timeseries" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d base=EUR \
-d symbols=USD,JPY,GBP \
-d start_date=2026-06-08 \
-d end_date=2026-09-05La risposta è una mappa indicizzata per data:
{
"success": true,
"base": "EUR",
"start_date": "2026-06-08",
"end_date": "2026-09-05",
"rates": {
"2026-06-08": { "USD": 1.1421, "JPY": 178.62, "GBP": 0.8447 },
"2026-06-09": { "USD": 1.1408, "JPY": 178.94, "GBP": 0.8451 }
}
}Una richiesta, una serie, nessun ciclo di paginazione. Il riferimento completo dei parametri è nella documentazione dell'API Finexly, mentre gli schemi più generali per lavorare con gli intervalli di date sono trattati nella nostra guida all'API per i tassi di cambio storici.
Quattro problemi di dati esclusivi del forex
Prima di fidarti dell'output, affronta questi punti. Nessuno di essi compare in un tutorial sulla volatilità azionaria, e tutti e quattro distorcono il risultato.
1. Non esiste una chiusura ufficiale. Il forex è decentralizzato: nessuno suona una campanella. I diversi fornitori scattano la loro istantanea in momenti diversi — le 22:00 UTC, la mezzanotte UTC, il fixing di riferimento BCE delle 14:15 CET, oppure il fixing WM/Reuters delle 16 di Londra. Mescolare orari di rilevazione all'interno di una stessa serie introduce varianza artificiale. Scegli una convenzione e non mescolarla mai. Se non sai con certezza come opera il tuo fornitore, il nostro approfondimento su dove le API dei tassi di cambio prendono i dati è un buon punto di partenza.
2. Fine settimana e buchi. Il mercato chiude il venerdì sera e riapre la domenica sera. Un rendimento da venerdì a lunedì copre circa 65 ore di calendario, ma in un calcolo ingenuo viene trattato come un solo "giorno". La maggior parte degli operatori accetta questa approssimazione e annualizza sui giorni feriali — è l'approccio standard — ma devi essere coerente. Non riempire la serie con i tassi del fine settimana tramite forward fill: una sequenza di valori identici trascina artificialmente verso il basso la deviazione standard.
3. Asimmetria della valuta di base. Come visto sopra, i rendimenti logaritmici risolvono matematicamente il problema dell'inversione. Devi però comunque decidere in quale base stai misurando il rischio. La volatilità della tua esposizione in USD misurata in EUR è una domanda di business diversa dalla stessa coppia misurata in USD, anche se il numero che esce è identico. Sii esplicito sul numerario.
4. Cross triangolati. Se il tuo fornitore ricava, per esempio, SEK/NOK dividendo SEK/USD per NOK/USD, il risultato eredita il rumore di entrambe le gambe e qualsiasi disallineamento temporale tra le due. I cross sintetici possono mostrare una volatilità sensibilmente più alta rispetto al mercato quotato direttamente. La nostra guida ai tassi di cambio incrociati spiega quando la triangolazione è sicura e quando non lo è.
Attenzione anche alla precisione. Troncare le coppie con JPY a due decimali prima di calcolare i rendimenti quantizza i piccoli movimenti a zero e distorce la volatilità verso il basso — vedi arrotondamento delle valute e cifre decimali per la regola generale. Conserva la precisione piena e arrotonda solo al momento di mostrare il dato.
Passo 2: calcolare la volatilità realizzata in Python
Ecco un'implementazione completa e con poche dipendenze. Usa requests e la libreria standard: pandas non serve.
import math
import statistics
import requests
FX_DAYS_PER_YEAR = 260 # weekday sessions; use 252 for the equity convention
def fetch_series(base, symbol, start, end, api_key):
url = "https://api.finexly.com/v1/timeseries"
params = {
"base": base,
"symbols": symbol,
"start_date": start,
"end_date": end,
}
headers = {"Authorization": "Bearer " + api_key}
response = requests.get(url, params=params, headers=headers, timeout=10)
response.raise_for_status()
return response.json()["rates"]
def log_returns(rates, symbol):
"""Ordered log returns from a date-keyed rates map."""
dates = sorted(rates.keys())
series = [rates[d][symbol] for d in dates]
return [
math.log(series[i] / series[i - 1])
for i in range(1, len(series))
if series[i] > 0 and series[i - 1] > 0
]
def annualised_volatility(returns, periods_per_year=FX_DAYS_PER_YEAR):
if len(returns) < 2:
raise ValueError("need at least two returns")
return statistics.stdev(returns) * math.sqrt(periods_per_year)
rates = fetch_series("EUR", "USD", "2026-06-08", "2026-09-05", "YOUR_API_KEY")
returns = log_returns(rates, "USD")
vol = annualised_volatility(returns)
print("Observations: {}".format(len(returns)))
print("Daily volatility: {:.4%}".format(vol / math.sqrt(FX_DAYS_PER_YEAR)))
print("Annual volatility: {:.2%}".format(vol))statistics.stdev è la deviazione standard campionaria (denominatore n − 1), che è quella che ti serve. Se passi a NumPy, ricorda che numpy.std usa di default la versione sulla popolazione: passa ddof=1 per ottenere lo stesso risultato.
Due tutele da tenere nel codice di produzione: scarta i tassi non positivi prima di calcolare un logaritmo, e rifiutati di restituire un numero da una finestra con troppe poche osservazioni. Una volatilità a 30 giorni calcolata su nove punti dati non è una volatilità a 30 giorni.
Passo 3: lo stesso calcolo in JavaScript
Anche qui non serve alcuna libreria numerica.
const FX_DAYS_PER_YEAR = 260;
async function fetchSeries(base, symbol, start, end, apiKey) {
const url = new URL('https://api.finexly.com/v1/timeseries');
url.searchParams.set('base', base);
url.searchParams.set('symbols', symbol);
url.searchParams.set('start_date', start);
url.searchParams.set('end_date', end);
const res = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
});
if (!res.ok) throw new Error(`Finexly returned ${res.status}`);
const body = await res.json();
return body.rates;
}
function logReturns(rates, symbol) {
const dates = Object.keys(rates).sort();
const series = dates.map((d) => rates[d][symbol]);
const out = [];
for (let i = 1; i < series.length; i += 1) {
if (series[i] > 0 && series[i - 1] > 0) {
out.push(Math.log(series[i] / series[i - 1]));
}
}
return out;
}
function annualisedVolatility(returns, periodsPerYear = FX_DAYS_PER_YEAR) {
if (returns.length < 2) throw new Error('need at least two returns');
const mean = returns.reduce((a, b) => a + b, 0) / returns.length;
const variance =
returns.reduce((acc, r) => acc + (r - mean) ** 2, 0) / (returns.length - 1);
return Math.sqrt(variance) * Math.sqrt(periodsPerYear);
}
const rates = await fetchSeries('EUR', 'USD', '2026-06-08', '2026-09-05', 'YOUR_API_KEY');
const vol = annualisedVolatility(logReturns(rates, 'USD'));
console.log(`Annualised volatility: ${(vol * 100).toFixed(2)}%`);Nota il denominatore (returns.length - 1): è la stessa correzione per la varianza campionaria della versione Python.
Volatilità mobile e riconoscimento di un cambio di regime
Un singolo numero su una finestra fissa non ti dice quasi nulla su quando le acque si sono agitate. La volatilità mobile sì, ed è la versione che vuoi davvero su una dashboard.
def rolling_volatility(rates, symbol, window=30,
periods_per_year=FX_DAYS_PER_YEAR):
dates = sorted(rates.keys())
series = [rates[d][symbol] for d in dates]
returns = [math.log(series[i] / series[i - 1]) for i in range(1, len(series))]
return_dates = dates[1:]
out = []
for i in range(window - 1, len(returns)):
chunk = returns[i - window + 1:i + 1]
out.append((
return_dates[i],
statistics.stdev(chunk) * math.sqrt(periods_per_year),
))
return out
for date, vol in rolling_volatility(rates, "USD", window=30)[-5:]:
print("{} {:.2%}".format(date, vol))La scelta della finestra è un compromesso, non un dato di fatto:
- 10 giorni — molto reattiva, molto rumorosa. Buona per gli alert, pessima per il pricing.
- 30 giorni — il default più diffuso. Reagisce nel giro di poche sedute senza impazzire.
- 90 giorni — liscia e stabile. Ottima per fissare rapporti di copertura e margini di prezzo.
Un segnale pratico di cambio di regime è il rapporto di volatilità: dividi la volatilità a 10 giorni per quella a 90 giorni. Letture stabilmente sopra circa 1,5 indicano che la dispersione di breve periodo ha superato in modo significativo la linea di base più lunga. Applicato alle coppie sullo yen attorno agli episodi di intervento descritti sopra, quel rapporto schizza verso l'alto mentre il valore a 90 giorni si muove appena — ed è esattamente questo il punto. Le finestre lunghe nascondono gli eventi; quelle corte li trovano.
Se hai intenzione di far girare questo calcolo di continuo su molte coppie, leggi prima le nostre note su caching e gestione degli errori per le API valutarie. I tassi storici giornalieri sono immutabili una volta pubblicati, quindi si possono mettere in cache a tempo indeterminato: ricalcola solo la finestra più recente invece di riscaricare un anno di storico a ogni caricamento di pagina. La pagina piani tariffari mostra come si distribuiscono i volumi di richieste tra i vari livelli.
Trasformare un numero di volatilità in una decisione
Calcolare la volatilità è facile. Il valore sta nell'usarla. Quattro applicazioni concrete:
- Finestre di validità delle quotazioni. Un prezzo che mostri a un cliente è un'opzione a breve che gli hai venduto. La deriva attesa su un periodo di t giorni è all'incirca
σ_annual × √(t / 260). Con una volatilità annualizzata dell'8%, una quotazione valida 24 ore porta con sé circa lo 0,5% di deriva attesa; al 20%, più vicino all'1,2%. Accorcia il TTL quando la volatilità sale, invece di usare per sempre 15 minuti fissi.
- Margini di prezzo. Anziché fissare a codice un margine FX del 2%, scalalo:
buffer = k × σ_annual × √(settlement_days / 260). Il margine si allarga automaticamente nei regimi di stress e si restringe quando i mercati si calmano, il che ti mantiene competitivo senza assumerti rischi nascosti.
- Trigger di copertura. L'esposizione da sola non è rischio; lo è l'esposizione moltiplicata per la volatilità. Un'esposizione di 2 milioni di dollari su una coppia con volatilità del 4% è un problema minore rispetto a 400.000 dollari su una coppia al 30%. Ordina le decisioni di copertura per
exposure × σ, non per nozionale. La nostra guida alla copertura valutaria presenta gli strumenti; il numero di volatilità ti dice che cosa merita di essere coperto.
- Rilevamento delle anomalie. Converti ogni nuovo movimento giornaliero in uno z-score rispetto alla deviazione standard degli ultimi 30 giorni e fai scattare un alert oltre ±3. Così intercetti sia gli eventi di mercato reali sia i dati sbagliati: un feed fermo o un cross triangolato male si presenta di solito come un outlier implausibile molto prima che qualcuno se ne accorga in un report.
Per esprimere questi movimenti in unità familiari ai trader anziché in percentuale, vedi che cos'è un pip.
Errori comuni
- Usare la variazione percentuale invece dei rendimenti logaritmici. Introduce asimmetria e fa dipendere il risultato dal verso della quotazione.
- Usare la deviazione standard sulla popolazione.
numpy.std()senzaddof=1sottostima la volatilità, e parecchio sulle finestre corte. - Riempire fine settimana e festivi con forward fill. I valori ripetuti sono giorni a rendimento nullo che trascinano meccanicamente la volatilità verso il basso.
- Annualizzare con l'N sbagliato. Dati settimanali annualizzati con 260 invece di 52 producono un numero circa 2,2 volte troppo grande.
- Confrontare volatilità calcolate su orari di rilevazione diversi. Due fornitori, due orari di fixing, due numeri non confrontabili.
- Riportare un'unica cifra annua e chiamarla rischio. La volatilità si presenta a grappoli. Mesi tranquilli e settimane violente si mediano in un valore intermedio che non descrive né gli uni né le altre. Pubblica sempre una serie mobile accanto al valore di sintesi.
- Dare per scontato che bassa volatilità significhi basso rischio. I regimi tranquilli e favorevoli al carry del 2026 sono rimasti tranquilli fino al momento in cui i titoli sugli interventi hanno mosso lo yen del 2% in una seduta. Una bassa volatilità realizzata descrive il passato recente, non è una promessa sulla settimana prossima.
Domande frequenti
Qual è un livello normale di volatilità per una coppia valutaria?
Le coppie principali come EUR/USD e GBP/USD si sono storicamente collocate intorno al 5-10% annualizzato in condizioni calme e al 10-15% sotto stress. Le coppie dei mercati emergenti sono in genere due o tre volte più alte. Invece di affidarti a regole empiriche, calcola una volatilità mobile a 90 giorni per le coppie che ti interessano e usa la tua baseline: i livelli si spostano insieme al regime di mercato.
Devo usare 252 o 260 giorni di contrattazione per annualizzare la volatilità valutaria?
260 è la scelta più adatta, perché il mercato dei cambi tratta ogni giorno feriale invece di seguire il calendario di una singola borsa. 252 è la convenzione azionaria ed è comunque molto diffusa. La differenza è di circa l'1,6% in termini relativi, quindi la cosa importante è sceglierne una, documentarla e applicarla in modo coerente ovunque confronti dei numeri.
Posso calcolare la volatilità implicita da un'API di tassi di cambio?
No. La volatilità implicita si ricava dai prezzi delle opzioni sui cambi e richiede un feed di dati sulle opzioni. Da una serie di tassi spot o storici puoi calcolare la volatilità realizzata. Per il pricing, le soglie di copertura e gli alert nel codice applicativo, la volatilità realizzata è di solito la misura appropriata.
Quanti dati storici mi servono?
Come minimo, un'osservazione in più della lunghezza della finestra — ma così la stima è instabile. Come soglia pratica, usa 30 osservazioni per una finestra a 30 giorni e scarica almeno un anno di storico, così puoi confrontare la lettura attuale con una baseline più lunga. L'endpoint /v1/timeseries restituisce un intervallo di date qualsiasi in una sola richiesta.
Perché il mio numero di volatilità è diverso da quello del mio fornitore di dati?
Quasi sempre per una di quattro ragioni: un diverso fattore di annualizzazione (252 contro 260), deviazione standard sulla popolazione anziché campionaria, un diverso orario di rilevazione del tasso giornaliero, oppure rendimenti semplici anziché logaritmici. Controlla questi quattro punti prima di dare per scontato che i dati siano sbagliati.
La volatilità prevede in quale direzione si muoverà una valuta?
No. La volatilità misura la dispersione, non la direzione. Da una coppia con volatilità annualizzata del 20% ci si aspetta che si muova molto; il calcolo non dice nulla sul fatto che salga o scenda. Usala per dimensionare il rischio, non per prendere posizione.
Pronto a calcolare la volatilità su dati live? Ottieni la tua API key Finexly gratuita — senza carta di credito. Hai accesso ai tassi in tempo reale e storici per oltre 170 valute, con 1.000 richieste gratuite al mese e un endpoint /v1/timeseries che restituisce un intero intervallo di date in una sola chiamata. Parti dall'API gratuita per i tassi di cambio e passa a un piano superiore man mano che crescono le tue esigenze di dati.
Explore More
Vlado Grigirov
Senior Currency Markets Analyst & Financial Strategist
Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...
View full profile →