1 Introduzione

1.1 Il software R

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.

2 I dati del Fondo Monetario Internazionale

2.1 Il sito del FMI

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) Packages in cui si può cercare un pacchetto e installarlo

2.2 Scaricare i dati

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 dati si può dare il comando View(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”.

2.3 Creare una serie storica

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.

2.4 Rappresentazione grafica

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.

2.5 Normalizzare i grafici

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')

3 Due indici di borsa a confronto

3.1 Scaricare dati da Yahoo

Il sito Yahoo contiene numerose serie storiche di dati finanziari. A noi, in particolare, interessano i due indici:

  • S&P 500 la cui etichetta nel database Yahoo è ^GSPC
  • NASDAQ 100 la cui etichetta è ^NDX

Per 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.

4 I tassi di interesse a 10 anni

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()

5 Inflazione e salari in Italia

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)

6 Borsa, cambio e tasso USA

Sul sito Yahoo scarichiamo tre serie storiche relative alle seguenti variabili:

  • indice S&P500: codice ^GSPC
  • tasso di cambio tra Euro e Dollaro: codice EURUSD=X
  • tasso di interesse sui bond USA a 10 anni: codice ^TNX

Scarichiamo 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)