The applet requires Java 1.4.1 or higher. It will not run on Windows 95 or Mac OS 8 or 9. Mac users must have OS X 10.2.6 or higher and use a browser that supports Java 1.4. (Safari works, IE does not. Mac OS X comes with Safari. Open Safari and set it as your default web browser under Safari/Preferences/General.) On other operating systems, you may obtain the latest Java plugin from Sun's Java site.
powered by NetLogo
view/download model file: stock_market_with_boundendly_rational_agents.nlogo
This model is a simulation of a single stock market with boundedly rational agents competing in the market trying to increase their cash following a personal strategy based on Artificial Neural Networks (ANN).
In the model each agent having enough cash or stocks will perform an offer of buying or selling that will be reported in the corrispondent logbook until prices will allow the transaction.
Each agent will be equipped with n-strat strategies as Artificial Neural Network (ANN) that, given the last mem value of the price exePrice forecast the new price. The agents will decide if to buy or sell and the corresponding price on the basis of the forecast; after the realization of the transaction, an handicap score will be assigned to the strategies according to the difference between the forecast and the effective price. The agents will follow the strategy with the lowest handicap trying to maximize their performances. The ANNs have been trained on a real time series using a Python code.
Click the SETUP button to set up the traders.
Click the GO button to run the simulation.
The number of trader can be changed with the slider n-traders, while the initial number of stocks and cash of the agents can be modified with the input form initial-cash and initial-stocks.
The log is cleaned after a tick-for-day number of ticks.
When the GO button has been pushed the simulation starts and the agents begin to exchange stocks and cash: the price is an emergent feature of the interaction between the past prices and the strategies. It is worth stressing that some agents will decide not to act if they are in economic troubles (not enough cash or no stocks), so that after a period all the agents will be in the pass state and there will not be any transaction.
Does the number of traders changes the behaviour of the market? What does it happens if the number of strategies for trader is increased? Which is the initial number of stocks and cash necessary to avoid a sudden death of the market at the beginning of the simulation?
The model presents a wide range of improvements: first of all even if in this simulation the attention is focused on the absolute value of the price, also the value of the return can be considered. The way agents make the offer, considering the last price and the forecast one, can be further discussed in order to find the most realistic and coherent with the market rule.
; n-traders number of traders ; n-strat number of strategies per traders ; mem is the memory, the number of inputs of the nn ; ch is the number of data of the hidden layer ; n-nns is the number of neural networks globals [n-nns mem ci ch co logB logS exePrice history day] breed[nns nn] ;neural networks to be used by traders breed[traders trader] ;agents - traders id goes from n-nns to (n-traders+n-nns-1) nns-own[wi wo forecast handicap] traders-own[nnset out-of-market buy sell pass cash stocks forecastt] to setup clear-all set n-nns 90 set history [10.2 10.3 10.4 10.2 10.5] set exePrice last history set logB [] set logS [] set mem 5 ;global variables setting, memory set ci (mem + 1) ;input nn set ch 4 ;hidden layer set co 1 ; number of output create-nns n-nns foreach n-values (n-nns) [?] [ ; reads neural networks from files ask nn ? [ set handicap 0 set hidden? true let path word word "nn/wi" ? ".out" set wi readM path ci ch set path word word "nn/wo" ? ".out" set wo readM path ch co ] ] create-traders n-traders ask traders [ set nnset [] repeat (n-strat) [ set nnset lput (random n-nns) nnset ; associates to each agent a strategy: some agents can be stubborn with some strategies identical ] set out-of-market False set shape "person" set size 2 set stocks initial-stocks set cash initial-cash ] let side sqrt n-traders let step max-pxcor / side let an n-nns let x 0 let y 0 while [an < (n-traders + n-nns)] [ if x > (side - 1) * step [set y y + step set x 0 ] ask trader an [setxy x y] set x x + step set an an + 1 ] end to-report readvalue [fname] ;read the first value of a file file-open fname let value file-read file-close report value end to-report readM [fname r c] ;read a matrix stored in a file file-open fname let line [] let m [] repeat (r)[ set line [] repeat (c)[ set line lput file-read line ] set m lput line m ] file-close report m end to-report multmatr [vi m] ;multiplies a vector vi to a matrix m let vo [] let j 0 repeat (length (item 0 m)) [ let somm 0 let i 0 repeat (length vi)[ set somm (somm + (item i vi) * (item j (item i m))) set i (i + 1) ] set vo lput somm vo set j (j + 1) ] report vo end to-report sigmoid [v] ;applies sigmoid to all the elements of a vector let vo [] foreach v [set vo lput ((e ^ (?) - e ^ (- ?)) / ( e ^ (?) + e ^ (- ?) )) vo] report vo end to-report outputnn [inp0 wi0 wo0] ;calculates the output of an ann given the input let inpscaled [] foreach inp0 [set inpscaled lput (? / (2 * (item 0 inp0))) inpscaled ] set inpscaled lput 1 inpscaled let temp [] set temp sigmoid(multmatr inpscaled wi0 ) set temp item 0 (sigmoid(multmatr temp wo0)) report (temp * 2 * (item 0 inp0)) end to update-forecast ;updates the forecasts ask nns [ set forecast outputnn history wi wo ] ask traders [ set nnset sort-by [[handicap] of (nn ?1) < [handicap] of (nn ?2)] nnset set forecastt ([forecast] of nn (item 0 nnset)) ] end to go update-forecast ;logs are cleaned after tick-for-day ticks if (ticks mod tick-for-day) = 0 [ set logB [] set logS [] ] tick ask traders [ ifelse out-of-market [set color white] [ set pass False ifelse forecastt < exePrice [ set buy False set sell True if stocks < 1 [ set pass True let minPrice 0 ifelse empty? logB [set minPrice exePrice] [set minPrice item 0 (item 0 logB)] if cash < minPrice [set out-of-market True] ] ] [ set sell False set buy True let minPrice 0 ifelse empty? logB [set minPrice exePrice] [set minPrice item 0 (item 0 logB)] if cash < minPrice [ set pass True ;; the maximum value of logB is the minimum possible price if stocks < 1 [set out-of-market True] ] ] ] ;show exePrice ifelse pass [set color grey] [ if buy [set color red] if sell [set color green] ] let tmp[] if not pass and not out-of-market [ ifelse not empty? logS and not empty? logB [ if buy [set tmp lput ((forecastt + item 0 (item 0 logB)) / 2) tmp] ;;mean value choice if sell [set tmp lput ((forecastt + item 0 (item 0 logS)) / 2) tmp] ;set tmp lput forecastt tmp ;;forecast value choice ;if buy [set tmp lput (item 0 (item 0 logB) + 0.1) tmp] ;; best choice according to ticket size ;if sell [set tmp lput (item 0 (item 0 logS) - 0.1) tmp] ] [set tmp lput ((forecastt + exePrice ) / 2) tmp] ;without offering set tmp lput who tmp if buy [set logB lput tmp logB set logB reverse sort-by [item 0 ?1 < item 0 ?2] logB ;show logB if (not empty? logB and not empty? logS) and item 0 (item 0 logB) >= item 0 (item 0 logS) [set exePrice item 0 (item 0 logS) let agB item 1 (item 0 logB) let agS item 1 (item 0 logS) ask trader agB [set stocks stocks + 1 set cash cash - exePrice] ask trader agS [set stocks stocks - 1 set cash cash + exePrice] set logB but-first logB set logS but-first logS set history but-first (history) set history lput exePrice history ask nns [ set handicap (handicap + abs ((forecast - exePrice) / 100)) set forecast outputnn history wi wo ] ask traders [ set nnset sort-by [[handicap] of (nn ?1) < [handicap] of (nn ?2)] nnset set forecastt ([forecast] of nn (item 0 nnset)) ] ] ] ;show exePrice if sell [ set logS lput tmp logS set logS sort-by [item 0 ?1 < item 0 ?2] logS ;show logS if (not empty? logB and not empty? logS) and item 0 (item 0 logB) >= item 0 (item 0 logS) [ set exePrice item 0 (item 0 logB) let agB item 1 (item 0 logB) let agS item 1 (item 0 logS) ask trader agB [set stocks stocks + 1 set cash cash - exePrice] ask trader agS [set stocks stocks - 1 set cash cash + exePrice] set logB but-first logB set logS but-first logS set history but-first (history) set history lput exePrice history ask nns [ set handicap (handicap + abs ((forecast - exePrice) / 100)) set forecast outputnn history wi wo ] ask traders [ set nnset sort-by [[handicap] of (nn ?1) < [handicap] of (nn ?2)] nnset set forecastt ([forecast] of nn (item 0 nnset)) ] ] ] ] ] graph if exePrice < 0 [ask traders [set out-of-market True]] end to graph set-current-plot "exePrice" plot exePrice end