Capitolo 5
Sum e SumWeb
Il modello Sum, acronimo di Surprising (Un)realistic Market,
è un modello ad agenti adattivi, che simula un mercato di borsa inizialmente
molto particolare, infatti, la prima versione di Sum è costituita da
un mercato artificiale popolato esclusivamente da agenti semplici, definiti
"random", i quali non operano in base a credenze o aspettative, ma
a caso.
Il progetto, al quale hanno contribuito alcuni tesisti aggiungendo elementi,
è tuttora in fase di sviluppo. L'autore, Pietro Terna (homepage,
pubblicazioni),
ha intenzione di aumentarne progressivamente il grado di realismo, eliminando
parte delle semplificazioni introdotte, estendendo meccanismi e strutture del
mercato e ricreando gran parte della varietà dei comportamenti attuati
dagli operatori "reali".
Dalla sua realizzazione ad oggi, infatti, Sum ha subito diverse modifiche. In
questo capitolo sarà descritta inizialmente la struttura di base del
modello, per poi analizzare le più recenti modifiche, tra cui, principalmente,
vi è l'estensione denominata SumWeb (grazie alla quale è possibile
fare esperimenti non solo con agenti artificiali, ma anche agenti umani).
He's
Tony DeRuvo, thinkin' about Sum (or Thinkin' in Java ???)
5.1 Struttura di base di Sum
Sum, acronimo di Surprising (Un)realistic Market è un
progetto di simulazione di un mercato di borsa. Lo scopo di Sum (e della sua
estensione SumWeb) è simulare la nascita di un mercato trattato tic per
tic, senza meccanismo artificiosi qual è il banditore, presente in molti
modelli di simulazione (Terna,
2000).
In questo mercato simulato si vuole osservare il comportamento, ricostruendo
la struttura di un mercato reale, degli agenti artificiali che vi operano e
quali sono i risultati, da un punto di vista aggregato, dei loro comportamenti.
In Sum è stata evitata ogni semplificazione relativa alla formazione
dei prezzi, come ad esempio l'utilizzo del banditore, ma è stata ricreata
la struttura del book telematico operante nei mercati reali; in questo modo
il prezzo dei titoli presenti in Sum è generato, istante dopo istante,
dal comportamento degli operatori che vi operano, i quali prendono le loro "decisioni",
in merito all'operatività sul mercato, sulla base di regole che li caratterizzano,
ma assolutamente senza condizionamenti da parte del programma stesso. Gli operatori,
chiamati agenti, inviano i loro ordini al mercato e, come nella realtà,
questi vengono inseriti nel book, dal lato denaro o dal lato lettera a seconda
che siano rispettivamente ordini di acquisto o di vendita; il book manda in
esecuzione immediatamente gli ordini che trovano una controparte mentre mette
in lista, in ordine decrescente gli ordini di acquisto ed in ordine crescente
gli ordini di vendita rimanendo così coerente con le modalità
utilizzate nei mercati reali.
I risultati più interessanti emersi dal funzionamento di questo modello
sono relativi al formarsi di bolle speculative e di relativi crash; analizzando
i dati si può asserire che tale fenomeno sia generato dalla struttura
del book stesso e non tanto dalla tipologia di operatori che agiscono sul mercato
o da eventi esterni (l'influenza di eventi esterni riguarda una modifica recente
apportata a Sum); anche se a tale proposito si è notato che le bolle
ed i crash si formano più frequentemente e di maggior entità,
quando vi sono particolari tipologie di operatori (in particolare i cosiddette
"imitatori di mercato"). Ma ciò che appare particolarmente
interessante è che a discapito delle tipologie di operatori le bolle
ed i crash del mercato si generano comunque (sono state inserite, come si vedrà,
numerose tipologie di agenti, e più modifiche sono state fatte, ma i
risultati sono sempre i medesimi)
Le varie tipologie di agenti che operano in Sum, sono state inserite per far
sì che nel mercato fossero rappresentate alcune tipologie di operatori
che nella realtà agiscono sui mercati di borsa, contribuendo a caratterizzarli
e determinandone il comportamento particolare, per il quale non è ancor
stata individuata una spiegazione matematica che lo giustifichi e che lo spieghi.
Proprio questa mancata comprensione della realtà giustifica l'utilizzo
di simulazioni per cercare di comprendere la realtà studiata.
Attualmente, a differenza delle prime versioni del modello in cui vi era un
solo titolo, sono presenti più titoli di borsa (scelti a piacere dall'utente)
ed un future scambiato sulla base di un indice di mercato (l'indice dei titoli
di Sum); la scelta del titolo su cui operare è attualmente impostata
in modo casuale, ipotesi questa coerente con la realtà, per la maggior
parte degli operatori. A tale regola fanno eccezione alcuni operatori che per
il loro modo di operare necessitano di concentrarsi sempre su un titolo oppure
sempre su tutti; verrà indicato in questa breve trattazione quali di
questi agenti fanno eccezione alla regola generale su definita.
Nei paragrafi successivi saranno descritte le principali tipologie di agenti
presenti in Sum e le modifiche introdotte recentemente, fino ad arrivare all'estensione
denominata SumWeb.
Prima di descrivere dettagliatamente la struttura del modello di simulazione
si osservi la figura che
rappresenta lo schema ERA, descritto nel capitolo 3,
applicato a Sum.
In questo caso lo schema generatore di regole - gestore di regole - agente,
è rispettato solo due volte. Solo in due casi le regole sono costruite
e adattate all'ambiente, e in entrambi i casi ciò avviene perché
vi è un collegamento con le reti neurali artificiali, che imparano dall'ambiente
e formulano di conseguenza le loro strategie.
Negli altri casi vi sono invece strategie molto semplici che sono pre-fissate:
sono previsti semplici comportamenti da parte degli agenti, come, ad esempio,
i random agents per cui si prevede che la loro scelta si discosti sempre in
un range predeterminato dall'ultimo prezzo eseguito.
I RuleMaster in questi casi non solo gestiscono, ma contengono anche le regole
per gli agenti. Altre due eccezioni sono l'agente arbitraggista e gli Avatar.
Il secondo schema offre una seconda visione di Sum, complementare
alla precedente.
Osservando la figura
si nota che al centro di tutta la costruzioni vi è il book. Al book si
collegano gli oggetti che coordinano e gestiscono l'intero modello (ModelSwarm,
ObserverSwarm), i gestori di regole (Rulemaster), gli agenti (Agent), quindi
i BPCT e le reti neurali (ANN).
Al di fuori di questo schema vi sono ancora tre elementi che forniscono supporto
e dati agli agenti. Questi sono l'IndexCalculator che calcola l'indice di mercato
dopo aver interrogato i book, l'EventGenerator che genera gli eventi, e l'interfaccia
per gli agenti BPCT.
Ogni linea dritta del disegno rappresenta un legame fra le categorie di soggetti
con il book. Ogni agente chiama singolarmente il book, ma per leggibilità
dello schema è stata disegnata una sola linea simbolica. Le linee curve
invece rappresentano relazioni fra specifici componenti della simulazione ad
esempio tra l'arbitraggista e l'IndexCalculator che calcola l'indice, o fra
l'agente sensibile agli eventi e l'EventGenerator.
5.2 Gli agenti
Sum dispone di diverse tipologie di agenti, ciascuna dotata
di caratteristiche e comportamenti propri. Ogni categoria di agente fa capo
ad un oggetto contenente l'insieme di regole che determinano la scelta delle
proprie azioni. Questi oggetti prendono il nome di ruleMaster. I ruleMaster
contengono l'insieme di regole comportamentali che caratterizzano i singoli
agenti durante la simulazione. Così come avviene per altri oggetti appartenenti
al modello, anche i ruleMaster associano diverse tipologie di azioni e comportamenti
a ciascuna fase della simulazione (apertura, continua e chiusura). Sia gli agenti
che i ruleMaster utilizzano due classi di base che prendono rispettivamente
il nome di BasicSumAgent e BasicSumRuleMaster. Queste due classi contengono
gli elementi comuni a tutti gli agenti e a tutti i ruleMaster. Al loro interno
si trovano, oltre ad alcune variabili, anche i metodi che descrivono le azioni
da svolgere durante le tre fasi della giornata.
In ognuno dei seguenti sottoparagrafi saranno analizzati le principali tipologie
di agenti:
Il RandomAgent è l'agente più semplice ed è quello i cui comportamenti, possono rappresentare l'operato di più tipologie di individui nella realtà borsistica. Le scelte che tale agente attua sono casuali, cioè sceglie casualmente (con probabilità pari a 0,5) se acquistare o vendere; per ciò che riguarda il prezzo a cui l'agente Random inserisce l'ordine, questo viene scelto applicando uno switch (il cui importo è generato in modo casuale), all'ultimo prezzo trattato su quel titolo; quindi le conoscenze che il randomAgent possiede, si limitano all'ultimo prezzo eseguito. Il valore dello switch che l'operatore casuale applica all'ultimo prezzo eseguito, che egli considera come base di partenza per inserire l'ordine, può essere modificato, correggendo i limiti massimo e minimo del range in cui tale switch viene generato casualmente. Il RandomAgent è sicuramente da considerare uno tra gli agenti (tipologie di agenti) più rappresentative della compagine reale di operatori perchè, nella realtà (soprattutto in questi ultimi anni) ci sono molti investitori che operano senza possedere le competenze adatte, senza avere nessuna nozione di base di carattere economico, senza un preciso motivo legato al titolo in questione od alle condizioni macroeconomiche. Il risultato di tali operatori è ben rappresentato dalle operazioni svolte dal RandomAgent in Sum.
Questo agente è costituito da una rete neurale artificiale e produce ogni giorno una previsione sul possibile prezzo assunto dal titolo nei giorni successivi. Il ForecastingAgent in realtà non è un vero e proprio agente, ma rappresenta le previsioni di una società di rating.
Il vero agente in grado di poter usufruire delle previsioni effettuate dal ForecastingAgent è l'ANNForecastingAgent. Questo agente opera sul mercato seguendo le previsioni fornite dal ForecastingAgent. Il suo funzionamento è del tutto analogo a quello degli agenti imitatori.
Nel modello vi sono due diverse categorie di agenti imitatori:
-MarketImitatingAgent che decide di acquistare (vendere) se il prezzo medio
è salito (sceso);
-LocallyImitatingAgent che decide di acquistare (vendere) se gli ultimi giocatori
hanno acquistato (venduto).
Entrambi, come gli agenti casuali, inseriscono una proposta di prezzo ottenuta
moltiplicando l'ultimo prezzo eseguito per un coefficiente casuale.
E' un agente che opera secondo due diverse modalità:
senza memoria, o con memoria del passato.
Nel caso in cui operi senza memoria del passato, se l'ultimo prezzo eseguito
è aumentato (diminuito), rispetto al prezzo medio di un dato intervallo
di tempo, di un tasso maggiore del maxLossRate, l'agente compra (vende) al prezzo
corrente. Nel caso in cui operi con memoria del passato, se l'ultimo prezzo
eseguito è aumentato (diminuito), rispetto al prezzo medio di un dato
intervallo di tempo, ad un tasso maggiore od uguale al parametro maxLossRate,
l'agente compra (vende) se ha una posizione short (long). In entrambi i casi,
se il prezzo corrente non supera lo stop loss, l'agente si comporterà
come un agente casuale.
Tale agente non crea effetti che alimentano le anomalie di borsa in quanto opera
fondamentalmente come un RandomAgent, con l'aggiunta però di una caratteristica
in più e cioè quella di trattare anche i titoli sulla base di
uno stop loss; tuttavia in casi in cui il prezzo corrente superi lo stop loss,
l'effetto è quello di alimentare la direzionalità del mercato.
Si potrebbe criticare tale impostazione asserendo che un operatore che fa usa
dello stop loss, non lo manterrebbe fisso per tutto il periodo di mantenimento
del titolo, ma lo modificherebbe a seconda dell'andamento delle quotazioni e
di altri eventi che ora non è importante ricordare. Tale critica è
corretta, se però si pensa che qui si vuole vedere cosa si verifica in
un mercato se alcuni agenti utilizzano lo stop loss e non cosa capita alla ricchezza
personale dell'agente stop loss, si comprende che tale critica non ha senso
di esistere (almeno per ora) in SUM; quando, se mai accadrà, saranno
inserite le ricchezze personali dei vari operatori allora avrà senso
modificare in parte la struttura di tale agente, rendendolo conforme a quello
reale.
In Sum vi sono due tipi di agenti cognitivi:
-BPCTAgentA: sono costruiti sulla base di un complesso meccanismo di determinazione
delle loro azioni, che si avvale della metodologia dei cross target. Gli agenti,
sulla base della struttura della rete neurale sviluppano coerenza interna tra
due azioni, quella di acquisto e quella di vendita e sviluppano congetture sugli
effetti liquidità e quantità azioni. Sono fissati anche degli
obiettivi esterni di tre tipi differenti: accrescere la liquidità, accrescere
la quantità di azioni detenute, accrescere entrambi.
-BPCTAgentB: sono anch'essi strutturati facendo utilizzo di reti neurali che
presentano la tecnica dei cross target; sono un'evoluzione degli agenti cognitivi
di tipo A, visti al punto sopra. A differenza degli agenti di tipo A, sviluppano
congetture oltre che sugli effetti liquidità e quantità di azioni,
anche sugli effetti ricchezza dall'agente valutata al prezzo di chiusura e ricchezza
dell'agente valutata sulla base del prezzo previsto dall'agente neurale. L'output
dal lato delle azioni è sempre uno e determina la decisione di acquisto
o di vendita.
L'obiettivo sia dell'agente di tipo A che di tipo B è quello di sviluppare una coerenza interna tra l'azione di vendita e l'azione di acquisto. Tale tipologia di agente (cognitivo), attraverso la metodologia dei cross target, sviluppa con l'apprendimento la capacità di prendere in modo coerente delle decisioni, cioè è in grado di prendere delle decisioni sulle azioni da compiere, per ottenere determinati risultati.
Con alcune modifiche/integrazioni apportate a Sum sono stati
creati nuovi agenti. Le loro caratteristiche saranno spiegate nei prossimi paragrafi
insieme alle modifiche che li hanno reso necessari. Tali agenti sono:
-l'EventAgent (che opera in conseguenza di eventi accaduti nel mondo simulato)
-l'ArbitrageurAgent (che sfrutta le opportunità di arbitraggio)
-l'AvatarAgent (che raccoglie gli ordini inviati dagli umani e li invia al sistema)
-il WasteTimeAgent (che serve per la gestione del tempo negli esperimenti con
gli umani)
Una delle ultime modifiche a Sum ha riguardato l'introduzione
nel modello di un generatore di eventi (EventGenerator) e di una nuova categoria
di agenti (gli EventAgent). Gli eventi in questione, che avvengono nel mondo
simulato, sono fatti e notizie che possono condizionare il mercato di borsa
in quanto alcuni agenti reagiranno (cioè acquisteranno o venderanno titoli)
in seguito a tali annunci.
L'introduzione degli eventi in Sum è stata necessaria per rendere maggiormente
realistico il mercato e per studiare la reazione degli operatori a notizie di
eventi legati, in qualche modo, al mondo della borsa. E' noto che l'annuncio
di eventi condiziona notevolmente i mercati reali, tuttavia lo studio di tali
problematiche utilizzando Sum può fornire interessanti risposte ai seguenti
quesiti: quali sono gli effetti che gli eventi e le notizie generano sul sistema
borsistico globale? Gli effetti che ne derivano si ripercuotono su tutto il
mercato oppure solo su una parte di esso? L'entità degli effetti dipende
solo dalle loro caratteristiche endogene o anche da altri elementi esogeni come
la razionalità dei soggetti operanti e le informazioni disponibili sul
mercato? Esiste un modo per gestire i rischi derivanti dagli eventuali effetti
negativi generati dagli eventi?
Per una trattazione approfondita dell'argomento si rimanda a Canavesio (2003);
si descrivono qui, invece, le caratteristiche fondamentali di questa importante
integrazione del modello di borsa Sum:
Gli agenti sensibili agli eventi determinano il proprio comportamento in base
ad alcune regole introdotte nell'eventRuleMaster e le loro azioni riflettono
l'andamento degli eventi. Nonostante il comportamento rispecchi una struttura
prevalentemente matematica, il modello riproduce abbastanza bene il reale comportamento
dei soggetti appartenenti a questa categoria operanti sui mercati.
Il funzionamento degli agenti può essere descritto, brevemente, nel modo
seguente: gli agenti interrogano il generatore di eventi per sapere lo stato
attuale. Se il generatore di eventi fornisce in risposta un evento di qualsiasi
entità diverso da quello nullo, gli agenti operano e procedono alla determinazione
del prezzo. Dovranno prendere una decisione sull'azione da intraprendere (acquisto
o vendita) e a quale prezzo. Il loro comportamento dipenderà esclusivamente
dall'entità dell'evento esistente in quel particolare istante. Si possono
distinguere tre casi:
- Evento nullo: Se l'evento è pari a zero, l'agente opera esattamente come un agente random e la sua scelta di acquisto o vendita, con relativo prezzo, è determinata con le stesse modalità degli agenti casuali.
- Evento positivo: Se l'evento è positivo, l'agente opera in acquisto ed il prezzo che è fissato risulta proporzionale all'entità numerica dell'evento. Su questo punto è necessario fornire ulteriori spiegazioni. Così come avviene per le altre tipologie di agenti, anche in questo caso, il prezzo di riferimento per la valutazione del nuovo prezzo, è l'ultimo inserito nel book. Il nuovo prezzo inserito dall'agente sarà calcolato tramite una maggiorazione casuale proporzionale all'entità dell'evento ed alla sensibilità degli agenti applicata sull'ultimo prezzo inserito. Il prezzo immesso da ogni singolo agente, benché casuale, sarà direttamente proporzionale all'entità dell'evento ed alla sensibilità degli agenti. Maggiore sarà la positività dell'evento e maggiore sarà la disponibilità ad aumentare il prezzo.
- Evento negativo: Se l'evento è negativo, l'agente agisce esattamente in modo speculare. Il prezzo adottato come riferimento è sempre l'ultimo inserito nel book, ma il comportamento dell'agente non implica più un acquisto bensì una vendita. Il calcolo del prezzo avviene in maniera del tutto analoga alla precedente, con l'eccezione che il prezzo inserito dall'agente sarà calcolato diminuendo, e non aumentando, proporzionalmente all'evento, l'ultimo prezzo inserito. L'analogia con il contesto reale si fonda sullo stesso ragionamento e perviene alle stesse conclusioni: maggiore sarà la negatività degli eventi e maggiore sarà l'incentivo ad abbassare il prezzo.
5.4 Il "multiBook", l'indice ed il future
Una delle modifiche che si è rivelata necessaria, per
arrivare all'attuale versione di Sum, è stata l'introduzione della possibilità
di trattare sul mercato più titoli. Questo, precedentemente, non era
possibile, in quanto era presente un unico titolo sul mercato e tutti gli agenti
indirizzavano le loro azioni su di esso.
L'introduzione di più titoli, oltre che elemento necessario al fine di
creare un indice, è stato anche un elemento che ha reso i fenomeni delle
bolle speculative e dei crash meno frequenti e meno consistenti; ciò
non è comunque servito ad eliminarne la presenza. Il fatto che le bolle
ed i crash diminuissero per frequenza e per consistenza era stato previsto,
in quanto essendoci più possibilità di scelta di investimento,
l'attenzione degli agenti, si sarebbe orientata su tutti i titoli e ciò
avrebbe contribuito a determinare una minore pressione della domanda e dell'offerta
di titoli.
La struttura del book presente nella precedente versione di Sum non è
stata modificata, ma è stata semplicemente duplicata, dando la possibilità
di generare più titoli nello stesso mercato, che sono tutti trattati
in book aventi le stesse caratteristiche. Quelle tipologie di agenti che richiedono
di seguire un Book specifico e di mantenere memoria di tale utilizzo, fanno
capo alla classe oneBook, mentre quegli agenti che non necessitano di avere
memoria del book su cui operano utilizzeranno la classe aBook.
Per quanto riguarda gli agenti presenti in Sum che non richiedono di seguire
un book specifico, essi scelgono casualmente su quale book operare.
Conseguentemente alla creazione del cosiddetto "multiBook", cioè
della possibilità di operare su più titoli, è stato creato
un indice di mercato ed un future sulla base di quest'ultimo.
E' stato così creato un metodo che calcolasse la variabile indice sui
titoli presenti in Sum, denominata IndexValue, la quale opera il calcolo di
un valor medio. Il calcolo è semplificato rispetto a quelli che vengono
fatti per i futures reali: tale variabile considera i prezzi dei titoli in un
dato istante, ne fa la somma e questa la divide per il numero di titoli.
Il future in Sum è, tecnicamente, un titolo identico a tutti gli altri.
Si vedrà nel prossimo paragrafo l'agente arbitraggista, il quale, sfruttando
le opportunità di arbitraggio tra future e titoli sottostanti, mantiene
la parità tra indice e future.
Si è fatta una distinzione in Sum tra i titoli veri e propri ed il future:
tutte e due le tipologie di contratti sono trattati sfruttando la stessa classe,
il book, ma è stato necessario porre una distinzione per differenziare
il book del future dagli altri book, per evitare che il calcolatore dell'indice
comprendesse nel calcolo anche il future. Questo problema è stato risolto
molto semplicemente assegnando l'ultimo book per le contrattazioni sul future
dunque, calcolato l'indice, è possibile costruire il future che abbia
come sottostante l'indice stesso e che possa essere trattato liberamente in
Sum.
Per ottenere questo si fa uso della classe book; calcolato il numero di book,
l'ultimo rappresenta quello del future ed il suo valore e dato dall'incontro
della domanda e dell'offerta ed il suo valore teorico è calcolato a parte,
secondo una metodologia che sarà ora descritta.
Tutti gli agenti operanti in Sum possono acquistare/vendere
il future; ciò comporta che le quotazioni di questo siano libere di oscillare
sulla base della domanda e dell'offerta. Infatti questo si verifica in Sum,
perché nessun agente ha cognizione di cosa sia un future e quindi opera
su esso come se fosse un semplice titolo. I prezzi inseriti dagli agenti nel
book del future, sono quindi incoerenti rispetto alla relazione che lega future
e suo sottostante.
Soltanto un agente, l'arbitrageurAgent, ha cognizione di ciò e proprio
grazie a tale cognizione riesce, operando su entrambi i mercati, a far sì
che siano allineati.
L'arbitrageurAgent cerca di operare individuando momentanee discrepanze di allineamento
tra quotazione del future e valore teorico di questo; attuando poi opportune
operazioni di segno opposto su mercati differenti, in questo caso mercato a
pronti e mercato a termine, lucra profitti privi di rischio.
Quando lo "scheduler" interpella l'arbitrageurAgent perché
è il suo turno di operare, questo importa la variabile indexValue e la
confronta con il prezzo a cui è stato concluso l'ultimo contratto sul
book del future. Se non c'è nessuno scostamento, non opera e passa il
turno, se invece individua uno scostamento prende in considerazione la possibilità
di arbitraggio, vincolata al verificarsi di altre condizioni ottimali. Supposto
che vi sia lo scostamento, l'arbitrageurAgent deve prima decidere quale tipologia
di operazione di arbitraggio effettuare; allora valuterà che se il future
è sottovalutato rispetto all'indexValue dovrà porsi come acquirente
di future e venditore di titoli, mentre qualora il future fosse sopravvalutato
rispetto al suo valore teorico egli dovrà porsi come acquirente di titoli
e venditore di future. Successivamente all'individuazione della tipologia di
arbitraggio egli dovrà verificare che altre condizioni sussistano, ed
in particolare, dovrà verificare di poter rientrare dei costi dell'operazione
e quindi che vi sia adeguata controparte. Tali due valutazioni sono svolte in
un solo momento, in quanto l'arbitrageurAgent avendo individuato quale tipologia
di arbitraggio eseguire, va a controllare che le sue controparti esistano nel
book. Se la controparte esiste l'operazione è inserita e mandata "simultaneamente"
in esecuzione, così l'operazione di arbitraggio è conclusa; qualora
vi siano più arbitrageurAgent, tale ciclo di calcolo sarà ripetuto
per ognuno di essi.
Il controllo del fatto che l'operazione di arbitraggio garantisca un guadagno
per l'arbitraggista, garantendogli quindi la copertura dei costi, è fatto
secondo due modalità: in una l'arbitraggista controlla che il disallineamento
tra future e valore teorico di questo (quindi la variazione tra i due valori)
sia strettamente maggiore ad un valore percentuale, nell'altra valuta che il
disallineamento sia strettamente maggiore di un valore fisso. L'indicazione
sia del valore percentuale, sia del valore fisso possono essere modificate dall'utente
stesso, il quale può innanzitutto scegliere la tipologia di costi da
assegnare alle operazioni e poi ne può scegliere l'entità, modificando
a proprio piacimento il valore da assegnare, in modo da ipotizzare varie condizioni
di mercato possibili.
L'arbitrageurAgent ha la possibilità di operare ogni volta dopo l'operazione
di un qualsiasi altro agente, compreso l'avatarAgent, questo perché potenzialmente
ogni operazione di un agente può in teoria portare fuori allineamento
il future con il suo valore teorico; tale impostazione deriva dal fatto che
nella realtà l'arbitraggista opera in qualsiasi momento le condizioni
lo permettano, infatti non vi è giustificazione concettuale che spinga
un arbitraggista a non operare quando se ne presentano le opportunità.
Per meglio comprendere la struttura delle chiamate ad operare degli arbitraggisti
si veda lo schema sotto, che indica in sequenza temporale come le chiamate dello
"scheduler" avvengano:
-Un agente qualsiasi (tranne l'arbitraggista).
-Un arbitraggista.
-Un avatar.
-Un arbitraggista.
L'ampliamento di Sum che permette di svolgere esperimenti
con agenti umani è denominato SumWeb, sigla che sta per SUM Web Economic
Behaviour, ed è frutto del lavoro di Alessandro N. Cappellini .
SumWeb comprende, al suo interno, l'intero modello Sum con tutte le modifiche
e integrazioni recentemente apportate, ma dispone di una struttura predisposta
per essere visualizzata in un browser e permettere agli agenti umani di interagire
con il modello.
L'interfaccia per gli operatori umani è stata realizzata utilizzando
il linguaggio Php. Sono state create due nuove classi di agenti: gli avatarAgents
e i wasteTimeAgents.
Creare l'interfaccia del modello era importante per aumentarne
il grado di realismo. Per realizzarla è stato fondamentale avere in considerazione
il livello di usabilità da parte degli agenti umani. E' stata realizzata
utilizzando il linguaggio Php, che è server side, cioè non richiede
installazione, da parte dell'utente, di particolari programmi o integrazioni
al sistema operativo (come, per esempio, se fosse scritta utilizzando Java o
C++).
Utilizzando l'internet è possibile comunicare in tempo reale con gli
agenti umani che necessitano di frequenti aggiornamenti del contenuto delle
pagine web. Era però necessario scegliere una buona combinazione di strumenti
informatici per ottenere buoni risultati: la scelta non ha riguardato solo il
linguaggio con cui creare le pagine web. Per l'aggiornamento dei grafici è
stato ritenuto migliore ricorrere al caricamento di immagini statiche diverse,
in formato GIF, piuttosto che ricorrere a animazioni o altre tecnologie.
La scelta PHP-HTML-GIF si è dimostrata solida, sia in termini di byte
trasferiti, sia in termini di velocità di elaborazione sul server. E'
noto che la velocità con cui sono visualizzate le pagine dei siti web
è importante. Grazie alla combinazione scelta i risultati ottenuti si
sono rivelati molto soddisfacenti.
L'unica imposizione fatta agli utenti è quella di avere un monitor con
risoluzione minima 1024x768 (che è tuttavia la più diffusa ora),
per poter usufruire al meglio dell'interfaccia.
Cliccare qui per andare subito agli screenshots delle pagine
che compongono l'interfaccia di SumWeb: l'homepage, la pagina di gioco, le pagine
contenenti i datafeed dei titoli, le pagine con i grafici candlestick e anche
una pagina per il questionario, una per la classifica, e una per comunicare
le decisione della SumWebConsob .
In molte pagine è presente il logo di SumWeb, il quale dà un identità
al sito. E' stato inserito in tutte le pagine pubbliche e, dove possibile, anche
nelle pagine di gioco.
La homepage si presenta come una splashpage dove insieme al logo dell'interfaccia
vi sono due semplici link per chi si incuriosisce all'esperimento (alle FAQ
e a un modulo per chiedere informazioni). Da questa pagina l'utente/agente umano
deve autenticarsi, inserendo login e password, per accedere alla pagina di gioco
che sarà personalizzata per ogni partecipante.
Nella pagina di gioco, oltre al logo, si trovano:
-Il giorno simulato, la fase della giornata (Opening Auction, Continuous Trading,
Closing Auction, ossia: asta di apertura, negoziazione continua e asta di chiusura)
-La propria posizione: ricchezza (valore e grafico), liquidità e titoli
posseduti
-Annunci di eventi, positivi o negativi, accaduti nel mondo simulato e eventuali
conferme di contratti conclusi
-Prezzi dei titoli, i valori dei prezzi di controllo, e valore dell'indice di
borsa
-Form per inviare proposte
-Links alle altre pagine (questionario, classifica, SumWebConsob)
E' importante descrivere come è strutturato esattamente
il contenuto dei messaggi: nella parte in basso a destra della pagina di gioco
compaiono, più o meno frequentemente messaggi di vari colori. Relativamente
agli eventi vi sono quattro possibili annunci:
-very positive event (in azzurro)
-positive event (in verde chiaro)
-negative event (in verde scuro)
-very negative event (in rosso)
La gravità dell'evento è espressa dal colore del messaggio e dalla
classificazione in questi quattro livelli. Nel messaggio sono indicate anche
la data e l'ora, riferite al tempo reale, in cui l'evento si è verificato.
Altri messaggi appaiono a conferma di eventuali contratti conclusi come, per
esempio:
Order Executed on Wed May 21 21:02:26 2003 at price -1.4050 on Book 3
Il messaggio, scritto in nero, indica il giorno, l'ora, il titolo e il prezzo
a cui il contratto è stato concluso. Il prezzo è indicato negativo
(cioè con il segno meno davanti) nel caso in cui si è conclusa
una vendita, positivo in caso di acquisto.
Le pagine sono state costruite per un uso intuitivo che non richiedesse particolari
sforzi anche agli utilizzatori meno esperti. Nelle prossime pagine è
riportato uno screenshot per ogni pagina dell'interfaccia di SumWeb.
Alcuni dubbi hanno riguardato l'utilizzo dei frame. In SumWeb tutte le componenti
sono in frame diversi e ognuna gode di un diverso tempo di aggiornamento. L'utente
però usa attivamente solo due di questi frame: quello dei link e quello
contenente il form per l'invio degli ordini. La pagina di gioco costruita utilizzando
i frame non ha creato nessuna difficoltà agli utenti di SumWeb.
Le pagine web, di cui sono disponibili gli screenshot,
sono:
homepage; pagina
di gioco; datafeed titoli
1, 2 e 3; datafeed
future e indice; candlestick
titolo 1.
L'indirizzo dell'homepage è http://eco83.econ.unito.it/sumweb
Per una spiegazione del grafico candlestick contenuto nella pagina web di cui
si è visto lo screenshot si rimanda all'appendice
di questo capitolo, dedicata agli elementi di analisi tecnica presenti in SumWeb.
Gli avatarAgents, come si è già accennato in
precedenza, sono gli agenti che permettono agli umani di "entrare"
nel modello, e quindi di fare gli esperimenti utilizzando gli agenti umani.
Il termine "Avatar" (o "Avatara"), dal sanscrito, letteralmente
significa discende da molto lontano ed indica una incarnazione divina in un
essere umano di un Essere altamente evoluto che non ha più la necessità
di rinascere in un corpo mortale.
In ambito informatico, la parola è diventata di uso comune per indicare
la possibilità data ad un oggetto di rappresentare una sorta di alter
ego di un altro.
In SumWeb è una classe di agenti, che è impersonata da umani,
il che significa che un umano può interagire con il modello Sum, attraverso
tali agenti. Le operazioni sono decise liberamente dall'umano, ma affinché
queste possano essere inserite nel modello, è necessario che l'umano
abbia "personificazione" in Sum in un agente avatar, che viene gestito
dal modello come un qualsiasi altro agente e le cui caratteristiche operative
non hanno precisa definizione nel codice informatico, perché sono relative
a ciò che l'umano in questione desidera fare.
La simulazione con agenti artificiali avviene sfruttando le
massime potenzialità del processore del computer, dunque, in tempo reale,
si conclude il più presto possibile. Quando però devono intervenire
anche gli agenti umani è necessario che il tempo simulato sia gestito
in modo diverso: è necessario che la simulazione avanzi "lentamente".
Inoltre è importante anche che gli sperimentatori possano decidere quanto
deve durare, in tempo reale, una giornata simulata.
Impostare questi valori in SumWeb, di fondamentale importanza per gli umani,
non è facile perché Swarm non permette di gestire il tempo assegnando
semplicemente un valore ad una variabile.
Per ovviare a questo inconveniente si è deciso di ricorrere ad un "trucco
informatico": agenti artificiali che non operano, ma semplicemente aspettano.
Sono stati chiamati waste time agents, in italiano agenti perditempo.
Per impostare la durata di una giornata è quindi necessario scegliere
il numero di tali agenti ed impostarne il ritardo, ad esempio: 100 agenti per
un ritardo di 3 secondi faranno sì che la giornata simulata duri 300
secondi più il tempo necessario al computer per elaborare la giornata
di borsa (generalmente pochi secondi).
A tutto ciò occorre sommare il tempo necessario per lo svolgimento delle
aste, l'ultima integrazione apportata al modello: poiché il meccanismo
d'asta è costituito semplicemente da un unico istante in cui gli agenti
possono inviare proposte al sistema, è sufficiente impostare la durata
di questo istante (la variabile è chiamata delayInAuction).
ModelSwarm e ObserverSwarm sono due file fondamentali per ogni
modello di simulazione creato utilizzando Swarm. L'Observer è l'osservatore
del modello e consente la creazione di vari strumenti il cui scopo è
osservare, registrare e analizzare i dati prodotti dal comportamento degli oggetti.
Il ModelSwarm descrive il modello vero e proprio e ha una sua probe, come anche
l'Observer, per gestire le variabili. Nel Model vi sono le direttive per creare
tutti gli agenti, e gli strumenti per coordinarne l'attività.
Il file ModelSwarm.m è composto da circa 1500 righe di codice, ma sarà
qui descritto soltanto il contenuto delle prime 100:
obj-> bookNumber = 3;
obj-> continuosMarket = 1;
obj-> humanPenalty = 1;
obj-> arbitrageurAgentNumber = 1;
obj-> arbitrageurOperatingInterval = 0.1;
obj-> arbitrageurOperatingIntervalFixed = 1;
obj-> arbitrageurGain = 1;
obj-> eventAgentNumber = 10;
obj-> randomAgentNumber = 200;
obj-> marketImitatingAgentNumber = 0;
obj-> locallyImitatingAgentNumber = 0;
obj-> stopLossAgentNumber = 0;
obj-> avatarAgentNumber = 100;
obj-> wasteTimeAgentNumber = 100;
obj-> aNNForecastAppAgentNumber = 0;
obj-> bPCTAgentAEO_EP_0_Number = 0;
obj-> bPCTAgentAEO_EP_1_Number = 0;
obj-> bPCTAgentAEO_EP_2_Number = 0;
obj-> bPCTAgentAEO_EP_3_Number = 0;
obj-> bPCTAgentBEO_EP_0_Number = 0;
obj-> bPCTAgentBEO_EP_1_Number = 0;
obj-> bPCTAgentBEO_EP_2_Number = 0;
obj-> bPCTAgentBEO_EP_3_Number = 0;
obj->bPCTAgentANumber = obj->bPCTAgentAEO_EP_0_Number
+ obj->bPCTAgentAEO_EP_1_Number
+ obj->bPCTAgentAEO_EP_2_Number + obj->bPCTAgentAEO_EP_3_Number;
obj->bPCTAgentBNumber = obj->bPCTAgentBEO_EP_0_Number + obj->bPCTAgentBEO_EP_1_Number
+ obj->bPCTAgentBEO_EP_2_Number + obj->bPCTAgentBEO_EP_3_Number;
obj-> agentNumber = obj-> randomAgentNumber +
obj-> marketImitatingAgentNumber +
obj-> locallyImitatingAgentNumber + obj->stopLossAgentNumber +
obj-> aNNForecastAppAgentNumber + obj->bPCTAgentANumber +
obj -> bPCTAgentBNumber + obj -> avatarAgentNumber +
obj-> eventAgentNumber + obj-> wasteTimeAgentNumber +
obj-> arbitrageurAgentNumber ;
obj-> dayNumber = 0;
obj-> asymmetricBuySellProb = 0.9;
obj-> minCorrectingCoeff = 0.9;
obj-> maxCorrectingCoeff = 1.1;
obj-> asymmetricRange = 0.0;
obj-> agentProbToActBeforeOpening = 0.25;
obj-> floorP = 0.3;
obj-> agentProbToActBelowFloorP = 0.5;
obj-> eventType = 1;
obj-> eventChangeProbability = 0.003;
obj-> eventSensibility = 0.20;
obj-> eventAgentChoiceToActBeforeOpening = 1;
obj-> maxOrderQuantity = 1;
// agentForge step 6
// used by imitating agents
obj-> meanPriceHistoryLength = 200;
obj-> priceVolumesHistoryLength = 200;
obj-> quantityVolumesHistoryLength = 200;
obj-> localHistoryLength = 20;
// used by stop loss agent
obj-> maxLossRate = 0.10;
obj-> stopLossInterval = 2;
obj-> checkingIfShortOrLong = 1;
// used by forecasting agent
obj-> dataWindowLength = 30;
obj-> nAheadForecasting = 10;
// used by forecasting agent
obj-> forecastingTrainingSetLength = 100;
obj->
epochNumberInEachForecastingTrainingCycle = 100;
obj-> learningProcessEveryNDays = 10;
obj-> cleanForecastingANNEveryMgtemNDays = 50;
// used by agents applying ANN forecast
obj-> aNNInactivityRange = 0.02;
obj-> aNNForecastAppAgentActDailyProb = 0.1;
// used by agent of BPCT type
obj->epochNumberInEachBPCTTrainingCycle = 100;
obj->agentAEO_EPDelta = 0.1;
obj->agentBEO_EPDelta = 10;
obj-> printing = 0;
obj-> delay = 1;
obj-> delayInAuction = 30;
- BookNumber: permette di inserire il numero di book, e quindi di titoli, che
si desidera inserire nelle contrattazioni del mercato.
- ContinuousMarket: impostando questa variabile uguale a 1 si ottiene che a ogni riavvio del modello questo usi come dati di partenza gli ultimi salvati nel run precedente.
- HumanPenalty:permette di attivare le modalità di assegnazione dei punti per gli agenti avatar. Assegnando il valore 1 si attiva la modalità per l'esperimento -in aula-(penalità calcolate sulla base della giornata simulata), assegnando il valore 2 si attiva la modalità per l'esperimento -on line-( penalità calcolate sulla base della giornata reale), assegnando 0 la funzione è disattivata.
- ArbitrageurAgentNumber: permette di inserire il numero di agenti arbitraggisti.
- ArbitrageurOperatingInterval: permette di decidere l'ammontare, in termini percentuali, del livello dei costi delle operazioni da arbitraggio; oltre questo scostamento minimo tra valore del future e valore teorico del future, l'arbitraggista riterrà proficuo svolgere le sue operazioni.
- ArbitrageurOperatingIntervalFixed: permette di attivare, inserendo il valore 1, la modalità a costi fissi per le operazioni sul future, eseguite dagli operatori arbitraggisti; inserendo il valore 0 la modalità dei costi è quella variabile e segue i parametri sopra esposti.
- ArbitrageurGain: è un parametro switch che, se attivato (inserendo il valore 1), permette di far sì che l'arbitraggista operi considerando di guadagnare sempre da ogni operazione. Disattivando tale funzione l'arbitraggista opererà qualsiasi volta individui uno scostamento del future dal suo valore teorico, indipendentemente dal fatto che ottenga un profitto.
- RandomAgentNumber: permette di scegliere il numero di agenti random da far operare nella simulazione.
- AvatarAgentNumber: permette di inserire il numero di agenti avatar, corrispondenti ad agenti umani, che si vuole far operare in Sum.
- MarketImitatingAgentNumber: permette di scegliere il numero di agenti imitatori di mercato da far operare in Sum.
- LocallyImitatingAgentNumber: permette di scegliere il numero di agenti imitatori locali di mercato da far operare in Sum.
- StopLossAgentNumber: permette di scegliere il numero di agenti che utilizzano lo stop loss da far operare in Sum.
- ANNForecastAppAgentNumber: permette di scegliere il numero di agenti che operano sulla base delle previsioni fornite dal aNNForecastAgent, da far operare in Sum.
- BPCTAgentAEO_EP_0_Number: permette di inserire il numero di BPCTAgentA che non utilizzano obiettivi esterni (EO).
- BPCTAgentAEO_EP_1_Number: permette di inserire il numero di BPCTAgentA che hanno come obiettivo esterno l'accrescimento della liquidità.
- BPCTAgentAEO_EP_2_Number: permette di inserire il numero di BPCTAgentA che hanno come obiettivo esterno l'accrescimento del numero di azioni in portafoglio.
- BPCTAgentAEO_EP_3_Number: permette di inserire il numero di BPCTAgentA che hanno come obiettivo esterno sia l'accrescimento della liquidità, sia l'accrescimento del numero di azioni in portafoglio.
- BPCTAgentBEO_EP_0_Number: permette di inserire il numero di BPCTAgentB che non utilizzano obiettivi esterni (EO).
- BPCTAgentBEO_EP_1_Number: permette di inserire il numero di BPCTAgentB che hanno come obiettivo esterno quello di accrescere la ricchezza valutata al prezzo di chiusura.
- BPCTAgentBEO_EP_2_Number: permette di inserire il numero di BPCTAgentB che hanno come obiettivo esterno quello di accrescere la ricchezza valutata al prezzo previsto.
- BPCTAgentBEO_EP_3_Number: permette di inserire il numero di BPCTAgentB che hanno come obiettivo esterno sia l'accrescimento della ricchezza valutata sia al prezzo di chiusura e sia al prezzo previsto.
- AgentNumber: numero totale degli agenti operanti nel mercato.
- AsymmetricBuySellProb: con tale valore si indica la probabilità di operare, per gli agenti che utilizzano strategie imitative, in accordo con le strategie stesse.
- MinCorrectingCoeff: indica il valore minimo del coefficiente correttivo utilizzato per determinare il prezzo da inserire negli ordini di compravendita.
- MaxCorrectingCoeff: indica il valore massimo del coefficiente correttivo utilizzato per determinare il prezzo da inserire negli ordini di compravendita.
- AsymmetricRange: correzione aggiuntiva a quella descritta sopra che permette di far sì che l'agente adotti un comportamento asimmetrico.
- AgentProbToActBeforeOpening: permette di determinare la probabilità dell'agente di agire prima dell'apertura.
- FloorP: il valore floor del prezzo.
- AgentProbToActBelowFloorP: indica il valore della probabilità di agire quando il prezzo raggiunge il valore floor.
- MaxOrderQuantity: indica il valore massimo del quantitativo che ogni agente può inserire negli ordini di compravendita (Gli agenti in SUM, possono contrattare una sola azione alla volta; quando si varia il parametro -maxOrderQuantity-, si indica che un agente possa trattare un quantitativo di azioni superiore ad 1, ma tecnicamente, avviene che lo stesso agente opererà per n volte consecutive invece che immettere un quantitativo pari ad n azioni in un unico ordine.).
- MeanPriceHistoryLenght: indica la lunghezza del vettore che contiene la serie storica di prezzi medi dei titoli, utilizzata dagli agenti imitativi del mercato.
- PriceVolumeHistoryLenght: indica la lunghezza del vettore che contiene la serie storica dei volumi relativi a determinati prezzi, utilizzata dagli agenti imitativi del mercato.
- QuantityVolumesHistorylenght: indica la lunghezza del vettore che contiene la serie storica dei volumi dei titoli, utilizzata dagli agenti imitativi di mercato.
- LocalHistoryLenght: lunghezza del vettore che registra le azioni degli altri agenti, tale valore è utilizzato dagli agenti che imitano localmente.
- MaxLostRate: valore massimo di perdita che l'agente stop loss è disposto a sopportare come tasso di perdita; oltre tale valore attiverà la strategia dello stop loss.
- StopLossInterval: indica la lunghezza dell'arco di tempo preso in considerazione dall'agente stop loss.
- CheckingIfShortOrLong: è un parametro switch, se attivato (inserendo il valore 1) fa sì che l'agente stop loss operi avendo memoria del passato; se disattivato (inserendo il valore 0) fa sì che l'agente stop loss operi senza memoria delle sue posizione passate.
- DataWindowLenght: il numero di dati utilizzati come input dalle rete neurale artificiale; i dati sono espressi come indici calcolati rapportando il prezzo medio del giorno t con il prezzo medio del giorno (t - nAheadForecasting).
- NAheadForecast: numero di giorni i cui valori vengono previsti dalla rete neurale; l'output generato dalla rete è sotto forma di rapporto tra il prezzo al tempo nAheadForecast e l'ultimo prezzo medio disponibile.
- ForecastTrainingSetLenght: numero di dati (input ed output attesi) utilizzati per fare apprendimento sulla rete neurale artificiale; tale set di valori viene aggiornato con il passare del tempo.
- EpochNumberInEachForecastTrainingCycle: indica il numero di epoche che vengono utilizzate nella fase di apprendimento della rete neurale artificiale; per ogni epoca si considera un set di valori pari al valore del parametro sopra indicato.
- LearningProcessEveryNDays: indica il numero di giorni che intercorrono tra una fase di apprendimento e l'altra, quindi tale valore indica ogni quanto la fase di apprendimento, definita sulla base delle variabili indicate sopra, deve essere ripetuta.
- CleanForecastANNEveryMgtemNDays: indica ogni quanti giorni la fase di apprendimento debba ricominciare da capo, assegnando nuovi pesi alle matrici delle funzioni utilizzate dalla rete neurale; in tale modo si ha la possibilità di tener conto nella fase di apprendimento dei cambiamenti della struttura dei prezzi.
- ANNInactivityRange: indica il range di variazione del prezzo all'interno del quale l'agente non opera; se la previsione è compresa tra [1 - aNNInactivityRange] e [1 + aNNInactivityRange], l'agente non opera.
- ANNForecastAppAgentActDailyProb: indica la probabilità di agire sul mercato.
- EpochNumberInEachBPCTTrainingCycle: indica il numero di epoche di apprendimento della rete neurale artificiale; l'apprendimento è applicato ogni giorno sugli ultimi 10 giorni, insieme che viene aggiornato di giorno in giorno.
- AgentAEO_EPDelta: indica il valore del parametro che viene utilizzato per misurare l'effetto degli obiettivi esterni della rete neurale artificiale degli agenti BPCT di tipo A.
- AgentBEO_EPDelta: indica il valore del parametro che viene utilizzato per misurare l'effetto degli obiettivi esterni della rete neurale artificiale degli agenti BPCT di tipo B.
- Printing: inserendo vari valori è possibile attivare la stampa su monitor di una vasta serie di informazioni relative ad alcuni elementi della simulazione di borsa. Se il valore inserito è 0 la stampa non è attivata.
- Delay: indica il ritardo in termini di secondi che si può attivare per le operazioni sul mercato degli randomAgent; tale ritardo serve per permettere agli avatarAgent di avere il tempo di inserire gli ordini senza che la simulazione sia troppo veloce.
- DelayInAuction: indica il ritardo in termini di secondi per le fasi di asta. E' uguale per l'asta di apertura e per l'asta di chiusura.
Il file ObserverSwarm.m è composto da oltre 700 righe di codice. Si riportano qui, e si spiegano, le prime 40:
obj->displayFrequency = 411;
obj->stopAtDayNumber = 8; // to stop the program
(if != 0)
obj->displayPreviousDayMean = 0;
obj->showPriceGraph = 0;
obj->savePriceData = 1;
obj->showBookGraph = 0;
obj->saveBookData = 1;
obj->showVolumesGraph = 0;
obj->saveVolumesData = 1;
obj->showAgentWealthGraph = 0;
obj->saveAgentWealthData = 1;
obj->showForecastingAgentGraph = 0;
obj->saveForecastingData = 1;
obj->showEventsGraph = 0;
obj->saveEventsData = 1;
//agentForge step 11b
obj->numberOfTheBPCTAgentA_ToBeObservedDirectly = 1;
obj->saveBPCTAgentAData = 1;
obj->numberOfTheBPCTAgentB_ToBeObservedDirectly = 1;
obj->saveBPCTAgentBData = 1;
- DisplayFrequency: indica la frequenza con la quale vengono aggiornate le finestre
che riportano le varie tipologie di grafici possibili; tale frequenza può
essere inserita in valore pari ad uno oppure in valore pari ad un multiplo del
numero degli agenti. Seguendo quest'ultima possibilità, si ha il risultato
di ottenere sul grafico il valore relativo all'ultimo prezzo di ogni giorno
della simulazione, per tale motivo è consigliabile tale scelta.
- StopAtEpochNumber: indica il numero di giorni che la simulazione
produrrà, al raggiungimento del quale si fermerà.
Le variabili che seguono hanno la valenza di interruttori: inserendo il valore 1 si attiva la funzione, mentre inserendo il valore 0 si disattiva la funzione. Tali variabili switch, sono:
- DisplayPreviousDayMean: permette di visualizzare il grafico del prezzo medio relativo all'andamento di ogni titolo.
- SavePriceData: permette di salvare i dati relativi alla simulazione in un apposito file.
- ShowBookGraph: permette di visualizzare l'andamento del volume di contrattazione su ogni titolo.
- SaveBookData: permette di salvare i dati relativi al bookGraph, in un apposito file.
- ShowVolumesGraph: permette di visualizzare l'andamento dei volumi di contrattazione.
- SaveVolumesData: permette di salvare i dati relativi al volumesGraph, in un apposito file.
- ShowAgentWealthgraph: permette di visualizzare il grafico della ricchezza degli agenti.
- SaveAgentWealthGraph: permette di visualizzare il grafico della ricchezza degli agenti.
- ShowForecastAgentGraph: permette di visualizzare il grafico con le previsioni dell'agente che fa uso delle previsioni ottenute mediante le reti neurali artificiali.
- SaveForecastData: permette di salvare i dati relativi alle previsioni dell'agente che fa uso delle previsioni ottenute mediante le reti neurali artificiali.
- NumberOfTheBPCTAgentA_ToBeObserverDirectly: permette di decidere il numero di BPCTAgentA di cui si vuole visualizzare il grafico con, liquidità, quantità di azioni e ricchezza.
- SaveTheBPCTAgentAData: permette di salvare i dati relativi al grafico dei BPCTAgentA, in un apposito file.
- NumberOfTheBPCTAgentA_ToBeObserverDirectly: permette di decidere il numero di BPCTAgentA di cui si vuole visualizzare il grafico con, liquidità, quantità di azioni e ricchezza.
- SaveTheBPCTAgentBData: permette di salvare i dati relativi al grafico dei BPCTAgentB, in un apposito file.
Appendice
L'analisi tecnica in SumWeb
I titoli scambiati nel mercato simulato che caratterizza SumWeb non corrispondono
a quote di partecipazione al capitale di imprese. SumWeb è un modello
di simulazione che ha per scopo lo studio dei meccanismi e delle dinamiche del
mercato. Dunque all'interno del modello è simulato un mercato borsistico,
ma non ciò che nella realtà ha dato luogo alla nascita dei mercati
di borsa: le imprese. Non essendoci gli emittenti, ma essendoci solamente i
titoli, ogni tentativo di analisi degli andamenti dei prezzi può essere
solamente generato dallo studio degli andamenti passati.
Dopo aver costruito l'interfaccia per l'utilizzo, da parte degli agenti umani,
del modello di borsa, si è deciso di offrire ai partecipanti alcuni cenni
di analisi dei titoli oggetto di contrattazione. Il metodo di analisi più
opportuno in questo caso, non potendo utilizzare i modelli dell'analisi fondamentale,
è il metodo di analisi denominato analisi tecnica. E' stato scelto per
la notevole diffusione di cui gode e per la possibilità di creare automaticamente
i grafici che l'investitore medio è abituato a vedere nei siti internet
per trading on line. E' stato scelto soprattutto per creare un ambiente "consueto"
rispetto alle aspettative dei partecipanti, anche se non si attribuisce valore
intrinseco alla tecnica in questione, se non nel riassumere i comportamenti
degli operatori, in particolare di quelli che seguono tale analisi.
L'analisi tecnica, come si è detto, consiste nello studio della storia
dei titoli, in particolare dei prezzi e dei volumi passati. Attraverso un certo
numero di indicatori, il metodo dell'analisi tecnica si prefigge di individuare
un sistema che possa permettere l'ottimizzazione dei guadagni e, nel caso si
fosse effettuato un errato ingresso sul mercato, una limitazione delle perdite.
Tutte le informazioni riferite ad un singolo titolo sono incorporate nei prezzi
e nei volumi degli scambi e nelle relative serie storiche, che rilevano come
questi ultimi siano variati in un determinato intervallo temporale. L'analisi
tecnica, mediante l'ausilio di strumenti matematico-statistici e grafici, cerca
di individuare dei cicli ricorsivi e tendenze di mercato. Alla base di tutto
vi è l'esistenza di pressioni speculative nel mercato, che sono osservate
nell'evoluzione dei prezzi e dei volumi di un determinato titolo. Si ipotizza
che il prezzo espresso dal mercato sconti tutte le informazioni conosciute e
anche le aspettative sul singolo titolo. Inoltre si tiene in considerazione
il fatto che il comportamento del mercato è influenzato dai partecipanti
allo stesso, caratterizzati dalle medesime propensioni psicologiche, prospettando
quindi degli andamenti ciclici e tendenziali.
E' stato deciso di fornire agli agenti umani di SumWeb tre grafici: un candlestick
con media mobile, il grafico dei volumi e l'RSI.
Il "CandlestickCharting", o "Japanese Candlestick", è
una modalità di rappresentazione grafica nata in Giappone verso la prima
metà del diciottesimo secolo, da Sokyu Homma, e solo da poco si è
diffusa anche nei mercati occidentali.
Il Candlestick era usato per l'analisi dell'andamento del mercato del riso,
prima a pronti poi a termine (future), nel mercato di Osaka (Dojima Rice Exchange).
Il Japanese Candlestick è una rappresentazione grafica che è usata
specialmente per analisi grafiche finalizzate a realizzare trading di breve
periodo.
Per poter costruire la candlestick di un'azione sono necessari quattro valori:
prezzo di apertura, massimo, minimo e prezzo di chiusura. La candlestick presenta
un corpo centrale (real body) e due tratti di linea verticali: uno posto sopra
il real body e chiamato upper shadow e un secondo posto al di sotto e chiamato
lower shadow. Le quotazioni di apertura e di chiusura della sessione delimitano
l'ampiezza del corpo della candlestick. Il colore bianco indica che il titolo
ha chiuso in rialzo (il prezzo di chiusura è maggiore del prezzo di apertura),
il colore nero indica invece che il titolo ha chiuso in ribasso (il prezzo di
chiusura è inferiore al prezzo di apertura). Infine le estremità
delle candlestick (dette ombre) rappresentano il prezzo massimo e minimo che
l'azione ha raggiunto. Il rettangolo che forma il corpo, dunque, rappresenta
la differenza di prezzo tra l'apertura e la chiusura. Nell'osservare il grafico
con le candlestick l'impatto visivo principale è dato dal colore. Semplificando,
candlestick nera indicherà mercato al ribasso (prezzo di chiusura inferiore
all'apertura), candlestick bianca indicherà mercato al rialzo (prezzo
di chiusura superiore all'apertura).
L'indice RSI (Relative Strength Index, Indice di Forza Relativa), elaborato
da Wilder nel 1978, è estremamente popolare, soprattutto tra i traders
sul mercato dei futures.
L'RSI, che può assumere valori compresi fra 0 e 100, indica la forza
del titolo: rispetto ai valori normali (da 30 a 70) si creano fasi di ipercomprato
(da 70 a 100) ed ipervenduto (da 0 a 30). Con questo indicatore si cerca di
anticipare leggermente la tendenza futura. L'indicatore RSI confermerà
la tendenza in atto se concorde con il trend in esame mentre diventerà
un segnale di inversione se contrario rispetto al trend. In sintesi indica il
rapporto tra le medie delle chiusure al rialzo e delle chiusure al ribasso.
E' calcolato con la seguente formula:
RSI = 100-100/(1+RS)
dove RS è dato dal rapporto tra MI e MD, rispettivamente
la media degli incrementi su n giorni (MI) e la media dei decrementi su n giorni
(MD).
Assume valore uguale a zero quando la media degli incrementi, nel periodo considerato,
è eguale a zero; assume valore uguale a 100 quando la media dei decrementi
è uguale a zero. Quindi il suo valore può variare soltanto all'interno
dell'intervallo 0-100: per tale motivo si dice che l'RSI è un oscillatore.
La scelta del numero dei giorni può variare: spesso sono utilizzati 14
giorni, che era il periodo scelto da Wilder. Al crescere del numero dei giorni
diminuisce la reattività dell'oscillatore (diminuiscono anche, ovviamente,
i falsi segnali). Come per tutti gli indicatori, la scelta del dominio dipende
dal tipo di operatività che si intende porre in essere: tanto più
l'operatività è "veloce" e di breve periodo, tanto più
breve sarà il dominio utilizzato.
L'utilizzo dell'RSI è uguale a quello degli altri indicatori di momentum.
Fornisce un segnale di vendita quando è nella zona di ipercomprato (sopra
70) e ne fuoriesce mentre i prezzi stanno ancora salendo (divergenza ribassista)
Fornisce invece un segnale di acquisto quando è nella zona di ipervenduto
(sotto 30) e ne fuoriesce mentre i prezzi stanno ancora scendendo (divergenza
rialzista).
Ovviamente, l'RSI può essere utilizzato anche per il trading infra-giornaliero:
in tal caso, il dominio non sarà calcolato sui giorni ma sulle ore. Se
configurato su un breve orizzonte temporale non è esente da falsi segnali,
le variazioni giornaliere sono eliminate aumentando l'intervallo di tempo, le
indicazioni migliori si ottengono quando raggiunge i valori estremi di oscillazione
(ipervenduto fra 0 e 30 / ipercomprato fra 70 e 100). Un segnale di acquisto
si può ottenere con la perforazione di tali valori in salita, stesso
ragionamento per il titolo in ipercomprato, segnale che generalmente anticipa
la discesa).
La media mobile costituisce un'operazione di media in grado di assorbire rapidamente
variazioni repentine e violente del valore delle azioni.
Il superamento della media mobile da parte dell'attuale livello dei prezzi è
generalmente indicato come un segnale di acquisto, o viceversa un segnale di
vendita. Spesso per questi segnali sono usate medie mobili con un periodo più
lungo (21 o 40 giorni).
La media mobile costituisce un'operazione di media in grado di assorbire rapidamente
variazioni repentine e violente del valore delle azioni. Se ci si trova nella
situazione, in cui il valore di chiusura dell'azione ha superato il valore medio
su 40 giorni, è il momento buono per comprare. In caso contrario ci si
trova nel momento migliore per vendere. Se non ci troviamo in nessuna di queste
due situazioni, è meglio tenere l'azione e aspettare.
Nel caso di SumWeb è stato deciso di utilizzare una media mobile a 5
giorni, che richiama la durata della settimana di borsa.
Il volume indica il numero dei contratti conclusi durante il
periodo in esame, in un mercato nel suo complesso o per una singola azione.
Nel caso di SumWeb: il periodo in esame è ogni singola giornata di borsa
simulata e si considerano i volumi di ogni singolo titolo, non del mercato.
L'entità di azioni trattate può essere calcolata sia in termini
di valore sia di numero delle stesse. Nello studio del movimento di un singolo
titolo, di solito,si fa riferimento solo alla quantità, mentre, per costruire
un indice generale del mercato, si utilizza il valore degli scambi. In SumWeb
si calcolano i volumi solamente in termini di numero di contrattazioni.
L'analisi dei volumi è lo studio della dimensione degli scambi, relativi
ad un determinato strumento, in relazione con il movimento e la tendenza dei
prezzi. I volumi possono essere considerati la pressione e la forza dei movimenti
dei prezzi ed indicano la forza relativa fra i venditori ed i compratori. Se
il prezzo effettua un movimento di rialzo con elevati volumi di scambio significa,
infatti, che con ogni probabilità la forza degli acquirenti è
stata molto più elevata di quella dei venditori e viceversa. I volumi,
nella teoria classica dell'analisi tecnica (teoria di Dow), assumono un valore
secondario rispetto ai prezzi, tuttavia svolgono un ruolo fondamentale di conferma.
Analizzare l'andamento grafico dei prezzi in relazione all'andamento dei volumi
aiuta a capire la rilevanza dei movimenti di quel mercato. Secondo la teoria
classica i volumi devono confermare il trend e quindi, per esempio, se il trend
è al rialzo gli scambi devono crescere nei movimenti di salita e crescere
meno nei movimenti correttivi o laterali. Il principio è specularmente
valido nel caso di trend al ribasso, anche se la spinta dei volumi è
un elemento critico più per i trend rialzisti che non per i movimenti
discendenti del mercato. Una crescita nei volumi di scambio all'interno di una
fase laterale successiva ad un rialzo può far temere l'esaurimento del
trend rialzista in atto. Viceversa se all'interno di un trend discendente i
ribassi si arrestano lasciando spazio ad un movimento laterale con volumi di
scambio crescenti, è possibile che ci si trovi di fronte ad una fase
di accumulazione che potrebbe preludere a nuovi movimenti di rialzo.
I volumi non sono considerati in valore assoluto; se ne considera l'andamento
tendenziale, quando si parla di volumi crescenti non ci si riferisce ad un particolare
livello di volumi ma ad una crescita rispetto all'andamento passato o meglio
ancora rispetto al valore medio di lungo, medio o breve periodo, a seconda dell'orizzonte
di analisi.
I grafici relativi ai metodi di analisi sopra descritti si
generano automaticamente utilizzando SumWeb. Il file che elabora i dati necessari
è candlestick.php. E' prodotta un'unica immagine, in formato GIF, che
contiene il grafico candlestick con media mobile a 5 giorni, il grafico dell'RSI
e il grafico dei volumi. L'immagine è contenuta in una pagina web e quando
la simulazione sta girando nel computer si aggiorna, cioè se ne genera
una nuova aggiornata, ogni 30 secondi (di default).
Per un'esempio della pagina contenente l'immagine GIF cliccare
qui.