Neural Trader: utilizzo di reti neurali per il trading di scommesse

Pagina creata da Cristian Frigerio
 
CONTINUA A LEGGERE
Neural Trader: 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:
premio
                                         quota =
                                                   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           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.
      a totalizzatore         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:

                                                     1
                                              P=
                                                   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:

                                                                    ∑    carico S 2
                                   ∀ S ∈ M : carico S =            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 Q1) o negativo (Q
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                                           descrizione
                              Prezzi della selezione corrente
 1     B(t)      Miglior prezzo in back all’istante corrente
 2     L(t)      Miglior prezzo in lay all’istante corrente
 3     BS(t)     Stake (o carico) disponibile al miglior prezzo in back
 4     LS(t)     Stake (o carico) disponibile al miglior prezzo in lay
 5    B(t-1)     Miglior prezzo in back all’istante precedente
 6    L(t-1)     Miglior prezzo in lay all’istante predente
 7    BS(t-1)    Stake (o carico) disponibile al miglior prezzo in back
 8    LS(t-1)    Stake (o carico) disponibile al miglior prezzo in lay
 9    B(t-2)     Miglior prezzo in back a due istanti precedenti
10    L(t-2)     Miglior prezzo in lay a due istanti precedenti
11    BS(t-2)    Stake (o carico) disponibile al miglior prezzo in back
12    LS(t-2)    Stake (o carico) disponibile al miglior prezzo in lay
                             Scambi sulla selezione corrente
13   MODD(t)     Starting price attuale della selezione
14    MS(t)      Carico scambiato sulla selezione
15   DODD(t)     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 )
16     DS(t)     Volume scambiato nell’ultimo intervallo di tempo, calcolabile come:
                                             DS (t ) = MS (t ) − MS (t − 1)
17   DODD(t-1)   Prezzo medio scambiato nel penultimo intervallo temporale. E’ di fatto la
                 versione traslata di un istante di DOSS(t)
18    DS(t-1)    Volume scambiato nel penultimo intervallo temporale
19   MODD(t-2)   Starting price calcolato due istanti prima dell’attuale, raccoglie
                 l’informazione sul comportamento medio prima delle ultime rilevazioni
20    MS(t-2)    Volume scambiato dall’apertura del mercato al terzultimo campione
                            Prezzi della selezione antagonista
21     BA(t)     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
22    LA(t)      Miglior prezzo in lay all’istante corrente della selezione antagonista
23    BAS(t)     Stake (o carico) disponibile al miglior prezzo in back della selezione
                 antagonista
24    LAS(t)     Stake (o carico) disponibile al miglior prezzo in lay della selezione
                 antagonista
25    BA(t-1)    Miglior prezzo in back all’istante precedente della selezione antagonista
26    LA(t-1)    Miglior prezzo in lay all’istante predente della selezione antagonista
27    BAS(t-1)   Stake (o carico) disponibile al miglior prezzo in back della selezione
                 antagonista
28    LAS(t-1)   Stake (o carico) disponibile al miglior prezzo in lay della selezione
                 antagonista
29    BA(t-2)    Miglior prezzo in back a due istanti precedenti della selezione antagonista
30    LA(t-2)    Miglior prezzo in lay a due istanti precedenti della selezione antagonista
31    BAS(t-2)   Stake (o carico) disponibile al miglior prezzo in back della selezione
antagonista
  32    LAS(t-2)      Stake (o carico) disponibile al miglior prezzo in lay della selezione
                      antagonista
                                Informazioni generali sul mercato
  33      Togo        Secondi che mancano alla partenza ufficiale della gara
  34     Runners      Numero di selezioni disponibili per il mercato
                                         Uscita desiderata
  35       wins       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                valore                                 commenti
Prezzo minimo           1.3                  Equivale ad una probabilità stimata di vittoria di circa
                                             il 30%, al di sotto di questo valore già si vedono gli
                                             effetti della speculazione
Prezzo massimo          50                   Al di sopra del 50% i prezzi appaiono decisamente
                                             poco significativi
% perdenti              5%                   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.
% vincenti              15%                  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:

                                                                                          Mean
                                                                Mean Training
 # hidden level       Learning rate         Momentum                                  Generalizzation
                                                                   error
                                                                                           error
       15                   0.8                  0.6              0.356758                0.3763
       15                   0.8                  0.4              0.340779               0.35604
       15                   0.6                  0.6               0.34712               0.36362
       15                   0.6                  0.4              0.339618               0.35328
        7                   0.8                  0.6               0.34353               0.36024
        7                   0.8                  0.4               0.33582               0.34997
        7                   0.6                  0.6               0.33775                0.3513
        7                   0.6                  0.4               0.33428               0.34871
       35                   0.8                  0.6               0.38539                 0.37
       35                   0.8                  0.4               0.36564               0.39274
       35                   0.6                  0.6               0.36835                0.4035
       35                   0.6                  0.4               0.35199               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                                          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 
          minAdv                                   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
          maxAdv
                               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
         minPrice              motivi di semplicità lo stesso valore viene usato sia in back che in
                               lay
         maxPrice              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
         minStake
                               carico minimo l’operazione viene ignorata
                               E’ il carico massimo che si vuole puntare. Se il mercato offre un
         maxStake              carico maggiore l’operazione sarà comunque eseguita con il carico
                               massimo
Esposizione massima sul singolo evento. Quando il trader ha
                                 collocato o bancato scommesse per una responsabilità pari
          Exposure               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,
            Back                 in lay o in entrambi. Questo parametro booleano indica se operare
                                 in back
             Lay                 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                             Tipo                       Min                 Max
         minAdv                             Int                         1                  100
         maxAdv                             Int                        30                  300
         minPrice                         Double                        1                    4
         maxPrice                         Double                        3                   30
         minStake                           Int                         1                  400
         maxStake                           Int                       200                 1000
         Exposure                         Double                      300                 3000
           Back                           Boolean                       -                    -
           Lay                            Boolean                       -                    -

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:
Puoi anche leggere