Il software R è liberamente scaricabile da internet r-project. Una delle interfacce più comode ed efficienti per utilizzare R è anch’essa liberamente scsaricabile da internet: RStudio. Esiste anche la possibilità di lavorare su RStudio mediante could al seguente indirizzo: posit.cloud. In quest’ultimo modo si può lavorare su internet anche senza che R sia installato sul computer su cui si lavora. R è un software disponibile per diversi sistemi opeartivi: Linux, Apple e Microsoft.
Il sito a cui fare riferimento per i dati del FMI è https://www.imf.org/external/datamapper/datasets.
Nella sezione “World Economic Outlook” (WEO) sono presenti gli indicatori economici principali (PIL, inflazione, popolazione, bilancia commerciale e finanze pubbliche).
Per accedere a questi dati è necessario installare il pacchetto
imfweo.
Il comando per installare un pacchetto è
install.packages('NOME'). Tuttavia nell’interfaccia RStudio esiste la sezione (in basso a destra)Packagesin cui si può cercare un pacchetto e installarlo
Una volta caricato in memoria il pacchetto imfweo, si
possono scaricare i dati relativi ai paesi scelti.
I paesi sono rappresentati con il codice a tre cifre che si può trovare a questo indirizzo.
Nel caso che ci interessa abbiamo: Germania DEU, Francia FRA, Italia ITA e Spagna ESP.
library(imfweo)
dati=weo_get(entities=c('DEU','FRA','ITA','ESP'),
start_year=1980,
end_year=2025)
Per osservare all’interno la variabile
datisi può dare il comandoView(dati).
I dati scaricati contengono tutte le serie storiche presenti sul sito
IMF. A noi, in particolare, interessa quella relativa al PIL a prezzi
corernti in (miliardi di) Dollari USA, la cui sigla è NGDPD
(la sigla si trova all’interno dell’indirizzo URL relativo a questa
variabile).
Con il comando View(dati) osserviamo quali colonne si
trovano dentro la variabile dati. La colonna “series_id”
riporta i codici delle serie storiche (a noi interessa
NGDPD), mentre la colonna “entity_id” riporta i codici dei
paesi (a noi interessano i tre codici visti in precedenza).
All’interno della variabile dati possiamo selezionare
alcuni valori utilizzando le parentesi quadre, al cui interno si
indicano i codici desiderati.
DEU=dati[dati$series_id=='NGDPD' & dati$entity_id=='DEU',]$value
FRA=dati[dati$series_id=='NGDPD' & dati$entity_id=='FRA',]$value
ITA=dati[dati$series_id=='NGDPD' & dati$entity_id=='ITA',]$value
ESP=dati[dati$series_id=='NGDPD' & dati$entity_id=='ESP',]$value
Nei codici precedenti il simbolo “&” indica che le due condizioni
devono essere verificate entrambe: cioè prenderemo solo i dati che
contengono, contemporaneamente, il codice NGDPD e il codice
del paese di interesse.
Il simbolo del Dollaro “$” indica, all’interno di una variabile formata da più colonne, quali colonne vogliamo estrarre.
La virgola alla fine delle parentesi quadre indica che tutti gli altri dati (cioè quelli non individuati dalle condizioni precedenti) vanno presi nella loro totalità.
Tra tutto ciò che è stato selezionato, si prende soltanto il contenuto della colonna “value”.
Per trasformare dei dati e delle date in una serie storica
utilizziamo il pacchetto zoo (che deve essere
preventivamente installato).
All’interno del pacchetto il comando zoo consente di
associare dei valori numerici (come primo input) a date (secondo
input).
library(zoo)
##
## Caricamento pacchetto: 'zoo'
## I seguenti oggetti sono mascherati da 'package:base':
##
## as.Date, as.Date.numeric
PIL=zoo(cbind(DEU,FRA,ITA,ESP),seq(1980,2025))
Il comando cbind crea una matrice incolonnando, una a
fianco all’altra, ogni variabile indicata negli argomenti del
comando.
A questo punto possiamo rappresentare graficamente le serie storiche.
Il semplice comando plot restituisce quanto segue.
plot(PIL)
Vediamo, così, che le serie storiche vengono rappresentate “impilate” separatamente.
Per rappresentarle tutte sullo stesso grafico bisogna specificare che
tutti i tracciati devono essere mostrati sullo stesso pannello con
l’opzione screens=1.
plot(PIL,screens=1)
A questo punto, però, bisogna diversificare i tracciati mediante
colori diversi. L’opzione è col al cui interno si possono
indicare i colori mediante i loro nomi in inglese.
plot(PIL,screens=1,col=c('black','red','blue','orange'))
Per rendere i tracciati più visibili si può specificare un
particolare spessore delle linee mediante l’opzione lwd:
line width.
plot(PIL,screens=1,col=c('black','red','blue','orange'),lwd=2)
Possiamo, ancora, aggiugnere una griglia sullo sfondo del piano cartesiano e inserire una legenda nella posizione più opportuna.
plot(PIL,screens=1,col=c('black','red','blue','orange'),lwd=2)
grid()
legend('topleft',legend=c('Germania','Francia','Italia','Spagna'),
col=c('black','red','blue','orange'),lwd=2,bty='n')
Il comando bty all’interno della legenda indica il
box type. La legenda, senza nessuan specifica di questa
opzione, appare all’interno di un rettangolo. Se vogliamo che la legenda
non sia incorniciata, il valore n indica che non si
desidera inserire una cornice.
Per rendere i valori dei PIL confrontabili tra di loro si può fare in modo che partano tutti dallo stesso valore (per convenzione pari a 1) e alla stessa data.
Il comando che ci serve, in questo caso, è sweep che
permette di applicare una trasformazione ai dati di una tabella.
Possiamo, per esempio, definire il seguente comando.
PIL1=sweep(PIL,2,PIL[1],'/')
La sintassi significa: si prende la variabile PIL e, per ogni colonna (la dimenzione 2 della matrice), si prende il primo valore della colonna PIL[1] e si divide ‘/’ tutta la colonna per questo valore.
Possiamo, così, rappresentare syu un grafico la nuova variabile.
plot(PIL1,screens=1,col=c('black','red','blue','orange'),lwd=2)
grid()
legend('topleft',legend=c('Germania','Francia','Italia','Spagna'),
col=c('black','red','blue','orange'),lwd=2,bty='n')
Per apprezzare come cambia la posizione relativa dei paesi cambiando la data di inizio dell’analisi, possiamo rappresentare lo stesso tipo di grafico, ma partendo dal 2008.
Il comando window ci permette di selezionare una
finestra temporale all’interno di una serie storica (indicando una data
di inizio e una data di fine).
PIL2=window(PIL,start=2008)
PIL2=sweep(PIL2,2,PIL2[1],'/')
plot(PIL2,screens=1,col=c('black','red','blue','orange'),lwd=2)
grid()
legend('topleft',legend=c('Germania','Francia','Italia','Spagna'),
col=c('black','red','blue','orange'),lwd=2,bty='n')
Per ultimo, osserviamo come la classifica si modifica partendo dal 2020.
PIL3=window(PIL,start=2020)
PIL3=sweep(PIL3,2,PIL3[1],'/')
plot(PIL3,screens=1,col=c('black','red','blue','orange'),lwd=2)
grid()
legend('topleft',legend=c('Germania','Francia','Italia','Spagna'),
col=c('black','red','blue','orange'),lwd=2,bty='n')
Il sito Yahoo contiene numerose serie storiche di dati finanziari. A noi, in particolare, interessano i due indici:
^GSPC^NDXPer scaricare dati da Yahoo occorre installare il pacchetto
quantmod. Il comando getSymbols viene poi
utilizzato per connettere R con il database di Yahoo e scaricare i
dati.
library(quantmod)
## Caricamento del pacchetto richiesto: xts
## Caricamento del pacchetto richiesto: TTR
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
getSymbols(c('^GSPC','^NDX'),
src='yahoo',return.class='zoo',
from='1985-01-01')
## [1] "GSPC" "NDX"
L’opzione src indica la sorgente dei dati; questa
opzione è necessaria perché quantmod poermette di scaricare
dati anche da altri database online.
L’opzoine return.class permette di scegliere che tipo di
output vogliamo dal comando getSymbols: vogliamo una serie
storica di tipo zoo, come già vista nel paragrafo
precedente.
Per verificare che cosa contengano le variabili scaricate diamo il
comando View(GSPC), osservando, così, che abbiamo scaricato
i prezzi di apertura, i prezzi massimi, i minimi, i prezzi di chiusura,
i volumi e le chiusure aggiustate. A noi interessano solo le chiusure
aggiustate che selezioniamo con il seguente comando.
S=merge(GSPC$GSPC.Adjusted,NDX$NDX.Adjusted,
all=FALSE)
Il comando merge fonde insieme le due variabili in base
alle date. L’opzione all specifica se vogliamo, come
output, tutte le osservazioni, oppure no. Se l’opzione è indicata come
FALSE, verranno restituite solo le date per le quali sono
disponibili i valori di tutte le variabili.
Una volta creta la serie storica S possiamo
rappresentarla graficamente come già visto in precedenza. In questo caso
specifichiamo anche l’etichetta da dare all’asse delle ascisse (con
l’opzione xlab – che manteniamo vuota nell’esempio) e
l’etichetta per l’asse delle ordinate (con l’opzione
ylab).
plot(S,screens=1,col=c('blue','red'),lwd=2,
xlab='',ylab='Indici di borsa')
grid()
legend('topleft',legend=c('S&P 500','NASDAQ 100'),
col=c('blue','red'),lwd=2,bty='n')
Per evidenziare delle date importanti all’interno del grafico, definiamo le date di rilievo mediante il seguente comando.
date=as.Date(c('2000-03-10',
'2008-09-15',
'2020-03-20'))
Il comando as.Date trasforma una stringa (o una serie di
stringhe) in una data: la stringa deve essere definita nella forma
anno-mese-giorno dove l’anno deve avere 4 cifre, mentre il
mese e il giorno devono avere 2 cifre.
Possiamo anche definire dei testi da aggiugnere al grafico.
eventi=c('Bolla\ndot-com',
'Lehman\nBrothers',
'Pandemia')
Le stringhe contengono il comando \n che separa una
linea dall’altra mediante un “a capo”.
Per aggiungere delle linee verticali al grafico precedente il comando
abline permette di definire delle rette da sovrapporre al
grafico. Il comando text, invece, permette di aggiungere
del testo a un grafico.
plot(S,screens=1,col=c('blue','red'),lwd=2,
xlab='',ylab='Indici di borsa')
grid()
legend('topleft',legend=c('S&P 500','NASDAQ 100'),
col=c('blue','red'),lwd=2,bty='n')
abline(v=date,lty=2)
text(date,max(S),labels=eventi,pos=1)
L’opzione v nel comando abline indica
“vertical”: vengono, quindi, create delle linee verticali in
corrispondenza delle ascisse nella variabile date e tutte
le rette sono tratteggiate (opzione lty=2).
Il comando text inserisce un testo nelle coordinate date
dai primi due argomenti. Prendiamo le ascisse della variabile
date e come ordinata prendiamo il massimo dei prezzi. Le
etichette sono inserite nella variabile eventi. Infine, la
posizione pos indica dove il testo deve comparire rispetto
al punto indicato dalle coordinate: 1 indica la posizione al di sotto
del punto, 2 indica a sinistra, 3 indica sopra e 4 indica a destra.
Il pacchetto quantmod permette di scaricare dati anche
dal database FRED gestito dalla Federal Reserve USA. Il sito è https://fred.stlouisfed.org/.
Cercando il tasso di interesse a 10 anni per l’Italia, per esempio,
si ottiene la serie storica con etichetta: IRLTLT01ITM156N. Il codice
IT all’interno dell’etichetta indica l’Italia. Possiamo,
quindi, scaricare diversi paesi cambiando soltanto le due lettere
centrali.
library(quantmod)
getSymbols(c('IRLTLT01DEM156N',
'IRLTLT01FRM156N',
'IRLTLT01ITM156N',
'IRLTLT01ESM156N',
'IRLTLT01GRM156N'),
src='FRED',
return.class='zoo')
## [1] "IRLTLT01DEM156N" "IRLTLT01FRM156N" "IRLTLT01ITM156N" "IRLTLT01ESM156N"
## [5] "IRLTLT01GRM156N"
Questa volta abbiamo scaricato i dati da “FRED”, indicandolo come
sorgente (src) dei dati.
Ora fondiamo tra loro tutti i tassi di interesse in una matrice unica.
tassi=merge(IRLTLT01DEM156N,
IRLTLT01FRM156N,
IRLTLT01ITM156N,
IRLTLT01ESM156N,
IRLTLT01GRM156N)
Rappresentando i dati in un grafico, otteniamo il seguente risultato.
plot(tassi,screens=1,
col=c('black','red','blue','orange','darkgreen'),
lwd=2,xlab='')
grid()
legend('topleft',legend=c('DE','FR','IT','ES','GR'),
col=c('black','red','blue','orange','darkgreen'),
lwd=2,bty='n')
Questo grafico mostra le serie storiche anche per date in
corrispondenza delle quali non ci sono tutti i tassi di interesse
disponibili (infatti non abbiamo indicato l’opzione
all=FALSE).
Per omettere i dati mancanti (not available na) occorre
usare il comando na.omit.
plot(na.omit(tassi),screens=1,
col=c('black','red','blue','orange','darkgreen'),
lwd=2,xlab='')
grid()
legend('topleft',legend=c('DE','FR','IT','ES','GR'),
col=c('black','red','blue','orange','darkgreen'),
lwd=2,bty='n')
Per calcolare lo spread fra due tassi (italiano e tedesco) è
sufficiente estrarre, dalla variabile tassi, le colonne
relative ai due tassi di interesse e calcolarne la differenza.
spread=tassi$IRLTLT01ITM156N-tassi$IRLTLT01DEM156N
plot(na.omit(spread),col='blue',lwd=2,
xlab='',ylab='spread IT DE')
grid()
Sul sito FRED possiamo modificare i dati mediante l’interfaccia del
sito stesso; per esempio, si possono calcolare le variazioni percentuali
di ogni variabile rispetto al suo valore del periodo precedente oppure
al suo valore dell’anno precedente. Queste trasformazioni si possono
operare anche su R, ma utilizzando un pacchetto apposito:
fredr.
Per utilizzare questo pacchetto occorre iscriversi al sito FRED e ottenere una chiave di accesso (tutto senza costi). nel coamndo che segue inserisce la mia chiave di accesso.
library(fredr)
fredr_set_key('c5b150d7ef18ec656ac2f4a3541dd60f')
Il comando per scaricare i dati è fredr che riceve in
input il codice della variabile, le unità di misura, la frequenza e il
metodo di aggregazione. Per i salari in Italia la variabile è
LCWRIN01ITM661S che riporta i livelli dell’indice dei
salari. Noi vogliamo calcolare la variazione percentuale rispetto
all’anno precedente (opzione units='pc1'), con frequenza
annuale (frequency='a') e calcolando il valore medio per
l’anno (aggregation_method='avg').
X=fredr('LCWRIN01ITM661S',
units='pc1',
frequency='a',
aggregation_method='avg')
Per trasformare questa variabile in una serie storica del tipo
zoo possiamo usare il comando già visto in precedenza
(all’interno del pacchetto quantmod).
library(quantmod)
w=zoo(X$value,X$date)
Scarichiamo dal sito FRED anche il valore dell’indice dei prezzi al consumo per l’Italia: FPCPITOTLZGITA. Questo è già nella forma della variazione rispetto allo stesso periodo dell’anno precedente e, quindi, non richiede ulteriori elaborazioni.
X=fredr('FPCPITOTLZGITA')
inf=zoo(X$value,X$date)
Adesso possiamo rappresentare graficamente le due variabilie
w e inf fondendole in una sola serie storica
con il comando merge.
plot(merge(w,inf,all=FALSE),screens=1,
col=c('blue','red'),lwd=2,
xlab='',ylab='Var. %')
grid()
legend('topright',legend=c('Salari','Prezzi al consumo'),
col=c('blue','red'),lwd=2,bty='n')
Per aggiungere le date dell’uscita dall’ECU dell’Italia e del suo rientro nell’Euro diamo i comandi seguenti.
plot(merge(w,inf,all=FALSE),screens=1,
col=c('blue','red'),lwd=2,
xlab='',ylab='Var. %')
grid()
legend('topright',legend=c('Salari','Prezzi al consumo'),
col=c('blue','red'),lwd=2,bty='n')
date=as.Date(c('1992-01-01',
'1996-12-31'))
eventi=c('Uscita \nECU','Rientro \nEuro')
abline(v=date,lty=2)
text(date,25,labels=eventi,pos=1,cex=0.8)
Sul sito Yahoo scarichiamo tre serie storiche relative alle seguenti variabili:
^GSPCEURUSD=X^TNXScarichiamo i dati da partire dal giorno precedente dell’annuncio di Trump sui dazi USA.
library(quantmod)
getSymbols(c('^SPX','EURUSD=X','^TNX'),
src='yahoo',
return.class='zoo',
from='2025-04-01')
## Warning: EURUSD=X contains missing values. Some functions will not work if
## objects contain missing values in the middle of the series. Consider using
## na.omit(), na.approx(), na.fill(), etc to remove or replace them.
## Warning: ^TNX contains missing values. Some functions will not work if objects
## contain missing values in the middle of the series. Consider using na.omit(),
## na.approx(), na.fill(), etc to remove or replace them.
## [1] "SPX" "EURUSD=X" "TNX"
Creiamo le variabili di interesse prendendo, dai dati scaricati, soltanto le chiusure aggiustate.
borsa=SPX$SPX.Adjusted
cambio=`EURUSD=X`$`EURUSD=X.Adjusted`
tasso=TNX$TNX.Adjusted
Nel caso del tasso di cambio abbiamo inserito gli apici inversi perché il nome della variabile contiene un comando R (il simbolo ‘=’).
Per rappresentare separatamente le tre variabili diamo i seguenti comandi-
plot(borsa,col='red',lwd=2)
plot(cambio,col='orange',lwd=2)
plot(tasso,col='blue',lwd=2)
Per mostarel tutte insieme sullo stesso grafico conviene normalizzarle a 1 all’inizio del periodo. Procediamo, quindi, a fondere le variabili in una sola e poi a calcolarne la normalizzazione come già visto in precedenza.
dati=merge(borsa,cambio,tasso,all=FALSE)
dati_norm=sweep(dati,2,dati[1],'/')
La rappresentazione grafica dei dati, a questo punto, si ottiene con i comandi seguenti.
plot(dati_norm,screens=1,col=c('red','orange','blue'),
lwd=2,xlab='',ylab='1/4/2025 = 1')
grid()
legend('topleft',legend=c('S&P 500','x USD = 1 EUR','Tasso a 10 anni'),
col=c('red','orange','blue'),lwd=2,bty='n')
abline(h=1,lty=2)