In questa nuova serie di articoli descriviamo l’implementazione per tutte le classi orientate agli oggetti di Python associate al framework di backtesting open source DataInvestor di TradingQuant.it. In questo articolo descriviamo come implementare la gestione degli asset di un portafoglio quantitativo tramite la classe Asset
. Questa classe è responsabile dell’implementazione degli aspetti relativi agli asset negoziabili all’interno del sistema di backtesting.
Alla data di pubblicazione di questo articolo sono disponibili due sottoclassi derivate da Asset
: Cash
e Equity
. Ognuna di queste due sottoclassi è una semplice estensione della classe base, che in questa fase non contiene specifiche di interfaccia. Usiamo questa gerarchia di classi in modo da consentire sviluppi futuri e la possibilità d specificare l’interfaccia quando si vuole implementare tipologie di asseta più sofisticate, come i derivati.
La gestione degli asset
Iniziamo definendo la classe base Asset
:
from abc import ABCMeta
class Asset(object):
"""
Classe di asset generica che memorizza i metadati su un asset di trading.
"""
__metaclass__ = ABCMeta
Non ci sono metodi astratti in questa classe, ma fornisce una base per future specifiche dell’interfaccia.
Gestione del cash
La prima sottoclasse derivata è Cash
. Questo rappresenta il “asset in contanti” che è depositato in un conto del broker quando qualsiasi asset negoziabile deve essere ancora acquistato. Contiene due attributi. Il primo è il valore booleano cash_like
, per indicare semplicemente che l’asset se è “simile al contante” o meno. La seconda è una stringa che descrive la valuta. L’impostazione predefinita è il dollaro USA.
from datainvestor.asset.asset import Asset
class Cash(Asset):
"""
Memorizza i metadati di un asset Cash.
Parameters
----------
currency : str, optional
La valuta del Cash Asset. Il valore predefinito è USD.
"""
def __init__(
self,
currency='USD'
):
self.cash_like = True
self.currency = currency
Gestione dei titoli azionari
Per la gestione degli asset la sottoclasse derivata più interessante è l’asset Equity
. Questa classe contiene un semplice insieme di attributi che memorizzano le informazioni sulle azioni ordinarie o i fondi negoziati in borsa (ETF). In particolare ha un nome e un simbolo ticker. Quest’ultimo non ha ancora alcuna funzionalità per la mappatura dei ticker, che sarebbe necessaria in un contesto istituzionale più robusto. Il terzo attributo tax_exempt
è un valore booleano specifico per determinate aree geografiche per indicare al sistema di backtesting che le transizioni di questo asset devono essere tassate:
from datainvestor.asset.asset import Asset
class Equity(Asset):
"""
Memorizza i metadati su un'azione ordinaria o ETF.
Parameters
----------
name : `str`
Il nome dell'asset (ad es. il nome dell'azienda e/o
la clase delle azioni).
symbol : `str`
Il simbolo ticker originale dell'asset
TODO: modifiche per gestire la corretta mappatura dei ticker.
tax_exempt: `boolean`, optional
La quota è esente da tassazione governativa?
Necessario per la tassazione sulle transazioni azionarie.
"""
def __init__(
self,
name,
symbol,
tax_exempt=True
):
self.cash_like = False
self.name = name
self.symbol = symbol
self.tax_exempt = tax_exempt
def __repr__(self):
"""
Rappresentazione in stringa dell'Asset azionario.
"""
return (
"Equity(name='%s', symbol='%s', tax_exempt=%s)" % (
self.name, self.symbol, self.tax_exempt
)
)
Conclusioni
Notiamo che tutte le sottoclassi per la gestione degli asset contengono un metodo di doppia sottolineatura – ‘dunder’ – __repr__
che produce una stringa di rappresentazione. In questo modo permettiamo ad ogni asset di essere completamente replicato da questa rappresentazione. Per esempio, Questo è il caso dove fosse digitato direttamente in una console Python.
Nel prossimo articolo della serie descriviamo la simulazione di un broker, considerando la gerarchia di classi FeeModel
. E’ utilizzato per specificare la struttura delle fee e delle commissioni di un broker, necessarie per modellare in modo appropriato i costi delle transazioni di trading.
Il codice completo presentato in questo articolo, basato sul framework di trading quantitativo event-driven DataInvestor, è disponibile nel seguente repository GitHub: https://github.com/tradingquant-it/DataInvestor.”