giovedì 21 maggio 2015

Modelli per la generazione di serie storiche

RANDOM WALK

La passeggiata aleatoria, è 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. Un semplice, discreta, piedi unidimensionale senza pregiudizi la stessa probabilità di andare a destra che a sinistra, vale a dire p = 0,5 .

Se sono fatti N realizzazioni, allora abbiamo una distribuzione binomiale:

La distribuzione di probabilità è:
P(k)\ =\ P(X_1+X_2+\ldots+X_n=k)\ =\ {n \choose k} p^k q^{n - k}


MOTO BROWNIANO

Un processo casuale che descrive il comportamento di alcune variabili casuali lo spostamento nel tempo. Questo processo è spesso usato in modelli finanziari per descrivere l'evoluzione dei prezzi nel tempo. Quando viene applicato ai prezzi, moto browniano presuppone che il passaggio da un periodo all'altro non sono associati con il livello di prezzi oppure a serie storiche delle variazioni dei prezzi. Cioè, ogni variazione di prezzo è indipendente dalle variazioni di prezzo del passato e la volatilità delle variazioni dei prezzi è costante. 
In molte indagini simulazione geometrico browniano movimento viene utilizzato per calcolare le probabilità di perdita dopo un certo tempo T, se siete dei titoli che sono i prezzi processi indipendenti o correlate. 






TRASFORMAZIONE DI BOX-MULLER


È un metodo per generare coppie di numeri casuali indipendenti e distribuiti gaussianamente con media nulla e varianza uno.
La trasformazione viene comunemente espressa in due forme. La forma principale è quella del lavoro originale: si campionano due numeri dalla distribuzione uniforme sull'intervallo (0,1] e si ricavano due numeri distribuiti normalmente. La forma polare campiona due numeri su un intervallo differente ([-1,+1]) e permette di ricavare due numeri distribuiti normalmente senza l'uso delle funzioni seno e coseno.
FORMA BASE 

Siano U_1 e U_2 due variabili aleatorie indipendenti ed uniformemente distribuite nell'intervallo (0,1]. Sia
 Z_0 = R \cos(\Theta) =\sqrt{-2 \ln U_1} \cos(2 \pi U_2) 
e
Z_1 = R \sin(\Theta) = \sqrt{-2 \ln U_1} \sin(2 \pi U_2).
Allora Z0 e Z1 sono variabili aleatorie indipendenti con distribuzione normale di deviazione standard unitaria.
La dimostrazione è basata sul fatto che, in un sistema cartesiano bidimensionale nel quale le coordinate X e Y sono descritte da due variabili casuali indipendenti normalmente distribuite, le variabili casuali R2 e \Theta nelle corrispondenti coordinate polari sono a loro volta indipendenti e possono essere espresse comeR^2 = -2\cdot\ln U_1  e \Theta = 2\pi U_2.

Strategie di Trading

TECNICHE DI TRADING A MARTINGALA

La Martingala è un metodo utilizzato in tutti i campi, dalla matematica al gioco d’azzardo, e anche nel trading online.
La verità è che il metodo della Martingala è molto semplice, e dal punto di vista della logica, ineccepibile. Talmente ineccepibile che a qualche trader è balzato in mente di implementarlo e traslarlo nell’universo del trading. Le tecniche derivanti dalla Martingala hanno riscosso un certo successo ma sono ancora oggi al centro di accese discussioni.
Il metodo Martingala è una sfida al caso. Lo è non tanto per una questione di basse probabilità, ma proprio perché – almeno in linea teorica – si propone di sconfiggere il caso stesso. Il principio che sta alla base è che prima o poi il caso volgerà a nostro favore, e quando ciò accadrà riusciremo a recuperare quanto abbiamo perso fino a quel momento.
Il metodo consiste nel puntare sempre su un dato evento e raddoppiare la posta in gioco ad ogni puntata. Un esemipo banale è il caso del “testa o croce”, in cui il metodo Martingala consisterebbe quindi nel puntare sempre su testa (o sempre su croce) investendo prima 1 euro, poi 2 euro, 4 euro, 8 euro e così via. In questo sarebbero sufficienti poche vincite per compensare gli investimenti persi.
Uno dei pro delle tecniche a Martingala è rappresentato dall’estrema semplicità. D’altronde, è possibile utilizzarle anche quando si gioca a “testa o croce”, dunque non ci possono essere dubbi in termini di accessibilità.
Un altro pro è che ha dalla sua la logica, oltre che la teoria. Il trader ha il 50% di probabilità di fallire la posizione, ma anche il 50% di andare a segno. Prima o poi, e questo per la legge dei grandi numeri, la fortuna volgerà a suo favore, e quando ciò accadrà il profitto ricompenserà tutte le perdite.
Ovviamente, ci sono anche dei contro rilevanti.
In primo luogo, la Martingala implica una mancanza di controllo da parte del trader. Questi non ha il polso della situazione per il semplice fatto che a muovere la sua mano non è un analisi del mercato o una strategia redatta sulla scorta di qualche indicatore, ma la semplice logica del 50% di probabilità.
Da qui, il corollario: la Martingala potrebbe non funzionare. Questo in teoria dovrebbe fare parte del gioco, ma quando si parla di questo gioco il rischio è di perdere un mucchio di soldi, se la posizione vincente non si verifica.

STRATEGIA DI HEDGING (COPERTURA)

Con il termine di hedging si fa riferimento, in ambito finanziario, ad una strategia d’investimento fatta per ridurre il profilo di rischio di un investimento mediante l’utilizzo di strumenti derivati quali:  opzioni put e call, che sono strumenti derivati in base al quale l’acquirente dell’opzione acquista il diritto, ma non l’obbligo, rispettivamente di vendere o comprare un titolo a un dato prezzo d’esercizio; vendite allo scoperto, che sono operazioni finanziari consistenti nella vendita, effettuata nei confronti di uno o più soggetti terzi, di titoli non direttamente posseduti dal venditore; contratti future e forward. L’utilizzo di questi strumenti consente di ridurre la volatilità di un portafoglio riducendo di conseguenza la possibilità di perdite. Una strategia di hedging consente inoltre di assicurarsi una performance predeterminata anche in presenza di movimenti di mercato opposti a quelli previsti.

Ad esempio, si pensi ad un investitore che possiede un portafoglio diversificato di azioni e che decide di coprirsi dal rischio di ribasso acquistando opzioni Put sull'indice azionario (questa strategia e' nota come portfolio insurance strategy). In questo caso l'investitore beneficia di un rialzo del mercato in quanto possiede le azioni e perde fino ad un massimo pari al premio pagato se il mercato azionario scende. Se si volesse effettuare una copertura tramite futures il risultato sarebbe la "sterilizzazione" sia dei guadagni che delle perdite. In questo caso pero' la strategia non comporta alcuna perdita a priori in quanto nessun premio deve essere pagato. 

Fonti: http://it.wikipedia.org/

Misure di Performance


SHARPE RATIO




Il risultato della formula non è espresso in termini percentuali, bensì assoluti ed un numero positivo esprime il buon esito dell’investimento alternativo, mentre un risultato negativo ne sancisce il fallimento.



In sintesi, in un determinato periodo considerato, quanto più è elevato il valore dell’indicatore Sharpe ratio, tanto più il rendimento dell’investimento è stato ottenuto con minore rischiosità, cioè con una bassa deviazione standard dei rendimenti, cioè con un andamento meno altalenante dei profitti dell’investimento.


Sharpe ratio applicato ai trading system:


Relativamente ad una strategia di trading come un trading system, assumiamo Rrf = 0 e l’indice Sharpe misura il rapporto tra il profitto netto e la deviazione standard



Ad esempio uno Sharp ratio = 0.6 indica che per ogni sei dollari di profitto, il rischio è di perdere 10 dollari in media.



SORTINO


Il Sortino è una misura di performance aggiustata per il rischio che misura l'extra-rendimento di un portafoglio rispetto al rendimento minimo accettabile in relazione al downside risk associato al portafoglio.



L'Indice di Sortino (dal nome dell'economista che ha introdotto tale misura per la prima volta) è un indicatore di risk adjusted performance che misura l'extra-rendimento, rispetto al tasso risk free oppure rispetto al tasso di rendimento minimo accettabile (minimum acceptable return, MAR), di un certo portafoglio per unità di rischio intendendo quest'ultimo come possibilità di conseguire una differenza negativa rispetto al tasso risk free (o anche rispetto al rendimento minimo accettabile).
dove Rp rappresenta il rendimento medio del portafoglio gestito, Rf rappresenta il rendimento medio di un'attività risk free e DSR downside risk. 
A sua volta il DSR è calcolato come:
Tale indicatore è simile all'Indice di Sharpe e all'Indice di Treynor, ma ne differisce per due motivi:
1) l'extra-rendimento può essere calcolato rispetto a un tasso di rendimento minimo accettabile definito dall'investitore;
2) il concetto di rischio considerato si riferisce unicamente alla possibilità di conseguire un extra-rendimento negativo, mentre non si considerano i casi i cui l'extra rendimento è positivo.
La preferenza è per le attività che presentano un valore più elevato dell'indice di Sortino.

STRATEGIA DI TRADING


  • Per prima cosa dobbiamo creare una serie storica tramite passeggiata aleatoria dei prezzi, utilizzando dei dati pseudocasuali legati attraverso una distribuzione uniforme nell'intervallo [0,1]. Il delta (tick) assume il valore 10.

  • Costruzione media mobile e deviazione standard della serie storica creata nel punto precedente.
  • Confronto il prezzo con gli estremi superiore e inferiore rispettivamente. Se il prezzo è maggiore dell'estremo superiore (sup) avrò un punto di sell, altrimenti, se il prezzo è minore dell'estremo inferiore (inf), avrò un punto di buy.
          Nota Bene:
          PrezzoIniziale=100
          BudgetIniziale=1000

  • Assegno tutti i punti, creati precedentemente, alle rispettive liste.


  • Calcolo il profitto ( prezzoSell-prezzoBuy)

























  • Calcolo indice di performance ( ho utilizzato l'indice di Sharpe):
  • Output:
Serie Storica e Buy-Sell:
Profitto:

Indice di Sharpe:


VETTORIZZAZIONE DEGLI ELEMENTI DALLA MATRICE

Consideriamo:

  • una matrice 10x10 contenente tutti i prodotti (indice_riga x indice_colonna).
  • un vettore di dimensione uguale a 100
  • un vettore di dimensione uguale a 55

Obiettivo:

  1. Copiare i dati della matrice in un vettore, utilizzando esclusivamente un solo ciclo for.
  2. Copiare solamente i dati della matrice al di sotto della diagonale principale(compresa) e inserirli in un vettore, utilizzando le pairing function.
Codice VB-NET:














Output:


giovedì 9 aprile 2015

Snippet Book


VB:NET
  • Creare un’ interfaccia grafica tramite cui l’utente, cliccando sul bottone aggiunto nella progettazione del Form, può rispettivamente:
  1. aprire e leggere (nella RichTextBox) il file selezionato
Dim o As New OpenFileDialog
o.ShowDialog()
Dim nomefile = o.FileName
Me.RichTextBox1.AppendText(nomefile)
Dim lett As StreamReader = New StreamReader(nomefile)


      2.salvare il file in una cartella selezionata

Dim salva As New SaveFileDialog
salva.ShowDialog()

  • Scrivere sul nuovo file che verrà salvato nella cartella selezionata tramite il Button:
Dim sw As StreamWriter = New StreamWriter(salva.FileName)
  • Un esempio di ciclo while dove in questo caso crea il ciclo while che si arresta quando finisce di leggere con lo StreamReader
Do While Not leggi.EndOfStream
‘comandi da inserire nel ciclo
Loop

  •   Effettuare lo split di una stringa
Dim dividi As String() = Linea.Split(",")
  • Un sempio di costrutto condizionale in cui si scrive una sequenza di stringhe che viene visualizzata nella RichTextBox
If (dividi(0) = "Date") Then sw.WriteLine("Year" & " " & "Month" & " " & "Day" & " " & "Open" & " " & "Close")
Me.RichTextBox1.AppendText(vbCrLf & "Year" & " " & "Month" & " " & "Day" & " " & "Open" & " " & "Close")
End If

  • Dichiarare una data
Dim d As Date
  •  Convertire una stringa nel formato della data “yyyy-mm-dd”
Date.TryParseExact(dividi(0), "yyyy-mm-dd", Globalization.CultureInfo.InvariantCulture, Globalization.DateTimeStyles.None, d)
  • Creare una variabili di tipo Integer:
Dim i As Integer
  • Creare un array di double
Dim open As New Double()
  • E' un metodo che converte il carattere "," dell'array di stringa dividi(1) con il carattere "."
Replace(dividi(1), ".", ",")
  • Converte un’espressione in un double
CDbl(expression)
  • Convertire un espressione in un intero
CInt(expression)
  • Convertire un elemento in array
x.ToArray
  • Incrementa di un’unità la variabile i
i += 1
  • Creare una variabile di tipo Boolean
Dim X As Boolean
  • Definire un colore
Dim colore As New Color
  • Dichiarare una finestra grafica delle dimensioni scelte dall’utente
Dim b As New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
  • Dichiarare una lista di Double
Dim listaMesi As New List(Of Double)
  • Riempire una lista
listaMesi.Add(Y)
  • Dichiarare un oggetto che crei grafici sul bitmap
Dim g As Graphics = Graphics.FromImage(b)
  • Dichiarare una data
Dim DataOrigine As Date
  • Rimuove dalla lista l’elemento di indice specificato
lista.RemoveAt(0)
  • Dichiarare un punto di coordinate specificate
Dim punto As Point = New Point(X, Y)
  • Costruire un ciclo iterativo “for”
For Each punto As Point In lista
‘comandi da eseguire nel ciclo
Next

  • Disegna delle linee creando un grafico:
g.DrawLines(Pens.Black, x)
  • Caricare l’immagine nella picture box:
PictureBox1.Image
  • Rappresentare un’ellisse riempita con un colore scelto
g.FillEllipse(New SolidBrush(colore), X, Y, asseX, asseY)
______________________________________________________________________

 C#:
  • Creare un’ interfaccia grafica tramite cui l’utente, cliccando sul bottone aggiunto nella progettazione del Form, può rispettivamente:
  1. aprire e leggere il file selezionato
OpenFileDialog o = new OpenFileDialog();
o.ShowDialog();
dynamic nomefile = o.FileName;
this.richTextBox1.AppendText(nomefile);
StreamReader lett = new StreamReader(nomefile);


     2.salvare il file in una cartella selezionata

SaveFileDialog salva = new SaveFileDialog();
salva.ShowDialog();

  • Scrivere sul nuovo file che verrà salvato nella cartella selezionata tramite il Button:
StreamWriter sw = new StreamWriter(salva.FileName);
  • Un esempio di ciclo while dove in questo caso crea il ciclo while che si arresta quando finisce di leggere con lo StreamReader
while (!sr.EndOfStream)
{

//comandi da inserire nel ciclo
}

  • Effettuare lo split di una stringa
string[] dividi = Linea.Split(',');
  • Esempio di costrutto condizionale in cui si scrive una sequenza di stringhe che viene visualizzata nella RichTextBox
if ((dividi[0] == "Date"))
{

sw.WriteLine("Year" + " " + "Month" + " " + "Day" + " " + "Open" + " " + "Close");

}

  • Dichiarare una data
System.DateTime d = default(System.DateTime);
  • Convertire una stringa nel formato della data “yyyy-mm-dd”
System.DateTime.TryParseExact(dividi[0], "yyyy-mm-dd", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out d);
  • Creare e inizializzare una variabile di tipo int     
int i = 0;
  • Creare un array di double
double open = new double();
  • E' un metodo che converte il carattere "," dell'array di stringa dividi(1) con il carattere "."
dividi[1].Replace(".", ",");
  • Converte un’espressione in un double
double.Parse(expression);
  • Incrementa di un’unità la variabile
i++;
  • Creare e inizializzare una variabile di tipo Boolean
bool X = false;
  • Definire un colore
public Color colore = new Color();
  • Dichiarare una finestra grafica delle dimensioni scelte dall’utente
Bitmap b = new Bitmap(this.PictureBox1.Width, this.PictureBox1.Height);
  • Dichiarare una lista di Double
List<double> listaMesi = new List<double>();
  • Dichiarare un oggetto che crei grafici sul bitmap
Graphics g = Graphics.FromImage(b);
  • Dichiarare un punto di coordinate specificate
Point punto = new Point(X, Y);
  • Costruire un ciclo iterativo “for”
foreach (Point punto2 in lista)
{

//comandi da eseguire nel ciclo

}

  • Creare il grafico:
g.DrawLines(Pens.Black, l.ToArray());
  • Caricare l’immagine nella picture box:
pictureBox1.Image = b;

Stablità numerica

La stabilità numerica (anche algoritmica o computazionale), nell'ambito dell'analisi numerica, è una proprietà desiderabile degli algoritmi numerici. Il significato esatto del termine varia ma, in generale, riflette l'accuratezza del risultato.
Non esistono metodi generali per valutare la stabilità di un algoritmo. Solitamente, si ricercano, tramite appositi metodi - come il metodo del simplesso - all'interno del dominio di un algoritmo, quei valori per cui l'algoritmo stesso diventa instabile: ossia la minima variazione dei dati porta a grandi scostamenti nell'errore.
Un esempio classico è il calcolo dell'area del triangolo con la formula di Erone, instabile per angoli molto piccoli.
Un altro esempio classico è il caso dell'overflow/underflow: basta pensare alle due operazioni
1/10^a \times 2
2 \times 10^b \div 2
dove 10-a è pari o inferiore all'epsilon di macchina, e 10b al massimo numero rappresentabile.
Un errore, una volta che è stato generato, generalmente si propagherà attraverso il calcolo. Questo conduce al concetto di stabilità numerica: un algoritmo si dice numericamente stabile se un errore, una volta che sia stato generato, non cresce troppo durante il calcolo.