Dopo aver introdotto la libreria Pandas di Python per l’analisi dei dati finanziari, in questo articolo descriviamo come usare un’altra utilissima libreria per implementare l’analisi delle performance degli asset con Python per le strategie di trading algoritmico. A tale scopo esaminiamo e analizziamo esempi e casi d’uso della libreria “ffn – Financial Functions” di Python. Questa libreria è stata creata da Philippe Morissette e rilasciata con licenza MIT. ed è consultabile su github (http://pmorissette.github.io/ffn/index.html)
La libreria offre molte funzioni per eseguire rapidamente l’analisi delle strategie di trading e delle serie storiche dei prezzi di asset finanziari. Possiamo gestire singole serie tramite la classe PerformanceStats
o gestire più asset contemporaneamente tramite la classe GroupStats
.
I dati
Iniziamo con il caso di un singolo asset/strategia e vediamo alcuni esempi. Per prima cosa importiamo i moduli necessari.
import pandas as pd
import numpy as np
import ffn
Generiamo quindi una serie di dati di prestazioni casuali, che coprono un periodo di 1000 giorni. Iniziamo impostando il numero di giorni desiderato (cioè 1000), quindi usiamo la funzione randn
di numpy per generare un array di 1000 numeri con un distribuzione normale. A questi numeri aggiungiamo un valore casuale scelto da un distribuzione uniforme con un valore massimo pari a e un valore minimo pari a 0, in modo da fornire una leggera distorsione verso l’alto alla serie di valori casuali. Questi valori rappresentano i rendimenti giornalieri di una ipotetica strategia di trading o dei prezzi di un ipotetico titolo azionario.
Creaiamo un dataframa con questi “rendimenti” e aggiungiamo una colonna con la somma cumulativa di tali rendimenti, aggiungendo 100 per rappresentare il capitale iniziale. In questo modo rappresentiamo l’equity della strategia, cioè la quantità di capitale che abbiamo nel conto di trading.
La libreria ffn consente di scaricare direttamente i dati storici dei prezzi delle azioni da Yahoo Finance, ma in questo articolo usiamo dati casuali in prima istanza. Usiamo il download dei dati in esempi successivi.
num_days = 1000
data = (np.random.randn(num_days) + np.random.uniform(low=0.0, high=0.2, size=num_days))
index = pd.date_range('01/01/2010', periods=num_days, freq='D')
data = pd.DataFrame(data, index=index, columns=['Returns'])
data['Equity'] = data.cumsum() + 100
data.iloc[0] = 100
L’analisi
La colonna “Equity” del dataframe è quella che ci interessa di più dato che rappresenta la curva di equity teorica del conto di trading. Iniziamo usando il metodo calc_stats
su questi dati e assegnando i risultati alla variabile perf
.
perf = data['Equity'].calc_stats()
perf
tramite la verifica del suo tipo
, possiamo vedere che è un oggetto ffn.core.PerformanceStats
. In questo modo possiamo applicare a perf
qualsiasi metodo dell’oggetto PerformanceStats
.
print(type(perf))
Possiamo quindi visualizzare la curva del patrimonio netto. Come abbiamo già visto con Pandas, in FFN è sufficiente chiamare la funzione plot()
.
perf.plot()
Otteniamo una rappresentazione visiva della curva di equity.
La reportistica
Per produrre un report delle statistiche possiamo usare semplicemente il metodo display()
di ffn. Questo metodo stampa il seguente report di statistiche completo.
perf.display()
Vediamo che abbiamo un report di statistiche piuttosto completo: Sharpe Ratio, Calmar Ratio, Total Returns, CAGR, Max Drawdown, Periodic Returns e altro ancora… Permette di risparmiare molto tempo – se dovessimo calcolarli tutti da soli, potrebbe volerci parecchio tempo.
Il prossimo metodo dellla libreria ffn che potrebbe interessarci è la possibilità di rappresentare una tabella dei rendimenti mensili.
perf.display_monthly_returns()
La libreria ffn mette a disposizione una funzione per tracciare il drawdown della serie di dati con una singola riga di codice
ffn.to_drawdown_series(data['Equity']).plot(figsize=(15,7),grid=True)
Possiamo inoltre tracciare un istogramma dei rendimenti in modo semplice e rapido.
perf.plot_histogram()
Se vogliamo entrare in possesso del set di statistiche di analisi complete di cui sopra, ma questa volta in una serie Pandas, anziché stampata come tabella, possiamo usare il seguente comando.
print(perf.stats)
Questo oggetto Series è indicizzabile, proprio come qualsiasi altra serie Pandas. Possiamo quindi selezionare tutti gli elementi rilevanti di cui abbiamo bisogno tramite la seguente sintassi, ad esempio se siamo interessati al Yearly Sharpe Ratio.
print(perf.stats['yearly_sharpe'])
“1.9283569892842471”
PerformanceStats
, possiamo estrarre la serie di Lookback Returns
semplicemente come segue (anche questo può essere indicizzato in modo simile all’oggetto perf.stats
menzionato sopra).
print(perf.display_lookback_returns())
Nel prossimo articolo descriviamo come usare la libreria FFN per analizzare più serie di prezzi/strategie contemporaneamente tramite l’oggetto GroupStats
.
Codice completo
In questo articolo abbiamo descritto come implementare l’analisi delle performance degli asset con Python. Per il codice completo riportato in questo articolo, si può consultare il seguente repository di github:
https://github.com/datatrading-info/AnalisiDatiFinanziari