Il moto browniano geometrico

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:

  1. Impostare una variabile per la volatilità (es. 0.2) e una variabile per la media uguale a 0.
  2. 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.
  3. 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).
  4. Trasformare il valore Z in un valore proveniente da una normale N(μ, σ) nel seguente modo: Nuovo valore New_Z = Z * σ + μ.
  5. 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 

.

Lascia un commento