Applicazioni pratiche di machine learning/Previsioni su azioni, criptovalute, derivati

Installazione librerie

modifica

In un notebook Jupyter scaricare se necessario le seguenti librerie tramite:

pip install pandas
pip install matplotlib
pip install yfinance
pip install prophet

Caricamento librerie

modifica
import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf
from prophet import Prophet

Parte 1: Dati

modifica

Collegarsi con Yahoo Finance da qui : https://it.finance.yahoo.com e cercare nell'apposita casella di ricerca l'azione TESLA. In corrispondenza del titolo dell'azione si legge : Tesla, Inc. (TSLA) quindi il simbolo dell'azione è TSLA . Scaricare i dati degli ultimi 5 anni di quote azionarie come pandas dataframe tramite la libreria yfinance passando il simbolo dell'azione. Si possono scaricare i dati per un periodo di tempo diverso, sostituendo il parametro period con uno dei seguenti valori:

   1d: ultimo giorno
   5d: ultimi 5 giorni
   1mo: ultimo mese
   3mo: ultimi 3 mesi
   6mo: ultimi 6 mesi
   1y: ultimo anno
   2y: ultimi 2 anni
   5y: ultimi 5 anni
   10y: ultimi 10 anni
   ytd: da inizio anno a oggi
   max: tutti i dati disponibili
data = yf.download("TSLA", period='5Y')
data.tail()


Date 	        Open 	        High 	         Low 	      Close
2022-12-30 	119.949997 	124.480003 	119.750000 	123.180000
2023-01-03 	118.470001 	118.800003 	104.639999 	108.099998
2023-01-04 	109.110001 	114.589996 	107.519997 	113.639999
2023-01-05 	110.510002 	111.750000 	107.160004 	110.339996
2023-01-06 	103.000000 	114.389999 	101.809998 	113.059998


Le variabili che interessano per la previsione sono Date e Close, quindi si crea un dataframe con tali variabili da fornire alla libreria Prophet:

# initialize data of lists.
quote = {'ds': list(data.index),
		'y': list(data["Close"])}

# Create DataFrame
df = pd.DataFrame(quote)

# Print the output.
df.head()

Parte 2: Previsioni

modifica

Si prevedono le quote azionarie di TESLA per i successivi 365 giorni a partire dall'ultima data disponibile nei dati scaricati e si traccia il grafico. La linea blu rappresenta la previsione, l'area ombreggiata celeste rappresenta l'intervallo di confidenza previsionale all'80%, mentre la linea nera rappresenta i dati reali:


m = Prophet(daily_seasonality = True) # the Prophet class (model)
m.fit(df) # fit the model using all data


future = m.make_future_dataframe(periods=365) #we need to specify the number of days in future
prediction = m.predict(future)
m.plot(prediction)
plt.title("Prediction of the Tesla Stock Price using the Prophet")
plt.xlabel("Date")
plt.ylabel("Close Stock Price")
plt.show()


 


Si prevedono le quote azionarie nei successivi 20 giorni e si visualizza la tabella delle previsioni con yhat previsione alla data ds e [yhat_lower, yhat_upper] intervallo di confidenza all'80%:


future = m.make_future_dataframe(periods=20) #we need to specify the number of days in future
prediction = m.predict(future)
prediction[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail(20)
	ds 		yhat 		yhat_lower 	yhat_upper
4629 	2023-01-07 	135.237772 	124.066947 	147.274124
4630 	2023-01-08 	135.413466 	123.708696 	146.199598
4631 	2023-01-09 	135.864748 	123.974760 	146.670062
4632 	2023-01-10 	135.948641 	125.184931 	147.171731
4633 	2023-01-11 	136.173244 	125.154799 	148.297313
4634 	2023-01-12 	136.323332 	125.202074 	146.979928
4635 	2023-01-13 	136.418874 	124.533623 	148.434514
4636 	2023-01-14 	136.377036 	126.042858 	148.228069
4637 	2023-01-15 	136.514687 	125.306550 	147.593090
4638 	2023-01-16 	136.922638 	125.965366 	148.345261
4639 	2023-01-17 	136.958999 	125.154397 	148.167304
4640 	2023-01-18 	137.132998 	125.917358 	148.123067
4641 	2023-01-19 	137.230561 	126.417526 	148.524123
4642 	2023-01-20 	137.272794 	125.928654 	148.286496
4643 	2023-01-21 	137.177964 	125.885137 	148.997752
4644 	2023-01-22 	137.263975 	125.649551 	149.110246
4645 	2023-01-23 	137.622579 	125.627036 	148.529891
4646 	2023-01-24 	137.612720 	126.122051 	148.167514
4647 	2023-01-25 	137.744325 	126.552612 	148.780082
4648 	2023-01-26 	137.803880 	127.165398 	149.364249

CRIPTOVALUTE

modifica

Installazione librerie

modifica

In un notebook Jupyter scaricare le seguenti librerie tramite:

pip install pandas
pip install matplotlib
pip install ccxt
pip install prophet

Caricamento librerie

modifica
import pandas as pd
import ccxt
import matplotlib.pyplot as plt
from prophet import Prophet

Parte 1: Dati

modifica

La libreria ccxt può gestire vari mercati di scambio di criptovalute elencati di seguito ma in questa analisi si utilizzerà Binance:

print(ccxt.exchanges)

['alpaca', 'ascendex', 'bequant', 'bigone', 'binance', 'binancecoinm', 'binanceus', 'binanceusdm', 'bit2c', 'bitbank', 'bitbay', 'bitbns', 'bitcoincom', 'bitfinex', 'bitfinex2', 'bitflyer', 'bitforex', 'bitget', 'bithumb', 'bitmart', 'bitmex', 'bitopro', 'bitpanda', 'bitrue', 'bitso', 'bitstamp', 'bitstamp1', 'bittrex', 'bitvavo', 'bkex', 'bl3p', 'blockchaincom', 'btcalpha', 'btcbox', 'btcex', 'btcmarkets', 'btctradeua', 'btcturk', 'buda', 'bybit', 'cex', 'coinbase', 'coinbaseprime', 'coinbasepro', 'coincheck', 'coinex', 'coinfalcon', 'coinmate', 'coinone', 'coinspot', 'cryptocom', 'currencycom', 'delta', 'deribit', 'digifinex', 'exmo', 'flowbtc', 'fmfwio', 'gate', 'gateio', 'gemini', 'hitbtc', 'hitbtc3', 'hollaex', 'huobi', 'huobijp', 'huobipro', 'idex', 'independentreserve', 'indodax', 'itbit', 'kraken', 'kucoin', 'kucoinfutures', 'kuna', 'latoken', 'lbank', 'lbank2', 'luno', 'lykke', 'mercado', 'mexc', 'mexc3', 'ndax', 'novadax', 'oceanex', 'okcoin', 'okex', 'okex5', 'okx', 'paymium', 'phemex', 'poloniex', 'poloniexfutures', 'probit', 'ripio', 'stex', 'therock', 'tidex', 'timex', 'tokocrypto', 'upbit', 'wavesexchange', 'wazirx', 'whitebit', 'woo', 'yobit', 'zaif', 'zb', 'zipmex', 'zonda']


# creare un'istanza di Binance
exchange = ccxt.binance()

# impostare il simbolo del bitcoin/euro su Binance
symbol ='BTC/EUR'

# impostare il periodo di tempo desiderato cioè giornaliero
timeframe = '1d'

# scaricare i dati del prezzo del bitcoin
ohlcv = exchange.fetch_ohlcv(symbol, timeframe)

# convertire i dati in un DataFrame di pandas
df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])

# convertire la colonna timestamp in una colonna datetime
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')

# visualizzare i dati
df.tail()


	timestamp 	open 		high 		low 		close 	
495 	2023-01-04 	15803.30 	16031.64 	15771.00 	15889.31
496 	2023-01-05 	15886.01 	16034.95 	15797.24 	15993.84
497 	2023-01-06 	15993.84 	16015.00 	15809.07 	15924.82
498 	2023-01-07 	15924.83 	15954.45 	15889.11 	15917.02
499 	2023-01-08 	15916.00 	15935.00 	15888.88 	15904.99


Le variabili che interessano per la previsione sono timestamp e close, quindi si crea un dataframe con tali variabili da fornire alla libreria Prophet:

data = df[["timestamp","close"]] # select Date and Price
# Rename the features: These names are NEEDED for the model fitting
data = data.rename(columns = {"timestamp":"ds","close":"y"}) #renaming the columns of the dataset
data.head()

Parte 2: Previsioni

modifica

Si procede come nel caso delle azioni, prevedendo per i successivi 365 giorni a partire dall'ultima data disponibile nei dati scaricati il prezzo dei bitcoins e si traccia il grafico. La linea blu rappresenta la previsione, l'area ombreggiata celeste rappresenta l'intervallo di confidenza previsionale all'80%, mentre la linea nera rappresenta i dati reali:


m = Prophet(daily_seasonality = True) # the Prophet class (model)
m.fit(data) # fit the model using all data


future = m.make_future_dataframe(periods=365) #we need to specify the number of days in future
prediction = m.predict(future)
m.plot(prediction)
plt.title("Prediction of the Tesla Stock Price using the Prophet")
plt.xlabel("Date")
plt.ylabel("Close Stock Price")
plt.show()


Si prevede il prezzo dei bitcoin nei successivi 20 giorni e si visualizza la tabella delle previsioni con yhat previsione alla data ds e [yhat_lower, yhat_upper] intervallo di confidenza all'80%:

future = m.make_future_dataframe(periods=20) #we need to specify the number of days in future
prediction = m.predict(future)
prediction[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail(20)

Conclusioni

modifica

Uno dei vantaggi del machine learning è che può essere utilizzato per prevedere gli andamenti dei mercati in modo più preciso e tempestivo rispetto agli approcci basati sulla sola analisi umana. Inoltre, il machine learning può essere utilizzato per identificare pattern e trend nascosti che potrebbero non essere evidenti a un analista umano. Nonostante i vantaggi del machine learning, è importante notare che esso non è immune da errori e che le previsioni effettuate tramite questa tecnologia devono essere sempre prese con le dovute precauzioni.