Esempi di strategie di trading algoritmico utilizzate

Esistono quattro tipi principali di strategie di trading: scalping, day trading, swing trading e position trading. Differenti stili di trading dipendono dal periodo e dalla durata del periodo di apertura.

Scalping Lo scalping è la forma di trading più a breve termine. Questi trader mantengono le posizioni aperte solo per secondi o minuti al massimo. Queste operazioni di breve durata hanno come obiettivo piccoli movimenti dei prezzi infragiornalieri. Lo scopo è quello di fare molte negoziazioni rapide con guadagni più piccoli, ma lasciare che i profitti si accumulino durante il giorno a causa del solo numero di negoziazioni eseguite in ogni sessione di negoziazione.

Day trading I trader giornalieri entrano ed escono dalle loro posizioni nello stesso giorno, eliminando il rischio di grandi spostamenti durante la notte. Alla fine della giornata, chiudono la loro posizione con un profitto o una perdita. Le negoziazioni si svolgono generalmente per un periodo di minuti o ore e, di conseguenza, richiedono tempo sufficiente per analizzare i mercati e monitorare frequentemente le posizioni durante il giorno. Proprio come i commercianti di cuoio capelluto, i commercianti diurni fanno affidamento su piccoli guadagni frequenti per costruire profitti.

Swing trading A differenza dei day trader che detengono posizioni per meno di un giorno, i traders swing in genere mantengono posizioni per diversi giorni, anche se a volte per alcune settimane. Poiché le posizioni vengono mantenute per un certo periodo di tempo, al fine di cogliere movimenti di mercato a breve termine, gli operatori non devono sedersi costantemente monitorando i grafici e le loro operazioni durante il giorno

Position trading I trader di posizione sono focalizzati sul movimento dei prezzi a lungo termine, cercando i massimi profitti potenziali da ottenere da importanti cambiamenti di prezzo. Di conseguenza, le negoziazioni generalmente si estendono per un periodo di settimane, mesi o addirittura anni. I trader di posizione tendono a utilizzare i grafici dei prezzi settimanali e mensili per analizzare e valutare i mercati, utilizzando una combinazione di indicatori tecnici e analisi fondamentali per identificare i potenziali livelli di entrata e uscita

Bollinger Bands

La Bande di Bollinger, chiamate anche Bollinger Bands, sono un tipo di analisi tecnica inventata da John Bollinger negli anni 90. Sono degli indicatori che possono essere utilizzati per misurare “l’altezza” o la “bassezza” di un prezzo, relativo alle posizioni precedenti. Le bande di Bollinger sono formate da:

  • Una Media Mobile (MA) di (N) Periodi
  • Una banda superiore ripetuta (K) volte che è una deviazione standard di (N) periodi, che viene posta al di sopra della media mobile (MA + Kσ)
  • Una banda inferiore ripetuta (K) volte che è una deviazione standard di (N) periodi, che viene posta al di sotto della media mobile (MA – Kσ)

I valori tipici di N e K sono spesso 20 e 2 rispettivamente. La scelta standard per la media mobile è di tipo Simple Moving Average (Media Mobile Semplice). Spesso viene anche utilizzata la Media Mobile Esponenziale, ma è comunque una seconda scelta, dipende anche da come il trader si trova con questo tipo di analisi tecnica. Importante ricordare anche che il solito lasso di tempo è usato sia per la banda centrale e il calcolo della deviazione standard. Le Bande di Bollinger servono principalmente per definire, in un grafico, i massimi e i minimi. Secondo la definizione, i prezzi sono alti nella parte superiore della banda e bassi nella banda inferiore.

Moving averages

In statistica, la media mobile è uno strumento utilizzato per l’analisi di serie storiche. In particolare, le medie mobili vengono ampiamente utilizzate nell’analisi tecnica. Data una serie storica \{y_{t}\},\quad t=1,2,\dots ,T, contenente i valori osservati di una variabile Y dal tempo 1 al tempo T, siano:

  • m_{1} il numero dei periodi precedenti a t;
  • m_{2} il numero dei periodi successivi a t;
  • \theta _{i} il peso da attribuire all’i-esimo valore osservato;

si definisce media mobile al tempo t il valore:

{\displaystyle mm_{t}={\frac {1}{k}}\sum _{i=-m_{1}}^{m_{2}}\theta _{i}y_{t+i}}

dove:

  • k=m_{1}+m_{2}+1 è il periodo o l’ordine della media mobile, ed equivale al numero degli addendi

Una media mobile viene detta:

  • semplice se i pesi \theta _{i} sono tutti uguali a 1 (in tal caso, si tratta di una normale media aritmetica);
  • centrata se m_{1}=m_{2};
  • simmetrica se centrata e se \theta _{{i-m}}=\theta _{{i+m}} per ogni m compreso tra 1 e m_{1}=m_{2}.

Esistono diversi tipi di medie mobili che differiscono tra loro semplicemente nella formula di calcolo generando così segnali più o meno sensibili alle variazioni dei dati. I principali sono i seguenti, considerati – per fissare le idee – con riferimento a dati che sono prezzi:

Media mobile semplice (SMA) Detta anche aritmetica, rimane quella più usata dagli analisti e di più facile calcolo. Vengono presi i dati di un determinato periodo e ne viene calcolata la media sommandoli fra loro e dividendo per il numero totale di valori. Questo tipo di media però viene spesso criticata da molti in quanto assegna la stessa importanza ad ogni singolo dato: in una media mobile a 100 periodi l’ultimo valore ha la stessa importanza, 1% di “peso”, del primo valore.

Media mobile ponderata (WMA) Sono state ideate per ovviare al problema delle medie mobili semplici riguardo al peso da assegnare ai valori presi in considerazione. Il suo calcolo prevede che, prendendo in esame una media mobile a 10 periodi, la chiusura del decimo giorno venga moltiplicata per 10, quella del nono giorno per nove, dell’ottavo giorno per otto e così via. Così facendo si dà maggior peso agli ultimi valori; il totale verrà poi diviso per la somma dei multipli, ovvero nel nostro caso sarà diviso per 1+2+3+…+10=55.
Resta il fatto che nonostante le varianti di calcolo anche questa media mobile non riesce a dare istantaneamente un’idea di quello che sta accadendo sul mercato.

WMA=(C_{1}*1+C_{2}*2+C_{3}*3+...+C_{n}*n)/(1+2+3+...+n)

Media mobile esponenziale (EMA)   Questa media mobile viene generata da un sistema di calcolo molto più complesso che cerca sempre di eliminare le carenze della media mobile semplice. Viene quindi dato un peso differente ai vari prezzi, maggiore ai più recenti e minore a quelli più vecchi, fatto che porta molti a definirla media mobile ponderata esponenziale. Nonostante dia un’importanza minore ai prezzi passati li include ugualmente nel suo calcolo prendendo in esame quindi molti più valori di quelli definiti dal periodo della media mobile. Resta di fatto un indicatore quasi impossibile da generare se non attraverso il computer in quanto la sua formula resta di difficile calcolo per qualsiasi analista.

Media mobile adattiva Uno dei problemi riscontrati nell’uso 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 Perry Kaufman ha ideato una media mobile che, utilizzando uno studio sulla volatilità presente nel mercato, adatta la sua velocità. I calcoli e la teoria su cui si basa questo tipo di media mobile non sono di facile apprendimento e si basano su concetti abbastanza avanzati sia di statistica che matematica. È stato anche concepito un efficiency ratio, o rapporto di efficienza, che mette a confronto movimento dei prezzi con il livello di volatilità. Quando rapporto di efficienza è elevato, il movimento è maggiore della volatilità, favorendo la media più veloce; quando è basso, la volatilità è maggiore del movimento, il che favorisce una media mobile più lenta. Incorporando l’efficiency ratio si verifica un aggiustamento automatico della media mobile adattiva alla velocità più opportuna per il mercato corrente.

Processi stocastici con mean reversion: Ornstein–Uhlenbeck process, Dixit & Pindyck Model, Vasicek model

Molti strumenti finanziari, come le materie prime (o commodities) presentano delle fluttuazioni intorno al prezzo di equilibrio. Il moto browniano non sarà più una path efficiente poiché presenta una varianza proporzionale al tempo e quindi non va bene per le commodities perché la fluttuazione del prezzo non verrebbe vista usando questo tipo di path: devo introdurre il concetto di mean reversion. Per introdurre la mean reversion devo introdurre il modello di Ornstein–Uhlenbeck: esso è una
variante del moto browniano in cui la variazione di prezzo generalizzato è pari a

Rispetto alla formula equivalente del moto browniano notiamo come la componente sistematica μ sarà sostituita da

Esso indica che esiste una costante theta che riporta il prezzo ad un livello di
equilibrio tanto più forte quanto mi allontano da quest’ultimo.
Forma geometrica:

Breve nota di utilizzo sui componenti: Timer, Backgroud worker. E sulla nozione di “extension method”

Il Timer Class implementa un timer con il quale viene generato un evento a intervalli definiti dall’utente. Questo timer è ottimizzato per l’uso in applicazioni Windows Forms e deve essere usato in una finestra. Nell’esempio seguente viene implementato un timer di intervallo semplice, che imposta un allarme ogni cinque secondi. Quando si verifica l’allarme, un MessageBox visualizza un conteggio del numero di volte in cui l’allarme è stato avviato e chiede all’utente se l’esecuzione del timer deve continuare.

public class Class1 {
    static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
    static int alarmCounter = 1;
    static bool exitFlag = false;
 
    // This is the method to run when the timer is raised.
    private static void TimerEventProcessor(Object myObject,
                                            EventArgs myEventArgs) {
       myTimer.Stop();
 
       // Displays a message box asking whether to continue running the timer.
       if(MessageBox.Show("Continue running?", "Count is: " + alarmCounter, 
          MessageBoxButtons.YesNo) == DialogResult.Yes) {
          // Restarts the timer and increments the counter.
          alarmCounter +=1;
          myTimer.Enabled = true;
       }
       else {
          // Stops the timer.
          exitFlag = true;
       }
    }
 
    public static int Main() {
       /* Adds the event and the event handler for the method that will 
          process the timer event to the timer. */
       myTimer.Tick += new EventHandler(TimerEventProcessor);
 
       // Sets the timer interval to 5 seconds.
       myTimer.Interval = 5000;
       myTimer.Start();
 
       // Runs the timer, and raises the event.
       while(exitFlag == false) {
          // Processes all the events in the queue.
          Application.DoEvents();
       }
    return 0;
    }
 }

Invece la classe BackgroundWorker esegue un’operazione su un thread separato. Nell’esempio di codice riportato di seguito vengono illustrate le nozioni di base della classe BackgroundWorker per eseguire un’operazione che richiede molto tempo in modo asincrono. Nell’illustrazione seguente viene illustrato un esempio dell’output.

Per provare questo codice, creare un Windows Forms Application. Aggiungere un controllo Label denominato resultLabel e aggiungere due controlli Button denominati denominati startAsyncButton e cancelAsyncButton. Creare Click gestori eventi per entrambi i pulsanti. Dalla scheda componenti della casella degli strumenti aggiungere un componente BackgroundWorker denominato backgroundWorker1. Creare i gestori eventi DoWork, ProgressChangede RunWorkerCompleted per la  BackgroundWorker. Nel codice del modulo sostituire il codice esistente con il codice seguente.

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace BackgroundWorkerSimple
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1.WorkerSupportsCancellation = true;
        }

        private void startAsyncButton_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy != true)
            {
                // Start the asynchronous operation.
                backgroundWorker1.RunWorkerAsync();
            }
        }

        private void cancelAsyncButton_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.WorkerSupportsCancellation == true)
            {
                // Cancel the asynchronous operation.
                backgroundWorker1.CancelAsync();
            }
        }

        // This event handler is where the time-consuming work is done.
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            for (int i = 1; i <= 10; i++)
            {
                if (worker.CancellationPending == true)
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    // Perform a time consuming operation and report progress.
                    System.Threading.Thread.Sleep(500);
                    worker.ReportProgress(i * 10);
                }
            }
        }

        // This event handler updates the progress.
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            resultLabel.Text = (e.ProgressPercentage.ToString() + "%");
        }

        // This event handler deals with the results of the background operation.
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                resultLabel.Text = "Canceled!";
            }
            else if (e.Error != null)
            {
                resultLabel.Text = "Error: " + e.Error.Message;
            }
            else
            {
                resultLabel.Text = "Done!";
            }
        }
    }
}

Metodi di estensione: consentono agli sviluppatori di aggiungere funzionalità personalizzate ai tipi di dati già definiti senza creare un nuovo tipo derivato. I metodi di estensione consentono di scrivere un metodo che può essere chiamato come se fosse un metodo di istanza del tipo esistente. Un metodo di estensione può essere solo una routine Sub o una procedura di Function. Non è possibile definire una proprietà, un campo o un evento di estensione. Tutti i metodi di estensione devono essere contrassegnati con l’attributo di estensione <Extension> dallo spazio dei nomi System.Runtime.CompilerServices e devono essere definiti in un modulo. Se un metodo di estensione viene definito all’esterno di un modulo, il Visual Basic compilatore genera l’errore BC36551, “i metodi di estensione possono essere definiti solo nei moduli”. Il primo parametro di una definizione di metodo di estensione specifica il tipo di dati che il metodo estende. Quando viene eseguito il metodo, il primo parametro viene associato all’istanza del tipo di dati che richiama il metodo. È possibile applicare l’attributo Extension solo a una Visual Basic ModuleSubFunction. Se lo si applica a una Class o a un Structure, il compilatore Visual Basic genera l’errore BC36550, l’attributo “extension” può essere applicato solo alle dichiarazioni ‘ Module ‘,’ Sub ‘ o ‘ Function ‘ “.

Scomposizione del PNL e concetto di matching degli ordini

Il PNL è una funzione del tempo aleatoria che dipende dagli ordini fatti e da come si evolve il prezzo nel tempo. Può assumere valori positivi o negativi. Come si calcola il PNL? Consideriamo un singolo strumento finanziario su cui ,applicando una strategia, verranno eseguiti degli ordini: l’insieme di questi ordini e del prezzo corrente genera una curva che rappresenta le perdite e profitti. Partiamo dal caso più semplice per calcolare il PNL: scelgo come strumento il CL (petrolio) e supponiamo che ci sia un ordine (buy) e più avanti nel tempo faccia anche un sell. Nel caso più semplice ho comprato e venduto la stessa quantità. Applichiamo anche un moltiplicatore che va a moltiplicare la quantità in questione. Il risultato è pari al (prezzo sell- prezzo a cui l’abbiamo comprato)moltiplicato per un moltiplicatore e per la quantità del bene. Introduciamo una variante: facciamo un’altra sell di una quantità
diversa (Q1). Possiamo suddividere il PNL in due componenti principali: Unrealised e Realised. La prima fa riferimento ad ordini non ancora chiusi ed è perciò sottoposta a dei movimenti aleatori mentre nella parte Realised rappresenta la parte conclusa del PNL in cui c’è stato un acquisto ed una vendita. La scelta del buy e del sell che determinano la parte chiusa del PNL è del tutto arbitraria e per questo vengono utilizzate alcune regole usate per il matching degli ordini. La prima metodologia è il matching FIFO, oppure LIFO. Immaginiamo di avere un certo strumento e una sequenza di buy e sell arbitraria: indico con Pc il prezzo corrente (sia per Bid che per Ask): visto che sappiamo calcolare il contributi relativo a matching della stessa quantità possiamo cercare di fare un matching tra quantità uguali di questi ordini: la parte che riesco a fare il match permette di ottenere la componente Realised mentre la parte che non viene matchata porterà ad ottenere la componente Unrealised. In base ai prezzi di buy e sell la parte Realised si divide in Gain (matching pos) e Loss (matching pos)

Processi di poisson

I processi di Poisson vengono utilizzati per modellizzare una situazione che presenta salti aleatori. Si tratta di un processo continuous time ma lo spazio degli stati che può assumere è di tipo discreto.
Per definire il processo di Poisson segue le seguenti proprietà:

  • Nella sua origini (in genere viene scelto l’istante 0) vale 0
  • In ogni intervallo di tempo si può verificare un salto con una certa probabilità
  • Nel processo di Poisson si assume ch la probabilità di avere un salto sia pari a λ volte la lunghezza dell’intervallo: più è largo l’intervallo e maggiore sarà la probabilità che avvenga un salto. Il valore di λ deve essere positivo ed esprime il tasso di arrivo di questi eventi (se fosse 10 in un intervallo che va da 0 a 1 vedrei in media 10 salti).
  • la probabilità di avere due o più salti in un intervallo di tempo deve tendere a 0 quando Δt tende a 0

Il processo di Poisson può essere approssimato ad una bernoulliana se si tiene in considerazione che in ogni intervallo di tempo si può eseguire un salto con probabilità λ*Δt. Il processo, quindi è una somma di bernoulliane e quindi sarà una distribuzione binomiale: Tuttavia la distribuzione binomiale tende ad una Poisson per Δt che tende a 0 e mantenendo costante λ. A sua volta la Poisson tende ad una normale. Per quanto riguarda i tempi di arrivo, invece, otteniamo una distribuzione uniforme e gli interarrivi (i tempi tra un arrivo e l’altro) hanno una distribuzione esponenziale con par lambda. La distribuzione di poisson è il limite di una distribuzione binomiale per λ uguale a np e n che tende ad infinito. Per dimostrarlo consideriamo che la probabilità che una variabile aleatoria distribuita secondo una binomiale assuma valore pari a k è

Questa formula può essere modificata come segue

Facendo il limite per n che tende a \infty la formula appena ottenuta si modificherà in questo modo

Questa formula equivale alla distribuzione di probabilità di una variabile aleatoria Poisson di parametro λ. Per quanto riguarda i tempi di interarrivi consideriamo la funzione di ripartizione e di densità di una variabile aleatoria esponenziale negativa

Indichiamo con λ’ il parametro del processo di Poisson che vogliamo valutare. Esso sarà pari a

Inoltre, poiché

La precedente relazione può essere scritta come

dove λ rappresenta la rate del processo di Poisson. Se adesso prendessimo in considerazione una generica variabile aleatoria Poisson di parametro λ potremmo affermare che

Consideriamo ora un generico range temporale ed identifichiamo con A1 l’intervallo relativo al primo interarrivo. Pertanto avremo che

Moto browniano geometrico

Per capire cosa si intende per moto browniano geometrico mettiamolo a confronto con quello normale (detto anche aritmetico). Esaminiamo il moto browniano aritmetico

Esso presenta la seguente equazione differenziale

e la seguente generalizzazione

Il moto browniano aritmetico presenta alcuni problemi

  • Visto che procedo per incrementi additivi è chiaro che anche se parto da un prezzo iniziale alto, se gli dò molto tempo potrei anche avere valori di prezzo negativi: non è quindi adeguato per studiare i prezzi
  • Quando rapportiamo i prezzi di beni o stock non ragioniamo in termini additivi ma in termini di tasso di incremento (return) perché l’importanza di quel bene dipende anche dal prezzo iniziale (l’incremento relativo e non quello assoluto) quindi piuttosto che un modello additivo vorrei quello moltiplicativo e per questo usiamo una brownian motion. geometrica. Il modello moltiplicativo si indica con la seguente formula

con la seguente equazione differenziale

descritta a sua volta in modo più generico mediante la seguente equazione

Nel moto browniano geometrico il differenziale del prezzo non è più la somma di variabili distribuite secondo una normale ma sarà descritta in questo modo e perciò occorre sbarazzarsi del prodotto: per farlo uso la funzione logaritmica

Pertanto la distribuzione di Pt risulta essere di tipo lognormale

Definizione differenziale del processo di Wiener

Definiamo con processo di Wiener (o Browian Motion) un processo stocastico delimitato su un’asse temporale continua e che presenta le seguenti proprietà:

  • W(0)=0 il nostro processo deve avere un punto d’origine (non necessariamente 0). Questo è necessario perché il processo è definito in base agli incrementi
  • Continuo in t con probabilità 1
  • Presenta incrementi stazionari indipendentemente distribuiti secondo una normale con media 0 e varianza t

Supponiamo di avere una random walk che ha incrementi pari a + o – 1 rispettivamente con probabilità pari a 1/2 (il singolo salto ha questa distribuzione discreta) e consideriamo due istanti t e t+ Δt:
l’incremento non è altro che la somma dei salti avvenuti in questo intervallo di tempo. Vista la distribuzione possiamo dire che la media del salto è 0 mentre la varianza è 1
Quindi anche l’incremento avrà valore atteso pari a 0 mentre la sua varianza sarà pari a Δt (perché i salti sono indipendenti). La varianza è quindi proporzionale alla distanza Δt.
Voglio portare queste conclusione anche nel caso continuo (nella Browian Motion) e quindi assumo che qualunque intervallo prendo la media e la varianza dell’incremento assuma proprio quel valore.
Inoltre assumo che l’incremento sia normale perché essendo una somma di variabili posso immaginare che nel continuo valga il teorema del limite centrale e quindi potrò sostituire la somma di variabili indipendenti ed identicamente distribuite con una normale. Una Brownian Motion presenta anche una forma generalizzata che equivale a considerare un processo con media μ*Δt e varianza pari a σ^2 * Δt. Per quanto riguarda la definizione differenziale del processo di Wiener consideriamo con ΔPt il suo incremento infinitesimo (e cioè l’incremento che si osserva quando Δt tende a 0). Esso sarà pari a

Possiamo affermare inoltre che nel caso generico il valore dell’incremento infinitesimo risulterà pari a

Teorema funzionale del limite centrale e Browian Motion

Come abbiamo visto nel precedente articolo la random walk è definita mediante tempi discreti. Tuttavia esistono anche modelli matematici che si basano su tempi continui e questo implica ovviamente che anche il processo che ne risulta generato mostrerà lo stesso andamento. Tra i modelli appartenenti a questa tipologia il più importante è senza dubbio la browian motion (o Wiener process). Esso è l’analogo delle distribuzioni normali per le distribuzioni nel senso che così per le distribuzioni esiste un risultato generale (il teorema del limite centrale), anche per i processi aleatori esiste un teorema di convergenza molto simile al primo: il teorema centrale del limite funzionale o teorema di Donskel. Infatti il Teorema del Limite Centrale ci dice che, sotto alcune condizioni, se consideriamo la media di una successione di variabili indipendenti ed identicamente distribuite questa convergerà ad una normale mentre l’equivalente teorema relativo ai processi aleatori ci dice che partendo da una random walk qualsiasi sotto opportune condizioni non importa quale sia la variabile aleatoria che utilizziamo ma all’infittirsi della rete dei punti che considero avremo una brownian motion

Progetta un sito come questo con WordPress.com
Comincia ora