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
The model tries to show the effect on the insurance market of the introduction of compulsory insurance policy and a public company.
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.
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.
Insurables will ever make a decision after a number of ticks equal to their calmness parameter.
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.
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.
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'.
We haven't found any agent-based model dealing with this specific topic.
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.
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