martedì 24 maggio 2016

Strategie di Trading

Nel calcolo del PNL ho aggiunto anche la passegiata aleatoria e il moto Browniano geometrico usati nell’esonero 2.
Il poter disporre di un modello che descriva adeguatamente l'andamento dei prezzi azionari risulta particolarmente interessante.

I prezzi dei titoli azionari sono assimilabili a una variabile il cui valore cambia nel tempo in modo aleatorio e in quanto tali sono regolati da un processo aleatorio.
I modelli finanziari più utilizzati si basano sull'ipotesi che la dinamica dei prezzi sia regolata da un processo stocastico continuo a parametro continuo.
Nel nostro esercizio abbiamo utilizzato due tipi di modelli che descrivono l’andamento dei prezzi azionari:

  • Il moto browniano geometrico riflette la natura del prezzo di un'attività finanziaria in quanto una quantità che segue un moto browniano geometrico può assumere soltanto valori maggiori di zero. Questo processo stocastico è stato proposto da Wiener per descrivere matematicamente il movimento di un granellino di polvere sospeso su una superficie d'acqua, movimento causato dai continui bombardamenti delle molecole circostanti.
        Il GBM è un’applicazione della normale. I paramentri sono denominati:
-Drift  = direzione ( media )
-Volatility = volatilità ( varianza )
  • Una random walk invece è un percorso dove ogni passo ha una direzione casuale e possibilmente anche una dimensione casuale. Queste passeggiate aleatorie servono come modelli per studiare fenomeni variabili come la diffusione, il prezzo di attività finanziarie, ecc..
Per generare i prezzi nella random walk usiamo la variabile bernoulliana.
Questo tipo di percorso però non è considerato un modello adatto per generare i prezzi perché se si genera un numero di prezzi sufficientemente elevato si possono ottenere anche valori negativi, e ovviamente per i prezzi questo non è realistico.
Cos’è una strategia di trading? 
Con il termine “sistema di trading”, ci si riferisce a una metodologia rigorosamente definita, che utilizza determinate regole per decidere quando comprare o quando vendere su un certo mercato. Lo scopo del sistema di trading è quello di generare una strategia che sia nel medio lungo periodo profittevole per l’investitore.
E’ importante sottolineare che un sistema di trading non è uno strumento previsivo. Si può pensare ad esso come al lancio di una moneta: 50% di probabilità di vincita e 50% di probabilità di perdita. Se però il sistema fosse studiato in modo tale da produrre nel tempo, e sulla base di un suo uso ripetuto, perdite limitate e vincite ampie, il risultato nel medio-lungo periodo risulterebbe interessante. In ogni caso, il sistema non avrebbe alcuna capacità previsiva anche se risultasse profittevole. Da questa considerazione discende un importante verità del trading: per guadagnare è sufficiente, ma non necessario, prevedere l’andamento futuro dei prezzi.
Un trading plan quindi è l’insieme di una serie di regole che definiscono il “come” e il “quando” un trader piazzerà i propri ordini. Un trading plan, dunque, si compone di elementi che descrivono l’attività di un trader. Ai trader non è imposto alcun limite sulla tipologia di mercato sul quale operare; la cosa importante,però, è che gli strumenti utilizzati per creare la strategia godano di buona liquidità e volatilità.
La liquidità descrive l’abilità di eseguire ordini, cioè è relativo alla facilità con la quale i titoli possono essere acquistati e venduti.
La liquidità si misura in termini di:
  • Ampiezza: quant’è stretto lo spread bid/ask
    [Nota: cosa è lo spread bid/ask? E’ la differenza tra il prezzo bid (denaro) e il prezzo ask (lettera) praticato da un commerciante. Il prezzo bid è il prezzo al quale il negoziante è disposto ad acquistare uno strumento finanziario. Il prezzo ask è quello al quale il negoziante è disposto a vendere uno strumento finanziario.]
  • Profondità: quant’è profondo il mercato, cioè quanti ordini rimangono fuori dal best price
  • Immediatezza: quanto velocemente può essere eseguito un grande ordine
  • Elasticità: quanto impiega il mercato a tornare indietro dopo l’esecuzione di un ordine molto grande
I mercati che godono di buona liquidità tendono ad avere piccoli spread bid/ask e una buona profondità perché i trade vengano eseguiti velocemente. La liquidità è un fattore estremamente importante per i trader perché assicura che gli ordini vengano completati e senza imponenti variazioni di prezzo.
La volatilità, invece, misura la quantità e la velocità con la quale il prezzo di un mercato si muove al rialzo, o al ribasso. La volatilità è spesso vista come un’opportunità di trarre profitto dal cambiamento di prezzo. Qualsiasi cambiamento di prezzo crea un’opportunità di guadagno: sia esso un aumento in fase di uptrend, o un calo in fase di downtrend. Diversamente, se il prezzo rimane invariato è difficile trarre profitto.
Il codice seguente, realizzato in VB.NET, implementa una strategia di trading basata sulle Bande di Bollinger. Dal punto di vista operativo, le Bande di Bollinger danno segnali di acquisto o vendita a seconda se la serie dei prezzi incontra la banda inferiore o superiore. Dal momento che la serie storica tocca la bande inferiore abbiamo un segnale di acquisto; viceversa quando incontra quella superiore il segnale sarà di vendita.


Codice:
Public Class Form1

    Public B As Bitmap
    Public g As Graphics

    Public r As New Rectangle(20, 20, 300, 250)
    Public xiniziale As Integer
    Public yiniziale As Integer
    Public AltezzaIniziale As Integer
    Public LarghezzaIniziale As Integer
    Public rxiniziale As Integer
    Public ryiniziale As Integer
    Public draggingMove As Boolean = False
    Public dx As Integer
    Public dy As Integer


    Public Ran As New Random
    Public serieStorica As New List(Of Class1)
    Public PrezIniziale As Decimal = 100
    Public inizialeInstant As Date = Now
    Public Incremento As Decimal = 1

    Public listSerieStorica As New List(Of PointF)
    Public SerieAvg As New List(Of PointF)
    Public SerieAvgMobile As New List(Of PointF)
    Public SerieDeviazioneSup As New List(Of PointF)
    Public SerieDeviazioneInf As New List(Of PointF)
    Public Sell As New List(Of Double)
    Public Buy As New List(Of Double)
    Public SerieSell As New List(Of PointF)
    Public SerieBuy As New List(Of PointF)

    Public PSs As New List(Of PointF)
    Public PAvg As New List(Of PointF)
    Public PAvgMobile As New List(Of PointF)
    Public PDeviazioneSup As New List(Of PointF)
    Public PDeviazioneInf As New List(Of PointF)
    Public PSell As New List(Of PointF)
    Public PBuy As New List(Of PointF)


    Public maxX As Double
    Public minX As Double
    Public maxY As Double
    Public minY As Double

    Public xt As Integer
    Public yt As Integer


   
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        'Ogni volta che viene premuto button resettiamo gli oggetti
        Me.listSerieStorica.Clear()
        Me.SerieAvg.Clear()
        Me.SerieAvgMobile.Clear()
        Me.SerieDeviazioneSup.Clear()
        Me.SerieDeviazioneInf.Clear()
        Me.SerieSell.Clear()
        Me.SerieBuy.Clear()

        Dim PrezCorrente As Decimal = PrezIniziale
        Dim correnteInstant As Date = inizialeInstant
        Dim AvgIniziale As Double = PrezIniziale
        Dim AvgCorrente As Double = AvgIniziale
        Dim AvgCorrenteMobile As Double = AvgIniziale
        Dim k As Integer = 12
        Dim varianza As Double = 0
        Dim Deviazione As Double = 0
        Dim DeviazioneSup As Double = AvgIniziale
        Dim DeviazioneInf As Double = AvgIniziale
        Dim ListaK As New List(Of Decimal)

        'Ciclo FOR per la passeggiata aleatoria dei prezzi nel quale vengono definite la serie storica dei prezzi,
        'la media, la media mobile per la Banda di Bollinger.

        For i = 1 To 1000
            Dim Osservazione As New Class1(correnteInstant, PrezCorrente, AvgCorrente, AvgCorrenteMobile, varianza, Deviazione, DeviazioneSup, DeviazioneInf)
            serieStorica.Add(Osservazione)

            If Ran.NextDouble < 0.5 Then
                PrezCorrente = PrezCorrente + Incremento
            Else
                PrezCorrente = PrezCorrente - Incremento
            End If

            correnteInstant = correnteInstant.AddSeconds(1)
            AvgCorrente = ((i - 1) * AvgCorrente + PrezCorrente) / i
            ListaK.Add(PrezCorrente)

            If i <= k Then
                AvgCorrenteMobile = AvgCorrente
            Else
                AvgCorrenteMobile = ((k * AvgCorrenteMobile) + PrezCorrente - ListaK(0)) / k
                ListaK.RemoveAt(0)
            End If

            varianza = ((i - 1) * varianza + (PrezCorrente - AvgCorrente) * (PrezCorrente - AvgCorrenteMobile)) / i
            Deviazione = Math.Sqrt(varianza)
            DeviazioneSup = AvgCorrenteMobile + Deviazione * NumericUpDown1.Value
            DeviazioneInf = AvgCorrenteMobile - Deviazione * NumericUpDown1.Value
        Next

        'Creazione della lista di punti per Bitmap della serie storica, media, media mobile, deviazione superiore, deviazione inferiore.

        listSerieStorica = New List(Of PointF)
        For Each Osservazione As Class1 In serieStorica
            Dim x As Integer
            Dim y As Integer
            y = r.Height - Osservazione.prezzo
            x = Osservazione.istante.Subtract(inizialeInstant).TotalSeconds
            Dim punto As New PointF(x, y)
            listSerieStorica.Add(punto)
        Next

        SerieAvg = New List(Of PointF)
        For Each Osservazione As Class1 In serieStorica
            Dim x As Integer
            Dim y As Integer
            y = r.Height - Osservazione.Avg
            x = Osservazione.istante.Subtract(inizialeInstant).TotalSeconds
            Dim punto1 As New PointF(x, y)
            SerieAvg.Add(punto1)
        Next

        SerieAvgMobile = New List(Of PointF)
        For Each Osservazione As Class1 In serieStorica
            Dim x As Integer
            Dim y As Integer
            y = r.Height - Osservazione.AvgMobile
            x = Osservazione.istante.Subtract(inizialeInstant).TotalSeconds
            Dim punto2 As New PointF(x, y)
            SerieAvgMobile.Add(punto2)
        Next

        SerieDeviazioneSup = New List(Of PointF)
        For Each Osservazione As Class1 In serieStorica
            Dim x As Integer
            Dim y As Integer
            y = r.Height - Osservazione.DeviazioneSup
            x = Osservazione.istante.Subtract(inizialeInstant).TotalSeconds
            Dim punto3 As New PointF(x, y)
            SerieDeviazioneSup.Add(punto3)
        Next

        SerieDeviazioneInf = New List(Of PointF)
        For Each Osservazione As Class1 In serieStorica
            Dim x As Integer
            Dim y As Integer
            y = r.Height - Osservazione.DeviazioneInf
            x = Osservazione.istante.Subtract(inizialeInstant).TotalSeconds
            Dim punto4 As New PointF(x, y)
            SerieDeviazioneInf.Add(punto4)
        Next


        Sell = New List(Of Double)
        Buy = New List(Of Double)
        SerieSell = New List(Of PointF)
        SerieBuy = New List(Of PointF)
        For Each Osservazione As Class1 In serieStorica
            Dim xs As Integer
            Dim ys As Integer
            Dim xb As Integer
            Dim yb As Integer
          
            If Osservazione.prezzo > Osservazione.DeviazioneSup Then
                ys = r.Height - Osservazione.DeviazioneSup
                xs = Osservazione.istante.Subtract(inizialeInstant).TotalSeconds
                Dim punto5 As New PointF(xs, ys)
                SerieSell.Add(punto5)
                Sell.Add(ys)
            ElseIf Osservazione.prezzo < Osservazione.DeviazioneInf Then
                yb = r.Height - Osservazione.DeviazioneInf
                xb = Osservazione.istante.Subtract(inizialeInstant).TotalSeconds
                Dim punto6 As New PointF(xb, yb)
                SerieBuy.Add(punto6)
                Buy.Add(yb)
            End If
        Next

        'Calcolo le coordinate reali della serie storica dei prezzi
        maxX = Double.MinValue
        minX = Double.MaxValue
        maxY = Double.MinValue
        minY = Double.MaxValue
        For Each punto As PointF In listSerieStorica
            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

        B = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        g = Graphics.FromImage(B)

        'Costruzione di una nuovi listi dei punti che vengono trasformati per rappresentare in Bitmap
        'e potere trascrivere all'interno del rectangolo

        PSs = New List(Of PointF)
        For Each punto As PointF In listSerieStorica
            xt = r.Left + (punto.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto.Y - minY) / (maxY - minY) * r.Height
            PSs.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PAvg = New List(Of PointF)
        For Each punto1 As PointF In SerieAvg
            xt = r.Left + (punto1.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto1.Y - minY) / (maxY - minY) * r.Height
            PAvg.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PAvgMobile = New List(Of PointF)
        For Each punto2 As PointF In SerieAvgMobile
            xt = r.Left + (punto2.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto2.Y - minY) / (maxY - minY) * r.Height
            PAvgMobile.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PDeviazioneSup = New List(Of PointF)
        For Each punto3 As PointF In SerieDeviazioneSup
            xt = r.Left + (punto3.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto3.Y - minY) / (maxY - minY) * r.Height
            PDeviazioneSup.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PDeviazioneInf = New List(Of PointF)
        For Each punto4 As PointF In SerieDeviazioneInf
            xt = r.Left + (punto4.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto4.Y - minY) / (maxY - minY) * r.Height
            PDeviazioneInf.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PSell = New List(Of PointF)
        For Each punto5 As PointF In SerieSell
            xt = r.Left + (punto5.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto5.Y - minY) / (maxY - minY) * r.Height
            PSell.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PBuy = New List(Of PointF)
        For Each punto6 As PointF In SerieBuy
            xt = r.Left + (punto6.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto6.Y - minY) / (maxY - minY) * r.Height
            PBuy.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        'Ciclo FOR per ottenere il beneficio. Questo ciclo ci dà tutte le transazioni con il proffito
        ' e proffito percentuale positiva
        Dim profit As Double = 0
        Dim Pprof As Double = 0
        For i As Integer = 0 To Buy.Count - 1
            For j As Integer = 0 To Sell.Count - 1
                profit = ((Sell(j)) - (Buy(i))) * Buy.Count
                Pprof = (profit / Buy(i)) * 100
                If profit > 0 Then
                    RichTextBox1.AppendText(vbCrLf & "Buy" & "       " & "Sell" & "       " & "Profit" & "           " & "%")
                    RichTextBox1.AppendText(vbCrLf & Buy(i).ToString("#.##").PadLeft(7) & Sell(j).ToString("#.##").PadLeft(7) & profit.ToString("#.##").PadLeft(8) & Pprof.ToString("#.##").PadLeft(13))
                End If
            Next
        Next


        g.Clear(Color.White)

        g.DrawLines(Pens.Black, PSs.ToArray)
        g.DrawLines(Pens.GreenYellow, PAvg.ToArray)
        g.DrawLines(Pens.Gold, PAvgMobile.ToArray)
        g.DrawLines(Pens.Blue, PDeviazioneSup.ToArray)
        g.DrawLines(Pens.Blue, PDeviazioneInf.ToArray)

        elipse()
        g.DrawRectangle(Pens.Black, r)
        PictureBox1.Image = B

        Dim drawFont2 As New Font("Arial", 12, FontStyle.Bold)
        g.DrawString("TRADING GRAPHIC", drawFont2, Brushes.Black, 300, 10)
    End Sub

    'Funzione MouseDown farvi sapere quale pulsante è stato premuto i la posizione all'interno del controllo
    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
  

        'Contains() determina se un elemento è contenuto nella lista.
        If Not r.Contains(e.X, e.Y) Then Exit Sub
        If e.Button = Windows.Forms.MouseButtons.Left Then
            'la mano Cursor in genere indica che il puntatore si trova sopra un collegamento
            'modificare il cursore del mouse
            Cursor = Cursors.Hand
        ElseIf e.Button = Windows.Forms.MouseButtons.Right Then
            'Ottiene un nord-ovest a due picchi o verso sud-est il ridimensionamento Cursor
            'modificare il cursore del mouse
            Cursor = Cursors.SizeNWSE
        End If

        'Salvare posizione corrente del mouse e del rettangolo
        xiniziale = e.X
        yiniziale = e.Y
        rxiniziale = r.X
        ryiniziale = r.Y
        LarghezzaIniziale = r.Width
        AltezzaIniziale = r.Height

        'abilitare il flag
        draggingMove = True

    End Sub

    'La funzione MouseMove ci permette di modificare la posizione di rectangolo
    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove

   
        If Not draggingMove Then Exit Sub

        'Aggiorniamo le nuove coordinate del rettangolo
        dx = e.X - xiniziale
        dy = e.Y - yiniziale

        'condicione If per modificare le coordinate
        If e.Button = Windows.Forms.MouseButtons.Left Then
            'Se il pulsante sinistro del mouse è stato premuto applico al nuovo vertice del rettangolo
            r.X = rxiniziale + dx
            r.Y = ryiniziale + dy
        Else
            'Modifichiamo l'altezza e la larghezza
            r.Width = LarghezzaIniziale + dx
            r.Height = AltezzaIniziale + dy

        End If

        r = New Rectangle(r.X, r.Y, r.Width, r.Height)


        PSs = New List(Of PointF)
        For Each punto As PointF In listSerieStorica
            xt = r.Left + (punto.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto.Y - minY) / (maxY - minY) * r.Height
            PSs.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PAvg = New List(Of PointF)
        For Each punto1 As PointF In SerieAvg
            xt = r.Left + (punto1.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto1.Y - minY) / (maxY - minY) * r.Height
            PAvg.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PAvgMobile = New List(Of PointF)
        For Each punto2 As PointF In SerieAvgMobile
            xt = r.Left + (punto2.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto2.Y - minY) / (maxY - minY) * r.Height
            PAvgMobile.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PDeviazioneSup = New List(Of PointF)
        For Each punto3 As PointF In SerieDeviazioneSup
            xt = r.Left + (punto3.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto3.Y - minY) / (maxY - minY) * r.Height
            PDeviazioneSup.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PDeviazioneInf = New List(Of PointF)
        For Each punto4 As PointF In SerieDeviazioneInf
            xt = r.Left + (punto4.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto4.Y - minY) / (maxY - minY) * r.Height
            PDeviazioneInf.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PSell = New List(Of PointF)
        For Each punto5 As PointF In SerieSell
            xt = r.Left + (punto5.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto5.Y - minY) / (maxY - minY) * r.Height
            PSell.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PBuy = New List(Of PointF)
        For Each punto6 As PointF In SerieBuy
            xt = r.Left + (punto6.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto6.Y - minY) / (maxY - minY) * r.Height
            PBuy.Add(New PointF(CSng(xt), CSng(yt)))
        Next




        g.Clear(Color.White)

        g.DrawLines(Pens.Black, PSs.ToArray)
        g.DrawLines(Pens.GreenYellow, PAvg.ToArray)
        g.DrawLines(Pens.Gold, PAvgMobile.ToArray)
        g.DrawLines(Pens.Blue, PDeviazioneSup.ToArray)
        g.DrawLines(Pens.Blue, PDeviazioneInf.ToArray)

        g.DrawRectangle(Pens.Black, r)
        PictureBox1.Image = B
        elipse()
        Dim drawFont2 As New Font("Arial", 12, FontStyle.Bold)
        g.DrawString("TRADING GRAPHIC", drawFont2, Brushes.Black, 300, 10)


    End Sub

    'Funzione MouseUp ci permette di trarre il rectangolo quando il pulsante del mouse viene rilasciato
    Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp

        'flag per spostare il controllo
        draggingMove = False

        'modificare il cursore
        Cursor = Cursors.Default


    End Sub

    Private Sub elipse()
        For Each punto As PointF In PSell
            g.DrawEllipse(Pens.Red, punto.X, punto.Y, 9, 9)
        Next
        For Each punto As PointF In PBuy
            g.DrawEllipse(Pens.Green, punto.X, punto.Y, 9, 9)
        Next
    End Sub
    Private Sub NumericUpDown1_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged


    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

End Class

Public Class Form1

    Public B As Bitmap
    Public g As Graphics

    Public r As New Rectangle(20, 20, 300, 250)
    Public xiniziale As Integer
    Public yiniziale As Integer
    Public AltezzaIniziale As Integer
    Public LarghezzaIniziale As Integer
    Public rxiniziale As Integer
    Public ryiniziale As Integer
    Public draggingMove As Boolean = False
    Public dx As Integer
    Public dy As Integer


    Public Ran As New Random
    Public serieStorica As New List(Of Class1)
    Public PrezIniziale As Decimal = 100
    Public inizialeInstant As Date = Now
    Public Incremento As Decimal = 1

    Public listSerieStorica As New List(Of PointF)
    Public SerieAvg As New List(Of PointF)
    Public SerieAvgMobile As New List(Of PointF)
    Public SerieDeviazioneSup As New List(Of PointF)
    Public SerieDeviazioneInf As New List(Of PointF)
    Public Sell As New List(Of Double)
    Public Buy As New List(Of Double)
    Public SerieSell As New List(Of PointF)
    Public SerieBuy As New List(Of PointF)

    Public PSs As New List(Of PointF)
    Public PAvg As New List(Of PointF)
    Public PAvgMobile As New List(Of PointF)
    Public PDeviazioneSup As New List(Of PointF)
    Public PDeviazioneInf As New List(Of PointF)
    Public PSell As New List(Of PointF)
    Public PBuy As New List(Of PointF)


    Public maxX As Double
    Public minX As Double
    Public maxY As Double
    Public minY As Double

    Public xt As Integer
    Public yt As Integer


   
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        'Ogni volta che viene premuto button resettiamo gli oggetti
        Me.listSerieStorica.Clear()
        Me.SerieAvg.Clear()
        Me.SerieAvgMobile.Clear()
        Me.SerieDeviazioneSup.Clear()
        Me.SerieDeviazioneInf.Clear()
        Me.SerieSell.Clear()
        Me.SerieBuy.Clear()

        Dim PrezCorrente As Decimal = PrezIniziale
        Dim correnteInstant As Date = inizialeInstant
        Dim AvgIniziale As Double = PrezIniziale
        Dim AvgCorrente As Double = AvgIniziale
        Dim AvgCorrenteMobile As Double = AvgIniziale
        Dim k As Integer = 12
        Dim varianza As Double = 0
        Dim Deviazione As Double = 0
        Dim DeviazioneSup As Double = AvgIniziale
        Dim DeviazioneInf As Double = AvgIniziale
        Dim ListaK As New List(Of Decimal)

        'Ciclo FOR per la passeggiata aleatoria dei prezzi nel quale vengono definite la serie storica dei prezzi,
        'la media, la media mobile per la Banda di Bollinger.

        For i = 1 To 1000
            Dim Osservazione As New Class1(correnteInstant, PrezCorrente, AvgCorrente, AvgCorrenteMobile, varianza, Deviazione, DeviazioneSup, DeviazioneInf)
            serieStorica.Add(Osservazione)

            If Ran.NextDouble < 0.5 Then
                PrezCorrente = PrezCorrente + Incremento
            Else
                PrezCorrente = PrezCorrente - Incremento
            End If

            correnteInstant = correnteInstant.AddSeconds(1)
            AvgCorrente = ((i - 1) * AvgCorrente + PrezCorrente) / i
            ListaK.Add(PrezCorrente)

            If i <= k Then
                AvgCorrenteMobile = AvgCorrente
            Else
                AvgCorrenteMobile = ((k * AvgCorrenteMobile) + PrezCorrente - ListaK(0)) / k
                ListaK.RemoveAt(0)
            End If

            varianza = ((i - 1) * varianza + (PrezCorrente - AvgCorrente) * (PrezCorrente - AvgCorrenteMobile)) / i
            Deviazione = Math.Sqrt(varianza)
            DeviazioneSup = AvgCorrenteMobile + Deviazione * NumericUpDown1.Value
            DeviazioneInf = AvgCorrenteMobile - Deviazione * NumericUpDown1.Value
        Next

        'Creazione della lista di punti per Bitmap della serie storica, media, media mobile, deviazione superiore, deviazione inferiore.

        listSerieStorica = New List(Of PointF)
        For Each Osservazione As Class1 In serieStorica
            Dim x As Integer
            Dim y As Integer
            y = r.Height - Osservazione.prezzo
            x = Osservazione.istante.Subtract(inizialeInstant).TotalSeconds
            Dim punto As New PointF(x, y)
            listSerieStorica.Add(punto)
        Next

        SerieAvg = New List(Of PointF)
        For Each Osservazione As Class1 In serieStorica
            Dim x As Integer
            Dim y As Integer
            y = r.Height - Osservazione.Avg
            x = Osservazione.istante.Subtract(inizialeInstant).TotalSeconds
            Dim punto1 As New PointF(x, y)
            SerieAvg.Add(punto1)
        Next

        SerieAvgMobile = New List(Of PointF)
        For Each Osservazione As Class1 In serieStorica
            Dim x As Integer
            Dim y As Integer
            y = r.Height - Osservazione.AvgMobile
            x = Osservazione.istante.Subtract(inizialeInstant).TotalSeconds
            Dim punto2 As New PointF(x, y)
            SerieAvgMobile.Add(punto2)
        Next

        SerieDeviazioneSup = New List(Of PointF)
        For Each Osservazione As Class1 In serieStorica
            Dim x As Integer
            Dim y As Integer
            y = r.Height - Osservazione.DeviazioneSup
            x = Osservazione.istante.Subtract(inizialeInstant).TotalSeconds
            Dim punto3 As New PointF(x, y)
            SerieDeviazioneSup.Add(punto3)
        Next

        SerieDeviazioneInf = New List(Of PointF)
        For Each Osservazione As Class1 In serieStorica
            Dim x As Integer
            Dim y As Integer
            y = r.Height - Osservazione.DeviazioneInf
            x = Osservazione.istante.Subtract(inizialeInstant).TotalSeconds
            Dim punto4 As New PointF(x, y)
            SerieDeviazioneInf.Add(punto4)
        Next


        Sell = New List(Of Double)
        Buy = New List(Of Double)
        SerieSell = New List(Of PointF)
        SerieBuy = New List(Of PointF)
        For Each Osservazione As Class1 In serieStorica
            Dim xs As Integer
            Dim ys As Integer
            Dim xb As Integer
            Dim yb As Integer
          
            If Osservazione.prezzo > Osservazione.DeviazioneSup Then
                ys = r.Height - Osservazione.DeviazioneSup
                xs = Osservazione.istante.Subtract(inizialeInstant).TotalSeconds
                Dim punto5 As New PointF(xs, ys)
                SerieSell.Add(punto5)
                Sell.Add(ys)
            ElseIf Osservazione.prezzo < Osservazione.DeviazioneInf Then
                yb = r.Height - Osservazione.DeviazioneInf
                xb = Osservazione.istante.Subtract(inizialeInstant).TotalSeconds
                Dim punto6 As New PointF(xb, yb)
                SerieBuy.Add(punto6)
                Buy.Add(yb)
            End If
        Next

        'Calcolo le coordinate reali della serie storica dei prezzi
        maxX = Double.MinValue
        minX = Double.MaxValue
        maxY = Double.MinValue
        minY = Double.MaxValue
        For Each punto As PointF In listSerieStorica
            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

        B = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        g = Graphics.FromImage(B)

        'Costruzione di una nuovi listi dei punti che vengono trasformati per rappresentare in Bitmap
        'e potere trascrivere all'interno del rectangolo

        PSs = New List(Of PointF)
        For Each punto As PointF In listSerieStorica
            xt = r.Left + (punto.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto.Y - minY) / (maxY - minY) * r.Height
            PSs.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PAvg = New List(Of PointF)
        For Each punto1 As PointF In SerieAvg
            xt = r.Left + (punto1.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto1.Y - minY) / (maxY - minY) * r.Height
            PAvg.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PAvgMobile = New List(Of PointF)
        For Each punto2 As PointF In SerieAvgMobile
            xt = r.Left + (punto2.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto2.Y - minY) / (maxY - minY) * r.Height
            PAvgMobile.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PDeviazioneSup = New List(Of PointF)
        For Each punto3 As PointF In SerieDeviazioneSup
            xt = r.Left + (punto3.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto3.Y - minY) / (maxY - minY) * r.Height
            PDeviazioneSup.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PDeviazioneInf = New List(Of PointF)
        For Each punto4 As PointF In SerieDeviazioneInf
            xt = r.Left + (punto4.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto4.Y - minY) / (maxY - minY) * r.Height
            PDeviazioneInf.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PSell = New List(Of PointF)
        For Each punto5 As PointF In SerieSell
            xt = r.Left + (punto5.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto5.Y - minY) / (maxY - minY) * r.Height
            PSell.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PBuy = New List(Of PointF)
        For Each punto6 As PointF In SerieBuy
            xt = r.Left + (punto6.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto6.Y - minY) / (maxY - minY) * r.Height
            PBuy.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        'Ciclo FOR per ottenere il beneficio. Questo ciclo ci dà tutte le transazioni con il proffito
        ' e proffito percentuale positiva
        Dim profit As Double = 0
        Dim Pprof As Double = 0
        For i As Integer = 0 To Buy.Count - 1
            For j As Integer = 0 To Sell.Count - 1
                profit = ((Sell(j)) - (Buy(i))) * Buy.Count
                Pprof = (profit / Buy(i)) * 100
                If profit > 0 Then
                    RichTextBox1.AppendText(vbCrLf & "Buy" & "       " & "Sell" & "       " & "Profit" & "           " & "%")
                    RichTextBox1.AppendText(vbCrLf & Buy(i).ToString("#.##").PadLeft(7) & Sell(j).ToString("#.##").PadLeft(7) & profit.ToString("#.##").PadLeft(8) & Pprof.ToString("#.##").PadLeft(13))
                End If
            Next
        Next


        g.Clear(Color.White)

        g.DrawLines(Pens.Black, PSs.ToArray)
        g.DrawLines(Pens.GreenYellow, PAvg.ToArray)
        g.DrawLines(Pens.Gold, PAvgMobile.ToArray)
        g.DrawLines(Pens.Blue, PDeviazioneSup.ToArray)
        g.DrawLines(Pens.Blue, PDeviazioneInf.ToArray)

        elipse()
        g.DrawRectangle(Pens.Black, r)
        PictureBox1.Image = B

        Dim drawFont2 As New Font("Arial", 12, FontStyle.Bold)
        g.DrawString("TRADING GRAPHIC", drawFont2, Brushes.Black, 300, 10)
    End Sub

    'Funzione MouseDown farvi sapere quale pulsante è stato premuto i la posizione all'interno del controllo
    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
  

        'Contains() determina se un elemento è contenuto nella lista.
        If Not r.Contains(e.X, e.Y) Then Exit Sub
        If e.Button = Windows.Forms.MouseButtons.Left Then
            'la mano Cursor in genere indica che il puntatore si trova sopra un collegamento
            'modificare il cursore del mouse
            Cursor = Cursors.Hand
        ElseIf e.Button = Windows.Forms.MouseButtons.Right Then
            'Ottiene un nord-ovest a due picchi o verso sud-est il ridimensionamento Cursor
            'modificare il cursore del mouse
            Cursor = Cursors.SizeNWSE
        End If

        'Salvare posizione corrente del mouse e del rettangolo
        xiniziale = e.X
        yiniziale = e.Y
        rxiniziale = r.X
        ryiniziale = r.Y
        LarghezzaIniziale = r.Width
        AltezzaIniziale = r.Height

        'abilitare il flag
        draggingMove = True

    End Sub

    'La funzione MouseMove ci permette di modificare la posizione di rectangolo
    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove

   
        If Not draggingMove Then Exit Sub

        'Aggiorniamo le nuove coordinate del rettangolo
        dx = e.X - xiniziale
        dy = e.Y - yiniziale

        'condicione If per modificare le coordinate
        If e.Button = Windows.Forms.MouseButtons.Left Then
            'Se il pulsante sinistro del mouse è stato premuto applico al nuovo vertice del rettangolo
            r.X = rxiniziale + dx
            r.Y = ryiniziale + dy
        Else
            'Modifichiamo l'altezza e la larghezza
            r.Width = LarghezzaIniziale + dx
            r.Height = AltezzaIniziale + dy

        End If

        r = New Rectangle(r.X, r.Y, r.Width, r.Height)


        PSs = New List(Of PointF)
        For Each punto As PointF In listSerieStorica
            xt = r.Left + (punto.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto.Y - minY) / (maxY - minY) * r.Height
            PSs.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PAvg = New List(Of PointF)
        For Each punto1 As PointF In SerieAvg
            xt = r.Left + (punto1.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto1.Y - minY) / (maxY - minY) * r.Height
            PAvg.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PAvgMobile = New List(Of PointF)
        For Each punto2 As PointF In SerieAvgMobile
            xt = r.Left + (punto2.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto2.Y - minY) / (maxY - minY) * r.Height
            PAvgMobile.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PDeviazioneSup = New List(Of PointF)
        For Each punto3 As PointF In SerieDeviazioneSup
            xt = r.Left + (punto3.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto3.Y - minY) / (maxY - minY) * r.Height
            PDeviazioneSup.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PDeviazioneInf = New List(Of PointF)
        For Each punto4 As PointF In SerieDeviazioneInf
            xt = r.Left + (punto4.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto4.Y - minY) / (maxY - minY) * r.Height
            PDeviazioneInf.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PSell = New List(Of PointF)
        For Each punto5 As PointF In SerieSell
            xt = r.Left + (punto5.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto5.Y - minY) / (maxY - minY) * r.Height
            PSell.Add(New PointF(CSng(xt), CSng(yt)))
        Next

        PBuy = New List(Of PointF)
        For Each punto6 As PointF In SerieBuy
            xt = r.Left + (punto6.X - minX) / (maxX - minX) * r.Width
            yt = r.Bottom - (punto6.Y - minY) / (maxY - minY) * r.Height
            PBuy.Add(New PointF(CSng(xt), CSng(yt)))
        Next




        g.Clear(Color.White)

        g.DrawLines(Pens.Black, PSs.ToArray)
        g.DrawLines(Pens.GreenYellow, PAvg.ToArray)
        g.DrawLines(Pens.Gold, PAvgMobile.ToArray)
        g.DrawLines(Pens.Blue, PDeviazioneSup.ToArray)
        g.DrawLines(Pens.Blue, PDeviazioneInf.ToArray)

        g.DrawRectangle(Pens.Black, r)
        PictureBox1.Image = B
        elipse()
        Dim drawFont2 As New Font("Arial", 12, FontStyle.Bold)
        g.DrawString("TRADING GRAPHIC", drawFont2, Brushes.Black, 300, 10)


    End Sub

    'Funzione MouseUp ci permette di trarre il rectangolo quando il pulsante del mouse viene rilasciato
    Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp

        'flag per spostare il controllo
        draggingMove = False

        'modificare il cursore
        Cursor = Cursors.Default


    End Sub

    Private Sub elipse()
        For Each punto As PointF In PSell
            g.DrawEllipse(Pens.Red, punto.X, punto.Y, 9, 9)
        Next
        For Each punto As PointF In PBuy
            g.DrawEllipse(Pens.Green, punto.X, punto.Y, 9, 9)
        Next
    End Sub
    Private Sub NumericUpDown1_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged


    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

End Class


Profit and loss

DEFINIZIONE DI PROFIT AND LOSS:
Una dichiarazione profitti e perdite (P & L) è un bilancio che riassume i ricavi, i costi e le spese sostenute durante un determinato periodo di tempo, di solito un trimestre fiscale o anno. Queste registrazioni forniscono informazioni circa la capacità di un'azienda - o la sua assenza - di generare profitto da aumentare le entrate, riducendo i costi, o di entrambi. La dichiarazione P & L è indicato anche come "dichiarazione di profitti e perdite", "conto economico", "conto economico", "dichiarazione di risultati finanziari," e "reddito e dichiarazione di spesa." 

Si inizia con una voce per le entrate , conosciuta come la "top line", e sottrae i costi delle attività commerciali, tra cui il costo del venduto , le spese di funzionamento , oneri fiscali e interessi passivi . La differenza, nota come la linea di fondo , è l'utile netto , indicato anche come il profitto o guadagno . 






Come procedo in Visual Basic?
Con questo esercizio, considerando un titolo e il suo prezzo, ci poniamo l’obiettivo di realizzare una strategia che permetta di vedere se si ha un profitto attraverso la vendita e l’acquisto di titoli.
Supponiamo che il prezzo iniziale di un titolo sia 2000. I successivi prezzi del titolo saranno calcolati con la seguente formula :
Pn =Pn-1 -( k + m * passo ) * d
dove k, m e d rappresentano dei parametri da inserire nelle NumericUpDown.
In una delle NumericUpDown viene inserita anche la posizione che indica il numero delle azioni che devono essere acquistate ad ogni passo.
Ad ogni passo verrà calcolato il prezzo corrente del titolo, la somma spesa nel complesso, il prezzo medio, la perdita, il retracement ed il retracement relativo.
Il retracement indica il rialzo necessario per realizzare un profitto, mentre il retracement relativo indica di quanto deve salire il prezzo rapportato alla caduta totale.
Nel form sono state inserite, oltre alla RichTextBox, in cui appariranno i dati, 2 RichTextBox più piccole, in cui specificare il target scelto e il prezzo iniziale, e 4 NumericUpDown per la posizione, i parametri a e b e la costante d.
Questa formula però non descrive bene l’andamento dei prezzi azionari, in quanto questi sono sempre decrescenti e non si ha quindi mai profitto. 
Risultato:


Script del programma in visual basic:





In generale le opzioni sono molto semplici e possono essere rappresentate con un grafico che evidenzia il profilo di rendimento a scadenza in funzione del prezzo del sottostante. In sintesi, si hanno le seguenti possibili posizioni, che possono essere combinate in strategie più complesse.

Consideriamo un operatore che detenga titoli in portafoglio. Il suo profitto o la sua perdita sono direttamente proporzionali alla variazione del prezzo nel tempo (P).
Nel grafico seguente viene rappresentato il profilo di profitti e perdite in funzione del prezzo del titolo, dove Po è il prezzo corrente del titolo ("spot") ovvero, nel caso considerato, il prezzo d'acquisto del titolo.

In termini matematici, si ha:
P&L = P - P0
Nel caso in cui il prezzo rimanga invariato a P0 non si ha nè perdita ne profitto, se il prezzo cresce, il profitto è pari alla differenza fra il prezzo corrente e il prezzo d'acquisto, se il prezzo invece scende la perdita è invece pari alla differenza fra il prezzo d'acquisto e il prezzo di mercato. Esiste in entrambe le ipotesi una relazione di diretta proporzionalità.
Consideriamo ora il caso speculare di un operatore che abbia venduto allo scoperto dei titoli.

Il profilo profitti e perdite è rappresentabile dalla seguente equazione:
P&L = P0 - P
Simmetricamente rispetto al caso precedente, se il prezzo rimane invariato a P0 non si ha nè perdita ne profitto, se il prezzo diminuisce, il profitto è pari alla differenza fra il prezzo di vendita ed il prezzo di mercato se il prezzo invece sale, la perdita è pari alla differenza fra il prezzo di mercato e il prezzo di vendita. Si può notare come in questo caso esiste una relazione di inversa proporzionalità in entrambe le ipotesi (di crescita o diminuzione del prezzo).
Consideriamo il caso di un operatore che acquista un'opzione CALL su un titolo con prezzo d'esercizio pari a P0: l'acquirente di tale opzione paga un premio iniziale per acquisire il diritto di comprare i titoli a P0.
Pertanto, nel caso in cui alla scadenza dell'opzione il prezzo del titolo sia pari o inferiore a Po l'acquirente dell'opzione call non esercita l'opzione perdendo il premio; qualora, invece, il prezzo del titolo sia maggiore di Po, allora l'opzione verrà esercitata e genererà un profitto illimitato pari alla differenza fra il prezzo di mercato ed il prezzo d'esercizio, diminuito del premio pagato.
In sintesi si ha:
P&L = max[0, (P - Po)] - premio
Per il compratore di un'opzione call, quindi, a fronte di una perdita limitata (premio) si apre una prospettiva di utile potenzialmente illimitato nel caso di rialzo dei prezzi come si vede dal grafico seguente:

Consideriamo ora il caso di un operatore che vende un'opzione CALL su un titolo con prezzo d'esercizio pari a Po: il venditore di tale opzione incassa un premio iniziale a fronte del rischio di dover vendere i titoli a Po.
Pertanto, nel caso in cui alla scadenza dell'opzione il prezzo del titolo sia pari o inferiore a Po l'acquirente dell'opzione call non esercita l'opzione perdendo il premio; qualora il prezzo del titolo sia maggiore di Po allora l'opzione verrà esercitata e genererà per il venditore una perdita illimitata pari alla differenza fra il prezzo di mercato e il prezzo d'esercizio, diminuito del premio incassato.
P&L = -max[0, (P - Po)] + premio
Per il venditore di un'opzione call, quindi, a fronte di un ricavo limitato (premio) si apre un rischio di potenziale perdita illimitata nel caso di rialzo dei prezzi, come mostra il grafico seguente:

Consideriamo ora il caso di un operatore che acquista un'opzione PUT su un titolo con prezzo d'esercizio pari a Po: l'acquirente di tale opzione paga un premio iniziale per acquisire il diritto di vendere i titoli a Po.
Pertanto, nel caso in cui alla scadenza dell'opzione il prezzo del titolo sia pari o superiore a Po l'acquirente dell'opzione put non esercita l'opzione perdendo il premio; qualora, invece, il prezzo del titolo sia inferiore a Po, allora l'opzione viene esercitata e genera per l'acquirente un profitto illimitato pari alla differenza fra il prezzo d'esercizio ed il prezzo di mercato, diminuito del premio pagato.
In sintesi, si ha:
P&L = max[0,(Po - P)] - premio
Per il compratore di un'opzione put, quindi, a fronte di una perdita limitata (premio) si apre una prospettiva di potenziale utile illimitato nel caso di ribasso dei prezzi, come mostra il grafico seguente:

Consideriamo infine, il caso di un operatore che vende un'opzione PUT su un titolo con un prezzo d'esercizio pari a Po: il venditore di tale opzione incassa un premio iniziale a fronte del rischio di dover acquistare i titoli a Po.
Pertanto, nel caso in cui alla scadenza dell'opzione il prezzo del titolo sia pari o inferiore a Po l'acquirente dell'opzione put non esercita l'opzione perdendo il premio, qualora, invece, il prezzo del titolo sia maggiore di Po, allora l'opzione verrà esercitata e genererà per il venditore una perdita illimitata pari alla differenza fra il prezzo d'esercizio ed il prezzo di mercato, diminuito del premio incassato.
In sintesi, si ha:
P&L = - max[0,(Po - P)] + premio
Per il venditore di un'opzione put, quindi, a fronte di un ricavo limitato (premio) si apre un rischio di potenziale perdita illimitata nel caso di ribasso dei prezzi, come mostra il grafico seguente:

Asimmetria del profilo di rendimento

La caratteristica peculiare delle opzioni è la cosiddetta "asimmetria del profilo di rendimento" o "asimmetria nella distribuzione del pay-off".
L'acquirente di un'opzione call paga un premio per avere il diritto di acquistare un bene ad un determinato prezzo. Se a scadenza (opzione europea) o entro la scadenza (opzione americana) il prezzo dell'attività sottostante rimane inferiore al livello del prezzo d'esercizio, l'acquirente del call non eserciterà l'opzione perdendo soltanto il premio pagato. Viceversa, se il prezzo dell'attività sottostante è più alto, eserciterà l'opzione garantendosi un profitto variabile pari alla differenza fra il prezzo corrente dell'attività ed il prezzo d'esercizio (meno il costo dell'opzione).
Esiste pertanto una sostanziale asimmetricità nell'esposizione al rischio tra le due controparti del contratto. L'acquirente di un diritto del tipo call, ad esempio, paga un premio e, quindi, un costo predefinito, al fine di trovarsi nella condizione potenziale di realizzare un profitto illimitato. Il venditore, al contrario è esposto ad un rischio di perdita illimitata a fronte di un profitto predeterminato pari al premio ricevuto.
Possiamo così concludere che l'opzione costituisce l'unico strumento derivato che permette di trarre profitto da una stabilità dei prezzi.

Tutto P & L si basano su una formula molto semplice – le vendite meno costi uguale profitto. E ‘davvero così semplice. Tutto il resto è una questione di scoppiare vendite o dei costi in modo più dettagliato e l’aggiunta di subtotali. Le vendite sono in genere visualizzati nella parte superiore del P & L. I costi sono riportati di seguito le vendite e il profitto è in fondo. Si può vedere un certo numero di subtotali come si guarda verso il basso la colonna, ma è ancora vendite meno costi pari profitto.
PNL=REALIZED+UNREALIZED+COMMISSION
dove REALIZED= profitto+perdita
quindi bisogna definire:
istante 
prezzo
quantità
commissione
tipologia buy/sell