"Produrre previsioni di alta qualità non è un problema facile né per le macchine né per la maggior parte degli analisti. Abbiamo osservato due temi principali nella pratica della creazione di una varietà di previsioni aziendali: Le tecniche di previsione completamente automatiche possono essere fragili e sono spesso troppo inflessibili per incorporare ipotesi o euristiche utili. Gli analisti che possono produrre previsioni di alta qualità sono abbastanza rari perché la previsione è un'abilità specializzata nella scienza dei dati che richiede una notevole esperienza. "
Dal sito web di Facebook Prophet. In questo progetto utilizzeremo l’algoritmo Neural Prophet per la previsione del cross EUR/CHF. Per la trattazione dell’argomento si farà uso del software di programmazione Python in ambiente Jupiter Notebook.
Un mondo di profeti
Quando nel mio primo articolo Introduzione al Machine Leanring per il Trading, inizio di questa avventura divulgativa, abbiamo voluto introdurre i concetti di previsione abbiamo fatto riferimento, con approccio provocatorio, a coloro che soprattutto nel passato pretendevano di prevedere il future basandosi su presunte doti magiche, segno di benevolenza divina, che gli permetteva di affermarsi nelle società del tempo incutendo rispetto e timore. Con il tempo e con il progresso scientifico si è dimostrato che tali poteri paranormali previsionali erano fallimentari per almeno due motivi.
Uno, erano statisticamente non affidabili, razionalmente non giustificabili e pertanto instabili, due, allorquando validi, erano dimostrati tali da una predisposizione mentale che rendeva quelle previsioni vere o verosimili. Fare previsioni significa considerare tutte le caratteristiche (nello spazio e nel tempo) di un fenomeno passato, assegnare ad ognuna di esse un peso di influenza, combinarle tra loro e contestualizzarle ed adattarle in una nuova circostanza.
Posso prevedere con certezza pressochè assoluta che domani avremo un alba e un tramonto, abbastanza accurata se la giornata sarà piovosa, nuvolosa o soleggiata, un po’ meno se devo prevedere dove trovare parcheggio in centro città (tanto piu’ se non conosco la zona). Le previsione é imprescindibile dall’esperienza passata, ma la stessa non ne è garanzia di accuratezza. Come nei teoremi matematici potremmo dire che, a meno di essere sicuro di aver considerato tutte (ma proprio tutte) le variabili, l’esperienza passata è condizione necessaria ma non sufficiente per la bontà della previsione.
Questo é vero a tutti i livelli, dai nostri comportamenti di fronte a determinate situazioni di cui abbiamo esperienza, alle strategie geopolitiche che prendono spunto dalla storiografia, dalle analisi e previsioni di vendita di un attività commerciale, al classico esempio noto a tutti gli studiosi di machine learning sulla potenziale solvibilità di un cliente bancario. Quando parliamo di previsioni di prezzo e andamento di un prodotto finanziario tentiamo di dare una interpretazione di come quel fenomeno, già prodotto risultante di previsoni fatte nel passato (il mercato), possa evolversi sulla base di pattern storici. Un problema fondamentale é quello di determinare quale é il migliore intervallo temporale tra il presente e il passato per elaborare la previsione, e fino a quando.
Se per esempio il trader graficista vuole una previsione giornaliera, deve considerare l’andamento dell’ultimo mese, dell’ultima settimana o dell’ultimo anno?
FACEBOOK PROPHET
Facebook ha sviluppato il software previsionale Prophet disponibile per applicazioni sia in Python che in R. Fornisce parametri intuitivi che sono facili da modulare per cui anche chi non ha una profonda esperienza nei modelli di previsione in serie temporali può usarlo per generare previsioni significative per una vasta varietà di problemi.
Un modello di regressione su modelli che presentano carattere stagionale particolarmente robusto in caso di dati mancanti, spostamenti di tendenza, e nella gestione degli outlier. Prophet utilizza un modello di serie temporale scomponibile in tre elementi principali del modello:
tendenza, stagionalità e interruzioni, combinati nella seguente equazione:
y(t)= g(t) + s(t) + h(t) + εt
g(t): curva di crescita lineare o logistica per modellare i cambiamenti non periodici nelle serie temporali
s(t): cambiamenti periodici (es. stagionalità settimanale/annuale)
h(t): effetti delle interruzioni (per esempio week end e vacanze)
εt: il termine di errore tiene conto di qualsiasi cambiamento insolito non contemplato dal modello.
Usando il tempo come regressore, Prophet inquadra il problema della previsione come un esercizio di adattamento della curva piuttosto che guardare esplicitamente la dipendenza basata sul tempo di ogni osservazione all'interno di una serie temporale. Prophet e la sua evoluzione Neural Prophet vengono considerati come il ponte di collegamento tra le pure tecniche di analisi delle serie temporali e il deep learning (Figura 1)
NEURAL PROPHET su EUR/CHF
Seguendo il solito principio di costruzione di un codice di machine learning ( se ti interessa ne ho parlato dettagliatamente in un articolo ), partiamo con l’importazione delle librerie di gestione tabelle e grafica :
digita i seguenti comandi sul terminale per scaricare le librerie necessarie
Se hai python < 3
pip install yfinance
pip install neuralprophet
Se hai python >= 3
pip3 install yfinance
pip3 install neuralprophet
Se stai usando google Colab
!pip install yfinance
!pip install neuralprophet
Ora crea un nuovo file e iniziamo a scrivere codice.
import pandas_datareader.data as web
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
STEP 1 – IMPORTAZIONE E LETTURA DATI
Procediamo con l’impostazione delle funzioni che ci permettono di leggere I valori del cross Euro – Franco Svizzero con ticker EURCHF=X che vogliamo analizzare :
from datetime import datetime
start = datetime (2015,3,8)
end= datetime (2022,3,8)
data = yf.download(tickers = EURCHF, start=start, end=end)
Che da l’output Figura 2
STEP 2 – ELABORAZIONE, TRASFORMAZIONE E ORGANIZZAZIONE DATI
In questa fase trasformiamo I dati in maniera tale che gli stessi possano essere gestiti dall’algoritmo neuralprophet che utilizzeremo.
closecolumn=data.iloc[:,3]
closecolumn
L’ultima riga di codice ci darà la possibilità di visualizzare la nuova struttura dati (Figura 3)
e il suo andamento grafico con le funzioni di plotting (Figura 4)
Per utilizzare NeuralProphet dobbiamo operare una ulteriore trasformazione del nostro dataframe eseguendo le seguenti linee di codice :
neuralproheptdataset = closecolumn.reset_index()
dataprophet = neuralprophetdataset.rename(columns = {“Date”:”ds”, “Close”:”y”})
dataprophet
Che restituisce l’output (F5)
STEP 3 – DEFINIZIONE DEL MODELLO
Importiamo la libreria che ci permetterà di implementare neuralprophet ed eseguire le operazioni per esso necessarie con le seguenti istruzioni
from neuralprophet import NeuralProphet
STEP 4 – ADDESTRAMENTO DEL MODELLO
Con NeuralProphet l’addestramento del modello viene compiuto con le semplici line di codice che seguono dove indichiamo I nostri parametri (tra gli altri notiamo il periodo in cui vogliamo la previsione con n_forecast = periodo previsionale di 30 giorni),
m = NeuralProphet(
n_forecasts=30,
n_lags=60,
n_changepoints=50,
yearly_seasonality=True,
weekly_seasonality=False,
daily_seasonality=False,
batch_size=64,
epochs=100,
learning_rate=1.0,
)
STEP 5 – VALUTAZIONE AFFIDABILITA’ DEL MODELLO
Come sempre dobbiamo valutare la bontà del nostro modello e capire quando dopo diverse
iterazioni di addestramento i valori convergono e diventano stabili per iterazioni successive
metrics = m.fit(dataprophet, freq="D")
metrics
In Figura 6 vediamo il riassunto delle metriche.
Di cui possiamo vedere anche una rappresentazione grafica (F7)
STEP 6 - PREVISIONE
Avendo costruito il modello ed avendo appurato la sua precisione, se accettabile, procediamo con la previsione futura, a 30 giorno dopo l’ultima data disponibile nel nostro dataset chiamato dataprophet e cioé 7 marzo 2022.
future = m.make_future_dataframe(dataprophet, periods=30, n_historic_predictions=len(roughdata))
#noi dobbiamo specificare il numero di GIORNI da prevedere
prediction = m.predict(future)
in questo modo, operando alcune trasformazioni e lanciando la funzione di plotting abbiamo il grafico in F8.
possiamo a questo punto azzardare anche una previsione a 100 giorni semplicemente cambiando il parametro n_forecast ottenenendo con la stessa serie di istruzioni per il plotting da Figura 9
che zoommato da il grafico di Figura 10.
Conclusioni
A proposito di futuro, si pensa che in 50 anni le capacità di calcolo delle macchine siano grado di emulare il ragionamento umano; é chiamata AGI, Artificial General Intelligence. C’é chi pensa ad essa come un opportunità, altri come una minaccia. La macchina dovrebbe in teoria sosituire l’uomo nelle cose “complesse” che la macchina riesce a fare bene e meglio (calcoli, gestione dei dati) ma quando lo sostituisce nelle attività comuni (la guida di un autoveicolo) o semplici (servire il caffè, fare il check in in hotel, passare l’aspirapolvere) entriamo in un discorso che affronta una tematica socio culturale simile a quella che ci viene raccontata dei tempi della rivoluzione industriale.
Come ricollocheremo gli addetti (presumiamo non altamente qualificati) che oggi sono impiegati in quei settori?
Per la risposta a questa domanda credo neanche la macchina piu’ avanzata possa aiutarci. Anzi quando entriamo nel campo della fantasia e creatività forse siamo ancora superiori e ancora per un po’ irraggiungibili. Come umani, siamo meno dipendenti da dati di input strutturati rispetto alla macchina perchè abbiamo immaginazione, abbiamo ispirazione, abbiamo sensazioni. Non confondiamo la capacità di progredire con la semplice capacità di fare previsione. Ricordiamo che alla base dell’intelligenza artificiale c’é l’idea di trovare dei pattern storici semplicemente sulla base di un enorme quantità di dati passati. In passato facevamo previsioni dopo aver compreso il fenomeno oggetto di studio ma le stesse non erano accurate quanto quelle che facciamo oggi con AI.
D’altra parte possiamo affermare che l’algoritmo pur analizzando bene i dati e le correlazioni, non comprende in maniera intelligente e consapevolmente quello che sta facendo. Un sistema a guida autonoma riesce a decidere razionalmente, sulla base della sua codifica se in una situazione di pericolo deve proteggere i suoi passeggeri, il bambino che attraversa la strada.
E se oltre al passeggero, il bambino ci fosse anche un ladro che scappa? Chi codifica il livello di priorità e in base a quale criterio?
C’é un grande dibattito sull’etica dei sistemi AI e sulla responsabilità dei vari attori, a partire dai softwaristi agli utilizzatori, fino a quella dello stesso sistema.
Per chi fosse interessato ad ottenere il codice completo e strutturato per un plug and play in
ambiente Jupiter Notebook, richiedetelo pure all’autore all’indirizzo email
nicola.matarese73@gmail.com. NON PERDERTI I PROSSIMI ARTICOLI
Nicola Matarese classe 1973, ha conseguito una laurea magistrale in ingegneria meccanica ed ha ricoperto ruoli manageriali all’interno di realtà industriali in ambito aerospazio e difesa.
E’ appassionato di trading e opera sui mercati dal 2001. Da qualche anno lavora a sistemi di trading supportati da teorie sui Big Data e Intelligenza Artificiale.
Comments