Simple Monetary Circuit Model
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
WHAT IS IT?
This simulation represents a monetary economy based on the monetary circuit framework. While it simplifies the involvement of key players like central banks, governments, and distinguishes less between households and firms, the model effectively illustrates how money circulates within an economy. It focuses on the interactions between economic agents, combining households and firms into one entity, to observe the impact of credit creation on money supply, investments, savings, and bank balance sheets.
HOW IT WORKS
Money is assumed to be created during credit creation, influenced by a simplified bank lending rule based on deposits to total assets (reserves + loans). Loans are provided to households.
Households receive loans to produce investment goods, spending them through transactions with other households. The model treats consumption and capital goods spending similarly, recognizing that the distinction depends on the mindset of capitalists.
Households, upon receiving income, check if it covers their minimum spending rule (assuming households can be immortal). If it does, they save some income as deposits in banks and withdraw the rest in hard currency (bank reserves). The savings rate is determined by the marginal propensity to consume. If income doesn't cover the minimum spending, the savings rate is set to 0, and savings are withdrawn from the bank to cover the deficit.
HOW TO USE IT
liability-to-deposit-ratio influences the amount of loans and deposits created by banks.
CreateLoans? determines whether banks lend according to the bank lending rule.
endowment determines the starting deposits household has.
ConsumptionPropensity determines how much is used for savings given a unit of new income.
MinimumSpending determines how much households need to spend in a single tick.
THINGS TO NOTICE
In a closed economy, investments equal savings in economics. Observe household savings and loan creation levels to understand their interaction within the monetary circuit framework. If MinimumSpending is 0, loans created eventually equal new deposits after all savings are done.
Note: if minimum spending is above 0, savings actually is smaller than investment, but this is due to how the code works as the residual is made up for in currency held by households. In theory, investment should still equal savings, but the sequence of the model doesn't really allow for that - yet.
THINGS TO TRY
Try turning on CreateLoans in the middle of the model running (let MinimumSpending > 0). This simulates a lending boom of sorts and GDP shoots up and eventually comes down.
EXTENDING THE MODEL
I'll extend the model by adding in new agentsets - governments, central banks and firms.
Furthermore, new features such as interest and principal payment on loans would be the next obvious step. It's exclusion is due to the fact that outstandingloans rarely every go down in any significant strech of time for most economies (through paying the loans off).
Also, the agents in this model faces no restriction in output production and places a fixed price for its work (1 unit of money = 1 unit of output). This is clearly unrealistic and ignores supply constraints and inflationary effects. Future model can improve on this.
Comments and Questions
breed [households household] breed [banks bank] banks-own [assets liabilities LoansCreated networth deposits reserves Total-Loans-Outstanding deposit-to-asset loans-to-reserve] households-own [MPC ExpenditureLag Gestation origin deposits ;; by this we meant ready deposits RM ;; currency FixedDeposits ;; real savings kind of situation ExpenditurePlans ;; schedule for expenditure, list of list have 3 things (amount to be spent, how much to spend this time, and how many tick left to be spent) orders] globals [ transactions output New-Output New-Transactions ] to setup clear-all create-households No.Households ask households [ set color white set shape "person" setxy random-xcor random-ycor set MPC ConsumptionPropensity ;; How much to spend given income set ExpenditureLag LagDenom ;;A denominator on how to chop up planned expenditure set Gestation lagOutput ;;Time taken for output to be produced set origin 0 set deposits endowment ; change this soon. Give endowment set RM 0 set FixedDeposits 0 set ExpenditurePlans [] set orders [] ] create-banks 1 ask banks [ set color green set shape "house" set reserves Initial-Reserves set assets reserves set deposits endowment * No.Households set liabilities deposits set deposit-to-asset (deposits + 0.001) / (assets + 0.001) set Total-Loans-Outstanding deposits set loans-to-reserve Total-Loans-Outstanding / reserves ] set transactions 0 set output 0 set New-Transactions 0 set New-Output 0 UpdateNetworth reset-ticks end to step if CreateLoan? [ CreateTheLoan ;; banks create loans and same amount of deposit is created ] OrganiseSavings ;; Decide how much of income to save in FD (determined by MPC), convert deposits to currency Expend ;; spend money, get recievers to process orders ProcessOrder UpdateNetworth tick end to CreateTheLoan ask banks [ if reserves > 0 [ if (liabilities + 0.01) / assets < liability-to-asset-ratio [ if reserves < 0 [ print "negative!"] set LoansCreated loan-creation set Total-Loans-Outstanding Total-Loans-Outstanding + LoansCreated set deposits deposits + loan-creation let random-household one-of households send-loan-to random-household LoansCreated] ] ] end to send-loan-to [recipient transfer] ask recipient [ set deposits deposits + transfer set color red set origin 1 ] end to OrganiseSavings ask households [ ifelse origin = 0 [ let SavingsRate 1 - ConsumptionPropensity let current-household who ifelse deposits * (1 - SavingsRate) > MinimumSpending [ ;; if your deposit (after savings) is already higher than minimum spending PlanExpendProcess current-household SavingsRate LagDenom ][ ;; if existing deposits alone can't cover it all set color yellow set SavingsRate 0 ifelse FixedDeposits + deposits >= MinimumSpending [ ; if still have money in FD, just don't have enough existing deposits let ExistingDeposit deposits let shortfall (MinimumSpending - ExistingDeposit) AltPlanExpendProcess current-household shortfall LagDenom ] [ ; if don't even have enough savings set color pink set SavingsRate 0 ifelse FixedDeposits > 0 [ ; gather crumbs let leftover FixedDeposits AltPlanExpendProcess current-household leftover LagDenom ] [ PlanExpendProcess current-household SavingsRate LagDenom ] ] ] ] [ let SavingsRate 0 if deposits > 0 [ let current-household who PlanExpendProcess current-household SavingsRate LagDenom set origin 0 ;; return back as normal spender ] ] ] end to AltPlanExpendProcess [OwnHousehold FDWithdrawal OwnLagDenom] ask household OwnHousehold [ set FixedDeposits FixedDeposits - FDwithdrawal ;; Keep this in bank as permanent savings let SpendingAcc deposits + FDwithdrawal BankWithdrawal SpendingAcc ;; Update bankside (reduce reserve and deposit) set deposits 0 ;; Update deposit depletion set RM RM + SpendingAcc ;; Update currency accumulation let chunks OwnLagDenom let amount SpendingAcc ;; new amount planned to be spent let delay ownLagDenom PlanExpenditure OwnHousehold amount chunks delay ] end to PlanExpendProcess [OwnHousehold OwnSavingsRate OwnLagDenom] ask household OwnHousehold [ let savings deposits * OwnSavingsRate ;; determine how much to save set FixedDeposits FixedDeposits + savings ;; Keep this in bank as permanent savings let SpendingAcc deposits - savings set savings 0 let withdrawal SpendingAcc ;; Intend to withdraw this much from bank BankWithdrawal SpendingAcc ;; Update bankside (reduce reserve and deposit) set deposits 0 ;; Update deposit depletion set RM RM + withdrawal ;; Update currency accumulation let chunks OwnLagDenom let amount SpendingAcc ;; new amount planned to be spent let delay ownLagDenom PlanExpenditure OwnHousehold amount chunks delay ] end to Expend ask households [ let pending-chunks [] foreach ExpenditurePlans [ [x] -> set pending-chunks filter [y -> item 1 y <= ticks] ExpenditurePlans ;;go through EP to find list with tick <= current tick ] foreach pending-chunks[ [z] -> let chunk-size item 0 z ;;get the amount to be spent in this ExpenditurePlans list let target-household one-of other households if target-household != nobody [ send-money chunk-size target-household ;;send money to this household place-order chunk-size target-household ;;place orders towards the targeted household ] UpdateTransactions chunk-size set RM RM - chunk-size ;; once money is sent, deducted from own account banktransaction chunk-size ;; hard currency returns back to bank, and so does deposit ] foreach pending-chunks [ [sub] -> set ExpenditurePlans remove sub ExpenditurePlans ] ] end to ProcessOrder ask households [ let pending-order [] foreach orders [ [x] -> set pending-order filter [y -> item 1 y <= ticks] orders ] foreach pending-order [ [z] -> let EconActivity item 0 z UpdateGDP EconActivity ] foreach pending-order [ [sub] -> set orders remove sub orders ] ] end to UpdateGDP [amount] set output output + amount set New-Output amount end to UpdateTransactions [amount] set transactions transactions + amount set New-Transactions amount end to send-money [amount target] ask target [ set deposits deposits + amount set color blue ] end to banktransaction [amount] ask banks [ set reserves reserves + amount set deposits deposits + amount ] end to place-order [amount target] ask target [ let current-tick ticks let scheduled-tick current-tick + Gestation let NewOrder (list amount scheduled-tick) set orders fput NewOrder orders ] end to PlanExpenditure [current-household amount chunks delay] ;;; determine your expenditure chunks let ExpendChunk amount / chunks ;; calculate the size of chunks let current-tick ticks let ExpendDelay 1 ask household current-household [ repeat chunks [ let scheduled-tick current-tick + ExpendDelay let new-chunk (list ExpendChunk scheduled-tick) set ExpenditurePlans fput new-chunk ExpenditurePlans if ExpendDelay != Delay [ set ExpendDelay ExpendDelay + 1 ] if ExpendDelay > Delay [ print "error!" ] ] ] end to FDPlacement [placement] ;; Cement savings decision ask banks [ set deposits deposits + placement set reserves reserves + placement ] end to BankWithdrawal [withdrawal] ;; Update bankside ask banks [ set reserves reserves - withdrawal set deposits deposits - withdrawal ] end to UpdateNetworth ;;Update bank networth ask banks [ set assets Total-Loans-Outstanding + reserves set liabilities deposits set networth assets - liabilities set deposit-to-asset liabilities / assets set loans-to-reserve Total-Loans-Outstanding / (reserves + 0.001) ] end
There is only one version of this model, created over 1 year ago by Per Hung Yap .
Attached files
File | Type | Description | Last updated | |
---|---|---|---|---|
Simple Monetary Circuit Model.png | preview | Preview for 'Simple Monetary Circuit Model' | over 1 year ago, by Per Hung Yap | Download |
This model does not have any ancestors.
This model does not have any descendants.