mercoledì 9 aprile 2014

Bande di Bollinger: rappresentazione grafica

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
End Class





Al variare della costante moltiplicata per la deviazione standard, avendo tracciato:


  • la serie storica in blu;
  • la media in azzurro;
  • la media mobile in rosso;
  • le bande, superiore ed inferiore, in verde;
di avrà dunque:







(Fonte: Wikipedia)

Nessun commento:

Posta un commento