Sei sulla pagina 1di 8

Introduzione all’uso di MATLAB

—————
Comandi Load e Save
Reperire dati storici da Yahoo Finanza
Caricare file .csv
—————
Appunti per l’insegnamento di
Metodi Computazionali per la Finanza
Anno Accademico 2017/2018

Riccardo Cambini
Dipartimento di Economia e Management
Università di Pisa,
Via Cosimo Ridolfi 10, 56124 Pisa, ITALY
E-mail: riccardo.cambini@unipi.it

Versione Marzo 2018

Piattaforma E-learning : https://moodle.ec.unipi.it/course/view.php?id=513

1
Come caricare e salvare dati in MATLAB
(Live Script realizzato con MATLAB versione 2018a)

clear % si svuota preliminarmente il Workspace di MATLAB per evitare problemi

Caricare array numerici salvati in formato testo


MATLAB è in grado di caricare in memoria un array di valori numerici nel caso in cui esso sia stato salvato
in un file di testo con i singoli valori separati da spazi. Ad esempio creiamo con un qualsiasi editor di
testo (editor di MATLAB, TextEdit su macOS, Blocco Note o Notepad su Windows) un file con il seguente
contenuto, e salviamolo nella "Current Folder" con il nome "Dell.txt".

3 4 5
6 7 8
1 2 3

Come si può facilmente osservare, il file contiene tre righe contenenti tre numeri ciascuna (numeri separati
tra loro da spazi).

Ripetiamo la stessa cosa con il seguente contenuto, e salviamo il file nella "Current Folder" con il nome
"Apple.txt".

45 64 67 89 90
1 2 3 4 5
23 12 23 56 65
11 2 3 89 5

Si osservi che in questo caso si hanno quattro righe contenenti cinque numeri ciascuna, e che il numero di
spazi che separa i numeri l'uno dall'altro è in quantità estremamente variabile.

Infine, creiamo e salviamo il file "Acer.txt" con il seguente contenuto (stavolta gli spazi sono serviti per
incolonnare opportunamente le cifre decimali dei numeri).

144.6 33.362 1212.0562


6.789 7.8 8.96418

La "Current Folder" contiene adesso tre file di testo contenenti ciascuno un array di dati numerici: "Dell.txt",
"Apple.txt", "Acer.txt".

Per caricare nella memoria di MATLAB tali array basta utilizzare il comando "load()".

load('Dell.txt')
load('Apple.txt')
load('Acer.txt')

Si osservi che nel "Workspace" sono comparsi tre array, con il nome ed il contenuto dei files caricati con il
comando "load()".

1
Dell

Dell = 3×3
3 4 5
6 7 8
1 2 3

Apple

Apple = 4×5
45 64 67 89 90
1 2 3 4 5
23 12 23 56 65
11 2 3 89 5

Acer

Acer = 2×3
103 ×
0.1446 0.0334 1.2121
0.0068 0.0078 0.0090

Riassumendo, il comando "load()" permette di caricare dalla "Current Folder" array numerici salvati in file
di testo. Gli unici requisiti sono che i valori numerici debbano essere separati l'un l'altro da spazi e che i file
contengano un solo array.

Salvare dati nella "Current Folder"


Per salvare dei dati in un file basta utilizzare il comando "save()", specificando in quale file salvare i dati e
quali dati salvare in tale file. La sintassi risulta:

save('NomeFile.mat',ListaVariabili)

Come si può vedere, il file avrà estensione ".mat", estensione riservata ai file dati di MATLAB. Nel file
verranno memorizzati sia i contenuti sia i nomi delle variabili, che potranno essere anche di tipo diverso. Si
definisca ad esempio la seguente "structure":

S.nome='Paolo Rossi';
S.nascita=datetime('24-Oct-1999');
S.iscritto=true;
S.matricola=712569;
S.matrice=[1 2;3 4];
S.sede="Pisa";
S

S = struct with fields:


nome: 'Paolo Rossi'
nascita: 24-Oct-1999
iscritto: 1
matricola: 712569
matrice: [2×2 double]
sede: "Pisa"

2
Il seguente comando crea il file "dati.mat" nella "Current Folder" e vi salva le variabili del workspace "Dell",
"Apple", "Acer", "S".

save('dati.mat','Dell','Apple','Acer','S')

Se si apre il file "dati.mat" con un editor di testo ci si accorge che esso ha un formato proprietario e che i dati
non sono leggibili. In effetti, i dati sono salvati in modo compresso, in modo tale da salvare sia il contenuto
sia il nome delle variabili, da occupare poco spazio sul disco, da poter essere ricaricati successivamente in
modo veloce.

Caricare dati da un file ".mat"


Per caricare i dati salvati in un file ".mat" si può utilizzare di nuovo il comando "load()".

load('NomeFile.mat') % carica tutte le variabili


load('Nomefile.mat',ListaVariabili) % carica solo le variabili specificate

Si osservi che è possibile caricare tutte o solo parte delle variabili salvate nel file:

clear; % cancelliamo tutte le variabili


load('dati.mat'); % carica da 'dati.mat' tutte le variabili
Dell

Dell = 3×3
3 4 5
6 7 8
1 2 3

Apple

Apple = 4×5
45 64 67 89 90
1 2 3 4 5
23 12 23 56 65
11 2 3 89 5

%
clear; % cancelliamo tutte le variabili
load('dati.mat','Acer','S'); % carica da 'dati.mat' solo 'Acer' ed 'S'
Acer

Acer = 2×3
103 ×
0.1446 0.0334 1.2121
0.0068 0.0078 0.0090

S = struct with fields:


nome: 'Paolo Rossi'
nascita: 24-Oct-1999
iscritto: 1

3
matricola: 712569
matrice: [2×2 double]
sede: "Pisa"

Come recuperare dati storici di borsa da Yahoo Finanza


Il sito web "Yahoo Finanza" (http://it.finance.yahoo.com/) permette di scaricare i dati storici delle quotazioni
dei titoli azionari delle principali borse mondiali.

Ad esempio, la pagina web:

https://it.finance.yahoo.com/quote/RACE.MI

è dedicata al titolo Ferrari N.V. quotato alla Borsa di Milano. Alla pagina:

https://it.finance.yahoo.com/quote/FCA.MI

si trova il titolo Fiat Chrysler Automobiles N.V., sempre quotato alla Borsa di Milano.

Selezionando la voce "Dati storici" sulla parte destra della pagina si ottengono le serie storiche dei prezzi
dei titoli. Questi dati sono raccolti in una tabella di sette colonne, corrispondenti rispettivamente alle date
cui si riferiscono i prezzi, al prezzo relativo al momento di apertura delle contrattazioni, al prezzo massimo
raggiunto nella giornata, al prezzo minimo raggiunto nella giornata, al prezzo relativo al momento di chiusura
delle contrattazioni, al prezzo di "Chiusura Aggiustata" che tiene conto dell'eventuale pagamento di dividendi
o di eventuali frazionamenti, al volume di scambio.

Si osservi che è possibile avere i prezzi con cadenza "giornaliera", "settimanale", "mensile". E' anche
possibile scegliere il periodo di riferimento, 1-3-6 mesi, 1-5 anni, dal giorno x al giorno y, oppure "Max" che
fornisce la serie storica completa.

Selezionando il pulsante "Applica" i dati richiesti vengono visualizzati nella pagina web, selezionando la
voce "Scarica dati" i dati vengono salvati sul disco del computer in un file ".csv" (Comma Separated Values),
ovvero in un file di testo in cui i valori (numerici o stringhe) sono separati l'un l'altro da virgole.

A titolo di esempio, si scarichino le quotazioni giornaliere del titolo Ferrari N.V. per il periodo 19 febbraio
2018 - 23 marzo 2018, ottenendo il file "RACE.MI.csv". Si scarichino poi per due volte le quotazioni
giornaliere complete del titolo FCA, ottenendo i file "FCA.MI.csv" e "FCA2.MI.csv" (le due copie del file ci

4
serviranno in seguito). Infine, si copino i tre files ottenuti nella "Current Folder", in modo tale da renderli
visibili a MATLAB.

Come caricare un file ".csv"


Per caricare i dati contenuti in un file ".csv" basta utilizazre il comando "readtable()".

Race=readtable('RACE.MI.csv');

Warning: Variable names were modified to make them valid MATLAB identifiers. The original names are saved in
the VariableDescriptions property.

Race(1:5,:)

ans = 5×7 table

Date Open High Low Close AdjClose

1 2018-02-19 105.2000 105.7500 102.6000 102.7000 102.7000

2 2018-02-20 103.0000 104.5000 101.2000 104.5000 104.5000

3 2018-02-21 103.8500 105.7500 103.3500 105.3000 105.3000

4 2018-02-22 104.5000 104.5000 102.4500 103.1000 103.1000

5 2018-02-23 103.1000 104.5500 101.7500 104.5000 104.5000

Si osservi che MATLAB ha caricato i dati storici in una "Table", ha riconosciuto che la prima colonna contiene
delle date, le 5 colonne successive dei dati numerici con cifre decimali, che l'ultima colonna contiene dei
valori numerici senza cifre decimali. MATLAB non accetta gli spazi nei nomi delle colonne, per questo motivo
converte la stringa "Adj Close" in "AdjClose" avvertendo l'utente con un "Warning".

Nel caso in cui MATLAB non riesca a riconoscere in modo automatico il formato dei dati (ad esempio
potrebbe visualizzare l'ultima colonna in formato esponenziale e non come numeri interi) è possibile
specificare a priori il formato delle colonne:

Race=readtable('RACE.MI.csv','Format','%D%f%f%f%f%f%d');

Warning: Variable names were modified to make them valid MATLAB identifiers. The original names are saved in
the VariableDescriptions property.

Race(1:5,:)

ans = 5×7 table

Date Open High Low Close AdjClose

1 2018-02-19 105.2000 105.7500 102.6000 102.7000 102.7000

2 2018-02-20 103.0000 104.5000 101.2000 104.5000 104.5000

3 2018-02-21 103.8500 105.7500 103.3500 105.3000 105.3000

5
Date Open High Low Close AdjClose

4 2018-02-22 104.5000 104.5000 102.4500 103.1000 103.1000

5 2018-02-23 103.1000 104.5500 101.7500 104.5000 104.5000

%D indica che la prima colonna contiene delle date, %f indica che le colonne 2-6 contengono dati numerici
"floating-point" (con le cifre decimali), %d indica che l'ultima colonna contiene numeri interi.

In alcuni casi il comando "readtable()" sembra non riconoscere i valori numerici delle quotazioni che vengono
interpretate come stringhe di caratteri.

Fca=readtable('FCA.MI.csv');

Warning: Variable names were modified to make them valid MATLAB identifiers. The original names are saved in
the VariableDescriptions property.

Fca(1:5,:)

ans = 5×7 table

Date Open High Low Close AdjClose

1 2000-01-03 '8.306290' '8.502870' '8.057100' '8.057100' '4.924587'

2 2000-01-04 '8.303520' '8.386580' '8.176160' '8.320130' '5.085354'

3 2000-01-05 '8.167850' '8.633000' '7.990650' '8.610850' '5.263045'

4 2000-01-06 '8.776980' '8.846200' '8.569320' '8.693920' '5.313818'

5 2000-01-07 '8.749290' '8.915420' '8.624700' '8.832350' '5.398428'

Ciò accade perché per alcune date Yahoo Finanza non aveva le quotazioni ed in loro assenza ha restituito
il valore "null". Questo valore non è per MATLAB un valore numerico ma una stringa, e quindi le colonne 2-7
sono state tutte interpretate come stringhe.

Per ovviare a questo problema basta utilizzare un editor di testo per sostituire nel file .csv tutte le occorrenze
di "null" con "NaN", valore che MATLAB interpreta correttamente come numerico.

Ad esempio, si vada nella "Current Folder", si selezioni con il tasto destro del mouse il file "FCA2.MI.csv" (in
modo tale da far comparire il menù contestuale) e si selezioni "Open as Text".

Il file .csv viene aperto come file di testo nell'editor di MATLAB, a questo punto basta premere sul pulsante
"Find" (avente come icona una lente di ingrandimento) e dire di sostituire con "NaN" tutte le occorrenze di
"null" (pulsante "Replace All"). Fatto questo si salvi il file modificato.

6
Il file .csv verrà adesso caricato correttamente.

Fca2=readtable('FCA2.MI.csv');

Warning: Variable names were modified to make them valid MATLAB identifiers. The original names are saved in
the VariableDescriptions property.

Fca2(1:5,:)

ans = 5×7 table

Date Open High Low Close AdjClose

1 2000-01-03 8.3063 8.5029 8.0571 8.0571 4.9246

2 2000-01-04 8.3035 8.3866 8.1762 8.3201 5.0854

3 2000-01-05 8.1678 8.6330 7.9906 8.6108 5.2630

4 2000-01-06 8.7770 8.8462 8.5693 8.6939 5.3138

5 2000-01-07 8.7493 8.9154 8.6247 8.8323 5.3984

Potrebbe infine accadere che il file .csv contenga i prezzi del titolo elencati in ordine decrescente di data
(dalla più recente alla più vecchia). Ciò è comodo per avere subito i prezzi più recenti del titolo, ma non è
utile per lavorare con i dati storici che servono invece in ordine crescente di data (dalla più vecchia alla più
recente).

Nel caso in cui si voglia invertire l'ordine temporale dei prezzi, basta utilizzare il comando "flipud()".

Fca3=flipud(Fca2);
Fca3(1:5,:)

ans = 5×7 table

Date Open High Low Close AdjClose

1 2018-03-23 16.7000 16.9160 16.5040 16.6380 16.6380

2 2018-03-22 17.4260 17.5900 16.6320 16.9820 16.9820

3 2018-03-21 17.3500 17.7000 17.2920 17.5780 17.5780

4 2018-03-20 16.8580 17.2700 16.7800 17.2700 17.2700

5 2018-03-19 17.1400 17.1420 16.7900 16.8560 16.8560

Potrebbero piacerti anche