Il moto browniano geometrico è un processo stocastico definito nel continuo in cui il logaritmo della variabile aleatoria nel tempo segue un moto browniano, o più precisamente un processo di Wiener.
Un processo stocastico segue un moto browniano geometrico se soddisfa la seguente equazione differenziale stocastica:

in cui W_t è un processo di Wiener, o moto browniano standard, un processo stocastico gaussiano in tempo continuo con incrementi indipendenti, e μ (drift percentuale istantaneo) e σ (volatilità percentuale istantanea) sono costanti reali.
L’equazione ha una soluzione analitica nella forma:

La variabile aleatoria ln(St/S0) ha distribuzione Normale con:
media (µ − 1/2 σ²)t
varianza σ²t.
Il processo è particolarmente apprezzato nel campo finanziario, il modello di moto browniano dei prezzi dei titoli finanziari è infatti un elemento essenziale nel pricing dei prodotti finanziari derivati, e in generale di altre attività finanziarie, questo poichè riflette la natura del prezzo di un’attività finanziaria (una quantità che segue un moto browniano geometrico può assumere soltanto valori maggiori di zero).
Il modello di Black & Scholes, ad esempio, ipotizza che il prezzo dell’azione sottostante segua tale processo.
Applicazioni più sofisticate considerano moti browniani geometrici multidimensionali che consentono di analizzare l’evoluzione dei prezzi di portafogli di attività finanziarie e di derivati su tali portafogli. Un’altra variante è costituita dai moti browniani frazionari, ritenuti particolarmente utili nell’analisi di serie storiche per le loro proprietà di autosimilarità (invarianza dei comportamenti rispetto alla scala utilizzata per descrivere il fenomeno).
Un limite del moto browniano geometrico però, è che, essendo un processo markoviano, dipende solo dall’ultima osservazione, quindi si basa sull’assunzione che, applicato alle variazioni dei prezzi nel tempo, esse siano tra di loro indipendenti.
La soluzione sarebbe considerare il fenomeno della Mean Reversion intesa come la tendenza dei prezzi azionari ad essere attratti verso il loro valore medio di lungo periodo. La differenza tra un processo di Mean Reversion ed il moto Browniano è semplicemente nel termine di deriva: infatti esso è positivo se il livello di prezzo corrente è inferiore alla media e negativa se il livello di prezzo è superiore, indicando appunto che tale livello di equilibrio attrae verso di sé la deriva.

Si può osservare una semplice applicazione del moto browniano geometrico nella generazione della variazione di prezzo di un titolo azionario.
Consideriamo un modello in cui è data la variazione di prezzo:

in cui viene effettuata una estrazione da una distribuzione Normale di parametri μ e σ.
E’ possibile implementare il modello con il seguente algoritmo:
- Impostare una variabile per la volatilità (es. 0.2) e una variabile per la media uguale a 0.
- Generare due valori casuali u1, u2 uniformemente distribuiti in (0,1) utilizzando la classe Random. Utilizzare la trasformazione di Box-Muller, sfruttando u1, u2 per generare un valore Z proveniente da una distribuzione normale standard.
- Calcolare i valori μ, σ. Se T è l’istante in cui vogliamo calcolare il valore del GBM, abbiamo μ = (media – (volatilità^2)/ 2 ) * T e σ = volatilità * sqrt(T).
- Trasformare il valore Z in un valore proveniente da una normale N(μ, σ) nel seguente modo: Nuovo valore New_Z = Z * σ + μ.
- Otteniamo il nuovo prezzo nel seguente modo:
Nuovo_Prezzo = Prezzo_Corrente * exp{New_Z}.
Di seguito viene anche riportato un codice in VB.NET con cui viene generata una serie storica dei prezzi che segua un moto browniano geometrico:
Imports System.IO Public Class Form1 Public ListaOsservazioniBid As List(Of osservazioneprezzo) Public ListaOsservazioniAsk As List(Of osservazioneprezzo) Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim PrezzoIniziale As Decimal = 1000 Dim DataIniziale As Date = Now Dim Tick As Decimal = 1 Dim RandB As New Random() Dim RandB As New Random() Dim IntervalloT As New TimeSpan(0, 0, 0, 5, 0) Dim PrezzoCorrente As Decimal = PrezzoIniziale Dim TempoCorrente As Date = DataIniziale ListaOsservazioniBid = New List(Of osservazioneprezzo) ListaOsservazioniAsk = New List(Of osservazioneprezzo) Do Dim ossbid As New osservazioneprezzo With ossbid .istante = TempoCorrente .prezzo = PrezzoCorrente End With ListaOsservazioniBid.Add(ossbid) Dim ossask As New osservazioneprezzo With ossask .istante = TempoCorrente .prezzo = PrezzoCorrente + RandS.Next(1, 10) End With ListaOsservazioniAsk.Add(ossask) Dim u1 As Decimal = RandB.NextDouble() Dim u2 As Decimal = RandB.NextDouble() Dim ossinc As Double Dim ossinc2 As Double ‘ Moto browniano ossinc = Math.Sqrt(-2 * Math.Log(u1)) * Math.Cos(2 * 3.14 * u2) ‘ Moto browniano geometrico ossinc2 = Math.Exp(ossinc – u1/2) If RandB.NextDouble <= 0.5 Then PrezzoCorrente = PrezzoCorrente + ossinc2 Else PrezzoCorrente = PrezzoCorrente – ossinc2 End If TempoCorrente = TempoCorrente + IntervalloT If (TempoCorrente – DataIniziale).TotalHours > 24 Then Exit Do End If Loop End Sub End Class

.