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
Commenti
Posta un commento