Per prima cosa
dobbiamo creare una serie storica tramite passeggiata aleatoria dei prezzi,
utilizzando dei dati pseudocasuali. Genero 1000 valori iniziali ad un prezzo
iniziale pari a 100 e con un delta di incremento pari a 1. Successivamente,
allo scorrere del tempo, confronto il prezzo rispettivamente con gli estremi
superiori e inferiori. Successivamente riportiamo il punto centrale della
nostra strategia:
If
(OsservazionePrezzo.Prezzo-PrezzoDiRiferimentoPerOrdine)/
PrezzoDiRiferimentoPerOrdine > Me.PercentualeRibassoPerBUY Then
‘ora di fare un BUY
ElseIf(PrezzoDiRiferimentoPerOrdine-OsservazionePrezzo.Prezzo)/
PrezzoDiRiferimentoPerOrdine > Me.PercentualeRibassoPerSELL Then
‘ora di fare un SELL
Successivamente inserisco all’interno di una lista i valori di Buy e di Sell
Costruisco la media mobile e deviazione standard della serie storica
creata nei punti precedenti
Calcolo il
profitto (prezzoSell-prezzoBuy)
Calcolo indice
di performance (pnl e drawdown)
Ricordiamo inoltre che una
dichiarazione Profitti e Perdite (P&L) è un rendiconto finanziario che
riassume i ricavi, i costi e le spese sostenute durante un determinato periodo
di tempo, di solito un trimestre fiscale o anno. Queste registrazioni
forniscono informazioni circa la capacità di un’azienda di generare profitto
aumentando le entrate, riducendo i costi. In questo caso specifico la grafica
del pnl è stata inserita in una Picture Box.
La passeggiata aleatoria, o comunemente “random walk”, è il modello base utilizzato per descrivere i movimenti dei prezzi azionari nei principali modelli di gestione del rischio. È una successione di variabili aleatorie con uguale distribuzione di probabilità e indipendenti l’una dall’altra. Un esempio elementare di una passeggiata aleatoria semplice è la distribuzione di Bernoulli che assume il valore 1 con probabilità p ( un passo verso destra) e -1 con probabilità 1 – p (un passo verso sinistra) ad ogni passo. La probabilità di andare a destra che a sinistra, vale p=0.5. Se si verificano N realizzazioni, allora abbiamo una distribuzione binomiale
La distribuzione di probabilità è:
Il moto browniano geometrico è un processo stocastico definito nel continuo in cui il logaritmo della variabile aleatoria nel tempo segue un moto browniano. Tale processo assume particolare rilevanza in ambito finanziario, in particolare nel calcolo del prezzo in quanto nel modello di Black-Scholes-Merton viene ipotizzato che il prezzo dell’azione sottostante segua un tale processo.Il moto browniano geometrico soddisfa la seguente equazione differenziale stocastica:
dove Wt è un moto browniano standard, mi il drift percentuale istantaneo e sigma la volatilità percentuale istantanea, sono costanti reali.
L’equazione ha una soluzione analitica nella forma:
Quando viene applicato ai prezzi, moto browniano presuppone che il passaggio da un periodo all’altro non è dipendente dal livello dei prezzi oppure dalle variazioni dei prezzi. Cioè, ogni variazione è indipendente dalle variazioni di prezzo del passato e la volatilità delle variazioni dei prezzi è costante.
In statistica la varianza di una variabile aleatoria X è un numero, indicato con Var(X) che fornisce una misura di quanto siano vari i valori assunti dalla variabile, cioè di quanto essi differiscano dalla media µ. In altri è il valore medio del quadrato degli scarti, cioè la somma dei quadrati degli scarti per le relative probabilità. La varianza è quindi una misura di concentrazione: minore (maggiore) è la varianza, peggiore (maggiore) è la concentrazione (dispersione) dei dati attorno al valore medio.La formula matematica per il calcolo della varianza per un’intera popolazione di dimensione N è:
La formula per il calcolo di una stima corretta della varianza di un campione di grandezza n è invece:
Gli algoritmi precedenti possono, però, essere migliorati. Il problema della perdita di cifre significative è descritta e analizzata daDonald Knuth (Art of Computer Programming, Vol 2, Seminumerical Algorithms“, section 4.2.2), un informatico statunitense. La soluzione prevede di calcolare media e varianza utilizzando equazioni di ricorrenza nel caso di data stream:
È di notevole interesse la dimostrazione che dalle formule classiche portano alla scrittura delle formule di ricorrenza:
Ampliando le nostre conoscenze sulla
struttura e gestione di dati annoveriamo:
le Collection
gli ArrayList
le strutture enumerative
Le collection sono strutture dati le quali possono
ospitare qualsiasi tipo di oggetto, e per propria natura, a
differenza degli array, non sono fortemente tipizzati.
Gli ArrayList sono una particolare struttura dati inclusa nel Framework .Net derivante dal namespace System.Collections.ArrayList; quindi costituiscono una particolare collection. Vediamone qualche esempio.
Facciamo l’esempio di dichiarazione,
inizializzazione e aggiunta di elementi:
….
Dim
objlist As ArrayList
objlist=New
ArrayList()
objlist.Add(“casa”)
objlist.Add(“macchina”)
objlist.Add(“divano”)
objlist.Add(“motore”)
….
Si dichiara una variabile di tipo ArrayList, si inizializza tale variabile con la clausola New e con il metodo Add si aggiunge l’elemento all’ArrayList. Volendo ordinare la lista, non dobbiamo are altro che utilizzare il metodo Sort.
…
objlist.Sort()
….
Concludiamo questo capitolo affermando che la gestione
di una collection è simile in tutto alla gestione di un ArrayList.
Accanto a queste troviamo le strutture
enumerative, particolarmente utili per definire un insieme, tipo:
l’insieme dei giorni della
settimana
un insieme di costanti definite
dall’utente
l’insieme dei mesi dell’anno
ecc.. ecc..
Una struttura enumerativa viene dichiarata con la classe Enum, proponiamo
anche in questo caso un esempio:
….
Public
Module enumerazioni
Enum
giorni_settimana
Lunedì=1
Martedì=2
Mercoledì=3
Giovedì=4
Venerdì=5
Sabato=6
Domenica=7
End Enum
End Module
In
questo modo abbiamo costruito un insieme di costanti intrinseche definite
dall’utente sfruttando la classe di base Enum.
Nel linguaggio del trading, per Gap si intende una particolare situazione in cui all’apertura di una sessione di contrattazione la quotazione di un titolo è superiore alla quotazione di chiusura del giorno precedente. Nel caso in cui invece l’apertura segni una quotazione inferiore a quella del minimo toccato il giorno precedente si parla di Gap Down.
La situazione di gap si verifica quando
sul mercato vi sono repentini sbilanci tra domande e offerta.
Poniamo ad esempio che una notizia importante arrivi durante le ore serali o
notturne, quando le contrattazioni sono chiuse. Questa notizia ha molta
probabilità di creare un gap up o un gap down rispetto al giorno precedente.
Tra i
certificati a capitale non protetto, gli strumenti a leva sono quelli che
offrono potenzialmente i rendimenti più alti a patto di essere disponibili a
sottoporsi a rischi superiori.
Con un prodotto con leva si
acquisisce il diritto di comperare (bull) o di vendere (bear) un valore
sottostante a un prezzo di esercizio (strike) e a una data prestabiliti.
L’impiego di capitale per
investire in un prodotto di questo tipo è minore rispetto a quello necessario
per un investimento diretto nel valore sottostante (cosiddetto effetto leva). E
proprio la presenza dell’effetto leva consente di moltiplicare la performance
del sottostante.
La leva però non amplifica solo
i guadagni ma anche le eventuali perdite e l’investitore si trova esposto al
rischio di estinzione anticipata del certificato e di perdita totale del
capitale investito, se il sottostante raggiunge una predeterminata barriera di
stop loss.
Visual Basic .NET è un
linguaggio di programmazione orientato agli oggetti, avendo bene in mente il concetto
di classe, analizziamo una caratteristica fondamentale di questo paradigma di
programmazione, ovvero l’ereditarietà. Si definisce ereditarietà la
possibilità per una classe di derivare da un’altra. La parola chiave utilizzata
per creare una relazione di eredità è Inherits; questa istruzione deve obbligatoriamente
essere sulla prima riga di codice dopo la definizione della classe.
L’istruzione Inherits viene
usata per dichiarare una nuova classe, denominata classe derivata, in
base a una classe esistente, nota come una classe di base. Le
classi derivate ereditano e possono estendere, proprietà, metodi, eventi, campi
e le costanti definite nella classe di base. La sezione seguente descrive
alcune delle regole per l’ereditarietà e i modificatori che è possibile usare
per modificare le classi modo ereditano o vengono ereditati:
Per impostazione predefinita, tutte le classi sono ereditabili a meno che non contrassegnato con il NotInheritable (parola chiave). Le classi possono ereditare da altre classi nel progetto o dalle classi in altri assembly che fa riferimento il progetto.
Diversamente dai linguaggi che consentono l’ereditarietà multipla, Visual Basic consente solo l’ereditarietà singola nelle classi. ovvero le classi derivate possono avere una sola classe base. Anche se non è consentito nelle classi di ereditarietà multipla, le classi possono implementare più interfacce di cui è possono eseguire in modo efficace la stessa funzione.
Per evitare l’esposizione agli elementi in una classe base, il tipo di accesso di una classe derivata deve essere uguale o più restrittivo alla classe di base. Ad esempio, un Public classe non può ereditare un Friend o una Private (classe) e un Friend classe non può ereditare un Private classe.
Il prezzo bid è il prezzo al quale il dealer è disposto ad acquistare uno strumento finanziario,i prezzo ask è quello al quale il dealer è disposto a vendere uno strumento finanziario.
Il
prezzo ask (detto anche offer) è superiore al prezzo bid. Il cosiddetto best
bid è il più elevato prezzo bid presente sul mercato. Analogamente, è detto
best ask il più basso prezzo ask presente sul mercato. Una quotazione di
mercato riporta il best bid e best ask disponibili sul mercato, ed è nota come
BBO (Best Bid and Offer). In tal senso il bid-ask spread è la differenza tra
best ask e best bid. Con riferimento all’operatività del dealer, il bid-ask
spread è il margine di profitto lordo di tale intermediario, che negozia
strumenti di proprietà appartenenti al proprio portafoglio (noto come
inventory). Con riferimento all’investitore, il bid-ask spread rappresenta un
costo di transazione implicito (che si differenzia dal principale costo di
transazione esplicito, ovvero dalla commissione pagata).
Il concetto di bid-ask spread è applicabile anche ai mercati ad asta e in tal
senso è dato dalla differenza tra la miglior proposta in vendita e la miglior
proposta in acquisto presenti sul mercato.CD
Contratto futures
È un accordo standardizzato (diversamente dal contratto forward) in cui le parti, un compratore e un venditore, stabiliscono di scambiarsi a una data futura (delivery date) un ammontare prestabilito (cash asset) ad uno specifico prezzo (delivery price). Un funzionamento un po’ contorto all’apparenza, ma semplice nella sostanza.
I Futures sono scambiati sul mercato ufficiale
(diversamente dai contratti forward, per i
quali non esiste un mercato ufficiale, ma vengono per l’appunto scambiati over-the-counter) al prezzo Future di mercato, finché il contratto non scade.
Una
tipologia di strumenti che si basa su contratti Futures sono ad esempio gli ETC (Exchange Trade Commodity) sul
petrolio e sulle altre principali materie prime.
Infatti,
a causa di problemi di stoccaggio e conservazione della commodity, non è possibile investire fisicamente in
questa materia prima ma l’esposizione può essere ottenuta attraverso una
replica di indici di Futures(replica
sintetica, resa possibile tramite l’utilizzo di derivati).
Backwardation e contango
Gli
ETC (come anche gli ETF) non hanno una scadenza. La
motivazione è la seguente: per evitare la liquidazione dell’investimento si
rende necessario rinnovare il contratto Futures corrente
prima che giunga a scadenza e reinvestire il ricavato in un contratto a
scadenza successivo. In questo modo, l’investitore in ETC (nel nostro caso sul
petrolio) potrà mantenere la sua posizione. Di conseguenza, questa attività di
sostituzione (rolling), genera un rendimento
(chiamato rendimento roll) che può essere
positivo o negativo e può influenzare in maniera significativa il rendimento
complessivo dell’investimento.
Quando il rendimento roll è negativo, ossia il valore del contratto Futures in scadenza è inferiore a quello
successivo, il mercato si dice in contango.
Nel
caso opposto, ossia quando il rendimento roll è
positivo, si parla di backwardation.
Il
rendimento totale dell’investimento in Futures dipende
anche:
dal movimento dei prezzi del sottostante;
dal collateral yield,
cioè dall’interesse sul valore delle garanzie collaterali.
Tuttavia,
come abbiamo detto, anche il rolling yield, è
una componente importante da considerare.
Le strutture iterative consentono di eseguire più volte una
determinata porzione di codice. Le strutture più utilizzate in VB sono due: For… Next e Do… Loop. La prima è senza
dubbio la più utilizzata;
la sua sintassi è:
For
<Contatore> = Inizio To Fine [Step Incremento]
…
Next [<Contatore>]
<Contatore> è
una variabile che deve contenere valori di tipo numerico (quindi può essere
Integer, Long, Single, Double, ecc.), così come numerici devono essere i valori
di Inizio, Fine e Incremento. La parola chiave Step è
facoltativa, se non viene specificata Incremento viene
automaticamente impostato a 1. Quando si entra in un ciclo For, la variabile
Contatore assume il valore specificato in Inizio; subito dopo viene verificato
se Contatore è maggiore dell’argomento Fine: in tal caso il ciclo termina
(analogamente, se Incremento è negativo, viene verificato se Contatore è minore
dell’argomento Fine). Se, invece, Contatore è minore o uguale a Fine (oppure è
maggiore o uguale, nel caso che Incremento sia negativo), vengono eseguite le
istruzioni all’interno del ciclo e, infine, Contatore viene incrementato del
valore di Incremento. Queste operazioni vengono fino a quando il valore di
Contatore diventa maggiore del valore di Incremento (oppure minore se
Incremento è negativo). Per uscire dal ciclo prima che si verifichino le
condizioni di fine descritte sopra è possibile usare l’istruzione Exit For; con
la quale si passa subito ad eseguire le istruzioni successive al ciclo.
L’altra struttura iterativa cui abbiamo accennato è quella Do…
Loop; di solito viene utilizzata quando non si sa a priori per quante volte è
necessario eseguire un certo blocco di codice. Questo costrutto si può
presentare in due forme; la più comune è la seguente:
Do
While Condizione
…
Loop
L’esecuzione di questa struttura prevede innanzitutto la verifica
della Condizione, che deve restituire un valore di tipo booleano. Se risulta
False, tutte le istruzioni del ciclo vengono ignorate, se invece risulta true,
le istruzioni vengono eseguite e, di seguito, la condizione viene nuovamente
verificata, e così via, finché Condizione risulta False. E’ facile intuire che
se la condizione risulta subito False, le istruzioni non verranno mai eseguite.
L’altra forma del Do… Loop, invece, permette di eseguire le istruzioni e di verificare
la Condizione al termine di ciascuna esecuzione. In questo modo le istruzioni
vengono eseguite almeno una volta:
L’apertura e la lettura di file con accesso in
lettura costituiscono una parte importante della funzionalità di input/output
(IO), anche se non è necessario scrivere sul file in questione. In questo
esempio viene aperto un file per la lettura, una procedura utile per i file di
testo ma non adatta ai file binari. Nell’esempio viene utilizzato uno dei vari
metodi disponibili per l’apertura del file. Sebbene siano disponibili diverse
strutture di dati per la memorizzazione delle informazioni recuperate dal file,
la classe ArrayList è la struttura più
semplice da utilizzare. Per aprire e leggere i dati contenuti nel file
nell’esempio vengono impiegati oggetti dello spazio dei nomi System.IO, in particolare la classe System.IO.StreamReader.
Per caricare e leggere un file di testo da
Visual Basic .NET, attenersi alla seguente procedura:
Aprire Visual Studio .NET. Creare una nuova applicazione console in Visual
Basic .NET. In Visual Studio vengono automaticamente creati un modulo e una
procedura Main() vuota.
Verificare che il progetto contenga riferimenti per lo meno allo spazio dei
nomi System. Utilizzare l’istruzione Imports per gli spazi dei
nomi System, System.IO e System.Collections in modo
che non sia necessario qualificare in un secondo tempo nel codice le relative
dichiarazioni. Queste istruzioni devono essere utilizzate prima di qualunque
altra dichiarazione.
Imports System Imports System.IO Imports System.Collections
Per aprire un file per la lettura, creare una nuova istanza di un
oggetto StreamReader e passare il percorso del file al costruttore
come segue:
Dim objReader As New StreamReader(“c:\test.txt”)
Occorrerà una variabile di stringa in cui memorizzare ogni riga del file
man mano che si procede. Poiché le righe verranno aggiunte a ArrayList,
dichiarare e creare anche un oggetto di questo tipo.
Dim sLine As String = “” Dim arrText As New ArrayList()
Esistono vari modi per leggere all’interno del file, compreso il
metodo ReadToEnd con il quale l’intero file viene letto
immediatamente. In questo esempio è tuttavia possibile utilizzare il
metodo ReadLine per inserire il file una riga alla volta. Una volta
raggiunta la fine del file, il metodo restituisce “Nothing”, il che
costituisce un modo per porre termine al loop. Man mano che ogni riga del file
viene letta, è possibile servirsi del
metodo Add di ArrayList per inserire le righe nella
classe ArrayList.
Utilizzare un loop “For Each” per scrivere nella console il
contenuto dell’ArrayList in cui sono appena stati inseriti i dati come
illustrato di seguito:
For Each sLine In arrText Console.WriteLine(sLine)
Next Console.ReadLine()
Salvare ed eseguire il codice, nella console viene visualizzato il file.
Precauzioni
Vi sono vari fattori di cui essere consapevoli quando
si lavora con l’I/O di file, fra cui:
Ogni volta che si accede a un file vi è la possibilità che il file che si
tenta di leggere o su cui si tenta di scrivere non sia presente nel sistema o
sia in uso.
In questo esempio l’intero file viene letto in memoria prima di essere
elaborato. Il file potrebbe essere troppo grande per essere contenuto in
memoria oppure l’utente potrebbe non disporre delle autorizzazioni di accesso
al file.
In tutti questi casi si verifica un’eccezione. È sempre buona norma fornire un blocco try…catch per gestire queste situazioni comuni.