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 DataTrading.info. Questo articolo descrivere la classe Asset
, che è 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.
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.
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
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
)
)
Notiamo che tutte le sottoclassi di questo 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.