model

model preview image

1 collaborator

Default-person ifelab lerma (Author)

Tags

(This model has yet to be categorized with any tags)
Visible to everyone | Changeable by the author
Model was written in NetLogo 5.1.0 • Viewed 60 times • Downloaded 3 times • Run 0 times
Download the 'model' modelDownload this modelEmbed this model

Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)


Comments and Questions

Please start the discussion about this model! (You'll first need to log in.)

Click to Run Model

;;;
;;; Define Variables          (declaration)
;;;

breed [ customers customer ]      ;; customers the main target of Microfinance.
breed [mfis mfi]                      ;; Microfinance institution, which give a loan to the customer.
breed [ partners partner ]        ;; partners who evaluate the loan amount according to the purpose of the loan.
breed [donors donor]      ;; donors who finance MFI.


globals [ 
  periods                          ;; the time span we consider. number represents the year after the starting time.
  ;custom_solvab?
  fund
  credit_amount                       ;; the limit of each microcredit
  interestrate                    ;; interest rate for the microcredit charged by the MFI.  
  wealth_mfi                      ;; profits of the mfi
  amount_purposeloan? 
  efficiency 
  profitability 
  productivity 
  credit_risk 
  average_loan_balance_per_borrower 
  nb_customers
  performance_achieved?    ;; if true, the IMF achieved social and financial performance
  funds_Offer?             ;; the donors offer funds to mfi
  profit_loss_amount       ;; the amount of the profit or the loss of the activity
  financing_cost
  wealth_funds
]                         

patches-own [
]

customers-own [
  wealth_cust                    ;; each individual's wealth level
  sex                            ;; each individual sex, either male or female8
  marital_status     ;; Married, single, divorced or widow
  customer_activity     ;; the activity of the customer, either agriculture, trade or cruft
  level_education     ;; the level of education of the customer: bad, medium or high level of education
  insured_customer     ;; the customer is insured or not
  customer_residence     ;; Rural or Urban area
  purpose_loan             ;; Creation or Devlopment of the activity
  customer_type       ;; Old or new customer
  nb_loan       ;; the number of loan contracted by the customer
  cross_indebteness     ;; if the customer has another loan with other institutions
  unpaid_amount       ;; the unpaid amout of the loan
  nb_paid_installments           ;; the number of paid installments
  nb_installments       ;; the number of installments
  borrowingdate                  ;; the date when one of poors get a loan from mfi
  ;wealth_sufficient?    ;; if true, customer can reimburse his loan.
  repay_amount?      ;; if true, customer reimubrse his loan.
  borrower-mfi?                  ;; if true, the turtle has got a microcredit from mfi.
  customer_score
]                              



;;;
;;; SETUP PROCEDURES          (initialisation)
;;;

to-report VARY [#low #high]   ;; reports a random integer in given range, inclusive 
   report #low + random(#high - #low + 1) 
end  

to SETUP
  ;; (for this model to work with NetLogo's new plotting features,
  ;; __clear-all-and-reset-ticks should be replaced with clear-all at
  ;; the beginning of your setup procedure and reset-ticks at the end
  ;; of the procedure.)
  clear-all
  reset-ticks
  setup-patches
  setup-customers
  set periods time-span-years  ;; the slider of time-span-years stands for the periods (years).
  reset-ticks
end 

to setup-patches
  ask patches [ set pcolor black ]  ;; set patche's color black. 
  mfi-setup
  partners-setup
end 

to mfi-setup
  ask patches [
     ask patch 0 0 [set  pcolor  red]          ;; the color for the patch of MFI is yellow.
    sprout-mfis 1 [                              ;; for visual impact, the mfi has the shape of yellow house.
      set size 3
      set shape "house"
      set color red   
      setxy 0 0
      set fund microcredit-available      ;; microcredits available from mfi is set using the slider of microcredit-available.
      set credit_amount vary 1 20 ;; the loan limit from the MFI is set using the slider -> need to make credit-limit slider
      set wealth_mfi fund  
      set performance_achieved?  random 2
      set funds_Offer? random 2
      set wealth_funds wealth-funds

    ]
 ] 
end 

to partners-setup
  ask patches [
    
     ask patch 0 10 [set  pcolor  grey]                      ;; the suppliers of raw materials are on the grey patch
    ask patch 0 -10 [set  pcolor  grey]
    ask patch 10 0 [set  pcolor  grey]                   
   ask patch -10 0 [set  pcolor  grey]
    sprout-partners 1 [                  ;; for visual impact, the raw material suppliers have the shapes of grey trucks.
      set size 2
      set shape "circle"
      set color grey    
      setxy 0 10 
      set amount_purposeloan? true    ;; if true, the amount applied by customer is accepted.
    ]
    sprout-partners 1 [
      set size 2
      set shape "circle"
      set color grey    
      setxy 0 -10
      set amount_purposeloan? true    ;; if true, the amount applied by customer is accepted.
    ]
    sprout-partners 1 [
      set size 2
      set shape "circle"
      set color grey    
      setxy 10 0
      set amount_purposeloan? true   ;; if true, the amount applied by customer is accepted.
    ]
    sprout-partners 1 [
      set size 2
      set shape "circle"
      set color grey    
      setxy -10 0
      set amount_purposeloan? true   ;; if true, the amount applied by customer is accepted.
    ]
  ]
end 

to setup-customers
  create-customers customers-number           ;; uses the value of the customers-number slider to set the number of customers.
  
  ask customers [ set shape  "person"
    set color green     ;; the color for the customer is green.
    setxy random-xcor random-ycor  
    set wealth_cust random-normal 50 15        ;; wealth level each custumers start with come from N(50, 15) 
    set sex random 2                      ;; sex for each custumers is either o (female) or 1 (male)
    set customer_type random 2            ;; statut for each custumer is either old (0)  or new (1).      
    set marital_status random 2      ;; either Married (0) or single (1).
    set customer_activity random 4    ;; either agriculture or cruft (0), trade (1), industry (2) or others (3)
    set level_education  random 3           ;; either bad (0), medium (1) or high (2) level of education
    set insured_customer random 2         ;; the customer is insured (1) or not (0)
    set customer_residence random 2        ;; Rural (1) or Urban area (0)
    set purpose_loan random 2             ;; Creation (0) or Devlopment (1) of the activity        
    ;set custom_solvab? FALSE     ;; if true, customer is accepted.
    ;set wealth_sufficient? false    
    set borrower-mfi? random 2                ;; if true, the turtle has got a microcredit from mfi.
    set repay_amount? random 2
    set nb_loan 0
    set cross_indebteness 0
    set unpaid_amount 0
    set nb_paid_installments 0
    set nb_installments 0
    set customer_score vary -5.0 5.0
    set profit_loss_amount profit-loss-amount
    set financing_cost financ-cost
  ]
end 


 

;;;
;;; GO PROCEDURES
;;;

to go    if ticks >= 365 * periods  [ stop ] ;; the time span is restricted to periods (year). *
   ask customers [
    move-customers           ;; this procedure makes customers move.  
    microcredit_application  ;; this procedure makes customer ask for a microcredit. 
    reimburse-mfi            ;; this procedure makes customers reimburse their loans towards mfi.
    ;donors_mfi               ;; this procedure makes mfi get funds from donors.
       ]

 tick                     ;; one tick stands for one day. 
    update-plot              
end   

to move-customers  
  right random 360
  forward random 4        
  set wealth_cust ( wealth_cust - 0.05 )
end   

;;;
;;; granting microcredit from mfi
;;;

to-report custom_solvab?
  ifelse  (customer_type = 0 and customer_score > -0.58) or (customer_type = 1 and customer_score > 1.8)
   [ report true ]
    [ report false ]
end 

to-report mfi_performance
 report ((efficiency + profitability + productivity + credit_risk + average_loan_balance_per_borrower + nb_customers) / 6  )
end  

to microcredit_application
    
  if (fund >= credit_amount) and wealth_cust < 20 and wealth_cust > 5 [     ;; microcredit is possible only when the MFI have money enough to loan and customers is located in the same patch as MFI, which reflects 
 ;if (wealth_mfi >= credit_amount)  [     ;; microcredit is possible only when the MFI have money enough to loan and customers is located in the same patch as MFI, which reflects  
   ; ask customers with [ (credit_amount <= 20 and  amount_purposeloan? = true) or (amount_purposeloan? = false or credit_amount > 20) ]  [  ;; the amout of loan applied by customer.  
     ;;  ifelse ((customer_type = 0 and customer_score > -0.58) or (customer_type = 1 and customer_score > 1.8))   
       ;; [set custom_solvab? true][set custom_solvab? false]

   ask customers with  [custom_solvab? = true ] [ 
      set wealth_cust  (wealth_cust +  credit_amount )        
      set color yellow        ;; those with microcredit turn yellow.
      set wealth_mfi  (fund - credit_amount) ;; available fund to loan will decreases as the loan increases.
      ;;set custom_Solvab? true 
      set borrower-mfi? 1             ;; if true, the turtle has got a microcredit from mfi.
      set borrowingdate ticks ] 
  ; ]
     ask customers with  [custom_solvab? = false] [
        set wealth_cust ( wealth_cust)        
        set color orange        ;; those with microcredit turn orange.
          ;;set custom_Solvab? false
          set borrower-mfi? 0  ;; if true, the turtle has got a microcredit from mfi
          set wealth_mfi (wealth_mfi)       ;; available fund .
         
     ]
  ]
end 

to-report wealth_sufficient?
 
;; ifelse ( wealth_cust >= ((credit_amount * interestrate / 100 / 365) / (1 - (1 + interestrate / 100 / 365)^(ticks - borrowingdate )) * ( ticks - borrowingdate )))
 ;; ifelse ( wealth_cust >= ((credit_amount * interestrate / 100 / 365) / (1 - (1 + interestrate / 100 / 365)^(loan_duration * -30 )) * loan_duration * 30))
 ifelse ( (wealth_cust + profit_loss_amount ) >= ( 1 + financing_cost) * credit_amount)
   [ report true ]
   [ report false ]
end 

to reimburse-mfi
if ( borrower-mfi? = 1 and color = yellow and  wealth_sufficient? = true) [  ;; customers can repay their debts only if he has contracted loan from mfi.
;if (color = yellow and wealth_sufficient? = true ) [  ;; customers can repay their debts only if he has contracted loan from mfi.
   ask customers with [ repay_amount? = 1 ][
          set wealth_cust ((wealth_cust + profit_loss_amount ) - (( 1 + financing_cost / 100 / 365 * ( ticks - borrowingdate ) ) * credit_amount)) ;; the amount of repayment is the summation of pricipal and interest (annual interest rate -> daily interest rate)
          set color violet ;; after repay, the color turn into violet
          set wealth_mfi ( wealth_mfi + (( 1 + financing_cost / 100 / 365 * ( ticks - borrowingdate) ) * credit_amount) - 20 ) ;; interest rate is rate for one year.
          if ticks - borrowingdate <= 365 [ set nb_paid_installments ( nb_paid_installments + 1 ) ]   ;;maturity for the loan is assumed to be one year.
   ]
        ask customers with [ repay_amount? = 0][
          set wealth_cust (wealth_cust +  profit_loss_amount) ;; the amount of repayment is the summation of pricipal and interest (annual interest rate -> daily interest rate)
          set color pink ;; after repay, the color turn into pink
          if ( wealth_funds + wealth_mfi >= (1 + financing_cost)* credit_amount)
          [set wealth_mfi ( wealth_mfi + (( 1 + financing_cost / 100 / 365 * ( ticks - borrowingdate) ) * credit_amount) - 20 ) ;; interest rate is rate for one year.
          set unpaid_amount (unpaid_amount + ((1 + financing_cost / 100 / 365 * ( ticks - borrowingdate) ) * credit_amount))
          if ticks - borrowingdate <= 365 [ set nb_paid_installments ( nb_paid_installments) ]  
          SET wealth_funds wealth_funds - (( 1 + financing_cost / 100 / 365 * ( ticks - borrowingdate) ) * credit_amount)
        ]]
]
end 

      



;to donors_mfi
   ;ask customers with [(( efficiency + profitability + productivity + credit_risk + average_loan_balance_per_borrower + nb_customers) / 6 >= 3) and  count customers with [custom_Solvab? = true] >= 0.7 * customers-number] [
         ;  set wealth_mfi (wealth_mfi + 100 + 50)
          ; set performance_achieved? 1
          ; set funds_Offer? 1
           
       ; ]
   
;end



;;;
;;; reports
;;;

to-report average-wealth-customer
  report ( sum [ wealth_cust ] of customers / count customers )
end 

to-report sum-wealth-mfi
  report ( sum [ wealth_mfi] of mfis)
end 

to-report customer-solvability
  report ( count customers with [ custom_Solvab? = true] )
end 


To-report customer-reimburse-loan
  report ( count customers with [ repay_amount? = 1 and custom_solvab? = true ] )
end 

to-report solvability-ratio
  report (count customers with [ custom_Solvab? = true] / count customers )
end 

to-report PAR30
   report ( sum [ credit_amount ] of customers with [ ticks - borrowingdate >= 30 ] /  sum [ credit_amount ] of customers )
end 

to-report PAR90
   report ( sum [ credit_amount ] of customers with [ ticks - borrowingdate >= 90 ] /  sum [ credit_amount ] of customers )
end 

to-report PAR180
   report ( sum [ credit_amount ] of customers with [ ticks - borrowingdate >= 180 ] /  sum [ credit_amount ] of customers )
end 

;;;
;;; PLOTS 
;;;

to update-plot
  set-current-plot "Average Wealth-customer"
  set-current-plot-pen "customers"
  plot sum [ wealth_cust ] of customers / count customers


  set-current-plot "Wealth-mfi"
  set-current-plot-pen "mfi"
  plot sum [ wealth_mfi ] of mfis

  
  set-current-plot "Average Loan"
  set-current-plot-pen "customers"
  plot sum [ credit_amount ] of customers / count customers 
  
  set-current-plot "Number of Payment"
  set-current-plot-pen "customers"
  plot sum [ nb_paid_installments ] of customers
end 

There is only one version of this model, created 11 months ago by ifelab lerma.

Attached files

File Type Description Last updated
model.png preview Preview for 'model' 11 months ago, by ifelab lerma Download

This model does not have any ancestors.

This model does not have any descendants.