Azzurra Coluccia Marco Pisanu

Simulation models for economics

Project work on

"Deposit multiplier and tax havens."

 

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

WHAT IS IT?

The model represents the function of multiplication of deposits held by banks and the effects on movements of capital around the world due to the presence of tax havens. The simulation does not consider real countries: the variables used are merely indicative of the choices made by the parties regarding the allocation of financial resources and taking into account the level of taxation at the country where they reside. The NetLogo world is divided into four areas, which have been assigned a tax rate, in which agents move, create business relationships with each other and maintain contact with the banks. It is therefore possible to set the areas of taxation with the dual aim of investigating the process of money creation and the attraction of capital on the basis of special tax advantages.There are three possible business cycle: Recession, Neutrality and Expansion, where agents can receive loans for investment with a probability of 5%, 20% and 35% .


HOW IT WORKS

The model presents multiple switches to create different scenarios:
- LOAN LIQUIDITY CRISIS allows agents to receive loans from banks to solve liquidity crisis;
- CHOOSE ECONOMIC CYCLE FOR INVESTMENT LOAN allows agents to receive the loan to be allocated to investments with a probability that depends on economic cycles selected from the chooser named Economic cycle;
- NO LOAN CHANGE COUNTRY? allows agents to change their area and the reference bank, if they had not received the loan for investment.
Using the three possibilities, choosing the money supply function of banks, the amount of loan by the Central Bank and the possible presence of tax haven, you can get different effects directly analyzed by the monitor and graphics.
Agents pay the cost of their transfers in the NetLogo world and the taxes. When the level of bank deposit of each agent is able to generate a situation of liquidity crisis, agents borrow a loan from their reference bank. Also the banks can borrow a loan in the interbank market of loans or, at least, from the Central Bank.


HOW TO USE IT

The sliders in the interface allow the user to choose the data to be included in the simulation: the initial deposit for each bank, the maximum value of the loan granted by the Central Bank, the function of money supply for banks, the number of economic agents, the tax rate and the initial settings of the areas. Pressing the Setup button the world is created with the desired characteristics. The Go and Go once buttons determine the start of the simulation. The switchs Loan liquidity crisis, Choose economic cycle for investment loan, No loan change country? can be enabled / disabled during the simulation and it is possible to use monitors and graphs to analyze the outcomes of the scenarios created: the monitors describe the number of customers divided by area, the amount of cash held by banks, total deposits of their clients, the amount of reserves, the money created by each bank and the all financial system. There are also two plots with different curves about the trend of deposits and number of customers of each bank, a third graph describes the creation of money by the financial system over time.


THINGS TO TRY

The end user can choose the data to be used in the simulation with some sliders: the initial deposit for each bank (varying from 100 to 1000), the max amount of loan granted by the Central Bank (varying from 100 to 1000), the money supply of banks (80-100%), the number of economic agents (from 2 to 100), the tax rates of areas (varying from 0 and 3% for the tax haven and between 3% and 10% for the others), settings regarding to the possibility of receive a loan for consumption, loans for investment considering the type of economic cycle and the final chance of change country if the loans for investment is not given by banks. With sliders and switchs can be created many experiments and it is possible to analyze the effects that variables have on the amount of created money in the system and on the movement of capitals in the four areas. In fact the settings of the amount of Central bank, Loan liquidity crisis, Choose economic cycle for investment loan e No loan change country can be modified during the running of the program allowing to create situations of crisis/excess of liquidity in the system, amount of loan for investment, movement of capitals and creation of money of different level.


EXTENDING THE MODEL

The model represents a simplified view of reality. More variables can be introduced to describe in detail the choice of agents in the allocation of money in tax havens, taking into account the level of economic welfare, the own economic activity, the accessibility to information and so on. It can also be introduced production activities in relation to investment during the different phases of the business cycle and identify new rating criteria of the banks for lending, both to solve liquidity crisis, and for the financing of investments.
CREDITS AND REFERENCES

www.giuriweb.unich.it
http://it.wikipedia.org/wiki/Riserva_frazionaria
Macroeconomia, Olivier Blanchard
Lo spazio geografico dell’economia finanziaria, Maria Giuseppina Lucia


PROCEDURES

;#####################KEYWORDS#############################################

globals [ transfer_cost                                 ;price paid by agents to transfer
          time                                          ;simulation time
          total_bank_cash_tax_haven                     ;total amount of money in the tax haven
          total_bank_cash_countryA                      ;total amount of money in the country A
          total_bank_cash_countryB                      ;total amount of money in the country B
          total_bank_cash_countryC                      ;total amount of money in the country C
          total_deposits_tax_haven                      ;total agents' deposits in the tax haven
          total_deposits_countryA                       ;total agents' deposits in the country A
          total_deposits_countryB                       ;total agents' deposits in the country B
          total_deposits_countryC                       ;total agents' deposits in the country C
          number_customers_tax_haven
          number_customers_bank_countryA
          number_customers_bank_countryB
          number_customers_bank_countryC
          total_money_created_by_financial_system ]     ;total money created by all banks

breed [ banks bank ]                                    ;turtles are divided into two types of subjects: banks and agents
breed [ agents agent ]

patches-own [ unitary_transfer_cost                     ;unitary price paid by agents to transfer
              tax_rate_here                             ;tax_rate applied in the country
              bank_here ]                               ;reference bank

turtles-own [ ]
              
banks-own [ money_created                  ;it's the money created by each bank
            bank_cash                      ;cash is the real money owned by each bank
            reserve ]                      ;it's the reserve bank
           
agents-own [ deposit                       ;it's the total amount of money owned by each agent
             my_bank                       ;it's the reference bank for each agent
             my_new_bank                   ;it's the new reference bank for each agent during transfer
             my_tax                        ;it's the tax rate paid by each agent and it's a percentage of the deposit
             buyer ]                       ;if the vaariable = 0 the agent is a buyer, if the variable = 1 the agent is a seller

;##############################SETUP#####################################

to setup
   ca
   setup-turtles
   setup-patches
end

to setup-turtles 
   create-banks 4                                                            ;There are four banks with different features about location and color
   ask banks [  set shape "house"                                            ;they have the same size and cash at time 0
                ask bank 0 [ setxy 23.5 23.5 set color 15 ]
                ask bank 1 [ setxy 23.5 7.5 set color 45 ]
                ask bank 2 [ setxy 7.5 7.5 set color 35 ]
                ask bank 3 [ setxy 7.5 23.5 set color 95 ]
               
                set size 3              
                set bank_cash initial_deposit_for_each_bank * ( banks_loans/deposits / 100 )                                
                set reserve ( 1 - banks_loans/deposits / 100 ) * initial_deposit_for_each_bank 
                set money_created ( banks_loans/deposits / 100 ) * initial_deposit_for_each_bank ]
  
   create-agents number_of_economic_agents                                 ;Agents have the same features about shape,size, location,color and deposit
   ask agents [ set shape "person"                                         ;at time 0
                set size 1.5
                setxy random-xcor random-ycor
                set color 15
                set deposit 0
               
                if pxcor > 15 and pxcor <= 31 and pycor > 15 and pycor <= 31   ;Agents's tax rate depends on the country they are born
                   [ set my_tax tax_rate_tax_haven
                     set my_bank bank 0 ]
                if pxcor > 15 and pxcor <= 31 and pycor >= 0 and pycor <= 15
                   [ set my_tax tax_rate_countryA 
                     set my_bank bank 1 ]
                if pxcor >= 0 and pxcor <= 15 and pycor >= 0 and pycor <= 15 
                   [ set my_tax tax_rate_countryB 
                     set my_bank bank 2 ]
                if pxcor >= 0 and pxcor <= 15 and pycor > 15 and pycor <= 31
                   [ set my_tax tax_rate_countryC
                     set my_bank bank 3 ]]
end 


to setup-patches
   ask patches [ if pxcor > 15 and pxcor <= 31 and pycor > 15 and pycor <= 31  ;All patches contain information relating to tax rate, reference bank 
                    [ set pcolor 19                                            ;and unitary transfer cost
                      set tax_rate_here tax_rate_tax_haven
                      set bank_here bank 0
                      set unitary_transfer_cost 2 ]
                    
                 if pxcor > 15 and pxcor <= 31 and pycor >= 0 and pycor <= 15  
                    [ set pcolor 29 
                      set tax_rate_here tax_rate_countryA
                      set bank_here bank 1
                      set unitary_transfer_cost 2 ]
                   
                 if pxcor >= 0 and pxcor <= 15 and pycor >= 0 and pycor <= 15 
                    [ set pcolor 28
                      set tax_rate_here tax_rate_countryB
                      set bank_here bank 2
                      set unitary_transfer_cost 2 ]
                    
                 if pxcor >= 0 and pxcor <= 15 and pycor > 15 and pycor <= 31  
                    [ set pcolor 18
                      set tax_rate_here tax_rate_countryC
                      set bank_here bank 3
                      set unitary_transfer_cost 2 ]]
   
end

;################################GO###########################

to go
   move_agents
   choose_country/transfer_deposit
   ask_loan
   loan_to_investment
   buy
   tax
   show_label
   calculate
   do-plot
   tick
end


to move_agents
   ask agents  [ if [ tax_rate_here ] of patch-here <= 3 
                    [ right random 360 forward ( random 5 ) + 1 
                      set transfer_cost ( distancexy pxcor pycor * unitary_transfer_cost ) ]
                 if [ tax_rate_here ] of patch-here > 3 and [ tax_rate_here ] of patch-here <= 7 
                    [ right random 360 forward ( random 5 ) + 2  
                      set transfer_cost ( distancexy pxcor pycor * unitary_transfer_cost ) ]
                 if [ tax_rate_here ] of patch-here > 7 
                    [ right random 360 forward ( random 5 ) + 4 
                      set transfer_cost ( distancexy pxcor pycor * unitary_transfer_cost ) ]                           
                               
                      if time > 0 [ set deposit deposit - transfer_cost ]
                      ask my_bank [ ifelse bank_cash > transfer_cost 
                                  [ set bank_cash bank_cash - transfer_cost ][ ask_loan_bank ]]]
end  

      
to choose_country/transfer_deposit 
   ask agents [ let my_client_deposit [ deposit ] of agent who
                if [ tax_rate_here ] of patch-here < my_tax                  
                   [ set my_new_bank bank_here
                     set my_tax tax_rate_here            
                while [ my_bank != my_new_bank ][ ask my_bank [ ifelse bank_cash >= ( my_client_deposit * banks_Loans/Deposits / 100 ) 
                                                                [ set bank_cash bank_cash - ( my_client_deposit * banks_Loans/Deposits / 100 )
                                                                  ifelse reserve >= ( my_client_deposit * ( 1 - banks_Loans/Deposits / 100 ))
                                                                  [ set reserve reserve - ( my_client_deposit * ( 1 - banks_Loans/Deposits / 100 )) ]
                                                                  [ set bank_cash bank_cash - ( my_client_deposit * ( 1 - banks_Loans/Deposits / 100 )) ]]
                                                                [ask_loan_bank]]   
                                                  ask my_new_bank [ set money_created money_created + ( my_client_deposit * banks_Loans/Deposits / 100 )
                                                                    set bank_cash bank_cash +  ( my_client_deposit * banks_Loans/Deposits / 100 )
                                                                    set reserve reserve + ( my_client_deposit * ( 1 - banks_Loans/Deposits / 100 ))]
                                                                    set my_bank my_new_bank ]]]
end  

               
to ask_loan
   ask agents [ if deposit <= 0 and time = 0 
                [ let loan ( [ bank_cash ] of my_bank / count agents with [ my_bank = [ my_bank ] of myself ])
                  set deposit deposit + loan ]]
                                                                                        
   ask agents [ if loan_liquidity_crisis [ if deposit <= 0 or deposit < transfer_cost and time > 0
                                           [ let loan [ bank_cash ] of my_bank
                                             set deposit deposit + loan
                                             ask my_bank [ if bank_cash <= 0 [ ask_loan_bank ] ]]]]
end


to ask_loan_bank                           
   ask banks [ let credit_institution bank who if ( count agents with [ my_bank = [ bank who ] of credit_institution ] > 0 )             
               [ let lender one-of banks
                 ifelse ( count agents with [ my_bank = [ bank who ] of lender ] = 0 ) 
                 [ set bank_cash bank_cash + [ bank_cash + reserve ] of lender
                   ask lender [ set bank_cash bank_cash - bank_cash 
                                set reserve reserve - reserve ]]
                 [ set bank_cash bank_cash + max_loan_from_central_bank ]]
              if [ reserve ] of bank who > 0 
              [ set bank_cash bank_cash + ( reserve - ( sum [ deposit ] of agents with [ my_bank = [ bank who ] of credit_institution ]) * ( 1 - banks_Loans/Deposits / 100 ))
                set reserve reserve - ( reserve - ( sum [ deposit ] of agents with [ my_bank = [ bank who ] of credit_institution ]) * ( 1 - banks_Loans/Deposits / 100 )) ]]             
end  
     

to loan_to_investment
   ask agents [ if choose_economic_cycle_for_investment_loan [ if ( remainder time 5 ) = 0 
                [ if economic_cycle = "Recession" [ if random ( 100 ) < 5 [ let loan [ bank_cash ] of my_bank
                                                                            set deposit deposit + loan ]] 
                                                                                  
                  if economic_cycle = "Neutrality" [ if random (100) < 20 [ let loan [ bank_cash ] of my_bank
                                                                            set deposit deposit + loan ]]    
                                                                                                                                      
                  if economic_cycle = "Expansion" [ if random ( 100 ) < 35 [ let loan [ bank_cash ] of my_bank                                                                                           
                                                                             set deposit deposit + loan ]]

                                                                                    
                  if no_loan_change_country? [ set my_new_bank one-of banks
                                               set my_tax [ tax_rate_here ] of [ patch-here ] of my_new_bank
                                               let my_client_deposit [ deposit ] of agent who
                                               while [ my_bank != my_new_bank ][ ask my_bank [ ifelse bank_cash >= ( my_client_deposit *  banks_Loans/Deposits / 100 )
                                                                                               [ set bank_cash bank_cash - ( my_client_deposit *  banks_Loans/Deposits / 100 )
                                                                                                 ifelse reserve >= ( my_client_deposit * ( 1 - banks_Loans/Deposits / 100 ))
                                                                                                 [ set reserve reserve - ( my_client_deposit * ( 1 - banks_Loans/Deposits / 100 )) ]
                                                                                                 [ set bank_cash bank_cash - ( my_client_deposit * ( 1 - banks_Loans/Deposits / 100 )) ]]
                                                                                              [ ask_loan_bank ]]    
                                               ask my_new_bank [ set money_created money_created + ( my_client_deposit * banks_Loans/Deposits / 100 )
                                                                 set bank_cash bank_cash + ( my_client_deposit *  banks_Loans/Deposits / 100 )
                                                                 set reserve reserve + ( my_client_deposit * ( 1 - banks_Loans/Deposits / 100 )) ]                                                                          
                                                                 set my_bank my_new_bank ]]]]]
                                                                                                                                                                                                   
end


to buy
   ask agents [ set buyer ( random 2 ) 
                if buyer = 0                                                    
                [ if count agents with [ buyer = 1 ] in-radius 3 != 0
                [ let consumer agent who
                  let partner one-of agents with [ buyer = 1] in-radius 3
                  ask consumer [ set deposit deposit - 1
                                if my_bank != [ my_bank ] of partner 
                                [ ask my_bank [ ifelse bank_cash >= ( 1 *  banks_Loans/Deposits / 100 )
                                                [ set bank_cash bank_cash - ( 1 *  banks_Loans/Deposits / 100 )
                                                  ifelse reserve >= ( 1 * ( 1 - banks_Loans/Deposits / 100 ))
                                                  [ set reserve reserve - ( 1 * ( 1 - banks_Loans/Deposits / 100 )) ]
                                                  [ set bank_cash bank_cash - ( 1 * ( 1 - banks_Loans/Deposits / 100 )) ]]
                                              [ask_loan_bank]]]
                                              
                ask partner [ set deposit deposit + 1
                              if [ my_bank ] of partner != [ my_bank ] of consumer
                              [ ask my_bank [ set money_created money_created + ( 1 * banks_Loans/Deposits / 100 )
                                              set bank_cash bank_cash + ( 1 * banks_Loans/Deposits / 100 )
                                              set reserve reserve + ( 1 * ( 1 - banks_Loans/Deposits / 100 )) ]]]]]]]                                                                                                                           
end 


to tax
   set time time + 1
   ask agents  
       [ if ( remainder time 5 ) = 0 
       [ let tax_on_deposit ( my_tax / 100 * [ deposit ] of agent who )
         set deposit deposit - tax_on_deposit 
        if deposit <= 0 [ set tax_on_deposit 0 ]
        ask my_bank [ ifelse bank_cash >= tax_on_deposit  
                    [ set bank_cash bank_cash - tax_on_deposit ][ ask_loan_bank ]]]]                     
end                                                                                               


to show_label
   ask agents
       [ ifelse show_individual_agent_deposit [ set label precision ( deposit ) 2 ][ set label "" ]]
                            
   ask banks 
       [ ifelse show_bank_cash_for_each_bank [ set label precision ( bank_cash ) 2 ][ set label "" ]]
end

;#########################CALCULATE & PLOTS########################################
   
to calculate
   set total_bank_cash_tax_haven [ bank_cash ] of bank 0
   set total_bank_cash_countryA [ bank_cash ] of bank 1
   set total_bank_cash_countryB [ bank_cash ] of bank 2
   set total_bank_cash_countryC [ bank_cash ] of bank 3
   set total_deposits_tax_haven sum [ deposit ] of agents with [ my_bank = bank 0 ]
   set total_deposits_countryA sum [ deposit ] of agents with [ my_bank = bank 1 ]
   set total_deposits_countryB sum [ deposit ] of agents with [ my_bank = bank 2 ]
   set total_deposits_countryC sum [ deposit ] of agents with [ my_bank = bank 3 ]
   set number_customers_tax_haven count agents with [ my_bank = bank 0 ]
   set number_customers_bank_countryA count agents with [ my_bank = bank 1 ]
   set number_customers_bank_countryB count agents with [ my_bank = bank 2 ]
   set number_customers_bank_countryC count agents with [ my_bank = bank 3 ]
   set total_money_created_by_financial_system sum [ money_created ] of banks 
end

to do-plot
   set-current-plot "Total deposits of agents"
   set-current-plot-pen "Total deposits Tax haven"
   plot total_deposits_tax_haven
   set-current-plot-pen "Total deposits country A"
   plot total_deposits_countryA
   set-current-plot-pen "Total deposits country B"
   plot total_deposits_countryB
   set-current-plot-pen "Total deposits country C"
   plot total_deposits_countryC
  
   set-current-plot "Total number customers of banks"
   set-current-plot-pen "Number customers Tax haven"
   plot number_customers_tax_haven
   set-current-plot-pen "Number customers country A"
   plot number_customers_bank_countryA
   set-current-plot-pen "Number customers country B"
   plot number_customers_bank_countryB
   set-current-plot-pen "Number customers country C"
   plot number_customers_bank_countryC
  
   set-current-plot "Total money created by financial system"
   set-current-plot-pen "Total_money_created_by_financial_system"
   plot total_money_created_by_financial_system
end