Il moto browniano geometrico



Il moto browniano geometrico (a volte detto moto browniano esponenziale) è un processo stocastico in tempo continuo in cui il logaritmo della quantità variabile nel tempo segue un moto browniano, o, forse più precisamente, un processo di Wiener. Il processo è ritenuto appropriato per modellizzare alcuni fenomeni dei mercati finanziari. In particolare, tale processo assume particolare rilevanza in ambito finanziario, in particolare nell’option pricing, in quanto nel modello di Black-Scholes-Merton viene ipotizzato che il prezzo dell’azione sottostante segua un tale processo.
Il moto browniano geoemetrico soddisfa la seguente equazione differenziale stocastica:



dove è un moto browniano standard e, il drift percentuale istantaneo, e, la volatilità percentuale istantanea, sono costanti reali.

L’equazione ha una soluzione analitica nella forma:



La variabile aleatoria ha distribuzione Normale con media e varianza.

Segue il codice in VB.NET per generare una serie storica dei prezzi che segua un moto browniano geometrico (tralasciando la componente grafica):
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

Commenti

Post popolari in questo blog

Resampling dei dati

Generazioni di variabili aleatorie