Data Mining Algoritmi e Programmazione Turning Point · Prima di proiettarsi sul discorso riguardo...

14
1 Data Mining Algoritmi e Programmazione Turning Point Professore: A cura di: Tommaso Gastaldi Nello Procaccioli

Transcript of Data Mining Algoritmi e Programmazione Turning Point · Prima di proiettarsi sul discorso riguardo...

1

Data Mining Algoritmi e Programmazione

Turning Point

Professore: A cura di:

Tommaso Gastaldi Nello Procaccioli

2

DEFINIZIONE ASK E BID

Prima di proiettarsi sul discorso riguardo l’algoritmo da utilizzare per il calcolo del turning point, vorrei analizzare tutti i passi effettuati per arrivare a questo, partendo dalla definizione di Ask e Bid. Che cos’è il prezzo Ask e il prezzo Bid?

Il prezzo Bid è il prezzo al quale il dealer è disposto ad acquistare uno strumento finanziario. Il prezzo Ask è quello al quale il dealer è disposto a vedere uno strumento finanziario. Il prezzo Ask (detto anche offer) è superiore al prezzo Bid. Il cosiddetto best Bid è il più elevato prezzo Bid presente sul mercato. Analogamente, è detto best Ask il più basso prezzo Ask presente sul mercato. Il concetto Bid-Ask spread è applicabile anche ai mercati ad asta e in tal senso è dato dalla differenza tra la miglior proposta in vendita e la miglior proposta in acquisto, presenti sul mercato.

Che cos’è lo Spread tra Ask e Bid? Lo Spread non è altro che la differenza tra Ask e Bid. Il Bid-Ask spread è la differenza tra best Ask e best Bid. Con riferimento all’operatività del dealer, il Bid-Ask spread è il margine di profitto lordo di tale intermediario, che negozia strumenti di proprietà appartenenti al proprio portafoglio. Negli ordini istantanei infatti lo spread è decisamente più facile da leggere perché lo vuoi vedere direttamente sul grafico tick oppure sopra i tasti Vendi/Compra della finestra ordine. Negli ordini pendenti invece il broker esegue gli ordini esattamente al prezzo da te indicato ( al netto dell’eventuale slippage) e pertanto aprirà e chuderà gli ordini a prezzi comprensivi di spread. Tuttavia si tratta di impostazioni che variano da broker a broker. Nello specifico, analizzando quello che avviene nella finestra ordine, è necessario precisare che se fai un rodine di acquisto (posizione long) devi pensare che il broker ti darà l’eseguito Ask nonostante tu abbia richiesto Bid. Infatti il broker aggiunge al prezzo Bid qualche pips di spread e in seguito ti fornisce l’eseguito al prezzo Ask. Allo stesso modo se fai un ordine di vendita (posizione short) devi pensare che il broker ti fornirà l’eseguito sempre al prezzo Ask nonostante tu abbia richiesto il Bid, ma in questo caso il broker aggiunge qualche pips.

3

Il colore della casella VENDI è rosso come il prezzo di Bid; Il colore della casella COMPRA è celeste come il prezzo di Ask;

Tale grafico è impostato sul prezzo Bid, pertanto se si vuole chiudere una posizione short si deve considerare il prezzo Ask e viceversa, se si vuole chiudere una posizione long si deve considerare il prezzo di Bid. Dopo aver fatto una breve introduzione riguardo gli Ask e i Bid proseguiamo il percorso andando ad illustrare tutti i passaggi effettuati per creare una serie storica che visualizzi l’andamento dei prezzi. La prima cosa che ci si chiede è : cos’è una serie storica? Una serie storica si definisce come un insieme di variabili casuali ordinate rispetto al tempo, ed esprime la dinamica di un certo fenomeno nel tempo. Le serie storiche vengono studiate sia per interpretare un fenomeno, individuando componenti di trend, di ciclicità, di stagionalità e/o di accidentalità, sia per prevedere il suo andamento futuro. In generale, quando si parla di serie si intende la classificazione di diverse osservazioni di un fenomeno rispetto ad un carattere qualitativo. Se tale carattere è il tempo, la serie viene denominata serie storica o temporale. La variabili, ossia il fenomeno preso in considerazione, può essere osservato in dati istanti di tempo o alla fine di periodi di lunghezza definita. Le serie storiche possono essere di due tipi: Deterministico: se i valori della variabile possono essere esattamente

determinati sulla base dei valori precedenti. Stocastico: se i valori delle variabili possono essere determinati sulla

base dei valori precedenti solo in misura parziale.

4

La maggioranza delle serie storiche è di tipo stocastico e si rivela quindi impossibile elaborare previsioni prive di errore.

Nel nostro programma per generare una serie di prezzi abbiamo utilizzato i generatori pseudocasuali. Per fare questo è importante definire:

1. Il prezzo iniziale.

2. Tick (Variazione minima).

Si è inoltre stabilito che il prezzo successivo Pi+1 deve essere uguale al prezzo precedente +- Tick in base al valore 0 o 1 della variabile Bernoulliana. Per effettuare una generazione di numeri casuali è stato utilizzato l’oggetto random che rappresenta un generatore di numeri peseudo-casuali. Il random walk è un percorso dove ogni passo ha una direzione casuale e possibilmente anche una dimensione casuale. Le cosiddette passeggiate aleatorie sono utilizzate come modelli per studiare fenomeni variabili coma la diffusione e il prezzo di attività finanziarie. L’espressione di un Random Walk è:

Pt = Pt-1 + Et

Dove:

o Pt = Indica il prezzo dell’azione al tempo t.

o Pt-1 = Indica il prezzo dell’azione al tempo t-1

o Et = Indica il White Noise

Questo appena descritto non viene considerato un modello utilizzabile per i prezzi perché, nel caso in cui viene generato un numero di prezzi sufficientemente elevato, si possono ottenere valori negativi perdendo cosi significato. Il modello cosi ottenuto non è realistico. Dopo aver illustrato le tecniche per definire il programma, andiamo a vedere alcuni passi fondamentali per la costruzione:

1) Viene creata la classe Osservazione_prezzo: Public Class osservazione_prezzo

Public istante As Date

Public prezzo As Decimal

End Class

5

2) Si creano le liste dei prezzi BID e ASK:

Dim lista_oss_casuali_bid As New List(Of osservazione_prezzo)

Dim lista_oss_casuali_ask As New List(Of osservazione_prezzo)

3) Si creano dei riferimenti temporali:

Dim Origine As Date = New Date(Now.Year, Now.Month, Now.Day, 0,

0, 0)

Dim istanteprec As Date = Origine

Dim istantecorrente As Date

4) Si procede con la creazione dei prezzi: Dim prezzoiniziale As Decimal = 10000

Dim prezzoprec As Decimal = prezzoiniziale

Dim prezzocorrente As Decimal

5) Si generano dei numeri casuali attraverso il ciclo for:

For i As Integer = 1 To 1000

If Me.rnd.NextDouble < 0.5 Then

prezzocorrente = prezzoprec - tick

Else

prezzocorrente = prezzoprec + tick

End If

istantecorrente = istanteprec.AddSeconds(Me.rnd.Next(5,

61))

6

6) Si creano le liste di osservazioni casuali:

Dim oss_bid As New osservazione_prezzo

With oss_bid

.prezzo = prezzocorrente

.istante = istantecorrente

End With

lista_oss_casuali_bid.Add(oss_bid)

Dim oss_ask As New osservazione_prezzo

With oss_ask

.prezzo = prezzocorrente + tick

.istante = istantecorrente

End With

lista_oss_casuali_ask.Add(oss_ask)

7) Si determinano i minimi e i massimi:

Dim x_bid As Single = CSng((oss_bid.istante -

Origine).TotalSeconds)

Dim y_bid As Single = oss_bid.prezzo

Dim x_ask As Single = CSng((oss_ask.istante -

Origine).TotalSeconds)

Dim y_ask As Single = oss_ask.prezzo

ListaPuntiNonTrasformati_bid.Add(New PointF(x_bid, y_bid))

ListaPuntiNonTrasformati_ask.Add(New PointF(x_ask, y_ask))

If minX > x_bid Then minX = x_bid

If maxX < x_bid Then maxX = x_bid

If minY > y_bid Then minY = y_bid

If maxY < y_ask Then maxY = y_ask

istanteprec = istantecorrente

prezzoprec = prezzocorrente

8) Si definisce una funzione in cui si crea una lista dei punti trasformati:

Function CalcolaListaPuntiTrasformati(ByVal minx As Double, ByVal

maxx As Double, ByVal miny As Double, ByVal maxy As Double, _

ByVal

listapuntinontrasformati As List(Of PointF)) As List(Of Point)

7

Dim listapuntitrasformati As New List(Of Point)

For Each puntonontrasformato As PointF In

listapuntinontrasformati

Dim x As Integer = CInt(mybitmap.Width *

(puntonontrasformato.X - minx) / (maxx - minx))

Dim y As Integer = mybitmap.Height - CInt(mybitmap.Height

* (puntonontrasformato.Y - miny) / (maxy - miny))

listapuntitrasformati.Add(New Point(x, y))

Next

Return listapuntitrasformati

End Function

9) Viene definito il disegno delle liste dei punti trasformati:

Me.mygraphics.FillRectangle(Brushes.White, New

Rectangle(Point.Empty, New Size(Me.mybitmap.Width,

Me.mybitmap.Height)))

Me.mygraphics.DrawLines(Pens.Maroon,

ListaPuntiTrasformati_bid.ToArray)

Me.mygraphics.DrawLines(Pens.Blue,

ListaPuntiTrasformati_ask.ToArray)

Me.PictureBox1.Image = Me.mybitmap

8

Costruito il progetto attraverso i 9 passaggi andiamo a visualizzare il risultato:

DEFINIZIONE DI TURNING POINT

I turning point sono dei particolari livelli di prezzo, calcolati mediante semplici formule matematiche che consentono di determinare dei possibili valori di supporto e resistenza per la seduta successiva. I Turning vengono maggiormente utilizzati dai trader che lavorano in intra –day su Cowered Warrant ed i derivati in generale che hanno necessità di prendere determinati livelli di prezzo a cui entrare e uscire nel corso della seduta. Questi punti vengono presi in considerazione per determinare la direzione primaria del mercato identificando i principali livelli di supporto e di resistenza. Tali livelli possono anche essere utilizzati per generare livelli validi in un’ottica settimanale o mensile anche ai singoli titoli azionari ed indici.

Dopo aver brevemente descritto il turning point, si procede con la definizione dei metodi o algoritmi scelti per il calcolo di tali punti di massimo o minimo “picchi”.

9

Il nostro principale obiettivo è quello di trovare degli algoritmi veloci ed efficaci, che ci aiutino a individuare il momento in cui vendere o acquistare un titolo finanziario. Si tratta in particolare di due metodi:

A. Il primo metodo scelto riguarda l’utilizzo delle medie mobili. La media mobile per definizione, è uno strumento utilizzato per l’analisi di serie storiche. Esse vengono utilizzate principalmente nell’analisi tecnica. Esistono diversi tipi di medie mobili, che si differenziano tra loro per la formula di calcolo. I tipi principali sono:

i. Media Mobile Semplice. La media mobile semplice è la più utilizzata dagli analisti ed è quella più facile per quanto riguarda il calcolo. Vengono presi dei dati di un determinato periodo e ne viene calcolata la media sommandoli fra loro e dividendo per il numero totale di valori. Tale media è spesso criticata, in quanto assegna la stessa importanza ad ogni singolo dato.

10

ii. Media Mobile Ponderata. Per ovviare al problema delle medie mobili semplici è stata creata la Media Mobile Ponderata. Il suo calcolo prevede che, prendendo in esame una media mobile composta da 10 periodi, la chiusura del decimo venga moltiplicata per 10, quella del 9 per nove e cosi fino alla fine. In questo modo si riesce a dare maggior peso agli ultimi valori.

iii. Media Mobile Esponenziale. La Media Mobile Esponenziale viene generata da un sistema di calcolo complesso che cerca di eliminare le carenze della media mobile semplice. Viene dato un peso differente ai vari prezzi, un peso maggiore quelli più recenti uno minore quelli più vecchi.

11

iv. Media Mobile Adattiva. Uno dei principali problemi riscontrati nell’utilizzo della media mobile riguarda la scelta del periodo da utilizzare. Mentre la media mobile veloce può risultare più efficace in un mercato che si muove poco, una più lenta sarà preferibile in un mercato con un trend ben definito. Per ovviare a questo problema è stata creata una media mobile che, utilizzando uno studio sulla volatilità presente nel mercato, adatta la sua velocità. I calcoli su cui si basa questa media non sono di facile apprendimento e si basano su concetti avanzati di statistica e matematica.

12

B. Il secondo metodo analizzato è quello che è stato attuato nel mio progetto. In tale algoritmo il calcolo del turning point avviene attraverso la differenza dei due prezzi, il prezzo corrente e il prezzo precedente del titolo. Vengono incrementati i punti buy e sell. Quando per uno dei due si arriva a un massimo di 10 punti nello stesso trend, l’ultimo viene memorizzato come un punto di svolta. Il codice è il seguente:

If prezzoprec > prezzocorrente Then

buy += 1 'bid

Else

sell += 1 'ask

End If

If buy >= 10 And sell = 1 Then

listapicchiB.Add(oss_bid)

Dim picco As New picco

With picco

.istante = istantecorrente

.prezzo = prezzocorrente

.Tipo_picco = picco.TipoPicco.buy

End With

listapicchi.Add(picco)

buy = 0

sell = 0

End If

If sell >= 10 And buy = 1 Then

listapicchiS.Add(oss_ask)

Dim picco As New picco

With picco

.istante = istantecorrente

13

.prezzo = CDec(prezzocorrente + tick)

.Tipo_picco = picco.TipoPicco.sell

End With

listapicchi.Add(picco)

buy = 0

sell = 0

End If

If buy > 1 And sell > 1 Then

buy = 0

sell = 0

End If

istanteprec = istantecorrente

prezzoprec = prezzocorrente

If listapicchi.Count > 0 Then

If ((prezzocorrente >= 1.01 * listapicchi.Last.prezzo) Or

(prezzocorrente <= 0.99 * listapicchi.Last.prezzo)) Then

Dim punto As New osservazione_prezzo

With punto

.istante = istantecorrente

.prezzo = prezzocorrente

End With

listapicchi.Last.PuntoChiusura = punto

End If

Il risultato dell’algoritmo:

14