In questo articolo descriviamo come implementare una heatmap del mercato azionario con python per rappresentare i rapporti tra i rendimenti delle azioni che compongono l’indice Dow 30. Lo scopo di questo articolo è mostrare ed approfondire l’uso della libreria Seaborn di Python, come per le altre librerie di Python fondamentali per l’analisi dei dati finanziari descritte nei precedenti articoli su DataTrading.info.
La heatmap
Una heatmap è definita come “una rappresentazione di dati sotto forma di mappa o diagramma in cui i valori dei dati sono rappresentati come colori”.
Una heatmap è quindi un ottimo strumento per visualizzare rapidamente l’entità dei rendimenti azionari nel tempo in un formato matrice/griglia. Questo strumento usa una mappa/scala di colori per rappresentare la dimensione e la direzione della variazione percentuale di ciascun titolo in uno specifico periodo di tempo.
La creazione di una heatmap è un processo molto semplice, grazie alla potenza e alla facilità d’uso di Seaborn.
Il codice
Vediamo come implementare una heatmap senza le etichette relative ai ticker dei titoli azionari, ovvero solamente con il valore numerico della relativa cella.
import pandas as pd
import numpy as np
import yfinance as yf
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
# Funzione per scaricare i dati storici di una lista di ticker
def get_prices(tickers, start):
prices = yf.download(tickers, start=start)['Adj Close']
return prices
# Url dove scaricare le informazioni dei ticker che compongono il Dow 30
dow = 'https://www.cnbc.com/dow-components/'
# Leggere la pagina del sito e raccogliere i dati dei ticker
data_table = pd.read_html(dow)
# Creazione della lista di ticker
tickers = data_table[:][0]['Symbol'].tolist()
# Download dei dati storici dei prezzi giornalieri per ogni ticker
prices = get_prices(tickers, start='2020-01-01')
# Calcolo dei rendimenti percentuali
returns = (((prices.iloc[-1] / prices.iloc[0]) - 1) * 100).round(2)
Il codice precedente ottiene i dati di cui abbiamo bisogno per popolare heatmap. Quindi possiamo creare e visualizzare la heatmap come segue:
per_change = ((np.asarray(returns)).reshape(6,5))
fig, ax = plt.subplots(figsize=(14,9))
plt.title('Dow 30 Heat Map',fontsize=18)
ax.title.set_position([0.5,1.05])
ax.set_xticks([])
sns.heatmap(per_change, annot=True, fmt="", cmap='RdYlGn', ax=ax)
plt.show()
Questa heatmap può andar bene, ma in realtà non possiamo vedere quale titolo si riferisce la singola cella. Non è l’ideale.
La parte (leggermente) complicata è la creazione degli array delle label per visualizzare le informazioni dei ticker nelle rispettive celle della heatmap che contengono i valori percentuali. Questo può essere implementato con il seguente codice.
# Creazione dell'array dei ticker dei simboli con la stessa dimensione della heatmap
symbol = ((np.asarray(returns.index)).reshape(6,5))
# Creazione dell'array dei rendimenti percentuali con la stessa dimensione della heatmap
per_change = ((np.asarray(returns)).reshape(6,5))
# Creazione di un array che unisce i ticker ai rispettivi rendimenti percentuali
labels = (np.asarray(["{0} \n {1:.3f}".format(symbol, per_change)
for symbol, per_change in zip(symbol.flatten(),
per_change.flatten())])).reshape(6,5)
annot
per creare la nuova heatmap, in modo da usare la lista di “labes” all’interno delle celle.
fig, ax = plt.subplots(figsize=(14,9))
plt.title('Dow 30 Heat Map',fontsize=18)
ax.title.set_position([0.5,1.05])
ax.set_xticks([])
sns.heatmap(per_change, annot=labels, fmt="", cmap='RdYlGn', ax=ax)
plt.show()
Otteniamo una heatmap che mostra sia i rendimenti che il ticker relativo a ciascun tittolo azionario che compone il Dow 30.
Codice completo
In questo articolo abbiamo descritto come implementare una heatmap del mercato azionario con python. Per il codice completo riportato in questo articolo, si può consultare il seguente repository di github:
https://github.com/datatrading-info/AnalisiDatiFinanziari