Marco Castelnuovo Fabrizio Leone Elena Sappa

Computer Science and Simulation for Economics

Project work on

"Insurance."

 

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: insurance.nlogo

WHAT IS IT?

The model tries to show the effect on the insurance market of the introduction of compulsory insurance policy and a public company.


HOW IT WORKS

There are two groups of turtles: insurance companies and insurables. The observer can choose to: immediately place the public company, do it with a time delay, do not place it. We measure the illness level of each insurable and determine whether one is ill or not establishing a threshold level. Above this level the insurable is declared ill.
The information set flows from insurance companies to insurables. They know a company only if they wander in a certain radius around the company.
Every insurable decides whether to take out an insurance policy on the basis of the possession of information. The information is organised in lists and every insurable has his own. This list takes into account his knowledge of every company and the offered premium. If the public insurance exists everyone is aware of it.
The private insurance companies quote a premium that is the sum of the pure premium and a markup. The latter is usually bigger than the public insurance one. This happens because profits are not the primary aim of the public subject.
The insurables decide to take out an insurance policy on the basis of a detailed choice process: they enter into the contract with the insurance that quotes the lowest premium in the market considering also their calmness (see HOW TO USE IT). If an insurable wants to take out the contract at all costs he may not consider the premium as an important variable, otherwise if he is not worried about his risks he will consider the premium as a key variable.
The final part of the model is a brief analysis of the effect of the introduction of the public subject on the balance sheet of the insurance companies. For the sake of simplicity we assume that the reserves do not exist and so the assets are the collected premium and the liabilities are represented by the claims that are payed out by the company.


HOW TO USE IT

Pressing 'insurances' button the observer has the possibility to choose where to place insurance companies by clicking on the patches. Afterwards the user can click the 'INSURABLES' button in order to create new insurables.
There are several parameteres (sliders) that can be modified:
- 'N': number of insurables,
- 'INFORMATION': information power of the insurance companies (i.e. advertising expenses),
- 'GET INFORMATION': cost of time and effort that insurables spend trying to collect information about the policies (shoe leather cost),
- 'ILLNESS THRESHOLD': illness level above of which an insurable is declared ill,
- 'FORECAST ERROR': made by the private insurance companies trying to estimate the illness probability,
- 'PUBLIC_FORECAST_ERROR': made by the public insurance company trying to estimate the illness probability,
- 'MARKUP': added to the pure premium to determine the quoted premium by the private companies,
-'PUBLIC_MARKUP': added to the pure premium to determine the quoted premium by the public company,
- 'MAXCALMNESS': determine the maximum calmness. Calmness of insurables is a random number between zero and maxcalmness that shows the number of weeks within the insurable takes the decision.


THINGS TO NOTICE

Insurables will ever make a decision after a number of ticks equal to their calmness parameter.


THINGS TO TRY

The user can change some variables represented by sliders to see how they can influence the model:

- 'INFORMATION' ('GET_INFORMATION') power of insurances (insurables): influences the choice,
- 'ILLNESS_THRESHOLD': the bigger is the illness threshold, the lower is the number of ills,
- 'MARKUP' ('PUBLIC_MARKUP'): the higher is the markup, the higher is the premium quoted. As a result the number of contracts taken out by that company is lower,
- 'CALMNESS': the bigger is the value, the latter is the decision.


EXTENDING THE MODEL

Who wants to extend our model can focus on these main topics:
- each customer of an insurance company may learn from his past experience to improve his condition (if he had a bad treatment he may change company in the future,
- interaction between customers of different insurances in order to share infomation about their current and previous experiences,
- insurances may improve their calculus techniques about premiums and claims. In addition it is possible to relax the hypotesis of constant equivalence between premium and claim in order to introduce the reserves in the balance sheet.


NETLOGO FEATURES

The screen is the market.
There are two main groups of turtles: insurances (privates and the public one) and insurables.
The insurances are represented by the "house ranch", while the insurables are represented by a person. The insurables are divided on the basis of their probability to fall ill: green (good health condition), yellow (middle risk), red (bad health condition). If an insurable is ill it becomes white and is represented by a doctor shape.
The simulation has also a graph: the earnings plotted against time (in weeks).
If you want to notice what happens at every step of the period you can click the button 'GO ONCE' instead of 'GO'.


RELATED MODELS

We haven't found any agent-based model dealing with this specific topic.


CREDITS AND REFERENCES

Stiglitz, Rotschild, "Equilibrium in competitive insurance markets: an essay on the economics of imperfect information".
Ermanno Pitacco, "Elementi di matematica per le assicurazioni", Lint editore.


PROCEDURES


breed [insurances insurance]
breed [publics public]
breed [insurables insurable]
insurables-own [dinfolist illness_prob illness_eprob ppremiumlist premiumlist claimlist markupremiumlist choicelist calmness chosenpremium]
insurances-own [markuprandom claim totclaim premiumsum]
publics-own [pclaim ptotclaim premiumsum]
globals [en ins publicinsurance publicscolor choice delay earnings0 earnings1 earnings2 earnings3 ills]


to crtinsurances
   ca
   clear-output
   set-default-shape insurances "house ranch"
   set-default-shape publics "house ranch"
   while [count insurances < 3] 
    [if mouse-down?
        [ask patch mouse-xcor mouse-ycor [sprout-insurances 1 [set size 3] wait 0.3]]]
   
   set choice user-one-of "Public insurance?" ["yes, immediately" "yes, with delay" "no"]
   ifelse choice = "yes, immediately" [ set publicinsurance true] 
       [ifelse choice = "yes, with delay"   [set delay read-from-string user-input "delay (weeks)" 
                                             set publicinsurance true 
                                             user-message ("Click on patch to place public insurance")]
           [set publicinsurance false]]
   
   if publicinsurance = true 
    [while [count publics = 0]   
     [if mouse-down?  
        [ask patch mouse-xcor mouse-ycor [sprout-publics 1 [set size 4 set color red]]]]] 
   
end



to crtinsurables
   displaychoice
   ask insurables [die]
   set-default-shape insurables "person"
   create-insurables n
   ask insurables [setxy random-xcor random-ycor]
   listbuilding
   ask insurables [set calmness random maxcalmness]
   set ills count insurables with [color = white] 
end

to displaychoice
   clear-output
   output-print choice
   if choice = "yes, with delay" [ask publics [set color black] output-print delay output-print "weeks"]
end

to listbuilding
  ask insurables [set dinfolist [1000 1000 1000 1000] ;first element is related to first insurance and so on
                  set illness_prob (random-gamma 10 25) * 100
                  set illness_eprob [0 0 0 0]] ;list of illness estimated probability 
                  
   ask insurances [let temp who       ;local variable: assumes value of 'who' related to insurance
                   ask insurables in-radius (information + random-float 6) [set dinfolist replace-item temp dinfolist 1]]
                       ;if public insurance exists last item is equal to 1
   probability-set
   
   ask insurances [ set markuprandom markup + round (random 6) ]
   ask insurables [set markupremiumlist [0 0 0 0]]
   ask insurances [let tempwho who 
                   let tempmur markuprandom ask insurables [set markupremiumlist replace-item tempwho markupremiumlist tempmur]]
   ask insurables [set markupremiumlist replace-item 3 markupremiumlist public_markup ] 
   
   ask insurables [set ppremiumlist (map [?1 * ?2] illness_eprob illness_eprob)
                   set premiumlist (map [?1 * (?2 / 100) + ?1] ppremiumlist markupremiumlist)]
   
   
   
   ask insurances [let temp who set premiumsum sum [item temp premiumlist] of insurables]
   ask publics [set premiumsum sum [item 3 premiumlist] of insurables]
   
   ask insurances  [set en count insurables with [illness_prob >= illness_threshold]
                   set claim ((premiumsum / (ills + 1)) + (premiumsum / (ills + 1)) * random-float 0.5)]
   ask publics [set en count insurables with [illness_prob >= illness_threshold]
                   set pclaim ((premiumsum / (ills + 1)) + (premiumsum / (ills + 1)) * random-float 0.5)]
   ask insurables [set choicelist (map [?1 * ?2] premiumlist dinfolist)]
end

to move
  ask insurables [ if illness_prob < illness_threshold [set shape "person" set size 1]]
  ;ifelse sum [chosenpremium > 0] []
  ask insurables [set ppremiumlist (map [?1 * ?2] illness_eprob illness_eprob)
                  set premiumlist (map [?1 * (?2 / 100) + ?1] ppremiumlist markupremiumlist)]
  ask insurances [let temp who set premiumsum sum [item temp premiumlist] of insurables]
  ask publics [set premiumsum sum [item 3 premiumlist] of insurables]
  ifelse ticks < (delay) [] [ask publics [set color red]]
  ask publics [set publicscolor color]
  ask insurables [right random 360 forward get_information + random-float 5] ;seeking information
  ask insurances [let temp who       
                  ask insurables in-radius (information + random-float 3) 
                   [set dinfolist replace-item temp dinfolist 1]] ;finding information
  if publicscolor = red
     [ask insurables [set dinfolist replace-item 3 dinfolist 1]] ;if public insurance exists, insurables know it
  choiceprocess
  ask insurances [set claim (premiumsum / (ills + 1)) + premiumsum / (ills + 1) * random-float 0.5]
  ask publics [set pclaim (premiumsum / (ills + 1)) + premiumsum / (ills + 1) * random-float 0.5]
  balance
  do-plots
  ask insurables [set illness_prob illness_prob + 1]
  probability-set
  tick
  ask insurables [if illness_prob > illness_threshold [set illness_prob (random-gamma 10 25) * 100
                                                        set illness_eprob [0 0 0 0]]]     ;list of illness estimated probability 
                                                        
  set ills count insurables with [color = white]
  
                                                 
end


to probability-set
ask insurances [let temp who 
                 ask insurables [ifelse illness_prob >= illness_threshold   ;builds list of estimated probabilities 
                                     [set illness_eprob replace-item temp illness_eprob illness_prob 
                                      set illness_eprob replace-item 3 illness_eprob illness_prob]   
                                          [set illness_eprob replace-item temp illness_eprob round (illness_prob + random-normal 0 forecast_error)
                                           set illness_eprob replace-item 3 illness_eprob round (illness_prob + random-normal 0 public_forecast_error)]
                               
                                     
                                    ifelse illness_prob >= 50                        ;
                                       [set color red] [ifelse illness_prob >= 30    ;graphical representation of insurables
                                           [set color yellow] [set color green]]     ;
                                    if illness_prob >= illness_threshold 
                                       [set color white set shape "person doctor" set size 1.5]]]  ;sets a different shape for ills
end


to choiceprocess
   ask insurables [set choicelist (map [?1 * ?2] premiumlist dinfolist)] ;insurables will choose a premium between elements of this list
   ask insurables [set chosenpremium [0 0 0 0]] ;initially the premium is not chosen yet
   
   
   
   ask insurables [if sum dinfolist = 4000 [set calmness calmness + 1]] ;if insurables don't know any of the insurances they delay their decision
   ifelse publicscolor = red [ask insurables [if sum dinfolist = 4 [set calmness 0]]] [ask insurables [if sum dinfolist = 3 [set calmness 0]]]  
   ;if they know all the insurances they take a decision
   
   ask insurables [if ticks >= calmness 
                   [let boolean map [? = min choicelist] choicelist
                     if item 0 boolean = true [set boolean [1 0 0 0]]
                     if item 1 boolean = true [set boolean [0 1 0 0]]
                     if item 2 boolean = true [set boolean [0 0 1 0]]
                     if item 3 boolean = true [set boolean [0 0 0 1]]
                    set chosenpremium (map [?1 * ?2] choicelist boolean)]] ;creates a list in which there is just one premium: the chosen one, the other elements are zeros
                    ask links [die]
                    ask insurances [let temp who 
                                    create-links-with insurables with [item temp chosenpremium > 0 and illness_prob >= illness_threshold] ]
                    ask publics [create-links-with insurables with [item 3 chosenpremium > 0 and illness_prob >= illness_threshold] ]
end
  
to balance
  ask insurances [set totclaim (claim * count my-links)]
  ask publics [set ptotclaim (pclaim * count my-links)]
  ask insurances [set earnings0 (sum [item 0 chosenpremium] of insurables - totclaim)]
  ask insurances [set earnings1 (sum [item 1 chosenpremium] of insurables - totclaim)]
  ask insurances [set earnings2 (sum [item 2 chosenpremium] of insurables - totclaim)]
  ask publics [set earnings3 (sum [item 3 chosenpremium] of insurables - ptotclaim)]
end

to do-plots
  set-current-plot-pen "earnings0"
  plotxy ticks earnings0
  set-current-plot-pen "earnings1"
  plotxy ticks earnings1
  set-current-plot-pen "earnings2"
  plotxy ticks earnings2
  set-current-plot-pen "earnings3"
  plotxy ticks earnings3
end