martedì 22 aprile 2014

Spostamento e ridimensionamento di un oggetto

Vediamo ora come creare un programma che permetta all'utente di variare dimensione e posizione di un oggetto a proprio piacimento. Creiamo un bottone ed una casella immagini, inizializzando le seguenti variabili:


Public Class Form1
    Dim B As New Bitmap(800, 6000)
    Dim G As Graphics = Graphics.FromImage(B)
    Public R As New Rectangle(10, 10, 200, 100)
    Public XInizialeMove As Integer
    Public YInizialeMove As Integer
    Public XInizialeRectangle As Integer
    Public YInizialeRectangle As Integer
    Public HInizialeRectangle As Integer
    Public WInizialeRectangle As Integer
    Public DeltaXMove As Integer
    Public DeltaYMove As Integer
    Public DragMove As Boolean
    Public DragResize As Boolean



Il rettangolo, le cui coordinate e le cui dimensioni sono state espresse nella fase precedente, viene visualizzato non appena si clicca sul bottone:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        G.Clear(Color.White)
        G.DrawRectangle(Pens.BlueViolet, R)
        PictureBox1.Image = B

    End Sub


Vogliamo a questo punto imporre che:
  • tenendo premuto sul tasto destro del mouse, e trascinando il cursore, sia possibile variare larghezza o altezza del rettangolo;
  • cliccando, invece, col sinistro, e sempre trascinando il cursore, si possa spostare l'intera figura, mantenendo inalterate le dimensioni.
La dichiarazione MouseDown permette di catturare la posizione del cursore, quando lo si sposta in basso o a destra:

Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
        If Not R.Contains(e.X, e.Y) Then Exit Sub
        If e.Button = Windows.Forms.MouseButtons.Left Then
            DragMove = True
        ElseIf e.Button = Windows.Forms.MouseButtons.Right Then
            DragResize = True
        End If
        XInizialeMove = e.X
        YInizialeMove = e.Y
        XInizialeRectangle = R.X
        YInizialeRectangle = R.Y
        WInizialeRectangle = R.Width
        HInizialeRectangle = R.Height
    End Sub


Se non ci interessa abilitare le due funzioni quando si sposta il puntatore del mouse verso l'alto o a sinistra, entrambi le variabili booleane vengono impostate come false nella dichiarazione MouseUp:

   Private Sub PictureBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp
        DragMove = False
        DragResize = False
    End Sub
End Class


MouseMove, invece, effettua istantaneamente il ridimensionamento o lo spostamento della figura, seguendo il movimento del cursore, lungo le posizioni registrate nella dichiarazione precedente:

Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
        If Not DragMove AndAlso Not DragResize Then
            Exit Sub
        End If
        DeltaXMove = e.X - XInizialeMove
        DeltaYMove = e.Y - YInizialeMove
        If DragMove Then
            R = New Rectangle(XInizialeRectangle + DeltaXMove, YInizialeRectangle + DeltaYMove, R.Width, R.Height)
        ElseIf DragResize Then
            R = New Rectangle(XInizialeRectangle, YInizialeRectangle, WInizialeRectangle + DeltaXMove, HInizialeRectangle + DeltaYMove)
        End If
        G.Clear(Color.White)
        G.DrawRectangle(Pens.BlueViolet, R)
        PictureBox1.Image = B
    End Sub

lunedì 14 aprile 2014

Capital asset pricing models

Nel 1990 tre economisti americani, William Shape, Merton Miller e Harry Markowitz, vincono il premio Nobel per l'Economia, «per i contributi pionieristici nell'ambito dell'economia finanziaria». Motivo del riconoscimento il capital asset pricing model (CAPM), modello matematico che descrive la relazione tra rendimento di un titolo e sua rischiosità.


Prima di procedere con la descrizione del modello, introduciamo alcuni aspetti preliminari, principalmente legati al quadro macroeconomico. Quando una società, una banca o uno Stato necessita di liquidità, ma ne è a corto, può decidere di cercare qualcuno, sia esso una azienda privata, una banca o uno Stato, disposto ad effettuare un prestito nei suoi confronti: a garantirlo vi sarà il titolo bancario. Parleremo di azioni laddove l'ente emittente sia un'impresa, pubblica o privata, mentre di obbligazioni nel caso in cui si tratti di una banca centrale, che operi quindi per conto di uno Stato. Ovviamente il prestito avviene purché, al termine di un periodo di tempo prestabilito, sia restituita non solo la somma di denaro ceduta, ma anche una quota di interessi: quest'ultima rappresenterà proprio il rendimento del titolo. Solitamente tassi di interessi maggiori corrispondono ad una minore affidabilità del soggetto che emette il titolo: più un ente economico sarà poco affidabile, più dovrà offrire tassi di interessi alti per i propri titoli, al fine di incentivare il loro acquisto. D'altro canto, più i tassi di interesse legati ai titoli emessi saranno elevati, maggiore sarà il rischio che il soggetto possa non restituire la quota dovuta al termine del periodo stabilito. Il rendimento è inoltre legato alla durata del titolo: mentre risulta più facile effettuare previsioni relative ai prossimi 6 o 12 mesi, maggiore incertezza è legata a quelle relative a periodi più ampi, con più alto rischio di default dell'ente, che renda impossibile la restituzione della cifra stabilita.



Nel capital asset pricing model si suppone che gli operatori finanziari operino secondo una logica di media-varianza, ossia:

  • cercando di massimizzare il rendimento futuro atteso;
  • cercando di minimizzare la varianza dei rendimenti, condizione che equivale a preferire soggetti economici.
L'ipotesi cardine del modello è che l'operatore finanziario basi la propria decisione riguardo l'acquisto di un titolo in base non solo al rendimento di questo, ma anche a quello del portafoglio, l'insieme di titoli che intende acquistare. Indicando quindi:
  • con rf  il rendimento lordo del titolo in questione, privo di rischio;
  • con E[rp] il rendimento futuro atteso del portafoglio, ottenuto come somma, ponderata con pesi ωi, dei rendimenti che costituiscono un dato portafoglio:;
  • con σp la deviazione standard dei rendimenti del portafoglio;
occorre massimizzare la funzione obiettivo:

Risolvendo il problema di ottimizzazione non lineare, in corrispondenza di un dato titoli i, la relazione ottenuta sarà:

avendo indicato con:
  • ri il rendimento lordo del titolo in questione;
  • rm quello relativo al portafoglio di mercato;
  • rf  il rendimento lordo del titolo in questione, privo di rischio;
  • βim il rapporto tra la covarianza tra rendimento del titolo i-esimo e portafoglio e la varianza di quest'ultimo:
Il modello è utile:
  • per valutare quanto le valutazioni di mercato si discostino dalle aspettative degli operatori: un'attività il cui prezzo sarà superiore al valore ottenuto con il capital asset pricing model risulterà sovraprezzata, una in cui sarà inferiore sottoprezzata;
  • per valutare l'acquisto di un dato titolo, rispetto al mercato di riferimento: per βim maggiore di uno, il titolo i-esimo comporterà rischiosità maggiore, al contrario βim denoterà minore rischiosità;
  • per βim maggiore di zero il trend dei due rendimenti sarà lo stesso (entrambi crescenti o decrescenti), risulterà opposto, invece, per βim minore di zero.

La difficoltà, di carattere puramente tecnico, risiede nel fatto che il coefficiente βim non può essere calcolato per via analitica, ma deve essere stimato. In questo contesto, la procedura più largamente adottata è una regressione a due passi.

Nel primo passo vengono stimati i coefficienti  βim attraverso la serie storica equazioni lineari relative a dati istanti di tempo, chiamate modelli di mercato:

Nel secondo passo, le stime ottenute in precedenza vengono utilizzate come variabili esplicative attraverso cui stimare i rendimenti riferiti all'i-esimo titolo, sempre in un modello di regressione lineare, in un'ottica cross-section:

Se α risulterà pari al rendimento lordo privo di rischio, rf, e  βim rappresenterà il premio per il rischio del portafoglio, allora il capital asset pricing model potrà essere adottato.


In realtà, il modello presuppone alcune ipotesi alquanto ristrettive:
  • la concorrenza perfetta, secondo ciascun individuo può disporre di tutte le informazioni di cui necessiti, in qualsiasi momento;
  • l'assenza di costi transazioni e tasse, che invece potrebbero frenare gli acquisti degli operatori finanziari;
  • la supposizione di medesime aspettative degli operatori, senza tener conto della possibilità di un giudizio soggettivo.

Si tratta comunque di una innovativa proposta di strategia di trading, che ovviamente può essere adottata dall'investitore, sempre con la dovuta premessa che non sempre il mercato azionario riflette l'economia reale.

(Fonte: Wikipedia)

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)

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:








giovedì 3 aprile 2014

Introduzione agli oggetti grafici e programmazione degli oggetti

Procediamo ora con l'analisi di alcuni elementi grafici di Visual Basic, osservando come sia possibile creare delle funzioni che costruiscano degli oggetti grafici.


A tal fine creiamo una funzione, che chiameremo PALLINA, tramite la quale, appunto, sarà possibile disegnare delle palline che si muoveranno sullo schermo, associando a ciascuna di essa, rispettivamente:
  • il passo con cui si muoverà;
  • il diametro;
  • le coordinate da cui partirà;
  • il verso, su ciascuno dei due assi, verso cui si muoverà;
  • il colore.
Le palline si muoveranno all'interno di una casella immagini, azionate da un semplice click su un bottone; viene dunque imposto che, una volta che le palline tocchino il bordo della casella immagini, esse "rimbalizino" su di esso, non fuoriuscendo dunque dalla schermata.
I comandi associati a tale funzione risulteranno:

Public Class PALLINA
    Public passo As Integer
    Public diam As Integer
    Public x As Integer
    Public y As Integer
    Public versox As Boolean
    Public versoy As Boolean
    Public brush As Brush
    Sub New(ByVal passou As Integer, ByVal diamu As Integer, ByVal xu As Integer, ByVal yu As Integer, ByVal versoxu As Boolean, ByVal versoyu As Boolean, ByVal brushu As Brush)
        Me.passo = passou
        Me.diam = diamu
        Me.x = xu
        Me.y = yu
        Me.versox = versoxu
        Me.versoy = versoyu
        Me.brush = brushu
    End Sub
    Public Sub ridisegna(ByVal B As Bitmap, ByVal G As Graphics)
        If x >= B.Width - diam Then
            versox = True
        End If
        If y >= B.Height - diam Then
            versoy = True
        End If
        If x <= 0 Then
            versox = False
        End If
        If y <= 0 Then
            versoy = False
        End If
        If versox Then
            x -= passo
        Else
            x += passo
        End If
        If versoy Then
            y -= passo
        Else
            y += passo
        End If
        G.FillEllipse(brush, x, y, diam, diam)
    End Sub
End Class




E' possibile procedere, a questo punto, con la creazione dei due strumenti cui si faceva riferimento in precedenza. Nell'esempio di seguito riportato, ad un primo click dell'utente compaiono della casella di immagini sei palline, ciascuna con le proprie peculiari caratteristiche; ad ogni successivo click all'interno della stessa casella, compaiono altre sei palline con le medesime caratteristiche. Si avrà pertanto:

Public Class Form1
    Public B As New Bitmap(600, 400)
    Public G As Graphics = Graphics.FromImage(B)
    Public L As New List(Of PALLINA)
    Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
        Dim p1 As New PALLINA(5, 30, 0, 0, False, False, Brushes.Fuchsia)
        Dim p2 As New PALLINA(10, 30, 150, 50, False, False, Brushes.Indigo)
        Dim p3 As New PALLINA(15, 30, 300, 300, False, False, Brushes.Blue)
        Dim p4 As New PALLINA(20, 30, 80, 30, True, True, Brushes.Orange)
        Dim p5 As New PALLINA(25, 30, 94, 73, True, True, Brushes.HotPink)
        Dim p6 As New PALLINA(30, 30, 400, 500, False, False, Brushes.LightBlue)
       
        L.Add(p1)
        L.Add(p2)
        L.Add(p3)
        L.Add(p4)
        L.Add(p5)
        L.Add(p6)
        Timer1.Start()
    End Sub
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        G.Clear(Color.Black)
        For Each P As PALLINA In Me.L
            P.ridisegna(B, G)
        Next
        PictureBox1.Image = B
    End Sub
End Class

Random walk ed analisi delle serie storiche

Molti approcci statistici suggeriscono che, avendo a disposizione una serie storica di prezzi registrati sul mercato azionario, sia possibile prevedere il loro andamento futuro, costruendo un modello basato sulle osservazioni registrate sino a quel momento. Teorie probabilistiche alternative ipotizzano, al contrario, che i prezzi siano soggetti ad un moto del tutto casuale, che renda impossibile qualsivoglia tipo di previsione.

La random walk hypothesis è una teoria finanziaria secondo cui i prezzi del mercato azionario si evolvono secondo quella che, nell'ambito della teoria della probabilità, è chiamata passeggiata aleatoria (random walk): si tratta di un processo stocastico in cui si ipotizza che una particella si muova esclusivamente in due direzioni, con probabilità prefissate, in maniera del tutto casuale; il termine random walk deriva dal titolo del celebre testo di Burton Malkiel, professore di economia alla Princeton University, "A random walk down Wall Street", pubblicato nel 1973. La random walk hypothesis risulta comunque una teoria coerente con l'assunzione di mercati efficienti (efficient-market hypothesis - EMH), secondo la quale un investitore non può formulare una strategia di trading che gli permetta di acquistare strumenti finanziari, quali azioni, valute o future, ottenendo un rendimento atteso superiore a quello del mercato, e questo a prescindere dalle informazioni di cui dispone.

Un secondo approccio è quello basato sul concetto di moto browniano geometrico (geometric brownian motion - GBM), un processo stocastico in tempo continuo in cui si ipotizza che il logaritmo dei prezzi di mercato segua un moto browniano. Con questo termine si fa riferimento al moto disordinato con cui si muovono delle particelle, nella formulazione originaria presenti nei fluidi o nelle sospensioni fluide.
In modelli di questo tipo, detti di Black-Scholes, si ipotizza che:
  •  i rendimenti attesi delle azioni di interesse siano indipendenti dai prezzi di tali strumenti finanziari registrati nei diversi periodi;
  • il processo assuma solamente valori positivi, non potendo ovviamente essere i prezzi reali minori di zero.
In realtà continuano ad essere presenti aspetti non troppo realistici:
  • la volatilità, ossia la variazione nel tempo dei titoli azionari, è assunta costante, mentre risulterebbe più opportuno considerarla variabile nel tempo;
  • questi modelli implicano l'ipotesi di normalità dei rendimenti, non sempre soddisfatta dato che essi, solitamente, presentano una maggiore curtosi, ovvero code più "grasse" rispetto a quelle della gaussiana; inoltre la distribuzione è generalmente asimetrica negativamente.




Al fine di simulare un andamento casuale dei prezzi, riportiamo di seguito un algoritmo costruito per simulare una serie storia in cui, a partire da un prezzo iniziale pari a 100, si registrino aumenti e diminuzioni del tutto aleatori in corrispondenza dei periodi successivi. Questo meccanismo è ottenuto generando valori casuali compresi tra 0 ed 1 ed imponendo che:
  • ogni qual volta il valore generato sia minore di 0.5, il prezzo corrente subisca un incremento di una unità:
  • nel caso contrario, questo subisca una riduzione pari ad 1.
Vengono creati dunque una casella di testo, che conterrà i valori ottenuti, ad ogni step, relativi al prezzo azionario simulato, ed un bottone, cui saranno associati i comandi:




Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim R As New Random
        Dim PrezzoIniziale As Decimal = 100
        Dim Incremento As Decimal = 1
        Dim PrezzoCorrente As Double = PrezzoIniziale

        For i = 1 To 100
            If R.NextDouble < 0.5 Then
                PrezzoCorrente += Incremento
            Else PrezzoCorrente -= Incremento
                RichTextBox1.AppendText(PrezzoCorrente.ToString("#.##") & vbCrLf)


            End If

        Next



    End Sub
End Class




Cliccando sul bottone sarà quindi possibile visualizzare gli aumenti e decrementi simulati dall'algoritmo ad ogni step.

(Fonte: Wikipedia)