Utilizzo di reti neurali per il trading di scommesse

Transcript

Utilizzo di reti neurali per il trading di scommesse
Neural Trader:
utilizzo di reti neurali per il trading di scommesse
Mario Arrigoni Neri
A. Introduzione
Il trading di scommesse sportive è una attività relativamente nuova, che si presenta per la prima
volta nel 2003 quando una importante società del Regno Unito, The Sporting Exchange Limited,
sviluppa un portale che propone un sistema di scambio di quote di scommesse analogo ad una borsa
valori. Questo sito, www.betfair.com, assorbe ben presto la gran parte del colossale giro d’affari
che, nel Regno Unito e non solo, ruota intorno alle scommesse, sportive ma non solo, tanto che
nello stesso anno Betfair riceve il Queen’s Award for Enterprise dalla Regina d’Inghilterra.
Il mercato delle scommesse presenta numerose analogie con quello azionario, tuttavia, grazie al suo
collegamento esplicito con eventi reali ed oggettivi, risulta fortemente più “vincolato”, nel senso
che è possibile valutare facilmente ed in maniera affidabile il grado di pertinenza di un mercato
all’evento sottostante, nonché i livelli di convenienza delle quote disponibili.
Per questi ed altri motivi, l’attenzione di alcuni broker di borsa si è spostato sul ricco mercato
offerto da Betfair (ed altri sistemi paralleli nati successivamente).
Lo scopo di questo lavoro è valutare se le tecniche di soft computing, quali le reti neurali e gli
algoritmi genetici, possono essere proficuamente applicate al mercato delle scommesse.
Dopo una prima brevissima introduzione ai concetti fondamentali dello scambio di scommesse,
proverò ad addestrare una rete neurale a stimare le probabilità di vittoria in relazione ad una
determinata scommessa, sperando di ottenere una stima più accurata di quella che si riflette nelle
quote (o prezzi) disponibili sul mercato. In effetti, ottenere una rete siffatta significherebbe depurare
almeno parzialmente il modello degli eventi sottostanti (ad esempio quelli sportivi) dalle dinamiche
sociali, psicologiche e speculative che intervengono nella formulazione di una quota. Così facendo
sarebbe in linea di principio possibile utilizzare la stima del sistema per valutare se il prezzo
proposto è più o meno conveniente, con un evidente vantaggio economico.
Una volta ottenuta la rete per la predizione passerò ad implementare un trader automatico che ne
sfrutti l’accuratezza per operare sul mercato guidato da alcuni parametri operativi. Infine questi
parametri operativi, che in generale saranno indicati dall’utente, saranno oggetto di ottimizzazione
da parte di un algoritmo genetico, che cercherà di identificare la politica ottima e, quindi, il trader
più performante.
B. Concetti base del mercato scommesse
Caratteristiche delle scommesse
Una scommessa non è altro che un accordo tra due attori, detti giocatore e banco, sull’effettuare
una transazione economica sulla base del verificarsi o meno di un evento, solitamente successivo
alla stipula dell’accordo.
Il giocatore corrisponde al banco una somma di denaro concordata detta carico, in caso in cui
l’evento si verifichi il banco corrisponderà al giocatore una somma concordata detta premio. In
sostanza, il giocatore, pagando il carico, acquista il diritto a ricevere dal banco il premio
condizionatamente al verificarsi dell’evento.
L’elemento caratteristico della scommessa è la quota (o prezzo), definito come:
quota =
premio
carico
Ovviamente, a parità di tutte le altre condizioni, più alta è la quota, maggiore è il vantaggio del
giocatore rispetto al banco. I livelli di rischio degli attori prende il nome di esposizione o
responsabilità ed indica la massima perdita a cui ciascuno degli attori si espone partecipando alla
scommessa. Il giocatore si espone, in caso l’evento non si verifichi, ad una perdita pari al carico,
mentre il banco si espone in caso l’evento si verifichi ad una perdita pari al premio decurtato del
carico che comunque riceve dal giocatore. Quindi:
exp G = carico
exp B = premio − carico = ( quota − 1) ⋅ carico
Esistono diversi schemi di scommesse, i due principali si distinguono sulla base dei meccanismi che
portano al calcolo della quota:
a quota fissa
a totalizzatore
E’ il sistema più diffuso. Il banco propone una scommessa ad
una platea di potenziali giocatori. La scommessa è
caratterizzata da una quota, decisa unilateralmente dal banco
e da un carico massimo che il banco stesso è disposto a
coprire.
Il giocatore può decidere liberamente se accettare la quota
proposta dal banco.
E’ il sistema utilizzato da alcuni sistemi di scommesse
statali, tra cui i sistemi italiani (SNAI, SiSal, Tris, ecc..).
Il banco accetta scommesse da una platea di giocatori,
riservandosi di decidere successivamente la quota delle
singole scommesse. I giocatori, quindi, indicano solo il
carico che intendono scommettere. Al termine della raccolta
il banco calcola le quote a cui accettare ogni scommessa. In
questo caso la quota è nota solo dopo la chiusura delle
scommesse ed è calcolata in modo inversamente
proporzionale al carico totale collezionato su ogni possibile
esito. E’ chiaro che se gli eventi sono mutuamente esclusivi
(come ad esempio i risultati di una partita) il banco può
bilanciare le quote in modo da non rischiare mai di perdere
del denaro.
Il mercato
Il mercato scommesse raccoglie un insieme di utenti, che possono operare contemporaneamente
come banco e come giocatore. Il mercato è organizzato in un albero di eventi reali (intesi come
eventi sportivi o meno nel mondo reale, come una partita, una corsa, una votazione politica, ecc..).
Per ogni evento sono disponibili uno o più mercati, ogni mercato si occupa di un particolare aspetto
dell’evento ed e caratterizzato dai possibili esiti di tale aspetto, detti anche selezioni.
Ad esempio, considerando come evento naturale una partita di calcio Milan-Inter, esisterà
quantomeno il mercato sul vincente, che permette di scambiare scommesse su quale sarà il risultato
di schedina. Questo mercato proporrà come possibili selezioni Milan, Inter e Pareggio.
Sullo stesso evento reale possono essere definiti mercati differenti, come il numero di reti, il
risultato finale, ecc.., ciascuno con una serie di selezioni che esauriscono i possibili esiti del
mercato.
Per ogni selezione di ogni mercato un utente può operare sia come banco che come giocatore, in
ogni momento può inserire nel sistema l’offerta di una scommessa indicando il carico e la quota a
cui è interessato.
Per ogni selezione il sistema mantiene una lista delle offerte e le propone agli utenti in un book a tre
livelli non dissimile da quello a cui si è abituati sul mercato borsistico organizzate sui due lati
dell’offerta:
• Lato del back: raccoglie tutte le proposte dei banchi, quindi ogni utente può decidere se
abbinare una scommessa inserendo, di fatto, una richiesta di gioco. E’ l’analogo della lista
delle offerte di vendita di un titolo
• Lato del lay: raccoglie le proposte dei giocatori. Ogni utente può decidere se abbinare una
scommessa inserendo una richiesta di banco. E’ analogo alla lista delle offerte di acquisto
Se una richiesta in back non è interamente soddisfacibile al prezzo richiesto, la frazione di carico
residua rimarrà disponibile in lay per ulteriori abbinamenti; dualmente i carichi non abbinati in lay
rimarranno disponibili in back.
Nell’analogia con i termini borsistici diremo che “acquistare” un evento ad un determinato prezzo
corrisponde a scommettere sulla sua realizzazione ad una data quota.
In termini operativi, conviene evidenziare subito il fatto che, contrariamente a quanto avviene in
borsa, il miglior acquisto è quello al prezzo massimo, così che un trader (o un bookmaker in questo
caso) ha come obiettivo acquistare eventi a prezzi elevati e rivenderli a prezzi inferiori, così da
poter tratte un utile indipendentemente dal verificarsi o meno dell’evento (e cioè effettuando quello
che in gergo prende il nome di arbitrato).
In Figura 1 è riportata una schermata del book a tre livelli su un mercato “vincente” di una corsa
ippica, per ogni selezione e per ogni livello di quota è riportato il carico disponibile per
l’abbinamento.
Figura 1 esempio di book a tre livelli
Ovviamente in ogni istante e per ogni selezione il massimo prezzo disponibile in back è inferiore al
minimo prezzo disponibile in lay. Mettendo in competizione sullo stesso mercato non solo giocatori
differenti, ma anche e soprattutto banchi differenti fa sì che le quote disponibili sul mercato siano
mediamente molto più convenienti delle quote fisse dei bookmaker tradizionali. Si valuta che
questo vantaggio sia nell’ordine del 25%.
Il margine di banco
Differentemente dal mercato valori, a prescindere dalle valutazioni tecniche in merito alla
convenienza dell’una o dell’altra selezione, è sempre e comunque possibile valutare la bontà e
concorrenzialità del mercato tenendo presente che una ed una sola delle selezioni sarà pagata dal
banco, mentre le altre si tradurranno in una perdita per il giocatore.
Il margine di banco è l’indice primario per stimare la bontà del mercato e misura il vantaggio che
si riserva il banco che propone tutte le selezioni al miglior prezzo disponibile. Chiaramente nel caso
di un mercato scommesse questo è un banco virtuale, nel senso che solitamente non esiste un unico
utente che propone i prezzi migliori su tutte le selezioni di un mercato. Assumendo un mercato
perfetto, ogni selezione dovrebbe avere una quota determinata unicamente dalla probabilità che
l’evento si verifichi. Il banco remunera il rischio dello scommettitore, garantendo un rapporto tra
vincita e carico inversamente proporzionale alla probabilità di vittoria. In formule:
P=
1
prezzo
Ad esempio é evidente che se si scommette su un evento con probabilità P=1/2, uno scommettitore
onesto accetterà una quota pari a due, in modo da avere una esposizione pari alla vincita.
Dato che le selezioni di un mercato M sono una partizione dell’evento certo (sono incompatibili tra
di loro e la loro ed una di esse deve necessariamente verificarsi), la somma delle loro probabilità
deve essere pari ad uno:
1
Q = ∑ Psel = ∑
=1
sel∈ M
sel∈ M prezzo sel
Sotto l’ipotesi di mercato perfetto (Q=1) è possibile costruire un book di scommesse neutro, infatti
è possibile giocare (o bancare) tutte le selezioni alle quote disponibili garantendosi un utile nullo a
prescindere dall’esito dell’evento scegliendo i carichi da collocare su ogni selezione sulla base della
quota. Occorre quindi garantire che:
∀ S ∈ M : prezzo S ⋅ carico S −
∑
carico S 2 = 0
S 2∈ M
In un mercato perfetto l’equazione ammette la soluzione:
∀ S ∈ M : carico S =
∑
carico S 2
S 2∈ M
prezzo S
In realtà, in ogni istante, il mercato presenta due livelli di quote, uno in back ed uno in lay, che
approssimano solamente il mercato perfetto. Dal lato del back troviamo le offerte di banco non
ancora abbinate ed è quindi naturale che tali quote diano un vantaggio al banco, quindi avremo
Q>1. Al contrario nel lato del lay avremo Q<1.
Queste informazioni sono riportate, in percentuale, in Figura 1 vicino a “punta” e “banca”.
Lo starting price
Come visto nei paragrafi precedenti, in un mercato perfetto è possibile far corrispondere
direttamente ai prezzi le probabilità del verificarsi di un evento. Tuttavia, la stima delle probabilità
sulla base delle quote si scontra con alcune problematiche fondamentali:
• In generale il mercato non è perfetto, ma risente degli errori di valutazione degli utenti.
All’aumentare degli utenti questo fenomeno diminuisce, così che le quote fuori mercato
vengono transate rapidissimamente (nel caso in cui siano vantaggiose) o vendono superate
da altre (se sono svantaggiose)
• Sono disponibili sul mercato solo le quote non ancora abbinate, questo significa come visto
che esiste un margine di banco positivo (Q>1) o negativo (Q<1) a seconda del lato che si
considera. Inoltre se il mercato non ha grossi volumi in transazione può accadere che i
prezzi in book siano lontani da quelli che vengono effettivamente transati
La soluzione classica per ottenere uno stimatore migliore è presa in prestito dall’ambito borsistico
ed è il cosiddetto starting price. Lo starting price non è altro che il valore medio, pesato sui carichi,
a cui è stata acquistata una selezione e fornisce una stima del valore “reale” della stessa. In formula:
SP =
∑
prezzo ⋅ carico
transazioni
∑
carico
transazioni
Lo starting price viene solitamente calcolato considerando tutte le transazioni dall’apertura del
mercato, dato che il volume di carichi transati rende atto delle diverse fasi della contrattazione.
Inoltre è possibile valutare lo starting price su intervalli successivi di tempo per stimare le
dinamiche di medio periodo di una selezione, utilizzando di fatto lo starting price come un
indicatore più robusto ed affidabile dei semplici prezzi disponibili.
C. Logging dei dati
Mercati di riferimento
Da un punto di vista tecnico, Betfair mette a disposizione, a pagamento, un accesso al proprio
mercato tramite WebService. In ogni istante è quindi possibile monitorare le quote disponibili e
consultare lo storico delle transazioni, ricavando utili indicazioni per le operazioni di trading.
Per sperare di ottenere uno stimatore delle probabilità di vittoria di una selezione occorre garantire
una certa uniformità tra gli eventi considerati. Nel mio lavoro ho scelto di concentrarmi sulle
scommesse sportive sui mercati “vincente” delle corse ippiche inglesi ed irlandesi.
Questa scelta è stata dovuta a due fattori:
• Il volume di gioco su questi eventi è notevole. Indicativamente si ha una media di 25-30
corse al giorno e su ciascuna di queste vengono transati diversi milioni di euro. L’alto
volume di gioco è da un lato indice di un possibile guadagno e dall’altro un indicatore di
concorrenzialità del mercato stesso (che ha in genere un Q molto prossimo ad 1). In un
mercato concorrenziale i prezzi e gli indicatori tecnici sono di norma più indicativi della
reale probabilità di vittoria e possono quindi essere verosimilmente utilizzati da un
predittore neurale
• I mercati “vincente” delle corse inglesi ed irlandesi sono aperti anche durante lo svolgersi
della corsa. In gergo si dice che il mercato è live. La possibilità di scommettere durante la
gara fa si che ci siano delle fasi molto concitate, dove grandi volumi di denaro vengono
scambiati su mercati molto volatili e con prezzi in rapida oscillazione. Questo fornisce
solitamente ottime opportunità di trading all’operatore umano e, verosimilmente, è un
indicatore di possibile successo anche per un trader artificiale.
Il logger
Una volta scelti i mercati di riferimento, il primo passo del mio lavoro è stata l’implementazione di
un client per il webservice di Betfair che fosse in grado di memorizzare tutte le transazioni. In realtà
Betfair stesso fornisce ai propri clienti delle statistiche sui mercati e sugli sport più popolari (tra cui
per prime troviamo proprio le corse inglesi). Tuttavia, queste non sono sufficienti per ricostruire le
dinamiche dei prezzi e delle transazioni: informazioni fondamentali in quanto sono le uniche
disponibili a runtime durante l’attività di trading.
Il logger è un semplice tool sviluppato in Java. Utilizza Axis per interfacciarsi al webservice di
Betfair ed è pensato per operare autonomamente per lunghi periodi.
Ogni giorno l’albero degli eventi viene aggiornato per contenere gli eventi giornalieri, le corse di
interesse si svolgono normalmente dall’una di pomeriggio fino a sera e la lista dei mercati viene
aggiornata entro le 10 di mattina.
Il logger, quindi, opera su base giornaliera. Alle 10 di mattina aggiorna la lista dei mercati,
navigando lungo le directory degli eventi fino alle corse di cavalli. A questo punto estrae le sole
corse inglesi ed irlandesi che prevedono una parte in live ed infine si mette in ascolto su tali eventi.
Già in fase di log è necessario effettuare alcune scelte sia sulle informazioni da considerare che
sulle modalità e le risoluzioni con cui osservarle:
• Intervallo di osservazione: solitamente, per gli eventi sportivi si osserva una
concentrazione dell’attività di compravendita a partire dagli ultimi minuti prima dell’evento
reale. Nell’ambiente ippico è detto effetto tondino; nella prima parte della giornata, i vari
•
bookmaker si propongono per bancare le selezioni sulla base di analisi tecniche di
periziatori ed i giocatori piazzano scommesse sulla base di fattori esogeni rispetto all’evento
vero e proprio. Il risultato sono scarsissime transazioni e quote di fatto slegate dalle
probabilità reali di vincita. 5 o 10 minuti prima dell’inizio della corsa i concorrenti si
presentano sul campo di gara e gli scommettitori possono visionare effettivamente cavallo e
fantino e valutarne le qualità e la forma. Questo è il momento in cui, trascinati dalle
scommesse inviate direttamente dall’ippodromo, i mercati incominciano a muovere i capitali
maggiori. Per queste considerazioni il logger analizza i mercati a partire da dieci minuti
prima della partenza.
Intervallo di campionamento: è una variabile fondamentale per ottenere dei campioni
numerosi, ma contemporaneamente significativi. Visto che alcune informazioni si
riferiscono all’intero intervallo di osservazione, non conviene spingere gli aggiornamenti
oltre una certa frequenza per evitare di campionare del rumore. Vista la volatilità dei mercati
e valutata la dinamica degli scambi, ho impostato l’intervallo tra due campioni a cinque
secondi. Empiricamente i tempi di comunicazione con il server ed i ritardi dovuti alla
scrittura dei dati hanno comportato un aumento di circa un secondo.
Figura 2 il tool per il log dei mercati
Il programma visualizza in una lista i riferimenti di tutti gli eventi monitorati, indicando
cromaticamente la fase in cui si trova il mercato:
• Grigio: mercato in attesa, non è ancora iniziata la fase di logging
• Giallo: logging pre-live, il sistema sta memorizzando lo storico del mercato, ma l’evento
reale non è ancora iniziato
• Verde: logging in-live, il sistema sta memorizzando lo storico del mercato e l’evento reale è
in corso. La distinzione rispetto al logging pre-live permetterà di specializzare la rete in una
delle due fasi, qualora emergano differenze sostanziali nei rispettivi comportamenti
• Rosso: logging terminato, il mercato è stato chiuso e si sta attendendo la regolazione delle
scommese abbinate; nessun gol viene creato in questa fase
Durante la fase di logging occorre estrarre dai dati grezzi forniti dalla piattaforma quelle
informazioni che permetteranno, di costruire i campioni di addestramento della rete. In particolare è
necessario calcolare lo starting price ed i volumi scambiati partendo dallo storico di tutte le
transazioni. L’impossibilità di accedere direttamente a questi valori richiede di accedere ad ogni
campione a tutte le quote abbinate ed è la principale causa dell’overhead in fase di logging.
Per ogni campione e per ogni selezione vengono quindi salvati:
• Il miglior prezzo in back
• Il miglior prezzo in lay
• Il carico disponibile al miglior prezzo in back
• Il carico disponibile al miglior prezzo in lay
• Lo starting price della selezione
• Il volume totale scambiato per la selezione
I file di log
Il frutto del logger viene salvato in una serie di file XML. Ogni file contiene i dati di un particolare
mercato ed i file sono organizzati in directory, una per ogni giornata.
Figura 3 DTD del linguaggio di log
L’elemento radice di ogni file contiene il nome del mercato (che corrisponde al nome del file), il
numero di rilevazioni eseguite e riporta la lista dei singoli campioni. Ogni campione è classificato a
seconda che sia stato o meno raccolto durante la fase live del mercato; inoltre si memorizza il
tempo, in secondi, che manca all’inizio ufficiale della gara. Questo può essere importante per
valutare in che misura i prezzi disponibili sul mercato sono legati al reale valore della selezione.
Ogni campione riporta poi i dati delle singole selezioni secondo le misure indicate nel paragrafo
precedente.
La Figura 3 riporta il DTD del linguaggi dei log, mentre la Figura 4 mostra il frammento iniziale del
log di una corsa.
Il logger è stato mantenuto in linea a partire dal 10 giugno fino al 27 novembre 2006, per un totale
di 3351 eventi reali a cui corrispondono ben 3790707 campioni.
Figura 4 frammento di un file di log
D. La rete neurale
Nello sviluppo della rete ho utilizzato il tool open sorse Joone (http://www.jooneworld.com/).
La rete implementata è una rete feedforward con:
• Uno strato lineare in ingresso
• Uno strato nascosto sigmoidale
• Un neurone di uscita sigmoidale
L’idea di base è addestrare la rete per riconoscere i campioni che si riferiscono a selezioni vincenti
da quelli che si riferiscono a selezioni perdenti. In questo modo il valore restituito dalla rete (che è
limitato tra zero ed uno a causa del neurone di uscita) può essere convenientemente interpretato
come la probabilità di vittoria.
Figura 5 rete neurale di base
In Errore: sorgente del riferimento non trovata viene mostrata la rete di partenza all’interno
dell’editor di Joone. Sono indicati i tre livelli della rete e le strutture necessarie all’addestramento ed
alla valutazione della rete stessa.
Tra queste troviamo:
• vari connettori a file, che permettono di leggere i campioni e gli esiti noti per
l’addestramento supervisionato
• il componente di apprendimento (teacher) che misura l’errore della rete ed implementa
l’algoritmo di addestramento scelto
• il componente grafico che si occupa di disegnare l’andamento dell’errore durante
l’addestramento.
Costruzione del training set
Il sistema di addestramento prevede che i campioni siano inseriti in un file testuale con i singoli
elementi divisi da caratteri di interpunzione (;). E’ quindi necessario sviluppare un secondo
programma di traduzione che:
• ricava dai dati dei log delle informazioni significative da fornire in ingresso alla rete.
Questa fase di preprocesso permette di ridurre lo spazio dei parametri (cioè la dimensione
dei campioni in ingresso) ed è finalizzata ad una migliore convergenza della rete, dato che
parte dell’elaborazione che questa dovrebbe apprendere è di fatto fornita dall’esperto del
dominio. Joone fornisce una libreria di plugin per il proprocessing dei campioni, tuttavia
l’elaborazione richiesta è fortemente dipendente dall’applicazione e mal si presta ad essere
demandata ai plugin della piattaforma
• seleziona un sottoinsieme di campioni dall’enorme mole di dati raccolta, mantenendone la
rappresentatività. Contestualmente esegue un resampling dei dati in modo da renderli più
efficaci per la classificazione.
Per sua natura, l’analisi dei prezzi e degli scambi trae vantaggio dall’elaborazione congiunta di una
serie di campioni letti in intervalli temporali contigui. L’approccio è molto vicino all’analisi di
sequenze temporali, ma rispetto alla semplice giustapposizione di campioni diversi successivi è
opportuno calcolare alcune grandezze di processo quali gli scambi nell’ultimo intervallo di
osservazione.
Ogni campione sottoposto alla rete riporta informazioni sui prezzi della selezione di interesse
relative agli ultimi tre istanti di osservazione. Per evitare un aumento insostenibile dello spazio in
ingresso ho scelto di utilizzare le sole informazioni sui migliori prezzi disponibili, riducendo di
fatto il book ad un unico livello. Queste informazioni sono integrate da informazioni sulle
transazioni della selezione, che rendono conto dell’effettivo interesse suscitato dall’evento ed
alcune informazioni generali sul mercato, che permettono di caratterizzare il tipo di evento e la
situazione in cui avviene il trading. Infine, è utile poter confrontare la selezione attuale con il suo
diretto antagonista, cioè con la selezione sullo stesso mercato che appare favorita dalle quote attuali;
a tale scopo il campione in ingresso viene integrato da alcuni dati sulla selezione antagonista.
Infatti spesso, e soprattutto in live, le stime sulle possibilità di vittoria di un corridore dipendono dal
raffronto delle dinamiche con selezioni differenti.
Complessivamente, ogni campione è costituito da 34 valori, a cui si aggiunge il valore dell’output
desiderato che nella fattispecie è la funzione indicatrice della vittoria. Dato che i dati dei log non
riportano esplicitamente il vincitore di una corsa è necessario estrarre questa informazione. Ciò è
possibile se si considera che al termine dell’evento, cioè appena prima della chiusura di un mercato,
il concorrente con quota minima è quasi certamente il vincitore.
La tabella seguente mostra i singoli campi di ogni campione, raggruppati per tipologia ed indicando
ove necessario il metodo di calcolo a partire dai dati nei log.
#
nome
1
2
3
4
5
6
7
8
9
10
11
12
B(t)
L(t)
BS(t)
LS(t)
B(t-1)
L(t-1)
BS(t-1)
LS(t-1)
B(t-2)
L(t-2)
BS(t-2)
LS(t-2)
13
14
15
MODD(t)
MS(t)
DODD(t)
16
DS(t)
17
DODD(t-1)
18
19
DS(t-1)
MODD(t-2)
20
MS(t-2)
21
BA(t)
22
23
LA(t)
BAS(t)
24
LAS(t)
25
26
27
BA(t-1)
LA(t-1)
BAS(t-1)
28
LAS(t-1)
29
30
31
BA(t-2)
LA(t-2)
BAS(t-2)
descrizione
Prezzi della selezione corrente
Miglior prezzo in back all’istante corrente
Miglior prezzo in lay all’istante corrente
Stake (o carico) disponibile al miglior prezzo in back
Stake (o carico) disponibile al miglior prezzo in lay
Miglior prezzo in back all’istante precedente
Miglior prezzo in lay all’istante predente
Stake (o carico) disponibile al miglior prezzo in back
Stake (o carico) disponibile al miglior prezzo in lay
Miglior prezzo in back a due istanti precedenti
Miglior prezzo in lay a due istanti precedenti
Stake (o carico) disponibile al miglior prezzo in back
Stake (o carico) disponibile al miglior prezzo in lay
Scambi sulla selezione corrente
Starting price attuale della selezione
Carico scambiato sulla selezione
E’ il prezzo medio scambiato nell’ultimo intervallo temporale. Visto che non
è fornito direttamente dai file di log è necessario calcolarlo come:
MODD(t ) ⋅ MS (t ) − MODD(t − 1) ⋅ MS (t − 1)
DODD( t ) =
DS (t )
Volume scambiato nell’ultimo intervallo di tempo, calcolabile come:
DS (t ) = MS (t ) − MS (t − 1)
Prezzo medio scambiato nel penultimo intervallo temporale. E’ di fatto la
versione traslata di un istante di DOSS(t)
Volume scambiato nel penultimo intervallo temporale
Starting price calcolato due istanti prima dell’attuale, raccoglie
l’informazione sul comportamento medio prima delle ultime rilevazioni
Volume scambiato dall’apertura del mercato al terzultimo campione
Prezzi della selezione antagonista
Miglior prezzo in back all’istante corrente della selezione antagonista. La
selezione antagonista è quella con il prezzo di Back minore tra le atre
selezioni. Quindi è solitamente il concorrente favorito, salvo nel caso in cui il
favorito sia la selezione corrente
Miglior prezzo in lay all’istante corrente della selezione antagonista
Stake (o carico) disponibile al miglior prezzo in back della selezione
antagonista
Stake (o carico) disponibile al miglior prezzo in lay della selezione
antagonista
Miglior prezzo in back all’istante precedente della selezione antagonista
Miglior prezzo in lay all’istante predente della selezione antagonista
Stake (o carico) disponibile al miglior prezzo in back della selezione
antagonista
Stake (o carico) disponibile al miglior prezzo in lay della selezione
antagonista
Miglior prezzo in back a due istanti precedenti della selezione antagonista
Miglior prezzo in lay a due istanti precedenti della selezione antagonista
Stake (o carico) disponibile al miglior prezzo in back della selezione
32
LAS(t-2)
33
34
Togo
Runners
35
wins
antagonista
Stake (o carico) disponibile al miglior prezzo in lay della selezione
antagonista
Informazioni generali sul mercato
Secondi che mancano alla partenza ufficiale della gara
Numero di selezioni disponibili per il mercato
Uscita desiderata
Funzione indicatrice della vittoria
Selezione dei campioni
La selezione dei campioni da inserire nel training set è fondamentale per garantire la
rappresentatività del campione stesso. La mole di dati raccolti fornisce una buona libertà nella scelta
dei criteri di ammissibilità dei campioni:
• omogeneità dei campioni: quando l’evento reale inizia, il mercato passa dalla fase di
trading a quella “live”. In questo passaggio tutte le scommesse non abbinate vengono
rimosse ed inizia una nuova contrattazione. Al fine di avere campioni temporali significativi
è quindi importante che i tre istanti che concorrono alla definizione di un campione
(nominalmente t, t-1 e t-2) appartengano alla stessa fase di contrattazione. Se così non fosse
si otterrebbero delle discontinuità sui prezzi di mercato artificiosi, dovuti ad un evento
singolare che interrompe la sequenza
• ammissibilità per prezzo: la significatività dei prezzi osservati varia enormemente a
seconda del livello di quota. A prezzi molto piccoli (al di sotto di 1.1) corrisponde una
vittoria quasi certa; al contrario livelli di prezzo molto alti (al di sopra di 1:50) sono molto
poco significativi in quanto sono determinati quasi unicamente da quote residue
abbandonate dal banco o da azioni speculative. E’ pertanto opportuno limitarsi a campioni
con prezzi di mercato (userò il back per maggiore significatività) compresi in un opportuno
intervallo.
• ricampionamento: il ricampionamento dei dati in ingresso permette di manipolare la
proporzione tra diverse classi di campioni. Uno dei problemi del fenomeno osservato è la
bassa incidenza statistica delle selezioni vincenti. Infatti, un mercato ha mediamente 10-12
selezioni a cui corrisponde una probabilità a priori di vittoria intorno al 5%. In letteratura è
noto che questo sbilanciamento tra le cardinalità delle due classi può rendere difficoltoso
l’apprendimento. Tuttavia il ricampionamento pone due problematiche:
• la probabilità a priori è di per sé un’informazione: ricampionare eccessivamente il
dataset può distruggere completamente questa informazione. Visto che l’obiettivo è
stimare le probabilità di vittoria e di sconfitta conviene mantenere il ricampionamento
entro termini accettabili
• ricampionare il training set vuole spesso dire replicare alcuni campioni della classe meno
numerosa. Questo solleva evidenti problemi sul filtraggio del rumore e sulla capacità di
generalizzazione della rete ottenuta e ripropone problematiche di overfitting. Nel nostro
caso il ricampionamento può essere effettuato senza replicare alcun campione. Dato il
grande numero di rilevamenti è infatti sufficiente campionare la classe dei vincitori con
una distribuzione di probabilità diversa per ottenere un aumento di dati senza
duplicazione degli stessi.
Nella costruzione del dataset ho scelto i seguenti parametri:
parametro
Prezzo minimo
valore
1.3
Prezzo massimo
50
% perdenti
5%
% vincenti
15%
commenti
Equivale ad una probabilità stimata di vittoria di circa
il 30%, al di sotto di questo valore già si vedono gli
effetti della speculazione
Al di sopra del 50% i prezzi appaiono decisamente
poco significativi
Per i campioni che soddisfano gli altri criteri si applica
una probabilità di selezione del 5%. Questo permette
di ottenere un numero comunque molto alto di
campioni che spaziano su tutti gli eventi registrati.
Mediamente un evento viene osservato per 13-14
minuti (10 di trading + 3-4 di durata del live), quindi
campionando ogni 5-7 secondi si hanno circa 140
campioni per evento; ricampionando se ne hanno 7-8.
Selezionando i vincenti con una probabilità tripla
rispetto ai perdenti si innalza la percentuale dei
vincenti a circa il triplo dell’incidenza originaria,
mantenendola comunque di gran lunga inferiore al
50%
Applicando questi parametri ai campioni reali ottenuti dalla fase di logging, composta da circa 3300
eventi, si filtrano gli oltre 3 milioni e mezzo di campioni fino ad ottenerne “solo” 186175,
innalzando contemporaneamente la percentuale di campioni vincenti dal 5 al 15%
E. Addestramento
Una volta estratto il training set si passa alla fase di addestramento. Come primo tentativo usiamo la
rete di Figura 5 ed un algoritmo di backpropagation con learning rate pari a 0.8 ed un momento di
0.6. il risultato, utilizzando i primi 5000 campioni del dataset, è riportato in Figura 6. Come appare
evidente, la rete parte già con delle performance interessanti, caratterizzate da un errore medio
intorno a 0.3 (che, come mostrerò, è già comparabile con l’errore medio delle stime basate sui
prezzi). Tuttavia, con l’avanzare delle epoche di addestramento, l’errore non diminuisce
significativamente, tanto da attestarsi dopo 200 epoche intorno a 0.28. E’ da evidenziare che anche
una riduzione modesta dell’errore di previsione può essere sfruttata per ottenere utili, seppur su una
grande mole di eventi.
Figura 6 RMSE del training di base
L’obiettivo è di modificare questa dinamica dell’errore per ottenere una riduzione constante, anche
se limitata, dell’errore stesso. A questo scopo è possibile attuare due interventi, il primo frutto di
considerazioni generali sulla dinamica dell’errore, il secondo specifico per le caratteristiche del
particolare problema in analisi.
Innanzitutto pare che la mancata dinamica decrescente dell’errore sia dovuta ad oscillazioni che
statizzano l’RMSE intorno ad un valore prossimo a quello iniziale. La soluzione tipica in questi casi
è una qualche forma di annealing. In questo caso ho scelto un annealing dinamico al 15%, questo
significa che ogni qualvolta l’errore aumenta il learning rate viene diminuito del 15%.
Inoltre, valutando il dataset, appare evidente una certa di sproporzione tra gli ordini di grandezza
delle singole componenti di ogni campione. Infatti, in ogni campione troviamo campi che
rappresentano prezzi (vuoi prezzi di mercato che starting price), altri che rappresentano carichi
(stake disponibile o volumi scambiati) ed infine altri che rappresentano intervalli temporali e
numero di partecipanti. Le tre classi di componenti assumono ovviamente valori ben differenti, a
volte distanti ordini di grandezza tra di loro. Questa considerazione, unitamente ad alcune
valutazioni sul significato di valori particolari, introduce la tematica del condizionamento tramite
preprocessing dei dati. Analizziamo queste operazioni per le tre classi di componenti:
•
•
•
valori di prezzo: i prezzi vengono distorti utilizzando una scala logaritmica. Man mano che
il prezzo aumenta, la differenza tra due prezzi diventa sempre meno significativa. Inoltre il
prezzo pari a 2 assume un significato particolare, dato che è il prezzo che, almeno
idealmente, dovrebbe indicare un evento puramente casuale; per questo motivi ho scelto di
utilizzare il prezzo 2 come punto per il cambio di segno del logaritmo. Riassumendo, i
prezzi vengono preelaborati attraverso la formula:
price = ln( p − 1)
valori di flussi: le componenti che rappresentano flussi di denaro assumono solitamente
valori maggiori dei prezzi, mentre anche per queste componenti rimane valicala
considerazione generale sulla significatività delle variazioni rispetto al valore assunto.
Inoltre in questo caso occorre gestire l’eventualità di un carico nullo. Per questi motivi ho
utilizzato un logaritmo in base dieci con una preventiva traslazione di una unità del volume
scambiato (o disponibile):
volume = log10 ( v + 1)
valori generici: le componenti che indicano i secondi mancanti all’inizio della corsa ed il
numero di partecipanti non vengono preelaborati, essendo per loro natura limitati ad un
range piuttosto contenuto.
Figura 7 andamento dell'RMSE con preprocessing
Per valutare l’effetto del condizionamento dei campioni è stato necessario aggiungere il
condizionatore al programma di elaborazione dei log. Aggiungendo l’annealing ed il preprocessing
dei campioni si ottiene il risultato di Figura 7. In effetti in questo caso le oscillazioni dell’errore
vengono smorzate entro le prime epoche di addestramento e l’errore assume il tipico andamento
decrescente, tendendo ad un valore prossimo a 0.24.
Si conclude quindi che le modifiche apportate hanno da un lato risotto l’errore finale della rete, e
dall’altro ne hanno stabilizzato il comportamento.
F. Generalizzazione della rete
Una volta compreso quale forma dare ai dati di training e che tipo di rete utilizzare occorre
dimensionare correttamente la rete medesima e scegliere i valori da assegnare ai parametri di
apprendimento (learning rate e momento).
A tal fine occorre confrontare tra di loro diverse opzioni sulla base dell’errore di validazione e per
fare ciò è opportuno utilizzare una tecnica di cross-validazione, in cui l’intero campione in ingresso
viene partizionato in K frammenti. La valutazione della rete avviene in K turni, in ciascuno dei
quali la rete viene reinizializzata, addestrata con i campioni provenienti da tutti i frammenti meno
uno, ed infine valicata sul frammento non usato nella fase di addestramento. Ad ogni turno si
sceglie un frammento diverso per la validazione ed alla fine si calcola la media degli errori di
validazione. La media calcolata è un indice delle capacità di generalizzazione della rete con
riferimento al particolare dataset, ma utilizzando porzioni diverse dello stesso dataset in fase di
addestramento e di validazione questo diventa un indicatore della generalizzazione della rete
rispetto al problema ed è quindi utile per scegliere i parametri tipici della rete.
Per usare la K-fold crossvalidation per selezionare la rete da utilizzare è possibile, banalmente,
misurare la generalizzazione di diverse configurazioni e scegliere quella che garantisce l’errore di
generalizzazione minimo.
Nel nostro caso i parametri che determinano maggiormente la capacità di generalizzazione della
rete sono il numero di nodi nello strato nascosto, il coefficiente di apprendimento ed il momento.
Nell’esperimento sono stati combinati tre valori per la dimensione del livello nascosto (15, 7 e 35)
con due livelli per il learning rate (0.8 e 0.6) e due per il momento (0.6 e 0.4), ottenendo un totale di
12 differenti configurazioni.
Il campione è stato diviso in cinque frammenti di 20000 campioni ciascuno. Viste alcune difficoltà
implementative di Joone si è scelto di memorizzare i singoli frammenti in file fisicamente distinti e
di usarli per una closs validation con K=5; ad ogni iterazione, quindi, la rete è stata addestrata con
80000 campioni e valicata con i restanti 20000. Per ogni configurazione provata e per ogni
combinazione dei blocchi di training si è eseguito l’addestramento per 100 epoche.
I risultati della valutazione comparativa, ottenuti dopo qualche ora di computazione, sono riportati
nella tabella seguente:
# hidden level
Learning rate
Momentum
Mean Training
error
15
15
15
15
7
7
7
7
35
35
35
35
0.8
0.8
0.6
0.6
0.8
0.8
0.6
0.6
0.8
0.8
0.6
0.6
0.6
0.4
0.6
0.4
0.6
0.4
0.6
0.4
0.6
0.4
0.6
0.4
0.356758
0.340779
0.34712
0.339618
0.34353
0.33582
0.33775
0.33428
0.38539
0.36564
0.36835
0.35199
Mean
Generalizzation
error
0.3763
0.35604
0.36362
0.35328
0.36024
0.34997
0.3513
0.34871
0.37
0.39274
0.4035
0.36768
Come si può notare gli errori di training e di validazione sono molto vicini tra di loro, questo indica
che il campione raccolto è in effetti significativo e si può ben sperare in risultati analoghi
utilizzando campioni al di fuori dei log.
Anche se di poco, la configurazione più efficiente sia in termini di apprendimento che in termini di
generalizzazione è quella con 7 neuroni nello strato nascosto, un learning rate iniziale (ridotto
dall’annealing) pari a 0.6 ed un momento di 0.4.
A questo punto è necessario chiedersi se questi risultati sono o meno sufficienti a fornire un trader
efficace. In particolare occorre confrontare l’errore medio di generalizzazione della rete con quello
che si otterrebbe con dei predittori elementari. Il modo più semplice per stimare la probabilità del
verificarsi di un evento è tramite l’inverso del numero di eventi disgiunti ed incompatibili. Nella
fattispecie si tratta di considerare, a priori, ogni corridore ugualmente capace di vincere la corsa, in
questo caso la proprietà viene stimata come:
1
P=
# partenti
In realtà, superare la precisione di una stima a priori non è sufficiente per ottenere un vantaggio
rispetto al mercato, quello che occorre è invece ottenere una stima più precisa di quella “fatta” dal
mercato stesso.
La stima del mercato può essere calcolata sia utilizzando le quote in back che quelle in lay:
1
1
P=
P=
Backprice
Layprice
Il calcolo delle stime di mercato viene eseguito contestualmente all’estrazione dei campioni dai log
ed è quindi pertinente ai campioni effettivamente utilizzati e resi disponibili al predittore. Gli errori
calcolati in questi tra modi sono riportati di seguito:
• RSME base = 0.512707392186992
• RSME back = 0.45659080492446985
• RSME lay = 0.4597434753711496
Effettivamente gli errori delle stime di back e di lay sono più precise di quelle del predittore di base;
questo sta a significare che i prezzi sono, come ovvio, correlati all’effettiva probabilità di vittoria.
Il confronto con il migliore dei predittori di base, quello basato sui prezzi in back, mostra una
precisione nettamente superiore, quantificabile con una riduzione dell’errore medio pari al 24%.
G. Trading automatico
Fino ad ora abbiamo ottenuto uno stimatore che appare nettamente migliore rispetto alle stime delle
quote di mercato. Questo significa che la rete ottenuta è effettivamente in grado di fornire un
vantaggio competitivo, vuoi fornendo indicazioni all’utente, vuoi fungendo da fonte informativa per
un sistema di trading automatico.
Resta ora da capire come si possa sfruttare questo predittore per automatizzare alcune operazioni sui
mercati. In questo lavoro mi limiterò all’uso più semplice, che consiste nell’adoperare la predizione
della rete per valutare quando i prezzi di mercato sono convenienti (alti in back o bassi in lay) e,
sotto alcune condizioni di ammissibilità e con qualche indicazione sulle tattiche operative, operare
di conseguenza degli acquisti di quote libere sul mercato.
Il trader opera con la seguente modalità:
• In ogni istante di campionamento osserva il mercato, registrando le quote disponibili ed i
carichi corrispondenti
o Per ogni corridore
 Utilizzando una memoria per gli stati del mercato ai due istanti precedenti
calcola in tempo reale i 34 ingressi del predittore neurale
 Passa gli ingressi alla rete ottenendo una stima della probabilità di vittoria di
ogni selezione
 Se la probabilità di vittoria desunta dal prezzo in back è sufficientemente
più bassa di quella ottenuta dalla rete e la selezione non è stata ancora
giocata in back, gioca la selezione al prezzo di mercato ed un carico
compreso in un intervallo predefinito compatibilmente con il mercato
 Se la probabilità di vittoria desunta dal prezzo in lay è sufficientemente più
alta di quella ottenuta dalla rete e la selezione non è stata ancora giocata in
lay, banca la selezione al prezzo di mercato ed un carico compreso in un
intervallo predefinito compatibilmente con il mercato
o Se hai raggiunto l’esposizione massima accettabile termina
Per poter simulare l’attività del trader sui mi dadi inseriti nel log è necessario introdurre dei
controlli per evitare che la stessa selezione venga giocata (o bancata) più di una volta. Questo è
importante perché, dato che si stanno usando dei log, in realtà le operazioni eseguite dal trader non
interferiscono con le quote di mercato. Questo vuol dire che se una selezione rimane costantemente
ad un prezzo considerato conveniente il trader continuerebbe a giocarla ogni 5 secondi; questo
comportamento, oltre ad essere particolarmente pericoloso, non riflette ciò che accadrebbe in un uso
reale sul campo, in cui invece la transazione farebbe quantomeno diminuire il carico disponibile, ed
è pertanto poco indicativa dell’effettivo potenziale del trading.
Il funzionamento del trader è parametrico rispetto a nove parametri:
Parametro
minAdv
maxAdv
minPrice
maxPrice
minStake
maxStake
Descrizione
Vantaggio minimo stimato per cui conviene operare sul mercato.
Una volta calcolata la probabilità di vittoria dal mercato (vuoi in
back, vuoi in lay) questa viene confrontata con la previsione della
rete, ottenendo il vantaggio della rete in percentuale rispetto alla
probabilità di mercato.
In back questo diventa:
 previsione 
adv = 
− 1 ⋅ 100
 mercato

Mentre in lay abbiamo
previsione 

adv =  1 −
 ⋅ 100
mercato 

Vengono valutate solo le operazioni per cui
adv ≥ min Adv
Anche vantaggi troppo eclatanti possono indicare operazioni troppo
rischioso. Infatti può essere sintomo di fattori esogeni particolari
che incidono sulla probabilità di vittoria del corridore, ma che per
loro natura non possono essere stati presi in considerazione durante
la fase di addestramento della rete.
Per questo motivo vengono valutate solo le operazioni con
adv ≤ max Adv
Indica il livello minimo di prezzo a cui si è disposti operare. Oer
motivi di semplicità lo stesso valore viene usato sia in back che in
lay
Indica il livello massimo di prezzo a cui si è disposti operare
E’ il carico minimo che si vuole puntare, se il mercato non offre il
carico minimo l’operazione viene ignorata
E’ il carico massimo che si vuole puntare. Se il mercato offre un
carico maggiore l’operazione sarà comunque eseguita con il carico
massimo
Exposure
Back
Lay
Esposizione massima sul singolo evento. Quando il trader ha
collocato o bancato scommesse per una responsabilità pari
all’esposizione (il carico in back e carico * (prezzo-1) in lay)
termina le operazioni e passa al prossimo mercato.
Questo evita di esporsi eccessivamente durante la fase di trading.
E’ anche possibile decidere da che parte del banco giocare, in back,
in lay o in entrambi. Questo parametro booleano indica se operare
in back
Indica se operare in lay
H. Ottimizzazione dei parametri
Sebbene il lavoro di apprendimento del mercato possa dirsi concluso con successo, è opportuno
valutare le potenzialità di guadagno offerte dal predittore. Per fare questo occorre cercare una
particolare configurazione dei parametri operativi che, in una simulazione di mercato, garantisca il
massimo guadagno.
In questo frangente ci si può affidare a tecniche genetiche, che ottimizzino l’insieme dei parametri
rispetto al guadagno.
Il sistema opera con un crossover ad un punto ed una probabilità di mutazione uniforme.
Tecnologicamente, la scelta è caduta sulla libreria JGAP che, rispetto ad altre soluzioni, permette di
operare con cromosomi eterogenei, cioè composti da geni di tipo diverso.
Campioni per l’addestramento
Il simulatore del trading è a tutti gli effetti il trader definitivo, fatto salvo il fatto che opera su dati
simulati invece che in linea con il mercato reale. Per farlo funzionare, quindi, servono i parametri
operativi ed i dati provenienti dal mercato.
Questi ultimi sono di fatto analoghi a quelli usati nella fase di addestramento della rete: i 34
campioni in ingresso vengono usati per stimare la probabilità di vittoria, mentre l’informazione sul
vincente viene usata per calcolare le vincite. Tuttavia, non è possibile riutilizzare i log per
l’addestramento della rete dato che questi non hanno alcuna caratteristica di località e sono anzi
prodotti volutamente scegliendo campioni da mercati diversi ed evitando di campionare troppo
spesso lo stesso mercato.
Per una corretta simulazione, al contrario, è necessario avere log completi di alcuni mercati, pur
operando un campionamento anche rado all’interno del set di mercati. Per questo motivo è
necessario eseguire una seconda estrazione dai log. In questo caso ho campionato i mercati con una
probabilità del 5% estraendo, per motivi di efficienza, solo 20 mercati (corrispondenti all’incirca ad
una giornata di attività). L’estrazione genera il log completo del mercato nella forma idonea ad
essere processata dalla rete neurale; per ogni corridore estrae le tuple che lo riguardano e le combina
con quelle del rispettivo antagonista. L’effetto è la creazione di uno storico di circa cento campioni
(ciascuno composto da 35 valori) per ogni corridore di ciascun mercato selezionato.
Evoluzione
I cromosomi, come detto, contengono un gene per ogni parametro operativo, cioè nove geni.
Innanzitutto ogni gene ha un tipo e degli intervalli ammissibili differenti; questo non crea problemi
durante la fase di addestramento, dato che si è scelto un crossover ad un punto e quindi le posizioni
all’interno del cromosoma vengono preservate durante la fase di evoluzione.
Fortunatamente la libreria utilizzata, JGAP, supporta cromosomi eterogenei.
Scegliendo convenientemente i limiti ammissibili per ogni gene si può indirizzare l’evoluzione
verso valori ritenuti semanticamente accettabili e velocizzare pertanto la convergenza della
popolazione anche utilizzando un numero tuttosommato esiguo di individui.
Nella fattispecie, i tipi ed i range ammissibili di ogni gene sono indicati di seguito:
Gene
minAdv
maxAdv
minPrice
maxPrice
minStake
maxStake
Exposure
Back
Lay
Tipo
Int
Int
Double
Double
Int
Int
Double
Boolean
Boolean
Min
1
30
1
3
1
200
300
-
Max
100
300
4
30
400
1000
3000
-
Anche all’interno dei range proposti esistono dei cromosomi che in realtà non ammettono alcuna
politica di trading diversa dalla politica nulla (cioè dall’assenza di operazioni sul mercato), ad
esempio è perfettamente lecito generare un cromosoma con minPrice>maxPrice, visto che i due
range ammissibili non sono disgiunti. Un siffatto cromosoma non accetterebbe di piazzare o
ricevere scommesse ad alcun prezzo. Lo stesso si dica per le restanti coppie di geni. Inoltre, anche
un cromosoma che disabiliti contemporaneamente le operazioni in back e quelle in lay sarebbe di
fatto inattivo e pertanto da scartare a priori.
Le dipendenze funzionali tra geni hanno caratteristiche locali, nel senso che coinvolgono al
massimo due geni. E’ pertanto conveniente definire dei cosiddetti supergeni:
“Un supergene è un gruppo di geni vicini in un cromosoma che sono ereditati insieme a
causa del forte legame genetico e sono funzionalmente correlati in senso evolutivo,
sebbene siano raramente co-regolati geneticamente” – Wikipedia
Da un punto di vista tecnico, un multigene è una collezione di geni contigui che:
• Non vengono spezzati dall’operazione di crossover
• Se vengono mutati vengono mutati insieme
• Sono co-vincolati da un vincolo di integrità che deve essere rispettato durante la mutazione
Il principale vantaggio nell’uso dei supergeni è che, invece di produrre un intero cromosoma e
valutarne l’ammissibilità prima di introdurlo nella popolazione, è possibile mutare ogni supergene
indipendentemente e valutarne indipendentemente l’ammissibilità, con un sostanziale
miglioramento dell’efficienza dell’algoritmo e dei tempi di convergenza dello stesso.
Nel caso specifico ho definito due tipi di supergeni:
• Un supergene ordinale, che impone l’ordinamento dei geni (interi o double) che lo
costituiscono. Viene usato per garantire che gli intervalli operativi dei diversi parametri non
siano vuoti. Questo ovviamente non garantisce che la politica non sia nulla, ma elimina una
grande moltitudine di cromosomi evidentemente inattivi
• Un supergene booleano, che impone che i costituenti (booleani) non siano entrambi falsi.
Viene usato per garantire che le due modalità operative back e lay non vengano mai
disabilitate contemporaneamente
minAdv maxAdv minPrice
<
maxPrice minStake maxStake exposure
<
<
back
lay
∨
exposure
Figura 8 partizionamento del cromosoma in supergeni
La fitness usata dall’algoritmo di apprendimento non è altro che il guadagno netto prodotto dalla
politica rappresentata dal cromosoma ottenuto dal simulatore sui mercati estratti casualmente dal
campione di log. In realtà, visto che la si richiede una fitness definita positiva, il profitto o perdita
della politica deve essere postprocessato.
La funzione di postprocessing dovrebbe:
• Evidenziare i miglioramenti in terreno positivo
• Penalizzare le politiche che generano perdite
La scelta è caduta su una funzione continua e monotona crescente, che è lineare per le vincite ed
esponenziale per le perdite:
 x
+1 x≥ 0

fitness (c) =  1000
 e x x < 1
fitness
1
1/1000
P/L
Le restanti caratteristiche dell’algoritmo sono:
• Popolazione di venti campioni, mantenuta costante tramite una selezione pesata sulla fitness
• Elitismo del solo primo elemento: mantenere il miglior esemplare nella generazione
seguente impedisce di perdere una soluzione pseudo-ottima o comunque ad alta efficienza
• Crossover ad un punto con probabilità costante del 10%
• Mutazione con probabilità costante del 5% sul cromosoma
Nonostante la ridotta dimensione della popolazione, dopo sole dieci generazioni viene selezionato
un gruppo di soluzioni molto efficaci, la migliore delle quali è:
adv [36-110]
price[3.37-7.87]
stake[372-525]
exposure = 2067
back: false
lay: true
Questa soluzione produce un utile netto su 20 mercati pari a 3546 euro. Considerando che il
campione considerato, seppur sparso in mesi di log, equivale come durata ad una giornata di
attività, è evidente l’efficacia della politica individuata.
In realtà la soluzione appare robusta e dotata di buone caratteristiche di generalità. Infatti:
• La scelta di operare unicamente in lay è supportata dal fatto che, mediamente, il denaro
disponibile in lay è fornito da giocatori meno esperti di quello disponibile in back, che è
invece gestito da bookmaker professionisti. E’ pertanto plausibile che su questo frangente si
presentino le migliori occasioni e ci sia una maggiore probabilità di avere prezzi che si
discostino dai reali valori di mercato
• Gli intervalli di ammissibilità di prezzi e carichi e l’esposizione massima consentita sul
singolo mercato sono più che ragionevoli, ed anzi sono sorprendentemente conformi
all’operatività media di un buon trader.
• L’intervallo del vantaggio fornito dalla rete appare anche molto adeguato. Vantaggi
superiori al 100% corrispondono ad una probabilità di vittoria pari alla metà di quella posta
sul mercato (operando in lay) e sono pertanto da valutare con cautela
I. Conclusioni
In questo lavoro ho mostrato come sia possibile utilizzare combinatamene le tecniche neurali e
genetiche per sintetizzare una politica di acquisto e vendita di quote di scommesse sportive
producendo un utile. Il trader ottenuto opera senza bisogno dell’intervento umano, estrae
dall’osservazione del mercato alcuni indici e coefficienti che caratterizzano la fase di contrattazione
e li fa elaborare da una rete neurale appositamente addestrata per stimare la probabilità di vittoria di
ogni partecipante.
La fase preliminare di trading della rete ha permesso di ottenere un predittore più preciso del
mercato stesso; il trader può pertanto utilizzare la rete per valutare quanto le quote di mercato siano
disallineate dall’effettivo valore di ogni concorrente ed operare di conseguenza alcune scelte
tattiche sulla posizione da assumere rispetto ad ogni selezione.
Per ottenere la rete sono state necessarie diverse fasi:
• Innanzitutto è stato sviluppato un tool in grado di accedere al mercato ed estrarre le
informazioni salienti delle con trattazioni in tempo reale e di memorizzarle in appositi file
XML
• Sono stati estratti diversi campioni, con diverse politiche, per la fase di addestramento della
rete e di successiva ottimizzazione dei parametri operativi
• E’ stato valutato un sistema di preprocessing dei dati in grado di mettere in evidenza
grandezze semanticamente rilevanti quali i prezzi medi scambiati e si è arrivati a definire gli
input della rete
• E’ stato implementato un sistema genetico che, sfruttando la tecnica dei supergeni, ha
portato entro poche generazioni ad identificare una politica vincente
L’insieme delle operazioni svolte, degli artefatti e dei dati prodotti è riportato nella figura seguente:
logger
mercato
Master LOG
Sampler di
campioni
Sampler di mercati
Training set
Simulation set
Parameters set
crossvalidazione
rete
iniziale
rete
ottima
progetto
GA
trader
Figura 9 schema di alto livello della sintesi del trader
Resta da valutare quanto i risultati di una simulazione si trasferiscano all’uso reale in linea del
trader. Il principale limite della simulazione è che non è in grado di valutare quanto il mercato sia
competitivo in termini di scambi. Il trader fa l’assunzione di poter acquistare l’intero carico
disponibile sul mercato, ma in generale questo non accadrà visto che altri attori stanno
contemporaneamente operando sul mercato e le loro quote potrebbero essere abbinate per prime,
lasciando di fatto al trader una minore possibilità operativa.
Quando il carico richiesto dal trader non può essere soddisfatto pienamente, il resto rimane
disponibile sul mercato dalla parte opposta del banco. Questo significa che, ad esempio, se vengono
collocati 100 euro in back e ne vengono abbinati solo 80, i restanti 20 rimangono disponibili per
una successiva operazione in lay. E’ chiaro che in questo scenario il prezzo della selezione è sceso
al di sotto del livello osservato dal trader, se il corridore si avvia ad una sicura vittoria il prezzo non
subirà ulteriori oscillazioni verso l’alto, e quindi i 30 euro non verranno mai giocati; al contrario se
il corridore viene battuto la sua quota risalirò durante la gara fino a raggiungere il massimo
permesso (1000:1), facendo abbinare anche i 20 euro residui. Discorso duale vale nel caso
dell’operatività di lay. Quindi, la presenza di operatori sul mercato riduce solitamente le previsioni
di guadagno, visto che incide, riducendolo, solo sul carico delle scommesse che portano un profitto.
Un primo passo per stimare l’impatto dei competitori sul mercato sarebbe valutare quanto del carico
transato del trader viene giocato durante la fase di live. In questa fase particolarmente tumultuosa,
infatti, si dovrebbero verosimilmente concentrare le migliori occasioni, ma anche la maggiore
concorrenza da parte degli altri operatori.