mercoledì 9 aprile 2014

Analisi delle serie storiche: rappresentazione grafica

Siamo a questo punto in grado di passare alla rappresentazione grafica di serie storiche generate casualmente, estendendo il programma già costruito in precedenza. Innanzi tutto, creiamo la classe Osservazione: tramite questa nuova funzione saranno inseriti i diversi prezzi che andranno a costituire la serie storica da rappresentare. Ad ogni osservazione sarà associato il valore del prezzo, nonché l'istante temporale corrispondente:

Public Class Osservazione
    Public Istante As Date
    Public Prezzo As Decimal
    Public Sub New(ByVal Istante As Date, ByVal Prezzo As Decimal)
        Me.Istante = istante
        Me.Prezzo = prezzo
    End Sub
End Class




Procediamo, a questo punto, con la creazione della casella immagini e del bottone, assegnando a quest'ultimo le istruzioni necessarie per generare i valori casuali di prezzi ed associare a ciascuno di essi ad un determinato istante appartenente all'intervallo temporale che parta dalla data odierna. Nell'esempio riportato di seguito, le osservazioni generate risultano mille:



Public Class Form1
    Public B As New Bitmap(600, 400)
    Public G As Graphics = Graphics.FromImage(B)

    Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click

    End Sub

    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

        For i = 1 To 1000
            Dim O As New Osservazione(IstanteCorrente, PrezzoCorrente)
            SerieStorica.Add(O)
            If R.NextDouble < 0.5 Then
                PrezzoCorrente = PrezzoCorrente + Incremento
            Else
                PrezzoCorrente = PrezzoCorrente - Incremento
            End If
            IstanteCorrente = IstanteCorrente.AddSeconds(1)
        Next





E' possibile ora tracciare il grafico di tali osservazioni, inizializzando una nuova lista di punti che associ ascissa ed ordinata a ciascuna osservazione:

        Dim ListaPunti As New List(Of Point)
        For Each O As Osservazione In SerieStorica
            Dim X As Integer
            Dim Y As Integer
            Y = B.Height - O.Prezzo
            X = O.Istante.Subtract(IstanteIniziale).TotalSeconds
            Dim Punto As New Point(X, Y)
            ListaPunti.Add(Punto)
        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




E' opportuno considerare che le osservazioni ottenute potrebbero fuoriuscire dalla casella immagini; a questo proposito, imponiamo che il grafico sia interamente contenuto nella schermata, effettuando una normalizzazione delle coordinate:


        Dim Lista 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)
            Lista.Add(Pt)
        Next
        G.Clear(Color.White)
        G.DrawLines(Pens.CornflowerBlue, Lista.ToArray)
        PictureBox1.Image = B
    End Sub
End Class



Ogni qual volta si cliccherà sul bottone, si otterrà pertanto la rappresentazione di una serie temporale con andamento aleatorio dei prezzi. Di seguito, alcuni esempi:








Nessun commento:

Posta un commento