Trading Automatico con Interactive Brokers tramite Python e IBPy

Trading Automatico con Interactive Brokers tramite Python e IBPy

In questa lezione relativa al corso “basi del trading algoritmico con Python” descriviamo come
effettuare il trading automatico con Interactive Brokers usando l’API e Python tramite il wrapper IBPy.

Interactive Brokers è uno dei principali broker utilizzati dai trader algoritmici retail grazie ai requisiti minimi di capitale relativamente bassi (10.000 USD) e a un’API robusta. In questa lezione utilizzeremo un account demo per automatizzare l’invio di ordini tramite l’API di Interactive Brokers, usando Python e il pacchetto IBPy.

Nota: non esiste alcuna affiliazione con Interactive Brokers. Abbiamo semplicemente testato il software in vari contesti e quindi acquisito una certa familiarità con la loro piattaforma.

L’API di Interactive Brokers

Interactive Brokers è un broker globale che si rivolge sia a trader retail che a operatori istituzionali automatizzati. Per questo motivo ha sviluppato una GUI avanzata chiamata Trader Workstation (TWS).

Oltre alla TWS è disponibile anche un componente più leggero chiamato IB Gateway, che consente l’accesso ai server IB senza interfaccia grafica. Per i nostri scopi di trading  automatico Interactive Brokers, non useremo direttamente la GUI, ma può essere utile per scopi dimostrativi.

L’architettura dell’API si basa su un modello client/server che fornisce dati di mercato in tempo reale e storici, oltre all’esecuzione degli ordini. In questa lezione, l’API verrà usata per inviare ordini automatici tramite IBPy.

IBPy è un wrapper dell’API Java di IB, pensato per facilitarne l’utilizzo con Python. Le librerie principali sono ib.ext e ib.opt, con quest’ultima che funge da interfaccia ad alto livello.

Nella seguente implementazione del trading automatico con Interactive Brokers prevediamo di invia un semplice ordine di mercato per acquistare 100 azioni Google. Vogliamo usare il routing intelligente per cercare il miglior prezzo disponibile.

Implementazione in Python

Per iniziare, è necessario un account Interactive Brokers e un ambiente Python configurato. È inoltre richiesta l’installazione di IBPy, che collegherà il codice all’API. Se necessario, consulta la lezione sull’ambiente di backtesting in Python.

Installare IBPy

IBPy è un wrapper Python dell’API Java di IB che semplifica lo sviluppo di sistemi di trading automatico con Interactive Brokers. Sarà la base per tutte le comunicazioni con IB, almeno fino all’introduzione del protocollo FIX. Essendo un progetto GitHub, va installato da git. Su Ubuntu:

				
					sudo apt-get install git-core
				
			

Una volta installato git, è possibile creare una sottodirectory per memorizzare IBPy. In questo esempio lo abbiamo semplicemente collocato sotto directory home:

				
					mkdir ~/ibapi
				
			

Lo step successivo è scaricare IBPy tramite git clone

Assicuriamoci di entrare nella directory IbPy ed effettuare l’installazione con l’ambiente virtuale Python preferito:

				
					cd ~/ibapi/IbPy
python setup.py.in install
				
			

Questo completa l’installazione di IBPy.

Il prossimo passo è aprire TWS

trading automatico con Interactive Brokers
Schermata del TWS Portfolio

Trading Automatico con Interactive Brokers

Il seguente codice implementa una semplice gestione degli ordine basato sulle API. Il codice è lontano dall’essere usato in produzione, ma dimostra la funzionalità essenziale dell’API per il trading automatico con Interactive Brokers e come utilizzarla per l’esecuzione degli ordini. Tutto il seguente codice è contenuto nel file ib_api_demo.py. Il primo passaggio consiste nell’importare gli oggetti Contract e Order dalla libreria ib.ext. Inoltre importiamo gli oggetti Connection e message dalla libreria ib.opt.
				
					# ib_api_demo.py

from ib.ext.Contract import Contract
from ib.ext.Order import Order
from ib.opt import Connection, message
				
			

IB ci offre la possibilità di gestire gli errori e le risposte del server tramite un meccanismo di callback. Le seguenti due funzioni non fanno altro che stampare il contenuto dei messaggi restituiti dal server. Un sistema di produzione più sofisticato dovrebbe implementare la logica per assicurare il funzionamento continuo del sistema nel caso di generazione di eccezioni:

				
					# ib_api_demo.py

def error_handler(msg):
    """Gestione per la cattura dei messagi di errori"""
    print("Server Error: %s" % msg)

def reply_handler(msg):
    """Gestione delle risposte dal server"""
    print("Server Response: %s, %s" % (msg.typeName, msg))
				
			

Le seguenti due funzioni completano la creazione degli oggetti ContractOrder, impostando i rispettivi parametri:

				
					# ib_api_demo.py

def create_contract(symbol, sec_type, exch, prim_exch, curr):
    """
    Crea un oggetto Contract definendo cosa sarà
    acquistato, in quale exchange e in quale valuta.

    symbol - Il simbolo del ticker per il contratto
    sec_type - Il tipo di asset per il contratto ("STK" è "stock")
    exch - La borsa su cui eseguire il contratto
    prim_exch - Lo scambio principale su cui eseguire il contratto
    curr - La valuta in cui acquistare il contratto
    """
    contract = Contract()
    contract.m_symbol = symbol
    contract.m_secType = sec_type
    contract.m_exchange = exch
    contract.m_primaryExch = prim_exch
    contract.m_currency = curr
    return contract

def create_order(order_type, quantity, action):
    """
    Crea un oggetto Ordine (Market/Limit) per andare long/short.

    order_type - "MKT", "LMT" per ordini a mercato o limite
    quantity - Numero intero di asset dell'ordine
    action - 'BUY' o 'SELL'
    """
    order = Order()
    order.m_orderType = order_type
    order.m_totalQuantity = quantity
    order.m_action = action
    return order
				
			

Conclusione

La funzione __main__ inizialmente crea un oggetto Connection verso Trader Workstation, che deve essere in esecuzione affinché il codice funzioni. Le funzioni di gestione degli errori e di risposta vengono quindi registrate con l’oggetto di connessione. Successivamente viene definita una variabile order_id. In un sistema di produzione questo deve essere incrementato per ogni ordine.

I passi successivi sono la creazione di un Contract e di un Order che rappresenta un market-order per acquistare 100 unità di azioni Google. L’ultimo compito è quello di piazzare quell’ordine tramite il metodo placeOrder dell’oggetto Connection. Quindi ci disconnettiamo da TWS:

				
					# ib_api_demo.py

if __name__ == "__main__":
    # Collegarsi alla Trader Workstation (TWS) in esecuzione
    # sulla solita porta 7496, con un clientId di 100
    # (Il clientId è scelto da noi e avremo bisogno di
    # ID separati sia per la connessione di esecuzione che per
    # connessione dati di mercato)
    tws_conn = Connection.create(port=7496, clientId=100)
    tws_conn.connect()

    # Assegna la funzione di gestione degli errori definita
    # sopra alla connessione TWS
    tws_conn.register(error_handler, 'Error')

    # Assegna tutti i messaggi di risposta del server alla
    # funzione reply_handler definita sopra
    tws_conn.registerAll(reply_handler)

    # Crea un ordine ID che sia "globale" per questa sessione. Questo
    # dovrà essere incrementato una volta inviati nuovi ordini.
    order_id = 1

    # Crea un contratto in stock GOOG tramite il routing degli ordini SMART
    goog_contract = create_contract('GOOG', 'STK', 'SMART', 'SMART', 'USD')

    # si va long di 100 azioni di Google
    goog_order = create_order('MKT', 100, 'BUY')

    # Uso della connessione per inviare l'ordine a IB
    tws_conn.placeOrder(order_id, goog_contract, goog_order)

    # Disconnessione da TWS
    tws_conn.disconnect()
				
			

Infine è sufficiente lanciare lo script Python:

				
					python ib_api_demo.py
				
			

Immediatamente si può vedere che si apre un tab “API” su Trader Workstation, mostrando il market order per andare long di 100 azioni su Google

Schermata del Tab API di TWS dopo l'ordine su Google

Il codice completo presentato in questa lezione, parte del pacchetto python per il backtest TQBacktest, è disponibile nel seguente repository GitHub: https://github.com/tradingquant-it/TQBacktest.”

Torna in alto