Esplora E-book
Categorie
Esplora Audiolibri
Categorie
Esplora Riviste
Categorie
Esplora Documenti
Categorie
—————
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
1
Come caricare e salvare dati in MATLAB
(Live Script realizzato con MATLAB versione 2018a)
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).
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.
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
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.
Si osservi che è possibile caricare tutte o solo parte delle variabili salvate nel file:
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
3
matricola: 712569
matrice: [2×2 double]
sede: "Pisa"
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.
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,:)
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,:)
5
Date Open High Low Close AdjClose
%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,:)
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,:)
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,:)