Le bande di Bollinger sono uno strumento di analisi tecnica, introdotto da John Bollinger nel 1980; risultano costituite da:
- una media mobile relativa a k periodi;
- una banda superiore, definita sommando alla media mobile il prodotto tra una costante prefissata e la deviazione standard;
- una banda inferiore, ottenuta sottraendo dalla media media mobile la medesima quantità.
Nell'ambito dell'analisi grafica delle serie temporali, la media mobile rappresenterà il trend, ovvero la tendenza di lungo periodo assunta dai prezzi considerati, mentre le due bande indicheranno la volatilità, dunque l'intervallo entro il quale sia ragionevole ipotizzare avvengano le fluttuazioni dei prezzi.
In statistica, una media è detta mobile quando è calcolata esclusivamente sulle ultime osservazioni registrate; ipotizzando di trovarci al tempo t, e di voler prendere in considerazione solamente k periodi, la media risulterà stimata sul valore corrente, nonché sui k-1 periodi precedenti:
Iterativamente, la media mobile odierna potrà essere ottenuta sommando all'ultimo valore a disposizione il rapporto tra il prezzo registrato oggi ed il numero di periodi considerato e sottraendo il rapporto tra il valore meno recente ed il numero di periodi:
La varianza, da cui ottenere la deviazione standard per la costruzione delle bande, può essere invece calcolata attraverso la formula:
E' possibile completare dunque le istruzioni create per la generazione di una serie storica casuale, in modo da ottenere anche le quantità appena introdotte. Definiamo, innanzi tutto, la classe Osservazione:
Public Class Osservazione
Public Istante As Date
Public Prezzo As Decimal
Public Media As Double
Public MediaMobile As Double
Public Varianza As Double
Public DevStandard As Double
Public DevStandardAum As Double
Public DevStandardDim As Double
Public Sub New(ByVal Istante As Date, ByVal Prezzo As Decimal, ByVal Media As Double, ByVal MediaMobile As Double, ByVal Varianza As Double, ByVal DevStandard As Double, ByVal DevStandardAum As Double, ByVal DevStandardDim As Double)
Me.Istante = Istante
Me.Prezzo = Prezzo
Me.Media = Media
Me.MediaMobile = MediaMobile
Me.Varianza = Varianza
Me.DevStandard = DevStandard
Me.DevStandardAum = DevStandardAum
Me.DevStandardDim = DevStandardDim
End Sub
End Class
Nella schermata della progettazione creiamo un bottone, una casella immagini ed uno strumento Numeric Up Down (formato da una casella di testo, in cui è inserito per default il valore zero, che l'utente può aumentare o decrementare a suo piacimento utilizzando le frecce poste sulla destra); all'interno di quest'ultimo elemento sarà inserito il valore della costante che andrà moltiplicata per la deviazione standard nel calcolo delle bande. Nel gestore degli eventi, avremo:
Public Class Form1
Public B As New Bitmap(600, 400)
Public G As Graphics = Graphics.FromImage(B)
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim R As New Random
Dim SerieStorica As New List(Of osservazione)
Dim PrezzoIniziale As Decimal = 100
Dim IstanteIniziale As Date = Now
Dim Incremento As Decimal = 10
Dim PrezzoCorrente As Decimal = PrezzoIniziale
Dim IstanteCorrente As Date = IstanteIniziale
Dim MediaIniziale As Double = PrezzoIniziale
Dim MediaCorrente As Double = MediaIniziale
Dim MediaMobileCorrente As Double = MediaIniziale
Dim k As Integer = 12
Dim Varianza As Double = 0
Dim DevStandard As Double = 0
Dim DevStandardAum As Double = MediaIniziale
Dim DevStandardDim As Double = MediaIniziale
Dim Listak As New List(Of Decimal)
Dim ListaAum As New List(Of Double)
Dim ListaDim As New List(Of Double)
A questo punto, inseriamo nel ciclo creato per la generazione casuale dei prezzi le formule con cui calcolare medie mobili e bande superiori ed inferiori:
For i = 1 To 1000
Dim Oss As New Osservazione(IstanteCorrente, PrezzoCorrente, MediaCorrente, MediaMobileCorrente, Varianza, DevStandard, DevStandardAum, DevStandardDim)
SerieStorica.Add(Oss)
If R.NextDouble < 0.5 Then
PrezzoCorrente = PrezzoCorrente + Incremento
Else
PrezzoCorrente = PrezzoCorrente - Incremento
End If
IstanteCorrente = IstanteCorrente.AddSeconds(1)
MediaCorrente = ((i - 1) * MediaCorrente + PrezzoCorrente) / i
Listak.Add(PrezzoCorrente)
If i <= k Then
MediaMobileCorrente = MediaCorrente
Else
MediaMobileCorrente = ((k * MediaMobileCorrente) + PrezzoCorrente - Listak(0)) / k
Listak.RemoveAt(0)
End If
Varianza = ((i - 1) * Varianza + (PrezzoCorrente - MediaCorrente) * (PrezzoCorrente - MediaMobileCorrente)) / i
DevStandard = Math.Sqrt(Varianza)
DevStandardAum = MediaMobileCorrente + DevStandard * NumericUpDown1.Value
DevStandardDim = MediaMobileCorrente - DevStandard * NumericUpDown1.Value
Next
Vengono quindi ottenute le coordinate dei punti relativi al prezzo, nonché alle medie mobili e alle bande, superiori ed inferiori:
Dim ListaPunti As New List(Of Point)
For Each O As Osservazione In SerieStorica
Dim X1 As Integer
Dim Y1 As Integer
Y1 = B.Height - O.Prezzo
X1 = O.Istante.Subtract(IstanteIniziale).TotalSeconds
Dim Punto1 As New Point(X1, Y1)
ListaPunti.Add(Punto1)
Next
Dim ListaMedie As New List(Of Point)
For Each O As Osservazione In SerieStorica
Dim X2 As Integer
Dim Y2 As Integer
Y2 = B.Height - O.Media
X2 = O.Istante.Subtract(IstanteIniziale).TotalSeconds
Dim Punto2 As New Point(X2, Y2)
ListaMedie.Add(Punto2)
Next
Dim ListaMedieMobili As New List(Of Point)
For Each O As Osservazione In SerieStorica
Dim X3 As Integer
Dim Y3 As Integer
Y3 = B.Height - O.MediaMobile
X3 = O.Istante.Subtract(IstanteIniziale).TotalSeconds
Dim Punto3 As New Point(X3, Y3)
ListaMedieMobili.Add(Punto3)
Next
Dim ListaDevStandardAum As New List(Of Point)
For Each O As Osservazione In SerieStorica
Dim X4 As Integer
Dim Y4 As Integer
Y4 = B.Height - O.DevStandardAum
X4 = O.Istante.Subtract(IstanteIniziale).TotalSeconds
Dim Punto4 As New Point(X4, Y4)
ListaDevStandardAum.Add(Punto4)
Next
Dim ListaDevStandardDim As New List(Of Point)
For Each O As Osservazione In SerieStorica
Dim X5 As Integer
Dim Y5 As Integer
Y5 = B.Height - O.DevStandardDim
X5 = O.Istante.Subtract(IstanteIniziale).TotalSeconds
Dim Punto5 As New Point(X5, Y5)
ListaDevStandardDim.Add(Punto5)
Next
Dim MaxX As Double = Double.MinValue
Dim MinX As Double = Double.MaxValue
Dim MaxY As Double = Double.MinValue
Dim MinY As Double = Double.MaxValue
For Each Punto As Point In ListaPunti
If Punto.X > MaxX Then MaxX = Punto.X
If Punto.Y > MaxY Then MaxY = Punto.Y
If Punto.X < MinX Then MinX = Punto.X
If Punto.Y < MinY Then MinY = Punto.Y
Next
Come in precedenza, si normalizzano i punti ottenuti:
Dim Listat As New List(Of Point)
For Each Punto As Point In ListaPunti
Dim Xt As Integer = ((Punto.X - MinX) / (MaxX - MinX)) * B.Width
Dim Yt As Integer = B.Height - ((Punto.Y - MinY) / (MaxY - MinY)) * B.Height
Dim Pt As New Point(Xt, Yt)
Listat.Add(Pt)
Next
Dim ListaMediet As New List(Of Point)
For Each Punto1 As Point In ListaMedie
Dim Xt1 As Integer = ((Punto1.X - MinX) / (MaxX - MinX)) * B.Width
Dim Yt1 As Integer = B.Height - ((Punto1.Y - MinY) / (MaxY - MinY)) * B.Height
Dim Pt1 As New Point(Xt1, Yt1)
ListaMediet.Add(Pt1)
Next
Dim ListaMedieMobilit As New List(Of Point)
For Each Punto2 As Point In ListaMedieMobili
Dim Xt2 As Integer = ((Punto2.X - MinX) / (MaxX - MinX)) * B.Width
Dim Yt2 As Integer = B.Height - ((Punto2.Y - MinY) / (MaxY - MinY)) * B.Height
Dim Pt2 As New Point(Xt2, Yt2)
ListaMedieMobilit.Add(Pt2)
Next
Dim ListaDevStandardAumt As New List(Of Point)
For Each Punto3 As Point In ListaDevStandardAum
Dim Xt3 As Integer = ((Punto3.X - MinX) / (MaxX - MinX)) * B.Width
Dim Yt3 As Integer = B.Height - ((Punto3.Y - MinY) / (MaxY - MinY)) * B.Height
Dim Pt3 As New Point(Xt3, Yt3)
ListaDevStandardAumt.Add(Pt3)
Next
Dim ListaDevStandardDimt As New List(Of Point)
For Each Punto4 As Point In ListaDevStandardDim
Dim Xt4 As Integer = ((Punto4.X - MinX) / (MaxX - MinX)) * B.Width
Dim Yt4 As Integer = B.Height - ((Punto4.Y - MinY) / (MaxY - MinY)) * B.Height
Dim Pt4 As New Point(Xt4, Yt4)
ListaDevStandardDimt.Add(Pt4)
Next
Si tracciano quindi sul grafico:
G.Clear(Color.White)
G.DrawLines(Pens.MidnightBlue, Listat.ToArray)
G.DrawLines(Pens.Turquoise, ListaMediet.ToArray)
G.DrawLines(Pens.MediumVioletRed, ListaMedieMobilit.ToArray)
G.DrawLines(Pens.SpringGreen, ListaDevStandardAumt.ToArray)
G.DrawLines(Pens.SpringGreen, ListaDevStandardDimt.ToArray)
PictureBox1.Image = B
Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
End Sub
Nessun commento:
Posta un commento