Random Walk Simulation Code

Run this code in NetLogo in order to replicate the model.

globals [

  ; the stock price

  pt

  ; stock price in next period

  pt+1

  ; stock price in previous period

  pt-1

  ; true fundamental value of stock

  fundamental-value

  ; list of past prices

  price-list

  ; population of fundamentalists

   pop-fund

  ; population of technical optimists

   pop-tech-op

  ; population of technical pessimists

   pop-tech-pess

   total-pop

  ; number of buy orders

  D

  ; number of sell orders

  S

  ; random element in price equation

  gamma

  ; coefficient representing the speed of price adjustment

  a

  ; TEST

  good-news?

  bad-news?

  severity

  partner-profit

  partner-philosophy

  shares-outstanding

  volatility

]

; different types of traders as breeds

breed [ fundamentalists fundamentalist ]

breed [ technical-optimists technical-optimist ]

breed [ technical-pessimists technical-pessimist ]

turtles-own [

 stock-holdings

 trader-pt+1                    ; what the trader expects the price to be next period

 initial-value                  ; initial value of portfolio

 portfolio-value                ; current value of portfolio

 money-in                       ; all money spent buying stocks

 money-out                      ; all money recieved selling stocks

 profit                         ; current portfolio value + money out - money in

 gain-loss                      ; profit / portfolio-value

 good-news-reaction

 bad-news-reaction

 philosophy

]

fundamentalists-own [

  F                               ; true fundamental value

  f                               ; parameter of speed with

                                  ; which the fundamentalist believes

                                  ;the price will return to fundamental value

  alpha                           ; random variable accounting for perception errors

]

technical-optimists-own [

 c                              ; reaction coefficient of the trader to price changes

 beta                           ; random noise and uncontrollable aspects of technical trading

 trend

]

technical-pessimists-own [

 c                              ; reaction coefficient of the trader to price changes

 beta                           ; random noise and uncontrollable aspects of technical trading

 trend

]

to setup

  clear-all

  set pop-fund 100

  set pop-tech-pess 100

  set pop-tech-op 100

  set good-news? false

  set bad-news? false

  setup-price

  setup-breeds

  reset-ticks

end

to setup-price

  set pt 80

  set pt-1 80

  set pt+1 80

  ;set price-list [ 71.98 72 ]

  set fundamental-value 80

  set volatility 0

  ;type "pt-1: " print pt-1

  ;type "pt: " print pt

  ;type "fundamental-value: " print fundamental-value

end

to setup-breeds

  set total-pop pop-fund + pop-tech-pess + pop-tech-op

  create-fundamentalists pop-fund

  ask fundamentalists [

    set philosophy "fundamentalist"

    setxy random-xcor random-ycor

    set color blue

    set shape "circle"

    set F fundamental-value

    set alpha random-normal 0 5

    set f random-float 0.5                                               ; random parameter for the speed of price adjustment

    set stock-holdings 100

    set money-in money-in + stock-holdings * pt

    set good-news-reaction random-float 1

    set bad-news-reaction random-float 1

    set initial-value stock-holdings * pt

    set portfolio-value initial-value

   ; type "pt " print pt

    if testing? = true

    [type "f " print f

    type "F " print F

    type "alpha " print alpha]

    set trader-pt+1 pt + (f * (fundamental-value - pt)) + alpha

    if testing? = true [type "expected price of fundamentalist " print who print trader-pt+1]

  ]

  create-technical-optimists pop-tech-op

  ask technical-optimists [

    set philosophy "technical-optimist"

    setxy random-xcor random-ycor

    set color green

    set shape "square"

    set c random-float 1

    set beta random-normal 0 5

    set trader-pt+1 pt + (c * (pt - pt-1)) + beta

    set stock-holdings 100

    set initial-value stock-holdings * pt

    set portfolio-value initial-value

    set money-in money-in + stock-holdings * pt

    set good-news-reaction random-float 1

    set bad-news-reaction random-float 1

    if testing? = true

    [type "expected price of technical optimist " print who print trader-pt+1]

  ]

  create-technical-pessimists pop-tech-pess

  ask technical-pessimists [

  set philosophy "technical-pessimist"

  setxy random-xcor random-ycor

  set color red

  set shape "triangle"

  set c random-float 1

  set beta random-normal 0 5

  if testing? = true [type "beta " print beta]

  set trader-pt+1 pt + c * (pt-1 - pt) + beta

  set stock-holdings 100

  set initial-value stock-holdings * pt

  set portfolio-value initial-value

  set money-in money-in + stock-holdings * pt

  set good-news-reaction random-float 1

  set bad-news-reaction random-float 1

  if testing? = true [type "expected price of technical pessimist " print who print trader-pt+1]

  ]

end

to decide-buy-sell

  ask fundamentalists [

    if trader-pt+1 - pt > 0

      [place-buy-order]

    if trader-pt+1 - pt < 0

      [place-sell-order]

  ]

  ask technical-optimists [

    if trader-pt+1 - pt > 0

      [place-buy-order]

    if trader-pt+1 - pt < 0

      [place-sell-order]

  ]

  ask technical-pessimists [

    if trader-pt+1 - pt > 0

      [place-buy-order]

    if trader-pt+1 - pt < 0

      [place-sell-order]

  ]

end

to go

 ; if abs(pt+1 - pt) < 0.5 [stop]

  if ticks mod 50 = 0

      [set fundamental-value fundamental-value + random-normal 0 3 ;+ random-float 1             ; this keeps the overall trend in fundamental value positive

       ask technical-optimists

          [set c random-float 1

           set beta random-normal 0 5]

      ask technical-pessimists

          [set c random-float 1

           set beta random-normal 0 5]

        ask fundamentalists

            [set f random-float 1

              set gamma random-normal 0 5]

           decide-philosophy]

  external-shock

  decide-buy-sell

  if D + S != 0 [set-price]

  set pt-1 pt                  ; update prices

  set pt pt+1

  calculate-expected-price

  ask turtles [move-randomly]

  tick

end

to move-randomly

  set heading (random 360)

  fd 1

end

to place-buy-order

  let ordered? false

    if (trader-pt+1 - pt) / pt >= 0.1                                                       ; if the trader expects the price to rise 10% or more next period buy 8 shares

    [ set stock-holdings stock-holdings + 8

      set D D + 8

      set money-in money-in + 8 * pt

      calculate-profit

      set color green

    if testing? = true [type "buying 8 shares " print who]

      set ordered? true

    ]

  if (trader-pt+1 - pt) / pt > 0.05 and (trader-pt+1 - pt) / pt < 0.1 and ordered? = false                    ; if the trader expects price to rise between 5% and 9.99% next period buy 5 shares

    [ set stock-holdings stock-holdings + 5

      set D D + 5

      set money-in money-in + 5 * pt

      calculate-profit

      set color green

      if testing? = true [type "buying 5 shares " print who]

      set ordered? true

      ]

   if (trader-pt+1 - pt) / pt >= 0.025 and (trader-pt+1 - pt) / pt <= 0.05 and ordered? = false                ; if trader expects price to rise between 2.5% and 5% next period buy 2 shares

    [ set stock-holdings stock-holdings + 2

      set D D + 2

      set money-in money-in + 2 * pt

      calculate-profit

      set color green

      set ordered? true

      if testing? = true [type "buying 2 shares " print who]

      ]

  if (trader-pt+1 - pt) / pt < 0.025 and ordered? = false                                        ; if trader expects price to rise between 0.001% and 2.5% next period buy one share

    [set stock-holdings stock-holdings + 1

      set D D + 1

      set money-in money-in + pt

      calculate-profit

      if testing? = true [type "buying 1 share " print who]

      set color green

      ]

end

to place-sell-order

  let ordered? false

  if (trader-pt+1 - pt) / pt > -0.025 and (trader-pt+1 - pt) / pt < 0 and stock-holdings >= 1                                       ; if trader expects price to fall between 0.001% and 2.5% next period sell one share

    [set stock-holdings stock-holdings - 1

      set S S + 1

        set money-out money-out + pt

        calculate-profit

        set color red

      if testing? = true [type "selling 1 share " print who

                          type stock-holdings print " shares left"]

        set ordered? true

        ]

  if (trader-pt+1 - pt) / pt <= -0.025 and (trader-pt+1 - pt) / pt >= -0.05 and ordered? = false               ; if trader expects price to fall between 2.5% and 5% next period sell 2 shares

    [ifelse stock-holdings >= 2

      [set stock-holdings stock-holdings - 2

       set S S + 2

        set money-out money-out + 2 * pt

        calculate-profit

        set color red

        if testing? = true [type "selling 2 shares " print who

                            type stock-holdings print " shares left"]

        set ordered? true

      ]

      [set S S + stock-holdings

        set money-out money-out + stock-holdings * pt

        calculate-profit

        if testing? = true [type "selling all " type stock-holdings type " shares" print who

                            type stock-holdings print " shares left"]

        set stock-holdings 0

        set ordered? true

        set color red]

  ]

  if (trader-pt+1 - pt) / pt < -0.05 and (trader-pt+1 - pt) / pt > -0.1 and ordered? = false                ; if the trader expects price to fall between 5% and 9.99% next period sell 5 shares

    [ifelse stock-holdings >= 5

      [set stock-holdings stock-holdings - 5

      set S S + 5

       set money-out money-out + 5 * pt

       calculate-profit

        if testing? = true [type "selling 5 shares " print who

                            type stock-holdings print " shares left"]

       set ordered? true

       ]

      [set S S + stock-holdings

        set money-out money-out + stock-holdings * pt

        calculate-profit

        set ordered? true

        if testing? = true [type "selling all " type stock-holdings type " shares" print who

                            type stock-holdings print " shares left"]

       set stock-holdings 0]]

  if (trader-pt+1 - pt) / pt <= -0.1 and ordered? = false                                                      ; if the trader expects the price to fall 10% or more next period sell all shares

    [ifelse stock-holdings >= 8

        [set stock-holdings stock-holdings - 8

        set S S + 8

        set money-out money-out + 8 * pt

        calculate-profit

        if testing? = true [type "selling 8 shares " print who

                            type stock-holdings print " shares left"]

        ]

        [set S S + stock-holdings

        set money-out money-out + stock-holdings * pt

        calculate-profit

        if testing? = true [type "selling all " type stock-holdings type " shares" print who

                            type stock-holdings print " shares left"]

        set stock-holdings 0]]

end

to set-price

  set gamma random-normal 0 1                            ; draws gamma from random normal distribution. 0.25 standard deviation can be positive or negative

  set a random-float 1                                       ; sets alpha between 0 and 1

  if testing? = true [type "D: " print D

    type "S: " print S

    type "gamma " print gamma

    type "a " print a]

  set pt+1 pt + a * ((D - S) / (D + S)) + gamma                           ; sets price based on number of buy and sell orders

  if pt+1 < 0

  [set pt+1 0.0001]

  if testing? = true [type "price " print pt+1]

  set volatility D - S

  set D 0

  set S 0

  ;set price-list lput pt+1 price-list

end

to calculate-expected-price

  ask fundamentalists [

    ;type "f " print f

   ;type "funadamental-value " print fundamental-value

   ;type "alpha " print alpha

    ifelse good-news? = false and bad-news? = false

      [set trader-pt+1 pt + f * (fundamental-value - pt) + alpha]

    [ifelse good-news? = true

      [set trader-pt+1 pt + f * (fundamental-value - pt) + alpha + (severity * good-news-reaction)]           ; adds in random shock mean 100 st dev 30

      [set trader-pt+1 pt + f * (fundamental-value - pt) + alpha - (severity * bad-news-reaction)]]

    if testing? = true [type "expected price " print who print trader-pt+1]

   ; type "profit of " type who print " " print profit

    ifelse portfolio-value > 0

      [set gain-loss profit / portfolio-value]

      [set gain-loss 0]

   ; type "gain loss " print gain-loss

  ]

  ask technical-optimists [

    ifelse good-news? = false and bad-news? = false

      [set trader-pt+1 pt + c * (pt - pt-1) + beta]

      [ifelse good-news? = true

        [set trader-pt+1 pt + c * (pt - pt-1) + beta + (severity * good-news-reaction)]           ; adds in random shock mean 100 st dev 30

        [set trader-pt+1 pt + c * (pt - pt-1) + beta - (severity * bad-news-reaction)]]

    if testing? = true [type "expected price " print who print trader-pt+1]

      ;  type "profit of " print who print " " print profit

      ifelse portfolio-value > 0

        [set gain-loss profit / portfolio-value]

        [set gain-loss 0]

    ;type "gain loss " print gain-loss

  ]

  ask technical-pessimists [

    ifelse good-news? = false and bad-news? = false

    [set trader-pt+1 pt + c * (pt-1 - pt) + beta]

    [ifelse good-news? = true

      [set trader-pt+1 pt + c * (pt-1 - pt) + beta + (severity * good-news-reaction)]           ; adds in random shock mean 100 st dev 30

      [set trader-pt+1 pt + c * (pt-1 - pt) + beta - (severity * bad-news-reaction)]]

    if testing? = true [type "expected price " print who print trader-pt+1]

  ;  type "profit of " print who print " " print profit

    ifelse portfolio-value > 0

        [set gain-loss profit / portfolio-value]

        [set gain-loss 0]

   ; type "gain loss " print gain-loss

  ]

end

to external-shock

  let newstype? true

  set good-news? false

  set bad-news? false

  if random-float 1 > 0.5

    [set newstype? false]               ; 0 means bad news 1 means good news

  if random-float 1 > 0.9

    [ifelse newstype? = true

      [set good-news? true

       set severity random-float 100]

      [set bad-news? true

       set severity random-float 100]]

end

to calculate-profit

  set portfolio-value stock-holdings * pt

  ;type "stock holdings of " print who print stock-holdings

  ;type "price " print pt

  ;type "portfolio value of " print who print portfolio-value

  set profit portfolio-value + money-out - money-in

  ;type "profit of " print who print profit

end

to decide-philosophy

  ask turtles [

    let partner one-of other turtles

    ask partner [

      set partner-profit profit

      ;type "partner profit " print partner-profit

      set partner-philosophy philosophy

      ;type "partner philosophy " print partner-philosophy

    ]

    if partner-profit > profit [

      let change-prob random-float 1

      if change-prob > 0.6 [

        if partner-philosophy = "fundamentalist"

          [set breed fundamentalists

           set f random-float 0.5

           set alpha random-normal 0 0.25]

        if partner-philosophy = "technical-optimist"

          [set breed technical-optimists

           set c random-float 0.5

           set beta random-normal 0 0.25]

        if partner-philosophy = "technical-pessimist"

          [set breed technical-pessimists

           set c random-float 0.5

           set beta random-normal 0 0.25]

        ;type who print "changed breed to " print partner-philosophy

      ]

    ]

  ]

end