venerdì 29 aprile 2016

Generazioni di processi aleatori

I linguaggi di programmazione ci permettono di generare e rappresentare processi aleatori come ad esempio il moto browniano In questo articolo vedremo e mostreremo come generare processi aleatori, come ad esempio il moto browniano applicandoli all'ambito finanziario.

Il moto Browniano (Brownian motion)

Il moto browniano è sicuramente il più importante tra i processi stocastici presi in esame. Il suo nome si deve al  lavoro del botanico R. Brown, è in realtà A. Einstein. Ricordiamo che il moto Browniano standard è definito come un processo stocastico che parte nell’origine, i cui incrementi sono indipendenti e distribuiti come una Normale di media nulla e varianza pari all’ampiezza dell’incremento. Alcune proprietà immediate sono la continuità e la non differenziabilità  delle traiettorie. 
Se rappresentassimo il moto Browniano standard unidimensionale noteremmo un’impressionante analogia con i grafici di borsa e ciò non è un caso, esistono infatti molti risultati teorici che collegano questo importante processo in tempo continuo all’evoluzione di alcuni strumenti finanziari come le opzioni. Questo processo è spesso usato in modelli finanziari per descrivere l'evoluzione dei prezzi nel tempo. Quando viene applicato ai prezzi, il 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 e i processi dei prezzi sono indipendenti e incorrelati. Cioè, ogni variazione di prezzo è indipendente dalle variazioni di prezzo del passato e la volatilità delle variazioni dei prezzi è costante. 


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}
 

Serie storica 

Si definisce come un insieme di variabili casuali ordinate rispetto al tempo, ed esprime la dinamica di un certo fenomeno nel tempo. Le serie storiche vengono studiate sia per interpretare un fenomeno, individuando componenti di trend, di ciclicità, di stagionalità e/o di accidentalità, sia per prevedere il suo andamento futuro.
In generale, per serie si intende la classificazione di diverse osservazioni di un fenomeno rispetto ad un carattere qualitativo. Se tale carattere è il tempo, la serie viene detta storica o temporale.
Il fenomeno osservato, detto variabile, può essere osservato in dati istanti di tempo (variabile di stato: numero dei dipendenti di un'azienda, quotazione di chiusura di un titolo negoziato in borsa, livello di un tasso di interesse ecc.) o alla fine di periodi di lunghezza definita (variabili di flusso: vendite annuali di un'azienda, PIL trimestrale ecc.).
Indicando con Y il fenomeno, si indica con Yt un'osservazione al tempo t, potendo t variare da 1 a T, dove T è il numero complessivo degli intervalli o dei periodi temporali considerati.
In generale una serie storica è così definita yt={y1,y2,y3,....,yT};la serie storica avrà dimensione T.



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.

Interazione con l'utente

E' possibile dfinire un nuovo programma in cui si rende partecipe l'utente  utilizzando gli stessi oggetti grafici, però questa volta si fa uso anche delle tre funzionalità del mouse: 
  • Down: muovere verso il basso l'oggetto;
  • Up: muovere verso l'alto l'oggetto;
  • Move: muovere l'oggetto;
Attraverso questi tre comandi l'utente può spostare gli oggetti, nel nostro esempio rettangoli, all'interno della Picture Box come vuole. 
Inoltre gli è consentito regolare a suo piacimento la dimensione dell'oggetto, questo comando si esegue attraverso la Scroll wheel (rotellina del mouse).

Ora passiamo finalmente alla programmazione :



Avviando il programma si ottiene la seguente grafica :



Premendo Button1 si generano i due rettangoli con cui il nostro utente può interagire.

 




Vi mettiamo inoltre a disposizione un nuovo programma, con le stesse caratteristiche del precedente, in cui però la grafica è migliorata. Infatti, come si può vedere dal risultato ottenuto, è possibile aumentare la grandezza del bordo dei rettangoli e modificare la loro forma (tratteggiato)  : 





Output:







Ora passiamo all'animazione : inseriamo all'interno dei due rettangoli un numero casuale di palline che rimbalzano all'interno di essi. In più mettiamo un timer che ci fornisce la data e l'orario correnti.










Avviando il programma e spingendo il Button1, si ottiene :






Come nel programma precedente anche qui si possono modificare i rettangoli, ma le palline restano comunque contenute in essi :



Animazione di oggetti nella PictureBox

L'obiettivo preposto consiste nel creare ora una PictureBox in cui premendo il bottone vengono inizializzate le palline che rimbalzano all'interno del controllo inserendo anche la data con l'orario quindi dare un'animazione agli oggetti rappresentati nella PictureBox. Di seguito è riportato il codice utilizzato:








Abbiamo creato una PictureBox in cui premendo il bottone vengono inizializzate le palline che rimbalzano all'interno del controllo. Inoltre abbiamo inserito anche la data con l'orario. Ogni volta che il bottone viene premuto le palline cambiano colore, dimensione e numero. Questo è il Form ottenuto :




Ora il nostro obiettivo è quello di inserire all'interno della PictureBox un rettangolo in cui le palline sono contenute. Questo strumento è molto utile nella grafica quando si deve sviluppare un'analisi finanziari e si vogliono mostrare più grafici contemporaneamente.



La grafica che si ottiene è rappresentata di seguito:






Oggetti principali per la grafica e simulazione di palline in una PictureBox

La programmazione orientata agli oggetti (OOP, Object Oriented Programming) è un paradigma di programmazione che permette di definire oggetti software in grado di interagire gli uni con gli altri attraverso lo scambio di messaggi. È particolarmente adatta nei contesti in cui si possono definire delle relazioni di interdipendenza tra i concetti da modellare (contenimento, uso, specializzazione). Un ambito che più di altri riesce a sfruttare i vantaggi della programmazione ad oggetti è quello delle interfacce grafiche. Tra gli oggetti grafici più utilizzati abbiamo il Bitmap, la PictureBox e il Graphics.

Cos'è un Bitmap?


Un Bitmap è un tipo di organizzazione della memoria o un formato di file immagine utilizzato per memorizzare immagini digitali. Il termine bitmap deriva dal linguaggio di programmazione e significa “mappa di bit”. Le immagini bmp sono composte di singoli punti denominati pixel; la trama dei pixel (talmente fitta da non poter essere distinta ad occhio nudo se non ingrandendo notevolmente l’immagine) da origine alle immagini. Un pixel è dotato di soli due attributi: posizione e colore.


Per ottenere un bitmap ci sono due modi: è possibile creare un nuovo bitmap oppure utilizzarne uno già esistente. Per utilizzarne uno già esistente, basta inizializzare una nuova istanza dell'oggetto Bitmap passandogli come parametro l'immagine esistente: Bitmap(image). 
Altrimenti, bisogna creare una  istanza dell'oggetto passandogli come argomenti le dimensioni del bitmap: Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height).
  
Cos'è un PictureBox?


L’oggetto grafico PictureBox, è in realtà molto simile ad una finestra vuota, su cui è possibile definire un’immagine. Date le sue caratteristiche è possibile gestire e manipolare la PictureBox proprio come una finestra (movimento, interazione con il mouse e la tastiera), con l’unica differenza che questo tipo di oggetto necessita di un oggetto che funge da contenitore, come ad esempio una Form. E' un oggetto nel quale possiamo inserire le nostre immagini o i nostri grafici.

Cos'è un Graphics?  
La classe Graphics contiene i metodi per disegnare testo, immagini, linee, rettangoli e altre forme su un controllo; richiede l’utilizzo di una penna (Pen) per disegnare un contorno, o un pennello (Brush) per rappresentare una superficie piena. Bisogna pensare all’oggetto Graphics come al foglio sul quale disegnare, scrivere, colorare e riprodurre immagini. Senza tale oggetto non è possibile eseguire alcuna azione di tipo grafico, pertanto è fondamentale disporre di un’istanza di questa classe.








In seguito, riporto l'implementazione in VB.NET di una serie di "palline" che si muovono all'interno di una Picturebox:





 







In seguito, riporto l'output del programma. Ad ogni click sul bottone si generano tre palline, le quali si muovono all'interno della PictureBox battendo contro la superficie dei bordi.