Backtrader usare api alpha vantage

Usare AlphaVantage nei Datafeed di Backtrader

In questo articolo descriviamo come integrare AlphaVantage nei datafeed di Backtrader ed acquisire le serie storiche da usare per creare strategie di trading algoritmico.

Molte delle fonti gratuite di dati azionari di buona qualità come Google e Quandl stanno scomparendo. Per questo motivo aziende come Alpha Vantage sono un’assoluta manna dal cielo per i trader retail con problemi di liquidità! In un precedente articolo, abbiamo descritto come creare scaricare e salvare  i dati EOD (End ODay) in un file CSV. In questo articolo facciamo un passo avanti e descriviamo come usare AlphaVantage nei datafeed di Backtrader, in altre parole anziché salvare i dati in un file CSV, il codice in questo post scarica i dati e li inserisce direttamente in backtrader come feed di dati Pandas. Questo è utile quando non vogliamo archiviare e gestire una vasta libreria di file CSV ma vogliamo semplicemente testare di volta in volta alcuni ticker casuali.

Ottenere una chiave API

Prima di immergerci nel codice. Per scaricare i dati da Alpha Vantage, dobbiamo registrarci per ottenere una chiave API. È gratuito e ci garantirà l’accesso a vita. Se non ne hai già uno, vai al seguente link e registrati prima di continuare. Fonte:  https://www.alphavantage.co/support/#api-key

Installazione

Una volta che abbiamo una chiave API, dobbiamo anche installare un pacchetto python per interagire con l’API. Romel Torres ha creato un eccellente python wrapper per l’API . Per installarlo dobbiamo semplicemente digitare: pip install alpha_vantage. Ricorda di sostituire pip con pip3 se hai già installato python2. Il pacchetto alpha_vantage richiede una serie di dipendenze come  pandas. Pip dovrebbe essere in grado di scaricare e installare tutti i pacchetti richiesti automaticamente.

Usare AlphaVantage nei datafeed di backtrader

				
					from alpha_vantage.timeseries import TimeSeries
import pandas as pd
import numpy as np
import backtrader as bt
from datetime import datetime

# IMPORTANTE!
# ----------
# Registrarsi per ottenere una chiave API:
# https://www.alphavantage.co/support/#api-key
# e inserirla qui.
Apikey = 'INSERT YOUR API KEY HERE'

def alpha_vantage_eod(symbol_list, compact=False, debug=False, *args, **kwargs):
    '''
    Funzioni che scarica i dati di Alpha Vantage

    Restituisce una lista di oggetti dove ogni elemento contiene:
        [0] dataframe pandas
        [1] il nome del feed.
    '''
    data_list = list()

    size = 'compact' if compact else 'full'

    for symbol in symbol_list:

        if debug:
            print('Downloading: {}, Size: {}'.format(symbol, size))

        # Invia la API key e crea una sessione
        alpha_ts = TimeSeries(key=Apikey, output_format='pandas')

        data, meta_data = alpha_ts.get_daily(symbol=symbol, outputsize=size)

        # Converte l'indice in un datetime.
        data.index = pd.to_datetime(data.index)
        data.columns = ['Open', 'High', 'Low', 'Close','Volume']
        data.sort_index(inplace=True)

        if debug:
            print(data)

        data_list.append((data, symbol))

    return data_list

class TestStrategy(bt.Strategy):

    def __init__(self):

        pass

    def next(self):

        for i, d in enumerate(self.datas):

            bar = len(d)
            dt = d.datetime.datetime()
            dn = d._name
            o = d.open[0]
            h = d.high[0]
            l = d.low[0]
            c = d.close[0]
            v = d.volume[0]

            print('{} Bar: {} | {} | O: {} H: {} L: {} C: {} V:{}'.format(dt, bar,dn,o,h,l,c,v))


# Crea un istanza di cerebro
cerebro = bt.Cerebro()

# Aggiunge la strategia
cerebro.addstrategy(TestStrategy)

# Scarica i dati da Alpha Vantage.
symbol_list = ['AAPL','MSFT']
data_list = alpha_vantage_eod(
                symbol_list,
                compact=False,
                debug=False)

for i in range(len(data_list)):

    data = bt.feeds.PandasData(
                dataname=data_list[i][0], # Pandas DataFrame
                name=data_list[i][1], # Simbolo
                timeframe=bt.TimeFrame.Days,
                compression=1,
                fromdate=datetime(2018, 1, 1),
                todate=datetime(2019, 1, 1)
                )

    # Aggiungere i dati a cerebro
    cerebro.adddata(data)

print('Starting to run')

# Esecuzione del backtest
cerebro.run()
				
			

Commento al codice

Prima di provare a eseguire il codice, dobbiamo assicurarci di aggiornare la chiave API:

				
					
# IMPORTANTE!
# ----------
# Registrarsi per ottenere una chiave API:
# https://www.alphavantage.co/support/#api-key
# e inserirla qui.
Apikey = 'INSERT YOUR API KEY'

				
			

La maggior parte della logica di questo script è implementata all’interno della funzione alpha_vantage_eod(). In questa funzione scarichiamo i dati e li elaboriamo in un formato che possiamo facilmente passare a Backtrader. Vediamo in dettaglio i parametri della funzione:

  • symbol_list: è un semplice elenco di simboli/ticker che vogliamo scaricare. Se si vuole un solo strumento, dobbiamo inserire un solo ticker all’interno di una lista, come segue: symbol_list = ['AAPL']
  • compact: utile per i test. Scarica solo gli ultimi 100 datapoint/barre e  quindi il download  sarà più rapido. Impostiamo questo parametro con True se desideriamo velocizzare i download.
  • debug: fornisce alcune stampe extra sul terminale nel caso otteniamo risultati strani. Con questa opzione possiamo vedere quale simbolo/ticker crea problemi.

La funzione alpha_vantage_eod() restituisce una lista nidificata di datafeed, cioè ogni elemento della lista è un’altra lista che contiene due elementi. Il primo elemento (in posizione [0]) è il dataframe pandas e il secondo elemento (in posizione [1]) è la stringa del simbolo relativo al dataframe. Avere un facile accesso al simbolo ci consente di aggiungerlo come name del datafeed in backtrader. Per quanto riguarda la strategia, è stata progettata solo per testare/controllare che i feed vengano aggiunti correttamente. Possiamo notare che il metodo (funzione) next() è stato codificato in modo da supportare più feed di dati. In questo modo la strategia può supportare uno o più feed di dati e gestirli in modo appropriato per stampare i  propri valori OHLCV. Per ulteriori informazioni abbiamo già descritto in precedenza come creare una strategia completa che supporti più feed di dati

Per chi fosse interessato, ulteriori informazioni sull’API sono disponibili su: https://www.alphavantage.co/documentation/

Risultati

Eseguendo lo script otteniamo il seguente output:

Usare AlphaVantage nei datafeed di Backtrader

Note e miglioramenti:

  1. Alpha Vantage ha limiti per le chiamate API. Quando usiamo la loro API gratuita, siamo limitati a 5 chiamate API al minuto e un totale di 500 al giorno. Quindi se abbiamo una lista di simboli di grandi dimensioni (oltre 5), dobbiamo aggiungere una funzione di sospensione per attendere 12 secondi tra i download. Ovviamente abbiamo rallentamenti anche nell’inizializzazione del backtest. Se prevediamo di effettuare un numero elevato di chiamate API, potremmo prendere in considerazione la possibilità di salvare l’output in CSV come descritto nell’articolo precedente .
  2. Il codice precedente scarica i dati non aggiustati. Se abbiamo bisogno dei dati corretti con i dividendi e split, Alpha Vantage fornisce solo un  valore close_adjusted quindi dobbiamo prevede una funzione che calcoli i valori aggiustati per openhighlow se desideriamo continuare a lavorare con i dati OHLC.
  3. Alpha Vantage fornisce anche dati intraday su azioni, FX e criptovalute! I lettori potrebbero voler utilizzare questo esempio di codice come base per accedere a questi altri feed.

Codice completo

In questo articolo abbiamo descritto come usare AlphaVantage nei datafeed di Backtrader per creare strategie di trading algoritmico. Per il codice completo riportato in questo articolo, si può consultare il seguente repository di github:

https://github.com/datatrading-info/BackTrader

Scroll to Top