# Version 2

No preview image

Model was written in NetLogo 6.0.2
•
Viewed 132 times
•
Downloaded 4 times
•
Run 0 times

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

extensions [ matrix r ] ; calling the R extension and the matrix extension globals [ Taylor-Interest-Rate ; interest rate as set by the central bank P_GDP ; potential GDP GDP_1 GDP GDP_va GDP_exp ; sum of Total-Consumption and total-investment GDP_inc GDP_or Recession-lenght Recession-Periods Growth-lenght Growth-Rate Unemployment-Rate ; sum of the households without a job Unemployed-People Total-Consumption ; sum of goods sold by the consumptions firms Total-Investment ; sum of total capital sold by the capital production firms Total-Inventory-investment ; sum of inventory investments of all K-Firms Total-Inventory-investment_1 Goods-Price-Level ; sum (price * qt) / Qt sold Goods-Price-Level_1 Capital-Price-Level ; sum (price * qt) / Qt sold Capital-Price-Level_1 General-Price-Level ; General price level starting from 1 General-Price-Level_1 cpi_1 kpi_1 gpi_1 kpi ; Capital price rate cpi ; Consumption price rate gpi ; general price rate, including capital and consumption goods C-Index ; Consumption price index K-Index ; Capital price index G-Index ; General price index C-Firms ; group of firms with property consumption production K-Firms ; group of firms with property capital production Workers ; group of households with property worker Capitalists ; group of households with property capitalist Employed ; building the group with all employed workers Unemployed ; building the group with all unemployed workers Employment_1 Employment Wage Wage_1 Labor-Share_1 Labor-Share Monetary-Base Currency Money-Supply Available-Credit-Basel2 Available-Credit-Basel31 Available-Credit-Basel32 Available-Credit-Basel Capital-Buffer State-Budget Helped-Households Public-Debt Account-of-State-at-Central-Bank Central-Bank-Own-Capital C-Broken ; number of consumption firms that went broken K-Broken ; number of capital production firms that went broken B-Broken ; number of times that banks went broken Bail-outs Bail-ins Promoted ; number of workers that became capitalists Demoted ; number of capitalists that became workers Matrix-C-Firms-Bankruptcy ; input with information that will be used in calculation into R (eq 23) Matrix-K-Firms-Bankruptcy ; input with information that will be used in calculation into R (eq 23) Matrix-Basel-Buffer Beta_1-C-Firms ; parameter utilized by the banks to calculate the interest rate for the firms (eq 26) Beta_2-C-Firms ; parameter utilized by the banks to calculate the interest rate for the firms (eq 26) Beta_1-K-Firms ; parameter utilized by the banks to calculate the interest rate for the firms (eq 26) Beta_2-K-Firms ; parameter utilized by the banks to calculate the interest rate for the firms (eq 26) Beta_1-Banks ; parameter utilized by the banks to calculate the interest rate for the firms (eq 26) Beta_2-Banks ; parameter utilized by the banks to calculate the interest rate for the firms (eq 26) Mjc ; parameter utilized in the process "SubF-Call-Matrix-formation", related to C-Firms Mjk ; parameter utilized in the process "SubF-Call-Matrix-formation", related to K-Firms Mjb ] breed [Households Household] ; agent class breed [Firms Firm ] ; agent class breed [Banks Bank ] ; agent class directed-link-breed [Hireds Hired ] ; link used to link firms to the worker directed-link-breed [Owners Owner ] ; link used to link firms to their owner/capitalist Households-own [ Worker? ; property of the household, yes if it is a worker, not if it is a capitalist Bankrupt? Employed? Human-Wealth ; parameter to calibrate how much of the entire wealth will be used for consumption Current-Income ; the salary if it is a worker, the profit if it is a capitalist Bank-Account-Household ; the total of wealth of the households held with the bank Desired-consumption ; theorical value the household want to consume this period Consumption ; real value the household consumed C-Expenses ; expenditures in consumtion goods Interest-Earned Price-List ; list with the prices of firms the household visited last period ] Firms-own [ C-Firm? ; property of the firms, yes if it is a consumption production firm, not if is a capital production firm Owner? Price ; last price practiced by the firm Demand ; last quantity demanded Production ; actual production of the firm Inventory-investment ; stock of machines produced this period but not sold Stock ; amount available for sales (inventories) Delta ; parameter used to calculate new price Number-of-Employees ; actual number of employees of this firm Desired-Employees ; ideal number of employees for this firm Vacancy ; number of opened places at this firm for new workers New-Credit-Available ; additional credit available for the firm at a particular moment Max-Credit-to-Firm ; maximum amount of loans a firm may get in its balances Revenue ; sum of quantity sold times the price K-Expenses ; this only applies to C-Firms and it is the nominal expenses in capital (net investment) Sales ; sum of quantity sold last period Profit ; revenue less the expenditures EBIT ; Profits Before Taxes Dividend ; part of the profit given to the owner, from firms and banks Need-Cash ; money that will be asked to the bank as a new loan Bank-Account-Firm ; money available at the bank owned by the firms Bank-Account-Firm_1 ; money available at the bank at the beginning of the period Leverage ; debts of the firm divided by their assets, including the debt, ranging between 0 and 1 (0 is zero debt, and 1, all assets are debt) Assets ; sum deposit at bank and stock available for sales Liabilities Equity Current-Retail-Loan ; sum of loans with the retail bank Interest-Retail ; actual interest rate applied to this firm by the retail bank Cases-of-Bankruptcy ; the probability to go bankruptcy by this firm, calculated by the retail bank Interest-Pay ; sum of interest rate payed last period Installment-Pay ; sum of the installment payed last period T-expected ; the expected life span for this firm Probability-of-Bankruptcy ; probability of dying for each and every firm Capital ; property of the C-firms, indicate the capital available to be used at the production process this period... this is a real variable Desired-Investment ; property of the C-Firms, ideal investment needed this period... this is a real variable Price-List ; property of the C-Firms, list of prices from the K-Firms visited last period trying to buy capital goods Investment ; property of the C-Firms, capital goods bough last period Investment-Memory ; property of the C-firms, parameter utilized to calculate te Desired-Investment Util-Capacity ; property of the C-Firms, indicates how much of the Capital had been used ] Banks-own [ Total-Accounts-Workers ; sum of deposit at bank of the households, equity is net worth, the difference between assets and debt Total-Accounts-Capitalists ; sum of deposit at bank of the capitalists, equity is net worth, the difference between assets and debt Total-Accounts-C-Firms ; sum of deposit at bank of the C-Firms, equity is net worth, the difference between assets and debt Total-Accounts-K-Firms ; sum of deposit at bank of the K-Firms, equity is net worth, the difference between assets and debt Own-Bank-Capital ; bank own equity, equity is net worth, the difference between assets and debt Total-Accounts_1 Total-Accounts ; sum of all equities, equity is net worth, the difference between assets and debt Total-Loans_1 Total-Loans ; sum of loans Total-Loans-C-Firms ; sum of loans with the C-Firms Total-Loans-K-Firms ; sum of loans with the K-Firms Central-Bank-Loans Dividend Leverage-C-Firms ; mean leverage of the C-Firms, every bank have their number Leverage-K-Firms ; mean leverage of the K-Firms, every bank have their number Interests-Received ; sum of interest received last period Interests-Paid Installments-Received ; sum of installment received last period Profit ; sum of interest received less the bank losses with their loans EBIT ; Profits Before Taxes Reserves Assets Liabilities Bank-Equity ] ; TO SETUP to Setup clear-all if Do_We_Have_Workers? [ Setup-Workers ] ; call the setup for workers if Do_We_Have_C-Firms? [ Setup-C-Firms ] ; call the setup for C-Firms if Do_We_Have_K-Firms? [ Setup-K-Firms ] ; call the setup for K-Firms if Do_We_Have_Capitalists? [ Setup-Capitalist ] ; call the setup for Capitalists if Do_We_Have_Banks? [ Setup-Bank ] ; call the setup for banks Setup-Globals ; call the setup for globals reset-ticks ; netlogo need this end to Setup-Workers create-Households Number-of-Workers [ setxy random-xcor random-ycor ; the initial position of the worker is random set shape "person" ; just for fun, not necessary for the model, used only for display in HUD netlogo set size 0.50 ; just for fun, not necessary for the model, used only for display in HUD netlogo set color blue ; just for fun, not necessary for the model, used only for display in HUD netlogo set Worker? true ; property of the household, true indicates it is a worker set Employed? false set Bankrupt? false set Human-Wealth 1 ; initial value for Human Wealth, utilized to calculate the consumption process set Current-Income 0 ; intitial income set Bank-Account-Household max list 0 (random-normal Initial-households-personal-assets 0.5) ; initial value of deposits at the banks set Desired-Consumption 0 ; initial value for desire Consumption set Consumption 0 ; initial value for Consumption set Price-List [ ] ; setup for the list which will be use to colect the price of the C-Firms visited ] end to Setup-Capitalist ask n-of 250 patches [ ; each patches represent one firm, this command ensure will be one capitalist for each firm sprout-Households 1 [ ; ask to create one capitalist in each position set shape "person" ; just for fun, not necessary for the model, used only for display in HUD netlogo set size 0.50 ; just for fun, not necessary for the model, used only for display in HUD netlogo set color white ; just for fun, not necessary for the model, used only for display in HUD netlogo set Worker? false ; proper of the household, false means it is a capitalist set Bankrupt? false set Employed? false set Human-Wealth 1 ; initial value for human wealth set Current-Income 0 ; initial value for Current income set Bank-Account-Household max list 0 (random-normal Initial-households-personal-assets 0.5) ; initial value for deposit at bank set Desired-Consumption 0 ; initial value for Desired-Consumption, D-C is the budget allocated to consumption set Consumption 0 ; initial value of Consumption set Price-List [ ] ; setup for the list which will be used to colect the price of the C-Firms visited create-Owner-from one-of Firms-Here [set hidden? true] ; this create a link between the firm and the capitalist. Thus, one will know each other for all the purposes, like divide, rebuild a broken firm, etc. ] ] end to Setup-C-Firms ask n-of 200 patches with [pycor < 8] [ ; this command ask the 200 patches which are position at grid with y coordinates less than 8 sprout-Firms 1 [ ; ask to create one firm at this patche set shape "house" ; just for fun, not necessary for the model, used only for display in HUD netlogo set size 0.75 ; just for fun, not necessary for the model, used only for display in HUD netlogo set color orange ; just for fun, not necessary for the model, used only for display in HUD netlogo set C-Firm? true ; proper of the Firms, true means it is a consumption producer firm set Owner? true set Price 1.0001 ; initial value for price set Capital Initial-capital ; initial value for capital set Stock Initial-production-C-firms ; initial value for stock set Production Initial-production-C-firms ; initial value for production set Probability-of-Bankruptcy 0.0001 set Revenue 0 ; initial value for revenue set Sales 0 ; initial value for sales set Need-Cash 0 ; initial value for cash need set Desired-Investment 0 ; initial value for desire investment set Investment 0 ; initial value for investment set Number-of-Employees 0 ; initial value for number of employees set Desired-Employees 0 ; initial value for desire employees set Price-List [ ] ; setup for the list which be used to colect the prices from the K-firms visited trying to buy capital set Vacancy 0 ; initial value for vacancy set Bank-Account-Firm max list 0 (random-normal Initial-liquidity-of-Firms 1) ; initial money deposited at the bank by the firms set Bank-Account-Firm_1 Bank-Account-Firm set Investment-Memory Initial-Capital ; initial value for Investment-Memory set Util-Capacity 0 ; initial value for util-capacity ] ] end to Setup-K-Firms ask n-of 50 patches with [pycor >= 8] [ ; this command ask 50 patches which are located at coordinates y >= 8 sprout-Firms 1 [ ; ask to create one firm in each of those patches set shape "house" ; just for fun, not necessary for the model, used only for display in HUD netlogo set size 0.75 ; just for fun, not necessary for the model, used only for display in HUD netlogo set color brown ; just for fun, not necessary for the model, used only for display in HUD netlogo set C-Firm? false ; proper of Firms, false mean it is a capital producer firm set Owner? true set Price 1.0001 ; initial value for price set Capital Initial-capital ; initial value for capital set Inventory-investment 0 set Stock Initial-production-K-firms ; initial value for stock set Production Initial-production-K-firms ; initial value for production set Probability-of-Bankruptcy 0.0001 set Revenue 0 ; initial value for revenue set Sales 0 ; initial value for sales set Need-Cash 0 ; initial value for cash needed set Desired-Investment 0 ; initial value for desire investment set Investment "" ; initial value for investment set Number-of-Employees 0 ; initial number for employees set Desired-Employees 0 ; initial value for desired employees set Price-List "" ; not applied to K-Firms set Vacancy 0 ; initial value for vacancy set Bank-Account-Firm max list 0 (random-normal Initial-liquidity-of-Firms 1) ; initial money deposited at the banks by the firms set Bank-Account-Firm_1 Bank-Account-Firm set Investment-Memory "" ; not applied to K-Firms set Util-Capacity "" ; not applied to K-Firms ] ] end to Setup-Bank create-Banks 1 [ ; create one bank set Own-Bank-Capital Initial-Capital-of-the-bank ; initial value fo the own bank equity set Total-Accounts Total-Accounts-Workers + Total-Accounts-Capitalists + Total-Accounts-C-Firms + Total-Accounts-K-Firms + Own-Bank-Capital ] end to Setup-Globals set C-Firms Firms with [ C-Firm? ] ; building the group with all C-Firms set K-Firms Firms with [ not C-Firm? ] ; building the group with all K-firms set Capitalists Households with [ not Worker? ] ; building the group with all Capitalist set Workers Households with [ Worker? ] ; building the group with all workers set Employed Workers with [ Employed? ] ; building the group with all employed workers set Unemployed Workers with [ not Employed? ] ; building the group with all unemployed workers set Taylor-Interest-Rate natural-interest-rate ; we don't need Central Bank for this set GDP 1.0001 ; initial GDP set GDP_1 1.0001 set Unemployment-Rate 0 ; initial Unemployment-Rate rate set Total-Consumption 0 ; initial value of Total-Consumption set Total-Investment 0 ; initial value of total investment set Goods-Price-Level 1.0001 ; initial goods price level set Capital-Price-Level 1.0001 ; initial capital goods price level set General-Price-Level 1.0001 set Wage Minimum-Wage ; initial value for wage set Central-Bank-Own-Capital Initial-Capital-of-the-bank set Account-of-State-at-Central-Bank 0 ; Account of the State at the Central Bank set State-Budget 0 set Matrix-C-Firms-Bankruptcy matrix:make-constant 2 Time-Window 0 ; building the initial matrix which will be used by R-Netlogo later, it is a constant matrix of zeroes with 2 rows and "T-W" columns set Matrix-K-Firms-Bankruptcy matrix:make-constant 2 Time-Window 0 ; building the initial matrix which will be used by R-Netlogo later, it is a constant matrix of zeroes with 2 rows and "T-W" columns set Matrix-Basel-Buffer matrix:make-constant 2 Time-Window2 0 ; building the initial matrix which will be used by R-Netlogo later, it is a constant matrix of zeroes with 2 rows and "T-W2" columns set Mjc 0 ; helper with the matrix above set Mjk 0 ; helper with the matrix above set Mjb 0 ; helper with the matrix above set Public-Debt 0 ; public debt titles sold to the central bank if not Random-Seed? [ random-seed 12345 ] ; random seed may or not be used end ; TO GO to Go ; here will be calling the functions Function-Job-Market ; this function plays the job market process Function-Consumption-Market ; this function plays the consumption market process Function-Capital-Market ; this function plays the capital market process Function-UpDate-Production ; this function plays the production process Function-Cash-Flows ; this function update the cash flow Function-UpDate-Globals ; this function update the globals if Macroprudential-Policy? [ if ticks > 100 [Function-Set-Macroprudential-Rules] ; this function sets the limits to available credit for firms ] Function-Credit-Market ; this function update the credit market Function-Update-Wages if Firm-Regeneration? [Function-New-Firms-Entries] if Do_We_Have_State? [ Function-Call-State ] if Do_We_Have_Central-Bank? [ Function-Call-Central-Bank ] ; r = r* tick ; NetLogo needs this because it controls time end ; FUNCTIONS ; TO FUNCTION-JOB-MARKET to Function-Job-Market ; here will be called the subfunctions ask Firms [ SubF-UpDate-Desired-Workers set Need-Cash 0 ] ; reset the firms need for cash and update the desire workers number if Do_We_Have_State? = false or Unemployment-Benefits? = false [ ; if you do not have unemployment benefits... ask Workers with [not Employed?] [ SubF-Find-a-Job ] ; ask workers which did not have a job to look for one ] if Do_We_Have_State? = true and Unemployment-Benefits? = true [ ; if you have unemployment benefits... ask Workers with [not Employed?] [ ; ask workers which did not have a job to look for one let rand random-float 1 if rand > Unemployment-Cover [ ; the higher the unemployment benefit, the lower the probability of looking for a job SubF-Find-a-Job ] ] ] ask Workers [ set Bank-Account-Household Bank-Account-Household + Current-Income ] ; ask workers to update their income (wages) ask Firms [ set Bank-Account-Firm Bank-Account-Firm - Number-of-Employees * Wage ] ; ask firms to update their bank account end to SubF-UpDate-Desired-Workers ; this subfunction update the desire workers if C-Firm? [ ; if C-firms is true, only C-Firm run this, because K-Firms do not have capital for the calculation... set Desired-Employees min list Desired-Employees ((Capital * Productivity-of-capital) / Productivity-of-labor) ; set desired employees considering the capital production restriction (Assanza et al. 2015, eq. 5.9) if Hiring-Liquidity-Constraint? [ ; if this switch is on, the firm will hire employees limited to the Bank-Account-Firm resources if Desired-Employees * wage > Bank-Account-Firm [ ; if Desired-Employees multiplied by wage is larger than the Bank-Account, the Desired-Employees is updated set Desired-Employees max list 0 (int (Bank-Account-Firm / Wage) + 1) ; update the desired employees considering the money available ] ; K-Firms set their desired employees later, with "Report-K-Update-Desired-Employees" ] ] set Vacancy Desired-Employees - Number-of-Employees ; opening new vacancies to contract more employees while [Vacancy < 0 and Number-of-Employees > 0] [ ; if vacancy < 0 the firm needs to fire some one ask one-of my-out-Hireds [ ; choose one employee ask other-end [ ; ask this employee to set... set Current-Income 0 ; their income as 0, it was fired (die) set Employed? false ] die ; die means this worker no more has a contract with the firm, fired ] set Vacancy Vacancy + 1 ; confirm the fired process, perhaps need to fire another one set Number-of-Employees Number-of-Employees - 1 ; update the number of employee after the firing process ] end to SubF-Find-a-Job ; this subfunction is used by the worker trying to find a job position set Current-Income 0 ; reseting this variable, because the only source of income for repeat Number-of-firms-visited-by-unemployed-workers [ ; the worker can try a maximum number of times to get a job, if not find one he still unemployeed setxy random-xcor random-ycor ; this means the worker visit a firm at the grid while [not any? Firms-here] [ setxy random-xcor random-ycor ] let Vacancy? false ; auxiliar variable to this subfunction ask one-of Firms-here [ ; ask to the firm visited if ... if Vacancy > 0 [ ; ... it has an open position set Vacancy? true ; update auxiliar variable set Number-of-Employees Number-of-Employees + 1 ; update the number of employees, because the firm hires the worker set Vacancy Vacancy - 1 ; update the vacancy of this firm ] ] if Vacancy? [ ; using the auxiliar variable to update the worker status ifelse Do_We_Have_State? [ set Current-Income Wage * (1 - Income-Tax) set State-Budget Wage * Income-Tax ] [ set Current-Income Wage ; update the Current-income of the worker ] create-Hired-from one-of Firms-here [set hidden? true] ; we create a link with the firm here, and this link means the worker has a job, and him and the firm knows about each other set Employed? true stop ; for the repeat function, if it finds a job did not need try once more ] ] if Unemployment-Benefits? = true and Do_We_Have_State? = true and Employed? = false [ SubF-Get-Unemployment-Benefits ; get unemployment benefits if the worker is unemployed ] end to SubF-Get-Unemployment-Benefits ; QEasing means Quantitative Easing, and this is a policy that opens unlimited buying of Public Debt let Unemployment-Benefit Wage * Unemployment-Cover ; the unemployment benefits is a fraction (= u-cover) of the wage ifelse Do_We_Have_Central-Bank? = true and QEasing? = true [ ; if there is a Central Bank and Quantitative Easing policy, this authority will buy any amount of Public Debt, so there are no constraints set Current-Income Unemployment-Benefit ; if the worker is unemployed and his/her Current income is zero the State pays unemployment benefits set State-Budget State-Budget - Unemployment-Benefit ; the tax on income goes to the State set Helped-Households Helped-Households + 1 ; the total number of households helped is increased ] [ if State-Budget >= Unemployment-Benefit [ ; if there is enough budget available the State pays the benefits, and the Central Bank help is unnecessary set Current-Income Unemployment-Benefit ; if the worker is unemployed and its Current income is zero the State pays unemployment benefits, a tax free subsidy set State-Budget State-Budget - Unemployment-Benefit ; the tax on income goes to the State set Helped-Households Helped-Households + 1 ; the total number of households helped is increased ] ] end ; FUNCTION-CONSUMPTION-GOODS-MARKET to Function-Consumption-Market ; here will be called the subfunctions of the Total-Consumption market ask C-firms [ ; updating properties of the C-Firms set Demand 0 set Sales 0 set Revenue 0 ] ask Households [ ; explicit SubF-UpDate-Desired-Consumption ; call subfunction for households update their desired Total-Consumption SubF-Visit-C-Firms ; call subfunction for households visit firm trying to Consumption if Desired-Consumption > 0 [ SubF-Try-Consumption ] ; if wana Consumption something, try buy it ] end to SubF-UpDate-Desired-Consumption set Human-Wealth (Memory-parameter-human-wealth * Human-Wealth) + (1 - Memory-parameter-human-wealth) * Current-Income ; update human wealth (eq 2) set Desired-Consumption min list Bank-Account-Household ((Fraction-of-wealth-devoted-to-consumption * Bank-Account-Household) + Human-Wealth) ; update desired Total-Consumption, it can not be higher than the money the household has set Desired-Consumption max list 0 Desired-Consumption ; ensure desired consumption is not negative end to SubF-Visit-C-Firms ; this subfunction rules the shopping process, visiting the firms let Who01 "" ; auxiliar variable, save the name of the first firm visited let Who02 "" ; auxiliar variable, save the name of the second firm visited let Price01 "" ; auxiliar variable, save the price of the first firm visited let Price02 "" ; auxiliar variable, save the price of the second firm visited setxy random-xcor random 8 ; choose the address of one random C-firm while [not any? Firms-here] [ setxy random-xcor random 8 ] ask one-of Firms-here [ set Who01 Who ; save the name of this firm set Price01 Price ; save the price of this firm ] setxy random-xcor random 8 ; choose the address of one random C-firm while [not any? Firms-here] [ setxy random-xcor random 8 ] ask one-of Firms-here [ ; choose the address of the second firm set Who02 Who ; save the name of this firm set Price02 Price ; save the price of this firm ] while [Who01 = Who02] [ ; if happened to visited the same firm twice, find another one, repeat the process above setxy random-xcor random 8 ; choose the address of one random C-firm while [not any? Firms-here] [ setxy random-xcor random 8 ] ask one-of Firms-here [ set Who02 Who set Price02 Price ] ] ifelse Price01 < Price02 [set Price-List list (Firm Who01) (Firm Who02) ] [set Price-List list (Firm Who02) (Firm Who01) ] ; create an organized list, the firm with the lowest price comes first end to SubF-Try-Consumption let Firm-A first Price-List ; extract the name of the firm with a better price let Firm-B last Price-List ; extract the name of the firm with the worst price let Qtt Desired-Consumption / [Price] of Firm-A ; auxiliar variable, record the quantity that can be bought, DC/Pa set c-expenses 0 let expenses 0 ; auxiliar variable to update the deposit at bank later let cons 0 ; auxiliar variable to record the quantity Consumptiond ask Firm-A [set Demand Demand + Qtt ] ; update the demand of C-Firms if [Stock] of Firm-A < Qtt [ ; if there is not available goods at the first firm ... ask Firm-B [set Demand Demand + Qtt - [Stock] of Firm-A ] ; also the second firm has a demand for their product ] ask Firm-A [ ; trying to Consumption at the better price ifelse Stock > Qtt [ ; first situation, the better one in which the Consumptionr can Consumption all at the better price set Stock Stock - Qtt ; updated the stock of the firm set Sales Sales + Qtt ; update the sales set Revenue Price * Qtt + Revenue ; update the revenue set expenses Price * Qtt + expenses ; update the auxiliar variable, used later to update the household bank account set cons cons + Qtt ; update the auxiliar variable to register the qtt Consumptiond set Qtt 0 ; means no need to bought anymore ] [ if Stock > 0 [ ; second situation, buying only part at first firm set Sales Sales + Stock ; update sales set Revenue Price * Stock + Revenue ; update revenue set expenses Price * Stock + expenses ; update auxiliar variable, later used to update the bank account of the household set cons cons + Stock ; update stock set Qtt Qtt - Stock ; update auxiliar variable to register the Qtt Consumptiond, Qtt = Qtt - S set Stock 0 ; update stock ] ] ] ; end ask Firm-A, because it already has its stock exhausted/depleted if Qtt > 0 [ ; means household did not Consumption all it wanted to in the first firm set Qtt (Qtt * [Price] of Firm-A) / [Price] of Firm-B ; auxiliar variable, max quantity can Consumption at the new price, (Qtt - S)*Pa/Pb = [(DC)/Pa - S]*Pa/Pb = (DC - S*Pa)/Pb ask Firm-B [ ; updating values at the second firm ifelse Stock > Qtt [ ; as above... ; first situation, buy all set Stock Stock - Qtt set Sales Sales + Qtt set Revenue Price * Qtt + Revenue set expenses Price * Qtt + expenses set cons cons + Qtt set Qtt 0 ] [ ; second situation, did not Consumption all he wants if Stock > 0 [ set Sales Sales + Stock set Revenue Price * Stock + Revenue set Expenses Price * Stock + expenses set cons cons + Stock set Qtt Qtt - Stock set Stock 0 ] ] ] ; end ask Firm-B ] ; end Qtt > 0, because the process ends with an unsatisfied positive quantity ; update households atributes set c-expenses expenses set Consumption cons ; update the Consumption of the households, the real value that the household did consume set Bank-Account-Household Bank-Account-Household - expenses ; update the bank account of the households with the remaining money after the purchasing process end ; FUNCTION-CAPITAL-MARKET to Function-Capital-Market ; this function set the rules for the capital goods market ask K-Firms [ set Demand 0 set Revenue 0 set Sales 0 ] ; update K-Firms properties ask C-Firms [ ; updating the C-Firms properties set Investment 0 SubF-UpDate-Investment-Desire ; call sub-function to update investment if Desired-Investment > 0 [ SubF-UpDate-Investment ] ; if there is need for investment call the sub-function for investment ] ask K-Firms [ set Inventory-investment Production - Sales ] end to SubF-UpDate-Investment-Desire ; sub-function with procedure to update the investment need of a C-Firm set Desired-Investment 0 ; reset variable let rand random-float 1 ; auxiliar sub-function variable if rand < Probability-of-investing [ ; check if it is time to invest, because only a fraction of C-Firms (= probability) can invest if ticks > 1 [ ; assure that there is no investment in time equal zero set Investment-Memory (Memory-parameter-investment * Investment-Memory) + (1 - Memory-parameter-investment) * Util-Capacity * Capital ; begin of equation of capital motion (eq 10 & Assenza et al. 2015, p. 12) set Desired-Investment max list 0 (( (1 / Desired-capacity-utilization-rate) + (Depreciation-of-capital-C / Probability-of-investing) ) * Investment-Memory - Capital) ; end of equation of capital motion (eq 12 & Assenza et al. 2015 eq. 5.7)) if Investment-loan? [ set Need-Cash Need-Cash + Desired-Investment * Capital-Price-Level ; in this way the firm asks for a loan when the desired investment is set ] ] ] end to SubF-UpDate-Investment ; this subfunction is called when there is need for investment if Desired-Investment > 0 [ ; just trying to find product in two diferents K-Firms SubF-Visit-K-Firms ; visit two K-Firms, take note of their prices SubF-Buy-Capital ; sub-function used to bought capital ] end to SubF-Visit-K-Firms ; searching for the better price, similar to the households sub-functions, check for details there let X xcor ; the diference is that the firm need to have a fixed position. This X and Y auxiliar variables save the firm position at the grid let Y ycor let Who01 "" let Price01 "" let Who02 "" let Price02 "" setxy random-xcor (random 2 + 8) while [not any? other Firms-here] [ setxy random-xcor (random 2 + 8) ] ask one-of other Firms-here [ set Who01 Who set Price01 Price ] setxy random-xcor (random 2 + 8) while [not any? other Firms-here] [ setxy random-xcor (random 2 + 8) ] ask one-of other Firms-here [ set Who02 Who set Price02 Price ] while [ Who01 = Who02 ] [ setxy random-xcor (random 2 + 8) while [not any? other Firms-here] [ setxy random-xcor (random 2 + 8) ] ask one-of other Firms-here [ set Who02 Who set Price02 Price ] ] ifelse Price01 < Price02 [ set Price-List list (Firm Who01) (Firm Who02) ] [set Price-List list (Firm Who02) (Firm Who01) ] setxy X Y ; return the firm to their position after the prices search end to SubF-Buy-Capital ; sub-function to buy capital goods set k-expenses 0 ; sub-function auxiliar variable to save the investment expenses of the C-Firm let expenses 0 let New-Inv 0 ; sub-function auxiliar variable to save the number of units of capital bought by the C-Firm let Firm-A first Price-List ; extract the name of the K-Firm with the better price let Firm-B last Price-List ; extract the name of the K-Firm with the second price let Qtt Desired-Investment ; auxiliar variable register the Qtt C-Firm want to buy if C-Firm_Budget_Constraint? [ ; including budget restriction, this way the demand of k-firm is afected by the monetary restriction let Budget Qtt * [Price] of Firm-A ; auxiliar variable with the monetary value the C-Firm can afford to invest if Budget > Bank-Account-Firm [ ; check if the C-Firm has enough money to invest set Qtt max list 0 (Bank-Account-Firm / [Price] of Firm-A) ; rebalance the investment according to money available ] ] ask Firm-A [ set Demand Demand + Qtt ] ; updating demand at the first K-Firm if [stock] of Firm-A < Qtt [ ; check if the K-Firm has enough stock to supply ask Firm-B [ set Demand Demand + Qtt - [Stock] of Firm-A ] ; when the first did no has enough stock, also update the demand of the second k-firm ] ifelse [stock] of Firm-A >= Qtt [ ; trying to buy when there is more stock than demand ask Firm-A [ ; first situation, better one, it is possible to bought all at the better price set Stock Stock - Qtt ; updating properties of the K-Firm ... set Revenue Price * Qtt + Revenue ; ... set expenses Price * Qtt + expenses ; ... set Sales Sales + Qtt ; ... set New-Inv New-Inv + Qtt ; ... set Qtt 0 ; ... end first situation for Firm-A ] ] [ if [stock] of Firm-A > 0 [ ; second situation, there is not enough stock at the first firm, but the stock is positive ask Firm-A [ ; updating properties of the K-Firm ... set Revenue Price * Stock + Revenue ; ... set expenses Price * Stock + expenses ; ... set Sales Sales + Stock ; ... set Qtt Qtt - Stock ; ... set New-Inv New-Inv + Stock ; ... set Stock 0 ; ... end second situation for Firm-A ] ] ] if Qtt > 0 [ ; means the C-Firm did not Consumption all investment needed ifelse [stock] of Firm-B >= Qtt [ ; first situation, it is possible to bought all it is needed ask Firm-B [ ; updating properties of the K-Firm ... set Stock Stock - Qtt ; ... set Revenue Price * Qtt + Revenue ; ... set expenses Price * Qtt + expenses ; ... set Sales Sales + Qtt ; ... set New-Inv New-Inv + Qtt ; ... set Qtt 0 ; ... end first situation for Firm-B ] ] [ if [stock] of Firm-B > 0 [ ; second situation, the C-Firm will not invest all it wants to ask Firm-B [ ; updating the properties of the K-Firm ... set Revenue Price * Stock + Revenue ; ... set expenses Price * Stock + expenses ; ... set Sales Sales + Stock ; ... set Qtt Qtt - Stock ; ... set New-Inv New-Inv + Stock ; ... set Stock 0 ; ... end second situation Firm-B ] ] ] ] set k-expenses expenses set Investment New-Inv ; updating this property of the C-Firm, the investment in real-terms set Bank-Account-Firm Bank-Account-Firm - expenses ; updating the bank account the C-Firm, which has secured the necessary liquidity with a loan (see line 590) end ; FUNCTION-UPDATE-PRODUCTION to Function-UpDate-Production ; this function update the production of Firms ask K-Firms [ ; updating the production of K-Firms (eqs 15, 17 & 18) set Production Number-of-Employees * Productivity-of-labor ; updating production for the next period set Stock Stock * (1 - Depreciation-of-Capital-K) + Production ; updating stock, depreciation-of-capital is Currently set at 2%, but K firms do not use capital so this is deterioration set Bank-Account-Firm Bank-Account-Firm + Revenue ; update bank account set Delta Production - Demand ; variable used to decide new production ifelse K-Qtt-Function? [ set Desired-Employees Report-K-Update-Desired-Employees ] ; the user may force the K-Firm to produce capital goods ... [ set Desired-Employees Demand / Productivity-of-labor ] ; ...if the switcher at HUD is turned off ifelse K-UpDate-Price? [ set Price Report-K-Update-Price ] ; the user may force the capital price be fixed if ... [ set Price Wage / Productivity-of-Labor ] ; ...the switcher at HUD is turned off ] ask C-Firms [ ; updating the production of C-Firms set Capital Capital - Capital * Util-Capacity * Depreciation-of-capital-C + Investment ; update the capital avalible for production process (eq 5.5 of Assenza et al. 2015) set Production min list (Number-of-Employees * Productivity-of-labor) (Capital * Productivity-of-capital) ; leontief production function set Stock Production ; the C-Goods are perishable, so the actual stock are equal the production set Util-Capacity Production / (Capital * Productivity-of-capital) ; utilized capacity (eq 5.4 of Assenza et al. 2015) set Bank-Account-Firm Bank-Account-Firm + Revenue ; update bank account set Delta Production - Demand ; variable used to decide new production level ifelse C-Qtt-Function? [ set Desired-Employees Report-C-Update-Desired-Employees ] ; the user may force the C-Firm to produce C-goods ... [ set Desired-Employees Demand / Productivity-of-labor ] ; ...if the switcher at HUD is turned off ifelse C-UpDate-Price? [ set Price Report-C-Update-Price ] ; the user may force the consumption good be fixed ... [ set Price Wage / Productivity-of-Labor ] ; ...if the switcher at HUD is turned off ] end to-report Report-C-Update-Price ; reporting the new price for C-Firms ... remember: delta = production - demand let N-P Price ; local auxiliar variable if (delta <= 0) and (Price < Goods-Price-Level) [ set N-P Price * (1 + random-float 1 * Price-adjust-parameter) ] ; rule to increase price, approaching it to that of the competitors... the jump is stochastic (eq 5.2 and fig.2 of Assenza et al. 2015) if (delta > 0) and (Price > Goods-Price-Level) [ set N-P Price * (1 - random-float 1 * Price-adjust-parameter) ] ; rule to reduce price, approaching it to that of the competitors... the jump is stochastic (eq 5.2 and fig.2 of of Assenza et al. 2015) report N-P ; report new price end to-report Report-K-Update-Price ; reporting the new price for K-firms let N-P Price ; local auxiliar variable if (delta <= 0) and (Price < Capital-Price-Level) [ set N-P Price * (1 + random-float 1 * Price-adjust-parameter ) ] ; rule to increase price, approaching it to that of the competitors... the jump is stochastic (eq 6.5 of Assenza et al. 2015) if (delta > 0) and (Price > Capital-Price-Level) [ set N-P Price * (1 - random-float 1 * Price-adjust-parameter ) ] ; rule to reduce price, approaching it to that of the competitors... the jump is stochastic (eq 6.5 of Assenza et al. 2015) report N-P ; report new price end to-report Report-C-Update-Desired-Employees ; reporting new C-Firm needs for employees (eq 14) let N-E Number-of-Employees ; local auxiliar variable if (delta <= 0) and (Price >= Goods-Price-Level) [ set N-E ((Production - Quantity-adjust-parameter * delta) / productivity-of-labor) ] ; possible condition to increase actual number of employees and production (eq 5.1 and fig.2 of of Assenza et al. 2015) if (delta > 0) and (Price < Goods-Price-Level) [ set N-E ((Production - Quantity-adjust-parameter * delta) / productivity-of-labor) ] ; other possible condition reduce actual number of employees and production (eq 5.1 and fig.2 of of Assenza et al. 2015) report N-E ; report new desired employees end ; if (delta <= 0) and (Price < Goods-Price-Level) or the contrary the production does not change and the prices adjust to-report Report-K-Update-Desired-Employees ; reporting new need for a C-firm employees let N-E Number-of-Employees ; local auxiliar variable if (delta <= 0) and (Price >= Capital-Price-Level) [ set N-E ((Production - Quantity-adjust-parameter * delta - Stock) / productivity-of-labor) ] ; possible condition to change actual number of employees and production, but we substract the stock (eq 6.6 of of Assenza et al. 2015) if (delta > 0) and (Price < Capital-Price-Level) [ set N-E ((Production - Quantity-adjust-parameter * delta - Stock) / productivity-of-labor) ] ; other possible condition to change actual number of employees (eq 6.6 of of Assenza et al. 2015) report N-E ; report new need for employees end ; UPDATE GLOBALS to Function-UpDate-Globals ; this function update the globals set Total-Investment sum [ Investment ] of C-Firms ; update investment realized by the C-Firms, in real terms (units) set Total-Consumption sum [ Consumption ] of Households ; update the Total-Consumption, in real terms (units) set Goods-Price-Level_1 Goods-Price-Level set Capital-Price-Level_1 Capital-Price-Level set General-Price-Level_1 General-Price-Level if sum [Sales] of C-Firms != 0 [ set Goods-Price-Level sum [Revenue ] of C-Firms / sum [Sales] of C-Firms ] ; update the goods price level if sum [Sales] of K-Firms != 0 [ set Capital-Price-Level sum [Revenue ] of K-Firms / sum [Sales] of K-Firms ] ; update the capital price level if sum [Sales] of K-Firms != 0 and sum [Sales] of C-Firms != 0 [ ; update the general price level set General-Price-Level sum [Revenue ] of Firms / sum [Sales] of Firms ] set cpi_1 cpi ; store the cpi value for use with adaptative functions... it is a global variable set cpi (Goods-Price-Level - Goods-Price-Level_1) / Goods-Price-Level_1 ; cpi is the Consumption prince index, user for indexing salaries set kpi_1 kpi set kpi (Capital-Price-Level - Capital-Price-Level_1) / Capital-Price-Level_1 set gpi_1 gpi ; this approximation with logarithms is good only if the rate is close to zero set gpi (General-Price-Level - General-Price-Level_1) / General-Price-Level_1 set C-Index 100 * (1 + cpi) set K-Index 100 * (1 + kpi) set G-Index 100 * (1 + gpi) set Employment_1 Employment set Employment sum [Number-of-Employees] of Firms set Unemployed-People count Workers - sum [Number-of-Employees] of Firms set Unemployment-Rate 1 - ((sum [Number-of-Employees] of Firms) / Number-of-Workers) ; update the unemployemnt rate set Total-Inventory-investment_1 Total-Inventory-investment set Total-Inventory-investment max list 0 (sum [Inventory-investment] of K-Firms) set GDP_or (sum [ Production ] of Firms + sum [stock] of K-Firms) ; this was the original formula, adding up physical amounts set GDP_va (sum [ Production ] of C-Firms * Goods-Price-Level + sum [ Production ] of K-Firms * Capital-Price-Level - Total-Inventory-investment_1 * Capital-Price-Level_1) / (General-Price-Level) set GDP_exp (Total-Consumption * Goods-Price-Level + Total-Investment * Capital-Price-Level + Total-Inventory-investment * Capital-Price-Level) / (General-Price-Level) set GDP_inc (Employment * Wage + sum [EBIT] of Firms) / (General-Price-Level) set GDP_1 GDP if GDP_approach = "original" [ set GDP GDP_or if GDP <= 0 [set GDP 1] ] if GDP_approach = "production" [ set GDP GDP_va if GDP <= 0 [set GDP 1] ] if GDP_approach = "income" [ set GDP GDP_inc if GDP <= 0 [set GDP 1] ] if GDP_approach = "expenditure" [ set GDP GDP_exp if GDP <= 0 [set GDP 1] ] ifelse GDP_1 > GDP [ set Recession-lenght Recession-lenght + 1 ; we define here a counter for recessions, to be used later set Growth-lenght 0 set Recession-Periods Recession-Periods + 1 ] [ set Recession-lenght 0 ; if there is no recession, the counter is set to zero set Growth-lenght Growth-lenght + 1 ] if ticks > 1 [ set Growth-Rate (GDP - GDP_1) * 100 / GDP_1 ] end ; FUNCTION-CASH-FLOWS to Function-Cash-Flows ; this function set the movement of cash in the system ; C-FIRMS ask C-Firms [ ; Cash flow of C-Firms let div 0 ; auxiliar variable ifelse Dividend-Payments-of-Firms? [ ; HUD control for a slighly different calculation of profits set EBIT max list 0 (Revenue - Number-of-Employees * Wage - Depreciation-of-Capital-C * Capital * Capital-Price-Level_1 - Interest-Pay - Installment-Pay) ; Assenza et al. eq. 9.4 if EBIT > 0 [ ifelse Do_We_Have_State? [ set Profit EBIT * (1 - Corporate-Tax) ; this profit is net of taxes set State-Budget State-Budget + Corporate-Tax * EBIT ; the taxes go to the government set Bank-Account-Firm Bank-Account-Firm - Corporate-Tax * EBIT ; the firm pays the taxes ] [ set Profit EBIT ; this profit is net of taxes ] set Dividend dividend-payout-ratio-firms * Profit ; if there was profit setup dividend ifelse Bank-Account-Firm > 0 and Bank-Account-Firm >= Dividend [ set Bank-Account-Firm Bank-Account-Firm - Dividend ; the bank account of the firm is reduced by the dividend which will be payed to the capitalist set Div Dividend ; auxiliar variable for bringing the div to the capitalist later ] [ set Div Bank-Account-Firm ; the limit for divided payment is the bank account of the firm set Bank-Account-Firm 0 ] ask one-of my-out-owners [ ; calling the owner of this firm, where my-out-calls "all links you can use to travel from this node" ask other-end [ ; at other end of the link is the capitalist set Current-Income 0 ifelse Do_We_Have_State? [ set Current-Income div * (1 - Income-Tax) ; update the Current income set Bank-Account-Household Bank-Account-Household + div * (1 - Income-Tax) ; update the bank account of the household set State-Budget State-Budget + Income-tax * div ; the taxes go to the government ] [ set Current-Income div ; update the Current income set Bank-Account-Household Bank-Account-Household + div ; upd ] ] ] ] ] [ ; this is a far simpler procedure set EBIT max list 0 ( Revenue - Number-of-Employees * Wage) ; check if the firm had this kind of profit this period ifelse Do_We_Have_State? [ set Profit EBIT * (1 - Corporate-Tax) ; this profit is net of taxes set State-Budget State-Budget + Corporate-Tax * EBIT ; the taxes go to the government set Bank-Account-Firm Bank-Account-Firm - Corporate-Tax * EBIT ; the firm pays the taxes ] [ set Profit EBIT ; this profit is net of taxes and financial costs (interests paid) ] set Dividend min list (dividend-payout-ratio-firms * Profit) (max list 0 (Bank-Account-Firm)) ; the firm pays dividends with a maximum determined by the bank account set Bank-Account-Firm Bank-Account-Firm - Dividend ; reduce the bank account the dividen which will be payed to the capitalist set Div Dividend ; auxiliar variable bring the div to the capitalist later ask one-of my-out-owners [ ; calling the owner of this firm ask other-end [ ; other end is the capitalist set Current-Income 0 ifelse Do_We_Have_State? [ set Current-Income div * (1 - Income-Tax) ; update the Current income set Bank-Account-Household Bank-Account-Household + div * (1 - Income-Tax) ; update the bank account of the household set State-Budget State-Budget + Income-tax * div ; the taxes go to the government ] [ set Current-Income div ; update the Current income set Bank-Account-Household Bank-Account-Household + div ; upd ] ] ] ] ] ; K-FIRMS ask K-Firms [ ; Cash flow of C-Firms let div 0 ; auxiliar variable ifelse Dividend-Payments-of-Firms? [ ; HUD control set EBIT max list 0 ( Revenue - Number-of-Employees * Wage - Interest-Pay - Installment-Pay) ; Assenza et al. eq. 9.9 if EBIT > 0 [ ifelse Do_We_Have_State? [ set Profit EBIT * (1 - Corporate-Tax) ; this profit is net of taxes set State-Budget State-Budget + Corporate-Tax * EBIT ; the taxes go to the government set Bank-Account-Firm Bank-Account-Firm - Corporate-Tax * EBIT ; the firm pays the taxes ] [ set Profit EBIT ; this profit is net of taxes ] set Dividend dividend-payout-ratio-firms * Profit ; if there was profit setup dividend ifelse Bank-Account-Firm > 0 and Bank-Account-Firm >= Dividend [ set Bank-Account-Firm Bank-Account-Firm - Dividend ; the bank account of the firm is reduced by the dividend which will be payed to the capitalist set Div Dividend ; auxiliar variable for bringing the div to the capitalist later ] [ set Div Bank-Account-Firm set Bank-Account-Firm 0 ] ask one-of my-out-owners [ ; calling the owner of this firm, where my-out-calls "all links you can use to travel from this node". ask other-end [ ; at other end of the link is the capitalist set Current-Income 0 ifelse Do_We_Have_State? [ set Current-Income div * (1 - Income-Tax) ; update the Current income set Bank-Account-Household Bank-Account-Household + div * (1 - Income-Tax) ; update the bank account of the household set State-Budget State-Budget + Income-tax * div ; the taxes go to the government ] [ set Current-Income div ; update the Current income set Bank-Account-Household Bank-Account-Household + div ; upd ] ] ] ] ] [ ; this is a far simpler procedure set EBIT max list 0 ( Revenue - Number-of-Employees * Wage) ; check if had profit this period ifelse Do_We_Have_State? [ set Profit EBIT * (1 - Corporate-Tax) ; this profit is net of taxes set State-Budget State-Budget + Corporate-Tax * EBIT ; the taxes go to the government set Bank-Account-Firm Bank-Account-Firm - Corporate-Tax * EBIT ; the firm pays the taxes ] [ set Profit EBIT ; this profit is net of taxes ] set Dividend min list (dividend-payout-ratio-firms * Profit) (max list 0 (Bank-Account-Firm)) ; if there was profit setup dividend set Bank-Account-Firm Bank-Account-Firm - Dividend ; reduce the bank account the dividen which will be payed to the capitalist set Div Dividend ; auxiliar variable bring the div to the capitalist later ask one-of my-out-owners [ ; calling the owner of this firm ask other-end [ ; other end is the capitalist set Current-Income 0 ifelse Do_We_Have_State? [ set Current-Income div * (1 - Income-Tax) ; update the Current income set Bank-Account-Household Bank-Account-Household + div * (1 - Income-Tax) ; update the bank account of the household set State-Budget State-Budget + Income-tax * div ; the taxes go to the government ] [ set Current-Income div ; update the Current income set Bank-Account-Household Bank-Account-Household + div ; upd ] ] ] ] ] ask Banks [ ; update the data into the retail bank system... the banks also pay dividends (SubF-Distribute-Dividends) set Total-Accounts-Workers sum [Bank-Account-Household] of Workers ; explicit set Total-Accounts-Capitalists sum [Bank-Account-Household] of Capitalists ; explicit set Total-Accounts-C-Firms sum [Bank-Account-Firm] of C-firms ; explicit set Total-Accounts-K-Firms sum [Bank-Account-Firm] of K-firms ; explicit set Total-Accounts_1 Total-Accounts set Total-Accounts Total-Accounts-Workers + Total-Accounts-Capitalists + Total-Accounts-C-Firms + Total-Accounts-K-Firms + Own-Bank-Capital ; explicit if Do_We_Have_Central-Bank? [ set Reserves max list 0 (Total-Accounts * Reserve-Requirement) ] ] ; end of ask banks end ; FUNCTION-CREDIT-MARKET to Function-Credit-Market ; this function rules the credit market system SubF-Call-Matrix-Formation ; function to set the matrix used in R to calculate the life spam of firms if Do_We_Have_Banks? [ ; switch in HUD to controle the retail bank ask Firms [ ; firms update their status with the retail bank SubF-Update-Installment ; to update the installment SubF-Update-Cash-Need ; to update firm cash need SubF-Update-Equity ; to update assets value SubF-Update-Leverage ; to update the leverage, all this is used to rule interest rate practiced later ] ask K-Firms [ SubF-Ask-for-K-Credit ; checks if this K-Firm needs credit, if it will be asked in this subfunction ] ask C-Firms [ SubF-Ask-for-C-Credit ; checks if this C-firm needs credit, it will be asked in this subfunction ] let I-Received sum [Interest-Pay ] of Firms ; local variable let D-Received sum [Installment-Pay ] of Firms ; local variable ask Banks [ ; the retail bank update the balance after the new was created set Total-Loans-C-Firms sum [Current-Retail-Loan] of C-Firms ; explicit set Total-Loans-K-Firms sum [Current-Retail-Loan] of K-Firms ; explicit set Total-Loans_1 Total-Loans set Total-Loans sum [Current-Retail-Loan] of Firms ; we introduce set Interests-Received I-Received ; explicit set Installments-Received D-Received ; explicit if Do_We_Have_Central-Bank? [ SubF-Ask-for-Credit-to-Central-Bank ; the retail bank asks for credits to the Central Bank if reserves fall bellow the prescribed level ] set Own-Bank-Capital Own-Bank-Capital + Interests-Received - Central-Bank-Loans * (taylor-interest-rate + Installment-on-debt) set Central-Bank-Loans Central-Bank-Loans - Central-Bank-Loans * Installment-on-debt set Assets max list 0 (Total-Loans-C-Firms + Total-Loans-K-Firms + Own-Bank-Capital) set Liabilities max list 0 (Total-Accounts-Workers + Total-Accounts-Capitalists + Total-Accounts-C-Firms + Total-Accounts-K-Firms + Central-Bank-Loans) set Bank-Equity Assets - Liabilities SubF-Distribute-Dividends ] ] ask Firms [ set Bank-Account-Firm_1 Bank-Account-Firm ; we record the deposits of the firms at this moment for the next perdiod (see SubF-Update-Cash-Need) ] if C-Bankruptcy? [ ; switch check if the user want the broke procedure ask C-Firms [ ; this rules is for C-firm broke if (Cases-of-Bankruptcy > T-Ban) [ ; check if this firm did not pay their debts with a bank, where T-Ban (= 1, 2 o 4) are the Firm's number of periods unable to make payments before going to bankrupcy SubF-Go-Bankruptcy-Type-C ; subfunction to lead the broke process ] ] ] if K-Bankruptcy? [ ; the same as the C-firm, check above for details ask K-Firms [ if (Cases-of-Bankruptcy > T-Ban) [ SubF-Go-Bankruptcy-Type-K ] ] ] end to SubF-Call-Matrix-formation ; subfunction that manage the R routines ask C-Firms [ set Matrix-C-Firms-Bankruptcy matrix:set-and-report Matrix-C-Firms-Bankruptcy 1 Mjc Leverage ; update the second row of the matrix with information about C-Firms: every (1, Mjc) element is replaced by Leverage ifelse (Cases-of-Bankruptcy < T-Ban) ; update a position with 0 if the firm is alive, and 1 if the firm went bankrupt [ set Matrix-C-Firms-Bankruptcy matrix:set-and-report Matrix-C-Firms-Bankruptcy 0 Mjc 0 ] ; 0 is the first row, 1 the second row, etc. Mjc is the columns [ set Matrix-C-Firms-Bankruptcy matrix:set-and-report Matrix-C-Firms-Bankruptcy 0 Mjc 1 ] set Mjc Mjc + 1 if Mjc > (Time-Window - 1) [ set Mjc 0 ] ; move the matrix element to the next position, so the replacements in the matrix are sequential, and the time-window controls how many observations we'll have ] ask K-Firms [ set Matrix-K-Firms-Bankruptcy matrix:set-and-report Matrix-K-Firms-Bankruptcy 1 Mjk leverage ; update the matrix with information about the K-firms ifelse (Cases-of-Bankruptcy < T-Ban) ; update a position with 0 if the firm is alive, and 1 if the firm went bankruptcy [ set Matrix-K-Firms-Bankruptcy matrix:set-and-report Matrix-K-Firms-Bankruptcy 0 Mjk 0 ] [ set Matrix-K-Firms-Bankruptcy matrix:set-and-report Matrix-K-Firms-Bankruptcy 0 Mjk 1 ] set Mjk Mjk + 1 if Mjk > (Time-Window - 1) [ set Mjk 0 ] ; move the matrix the next position, and the time-window controls how many observations we'll have ] let A matrix:get-row Matrix-C-Firms-Bankruptcy 0 ; create an object with the first row of the matrix, which contains 0s and 1s, if barkrupt or not let B matrix:get-row Matrix-C-Firms-Bankruptcy 1 ; create an object with the second row of the matrix, which contains the Leverage for every C-Firm r:put "a" A ; call the R and put there the object A r:put "b" B ; call the R and put there the object B r:eval "c <- glm(a ~ b, family = binomial)" ; call R and ask to solve the logistic function with the inputs A and B, gls stands for "generalized linear model", and binomial implies logit link between "a" and "b" let C r:get "c$coefficients" ; call R and the coefficients into object C set Beta_1-C-Firms first C ; save the beta-1 for C-firms if Beta_1-C-Firms < (- 25) [set Beta_1-C-Firms (- 25)] ; assure value into a meaninful range, because the first period there is not enough information set Beta_2-C-Firms last C ; save the beta-2 for C-firms if (Beta_2-C-Firms > 0) = false [ set Beta_2-C-Firms 0 ] ; assure value into a meaninful range, because the first period there is not enough information if Beta_2-C-Firms > 25 [ set Beta_2-C-Firms 25 ] ; assure value into a meaninful range, because the first period there is not enough information set A matrix:get-row Matrix-K-Firms-Bankruptcy 0 ; create an object with the first row of the matrix, which contains 0s and 1s, if barkrupt or not set B matrix:get-row Matrix-K-Firms-Bankruptcy 1 ; create an object with the second row of the matrix, which contains the Leverage for every K-Firm r:put "a" A ; call the R engine and put there the object A r:put "b" B ; call the R engine and put there the object B r:eval "c <- glm(a ~ b, family = binomial)" ; call R and ask to solve the logistic function with the inputs A and B, gls stands for "generalized linear model", and binomial implies logit link between "a" and "b" set C r:get "c$coefficients" ; the same as for the C-firms, look above for details set Beta_1-K-Firms first C if Beta_1-K-Firms < (- 25) [ set Beta_1-K-Firms (- 25) ] set Beta_2-K-Firms last C if (Beta_2-K-Firms > 0) = false [ set Beta_2-K-Firms 0 ] if Beta_2-K-firms > 25 [ set Beta_2-K-Firms 25 ] end to SubF-Update-Installment ; this subfunction update the installment debt with retail banks set Interest-Pay 0 ; reset parameter set Installment-Pay 0 ; reset parameter, the repayment schedule if Current-Retail-Loan > 0 [ ; check if exist loan ifelse Bank-Account-Firm >= ((Installment-on-Debt + Interest-Retail) * Current-Retail-Loan) [ ; check if there is money enough to pay the debts set Interest-Pay Interest-Retail * Current-Retail-Loan ; update the parameter with the value will be payed set Installment-Pay Installment-on-Debt * Current-Retail-Loan ; update parameter set Bank-Account-Firm Bank-Account-Firm - Installment-Pay - Interest-pay ; update parameter set Current-Retail-Loan Current-Retail-Loan - Installment-Pay ; update parameter... and this is important, because the bank aggregates this variable and installments are included set Cases-of-Bankruptcy 0 ; as the firm pay debts this period, reset the parameter for bankruptcy ] [ set Cases-of-Bankruptcy Cases-of-Bankruptcy + 1 ; if the firm did not had money she will be closer and closer to bankruptcy ] ] end to SubF-Update-Cash-Need ; subfuntion used for updating the need for cash (loans) ifelse Investment-loan? [ ; see line 590... C-Firms already asked for a loan when desired-investment (before k-expenses) was set. So it is invetment planning the key here set Need-Cash max list 0 (Need-Cash + Number-of-Employees * Wage + (Installment-on-Debt + Interest-Retail) * Current-Retail-Loan - Bank-Account-Firm_1) ] [ ifelse Bank-Account-Firm >= 0 [ ; See eqs. 7.1 and 7.2 in Assenza et al. 2015. if C-Firm? [ set Need-Cash max list 0 (Need-Cash + Number-of-Employees * Wage + K-Expenses + (Installment-on-Debt + Interest-Retail) * Current-Retail-Loan - Bank-Account-Firm_1) ] if not C-Firm? [ set Need-Cash max list 0 (Need-Cash + Number-of-Employees * Wage + (Installment-on-Debt + Interest-Retail) * Current-Retail-Loan - Bank-Account-Firm_1) ] ] [ set Need-Cash max list 0 (abs Bank-Account-Firm + Initial-Liquidity-of-Firms) ] ] end to SubF-Update-Equity ; subfunction to update the assets, which differ from C-Firm to K-Firm type ifelse C-Firm? [ set Assets max list 0 (Stock * Price + Bank-Account-Firm + Capital * Capital-Price-Level) ] [ set Assets max list 0 (Stock * Price + Bank-Account-Firm ) ] ifelse C-Firm? [ set Liabilities max list 0 (Current-Retail-Loan) ] [ set Liabilities max list 0 (Current-Retail-Loan) ] ifelse C-Firm? [ set Equity Assets - Liabilities ] [ set Equity Assets - Liabilities ] end to SubF-Update-Leverage ; updating the leverage of a firm if Need-Cash > 0 [ set Leverage (Current-Retail-Loan + Need-Cash) / (Assets + Current-Retail-Loan + Need-Cash) ] if (Current-Retail-Loan = 0) [ set Leverage 0 ] end to SubF-Ask-for-K-Credit ; this subfunction is called when there is need for a loan ifelse Macroprudential-Policy? [ if Risk-Calculations-Procedure = "Original" [ ; how much money the bank may offer as a loan, see eq. 27 of Elder Silva's document set New-Credit-Available max list 0 (Bank-loss-parameter * (sum [Own-Bank-Capital] of Banks * B-Lev * ( Risk-spread ) - sum [Current-Retail-Loan] of Firms)) ; no constraints if (Need-Cash > 0) and (Available-Credit-Basel > Need-Cash) and (Need-Cash < New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Need-Cash ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Need-Cash ; updating the bank account with the money received set Need-Cash 0 set Available-Credit-Basel Available-Credit-Basel - Need-Cash ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-K ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the central bank has a constraint if (Need-Cash > 0) and (Available-Credit-Basel <= Need-Cash) and (Need-Cash < New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Available-Credit-Basel ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Available-Credit-Basel ; updating the bank account with the money received set Need-Cash Need-Cash - Available-Credit-Basel set Available-Credit-Basel 0 ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-K ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the retail bank has a constraint if (Need-Cash > 0) and (Available-Credit-Basel > Need-Cash) and (Need-Cash >= New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + New-Credit-Available ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + New-Credit-Available ; updating the bank account with the money received set Need-Cash Need-Cash - New-Credit-Available set Available-Credit-Basel Available-Credit-Basel - New-Credit-Available ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-K ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the retail bank and the central bank have a constraint, but the later's is tighter if (Need-Cash > 0) and (Available-Credit-Basel <= Need-Cash) and (Need-Cash >= New-Credit-Available) and (Available-Credit-Basel < New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Available-Credit-Basel ; updating the loans parameter set Bank-Account-Firm Bank-Account-Firm + Available-Credit-Basel ; updating the bank account with the money received set Need-Cash Need-Cash - Available-Credit-Basel set Available-Credit-Basel 0 ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-K ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the retail bank and the central bank have a constraint, but the former's is tighter if (Need-Cash > 0) and (Available-Credit-Basel <= Need-Cash) and (Need-Cash >= New-Credit-Available) and (Available-Credit-Basel >= New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + New-Credit-Available ; updating the loans parameter set Bank-Account-Firm Bank-Account-Firm + New-Credit-Available ; updating the bank account with the money received set Need-Cash Need-Cash - New-Credit-Available set Available-Credit-Basel Available-Credit-Basel - New-Credit-Available ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-K ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ] if Risk-Calculations-Procedure = "Assenza" [ ; how much money the bank may offer as a loan to a particular firm (not doable at an aggregate level), see footnote 32 in Assenza, Gatti, Grazzini et al. 2015 set Max-Credit-to-Firm max list 0 (Bank-loss-parameter * sum [Own-Bank-Capital] of Banks / Probability-of-Bankruptcy) ; how much money the bank may offer as a loan, see eq. 27 of Elder Silva's document ; let Available-Credit-Assenza max list 0 (Bank-loss-parameter * (sum [Own-Bank-Capital] of Banks * B-Lev * ( Risk-spread ) - sum [Current-Retail-Loan] of Firms)) ; how much money the bank may offer as a loan to a particular firm (not doable at an aggregate level), see eq. 8.11 in Assenza, Gatti, Grazzini et al. 2015 set New-Credit-Available max list 0 (Max-Credit-to-Firm - Current-Retail-Loan) ; no constraints if (Need-Cash > 0) and (Available-Credit-Basel > Need-Cash) and (Need-Cash < New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Need-Cash ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Need-Cash ; updating the bank account with the money received set Need-Cash 0 set Available-Credit-Basel Available-Credit-Basel - Need-Cash ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-K ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the central bank has a constraint if (Need-Cash > 0) and (Available-Credit-Basel <= Need-Cash) and (Need-Cash < New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Available-Credit-Basel ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Available-Credit-Basel ; updating the bank account with the money received set Need-Cash Need-Cash - Available-Credit-Basel set Available-Credit-Basel 0 ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-K ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the retail bank has a constraint if (Need-Cash > 0) and (Available-Credit-Basel > Need-Cash) and (Need-Cash >= New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + New-Credit-Available ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + New-Credit-Available ; updating the bank account with the money received set Need-Cash Need-Cash - New-Credit-Available set Available-Credit-Basel Available-Credit-Basel - New-Credit-Available ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-K ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the retail bank and the central bank have a constraint, but the later's is tighter if (Need-Cash > 0) and (Available-Credit-Basel <= Need-Cash) and (Need-Cash >= New-Credit-Available) and (Available-Credit-Basel < New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Available-Credit-Basel ; updating the loans parameter set Bank-Account-Firm Bank-Account-Firm + Available-Credit-Basel ; updating the bank account with the money received set Need-Cash Need-Cash - Available-Credit-Basel set Available-Credit-Basel 0 ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-K ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the retail bank and the central bank have a constraint, but the former's is tighter if (Need-Cash > 0) and (Available-Credit-Basel <= Need-Cash) and (Need-Cash >= New-Credit-Available) and (Available-Credit-Basel >= New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + New-Credit-Available ; updating the loans parameter set Bank-Account-Firm Bank-Account-Firm + New-Credit-Available ; updating the bank account with the money received set Need-Cash Need-Cash - New-Credit-Available set Available-Credit-Basel Available-Credit-Basel - New-Credit-Available ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-K ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ] if Risk-Calculations-Procedure = "Teglio" [ ; the formula for Probability-of-Bankruptcy comes from Teglio et al. (2012), eq. 1 set New-Credit-Available Need-Cash if (Need-Cash > 0) and (Available-Credit-Basel > Need-Cash) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Need-Cash ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Need-Cash ; updating the bank account with the money received set Need-Cash 0 set Available-Credit-Basel Available-Credit-Basel - Need-Cash ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-K ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] if (Need-Cash > 0) and (Available-Credit-Basel <= Need-Cash) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Available-Credit-Basel ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Available-Credit-Basel ; updating the bank account with the money received set Need-Cash Available-Credit-Basel - Need-Cash set Available-Credit-Basel 0 ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-K ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ] ] [ if Risk-Calculations-Procedure = "Original" [ ; how much money the bank may offer as a loan, see eq. 27 of Elder Silva's document set New-Credit-Available max list 0 (Bank-loss-parameter * (sum [Own-Bank-Capital] of Banks * B-Lev * ( Risk-spread ) - sum [Current-Retail-Loan] of Firms)) ; no constraints if (Need-Cash > 0) and (Need-Cash < New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Need-Cash ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Need-Cash ; updating the bank account with the money received set Need-Cash 0 set Available-Credit-Basel Available-Credit-Basel - Need-Cash ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-K ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the retail bank has a constraint if (Need-Cash > 0) and (Need-Cash >= New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + New-Credit-Available ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + New-Credit-Available ; updating the bank account with the money received set Need-Cash Need-Cash - New-Credit-Available set Available-Credit-Basel Available-Credit-Basel - New-Credit-Available ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-K ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ] if Risk-Calculations-Procedure = "Assenza" [ ; how much money the bank may offer as a loan to a particular firm (not doable at an aggregate level), see footnote 32 in Assenza, Gatti, Grazzini et al. 2015 set Max-Credit-to-Firm max list 0 (Bank-loss-parameter * sum [Own-Bank-Capital] of Banks / Probability-of-Bankruptcy) ; how much money the bank may offer as a loan, see eq. 27 of Elder Silva's document ; let Available-Credit-Assenza max list 0 (Bank-loss-parameter * (sum [Own-Bank-Capital] of Banks * B-Lev * ( Risk-spread ) - sum [Current-Retail-Loan] of Firms)) ; how much money the bank may offer as a loan to a particular firm (not doable at an aggregate level), see eq. 8.11 in Assenza, Gatti, Grazzini et al. 2015 set New-Credit-Available max list 0 (Max-Credit-to-Firm - Current-Retail-Loan) ; no constraints if (Need-Cash > 0) and (Need-Cash < New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Need-Cash ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Need-Cash ; updating the bank account with the money received set Need-Cash 0 set Available-Credit-Basel Available-Credit-Basel - Need-Cash ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-K ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the retail bank has a constraint if (Need-Cash > 0) and (Need-Cash >= New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + New-Credit-Available ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + New-Credit-Available ; updating the bank account with the money received set Need-Cash Need-Cash - New-Credit-Available set Available-Credit-Basel Available-Credit-Basel - New-Credit-Available ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-K ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ] if Risk-Calculations-Procedure = "Teglio" [ ; the formula for Probability-of-Bankruptcy comes from Teglio et al. (2012), eq. 1 set New-Credit-Available Need-Cash if (Need-Cash > 0) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Need-Cash ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Need-Cash ; updating the bank account with the money received set Need-Cash 0 set Available-Credit-Basel Available-Credit-Basel - Need-Cash ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-K ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ] ] end to SubF-Ask-for-C-Credit ; this subfunction is called when there is need for a loan, C-Firm type ifelse Macroprudential-Policy? [ if Risk-Calculations-Procedure = "Original" [ ; how much money the bank may offer as a loan, see eq. 27 of Elder Silva's document set New-Credit-Available max list 0 (Bank-loss-parameter * (sum [Own-Bank-Capital] of Banks * B-Lev * ( Risk-spread ) - sum [Current-Retail-Loan] of Firms)) ; no constraints if (Need-Cash > 0) and (Available-Credit-Basel > Need-Cash) and (Need-Cash < New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Need-Cash ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Need-Cash ; updating the bank account with the money received set Need-Cash 0 set Available-Credit-Basel Available-Credit-Basel - Need-Cash ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-C ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the central bank has a constraint if (Need-Cash > 0) and (Available-Credit-Basel <= Need-Cash) and (Need-Cash < New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Available-Credit-Basel ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Available-Credit-Basel ; updating the bank account with the money received set Need-Cash Need-Cash - Available-Credit-Basel set Available-Credit-Basel 0 ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-C ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the retail bank has a constraint if (Need-Cash > 0) and (Available-Credit-Basel > Need-Cash) and (Need-Cash >= New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + New-Credit-Available ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + New-Credit-Available ; updating the bank account with the money received set Need-Cash Need-Cash - New-Credit-Available set Available-Credit-Basel Available-Credit-Basel - New-Credit-Available ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-C ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the retail bank and the central bank have a constraint, but the later's is tighter if (Need-Cash > 0) and (Available-Credit-Basel <= Need-Cash) and (Need-Cash >= New-Credit-Available) and (Available-Credit-Basel < New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Available-Credit-Basel ; updating the loans parameter set Bank-Account-Firm Bank-Account-Firm + Available-Credit-Basel ; updating the bank account with the money received set Need-Cash Need-Cash - Available-Credit-Basel set Available-Credit-Basel 0 ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-C ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the retail bank and the central bank have a constraint, but the former's is tighter if (Need-Cash > 0) and (Available-Credit-Basel <= Need-Cash) and (Need-Cash >= New-Credit-Available) and (Available-Credit-Basel >= New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + New-Credit-Available ; updating the loans parameter set Bank-Account-Firm Bank-Account-Firm + New-Credit-Available ; updating the bank account with the money received set Need-Cash Need-Cash - New-Credit-Available set Available-Credit-Basel Available-Credit-Basel - New-Credit-Available ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-C ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ] if Risk-Calculations-Procedure = "Assenza" [ ; how much money the bank may offer as a loan to a particular firm (not doable at an aggregate level), see footnote 32 in Assenza, Gatti, Grazzini et al. 2015 set Max-Credit-to-Firm max list 0 (Bank-loss-parameter * sum [Own-Bank-Capital] of Banks / Probability-of-Bankruptcy) ; how much money the bank may offer as a loan, see eq. 27 of Elder Silva's document ; let Available-Credit-Assenza max list 0 (Bank-loss-parameter * (sum [Own-Bank-Capital] of Banks * B-Lev * ( Risk-spread ) - sum [Current-Retail-Loan] of Firms)) ; how much money the bank may offer as a loan to a particular firm (not doable at an aggregate level), see eq. 8.11 in Assenza, Gatti, Grazzini et al. 2015 set New-Credit-Available max list 0 (Max-Credit-to-Firm - Current-Retail-Loan) ; no constraints if (Need-Cash > 0) and (Available-Credit-Basel > Need-Cash) and (Need-Cash < New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Need-Cash ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Need-Cash ; updating the bank account with the money received set Need-Cash 0 set Available-Credit-Basel Available-Credit-Basel - Need-Cash ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-C ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the central bank has a constraint if (Need-Cash > 0) and (Available-Credit-Basel <= Need-Cash) and (Need-Cash < New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Available-Credit-Basel ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Available-Credit-Basel ; updating the bank account with the money received set Need-Cash Need-Cash - Available-Credit-Basel set Available-Credit-Basel 0 ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-C ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the retail bank has a constraint if (Need-Cash > 0) and (Available-Credit-Basel > Need-Cash) and (Need-Cash >= New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + New-Credit-Available ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + New-Credit-Available ; updating the bank account with the money received set Need-Cash Need-Cash - New-Credit-Available set Available-Credit-Basel Available-Credit-Basel - New-Credit-Available ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-C ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the retail bank and the central bank have a constraint, but the later's is tighter if (Need-Cash > 0) and (Available-Credit-Basel <= Need-Cash) and (Need-Cash >= New-Credit-Available) and (Available-Credit-Basel < New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Available-Credit-Basel ; updating the loans parameter set Bank-Account-Firm Bank-Account-Firm + Available-Credit-Basel ; updating the bank account with the money received set Need-Cash Need-Cash - Available-Credit-Basel set Available-Credit-Basel 0 ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-C ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the retail bank and the central bank have a constraint, but the former's is tighter if (Need-Cash > 0) and (Available-Credit-Basel <= Need-Cash) and (Need-Cash >= New-Credit-Available) and (Available-Credit-Basel >= New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + New-Credit-Available ; updating the loans parameter set Bank-Account-Firm Bank-Account-Firm + New-Credit-Available ; updating the bank account with the money received set Need-Cash Need-Cash - New-Credit-Available set Available-Credit-Basel Available-Credit-Basel - New-Credit-Available ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-C ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ] if Risk-Calculations-Procedure = "Teglio" [ ; the formula for Probability-of-Bankruptcy comes from Teglio et al. (2012), eq. 1 set New-Credit-Available Need-Cash if (Need-Cash > 0) and (Available-Credit-Basel > Need-Cash) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Need-Cash ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Need-Cash ; updating the bank account with the money received set Need-Cash 0 set Available-Credit-Basel Available-Credit-Basel - Need-Cash ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-C ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] if (Need-Cash > 0) and (Available-Credit-Basel <= Need-Cash) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Available-Credit-Basel ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Available-Credit-Basel ; updating the bank account with the money received set Need-Cash Available-Credit-Basel - Need-Cash set Available-Credit-Basel 0 ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-C ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ] ] [ if Risk-Calculations-Procedure = "Original" [ ; how much money the bank may offer as a loan, see eq. 27 of Elder Silva's document set New-Credit-Available max list 0 (Bank-loss-parameter * (sum [Own-Bank-Capital] of Banks * B-Lev * ( Risk-spread ) - sum [Current-Retail-Loan] of Firms)) ; no constraints if (Need-Cash > 0) and (Need-Cash < New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Need-Cash ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Need-Cash ; updating the bank account with the money received set Need-Cash 0 set Available-Credit-Basel Available-Credit-Basel - Need-Cash ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-C ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the retail bank has a constraint if (Need-Cash > 0) and (Need-Cash >= New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + New-Credit-Available ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + New-Credit-Available ; updating the bank account with the money received set Need-Cash Need-Cash - New-Credit-Available set Available-Credit-Basel Available-Credit-Basel - New-Credit-Available ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-C ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ] if Risk-Calculations-Procedure = "Assenza" [ ; how much money the bank may offer as a loan to a particular firm (not doable at an aggregate level), see footnote 32 in Assenza, Gatti, Grazzini et al. 2015 set Max-Credit-to-Firm max list 0 (Bank-loss-parameter * sum [Own-Bank-Capital] of Banks / Probability-of-Bankruptcy) ; how much money the bank may offer as a loan, see eq. 27 of Elder Silva's document ; let Available-Credit-Assenza max list 0 (Bank-loss-parameter * (sum [Own-Bank-Capital] of Banks * B-Lev * ( Risk-spread ) - sum [Current-Retail-Loan] of Firms)) ; how much money the bank may offer as a loan to a particular firm (not doable at an aggregate level), see eq. 8.11 in Assenza, Gatti, Grazzini et al. 2015 set New-Credit-Available max list 0 (Max-Credit-to-Firm - Current-Retail-Loan) ; no constraints if (Need-Cash > 0) and (Need-Cash < New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Need-Cash ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Need-Cash ; updating the bank account with the money received set Need-Cash 0 set Available-Credit-Basel Available-Credit-Basel - Need-Cash ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-C ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ; the retail bank has a constraint if (Need-Cash > 0) and (Need-Cash >= New-Credit-Available) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + New-Credit-Available ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + New-Credit-Available ; updating the bank account with the money received set Need-Cash Need-Cash - New-Credit-Available set Available-Credit-Basel Available-Credit-Basel - New-Credit-Available ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-C ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ] if Risk-Calculations-Procedure = "Teglio" [ ; the formula for Probability-of-Bankruptcy comes from Teglio et al. (2012), eq. 1 set New-Credit-Available Need-Cash if (Need-Cash > 0) and (Cases-of-Bankruptcy < T-Ban) [ ; check if the need of a firm is lower then the available credit set Current-Retail-Loan Current-Retail-Loan + Need-Cash ; the reduces the available-credit-assenza with each new loan because Current-Retail-Loan increases set Bank-Account-Firm Bank-Account-Firm + Need-Cash ; updating the bank account with the money received set Need-Cash 0 set Available-Credit-Basel Available-Credit-Basel - Need-Cash ifelse Retail-Interest? and ticks > 100 [ SubF-Update-Interest-Retail-C ] [ set Interest-Retail Taylor-Interest-Rate ] ; call a subfunction to update the interest rate of this firm ] ] ] end to SubF-Update-Interest-Retail-C ; update the interest rate of a C-firm if Risk-Calculations-Procedure = "Original" [ ; the formula for Probability-of-Bankruptcy comes from Assenza et al. (2015), p. 15 set Probability-of-Bankruptcy (1 / (1 + e ^ ( (- Beta_1-C-Firms) - (Beta_2-C-Firms * leverage)))) ; local variable, save the prob of this firm die set T-expected (1 / Probability-of-Bankruptcy) ; calculate the life expectation of this firm (eq 24) let Numerator (1 + (Taylor-Interest-Rate / Installment-on-Debt)) ; local auxiliar variable, first part to calculate the new interest rate let Denominator ((1 - (1 - Installment-on-Debt) ^ (T-expected + 1)) / Installment-on-Debt) ; // // second part of the new interest rate let new-int Bank-gross-mark-up * ((numerator / denominator) - Installment-on-Debt) ; calculating the new interest rate (eq 26 or 8.8 in Assenza et al. 2015) ifelse Current-Retail-Loan > 0 [ set Interest-Retail max list 0 ((Interest-Retail * (Current-Retail-Loan - Need-Cash) + new-int * Need-Cash) / Current-Retail-Loan) ; update the interest rate as mean of the new and the later interest rate ] [ set Interest-Retail Taylor-interest-rate ] ] if Risk-Calculations-Procedure = "Assenza" [ ; the formula for Probability-of-Bankruptcy comes from Assenza et al. (2015), p. 15 set Probability-of-Bankruptcy (1 / (1 + e ^ ( (- Beta_1-C-Firms) - (Beta_2-C-Firms * leverage)))) ; local variable, save the prob of this firm die set T-expected (1 / Probability-of-Bankruptcy) ; calculate the life expectation of this firm (eq 24) let Numerator (1 + (Taylor-Interest-Rate / Installment-on-Debt)) ; local auxiliar variable, first part to calculate the new interest rate let Denominator ((1 - (1 - Installment-on-Debt) ^ (T-expected + 1)) / Installment-on-Debt) ; // // second part of the new interest rate let new-int Bank-gross-mark-up * ((numerator / denominator) - Installment-on-Debt) ; calculating the new interest rate (eq 26 or 8.8 in Assenza et al. 2015) ifelse Current-Retail-Loan > 0 [ set Interest-Retail max list 0 ((Interest-Retail * (Current-Retail-Loan - Need-Cash) + new-int * Need-Cash) / Current-Retail-Loan) ; update the interest rate as mean of the new and the later interest rate ] [ set Interest-Retail Taylor-interest-rate ] ] if Risk-Calculations-Procedure = "Teglio" [ ; the formula for Probability-of-Bankruptcy comes from Teglio et al. (2012), eq. 1 ; the original formula is Probability-of-Bankruptcy = 1 - (1 / e ^ ((current-retail-loan + need-cash)/ equity)) but the exponent is related to leverage, and it is more consistent to use this ; if we do Probability-of-Bankruptcy = 1 - (1 / e ^ (leverage), when leverage = 1 we have Probability-of-Bankruptcy 0.63, too low... so we modify the formula assuring leverage = 1 implies Probability = 1 ifelse ticks > 50 [ set Probability-of-Bankruptcy 1 - (1 / e ^ (0.0001 + 5 * leverage)) ] [ set Probability-of-Bankruptcy 0.0001 ] set T-expected (1 / Probability-of-Bankruptcy) ; calculate the life expectation of this firm (eq 24) ; the formula for Probability-of-Bankruptcy comes from Teglio et al. (2012), eq. 2 set Interest-Retail max list 0 (taylor-interest-rate + risk-spread * leverage * Probability-of-Bankruptcy) ; the leverage is a risk spread parameter here, approaching 1 as current retail loans get larger ] end to SubF-Update-Interest-Retail-K ; update the interest rate of a K-firm if Risk-Calculations-Procedure = "Original" [ ; the formula for Probability-of-Bankruptcy comes from Assenza et al. (2015), p. 15 set Probability-of-Bankruptcy (1 / (1 + e ^ ( (- Beta_1-K-Firms) - (Beta_2-K-Firms * leverage)))) ; the same as the C-firm, check above for details set T-expected (1 / Probability-of-Bankruptcy) ; calculate the life expectation of this firm (eq 24) let Numerator (1 + (Taylor-Interest-Rate / Installment-on-Debt)) let Denominator ((1 - (1 - Installment-on-Debt) ^ (T-expected + 1)) / Installment-on-Debt) let new-int Bank-gross-mark-up * ((numerator / denominator) - Installment-on-Debt) ; calculating the new interest rate (eq 26 or 8.9 in Assenza et al. 2015) ifelse Current-Retail-Loan > 0 [ set Interest-Retail max list 0 ((Interest-Retail * (Current-Retail-Loan - Need-Cash) + new-int * Need-Cash) / Current-Retail-Loan) ; update the interest rate as mean of the new and the later interest rate ] [ set Interest-Retail Taylor-interest-rate ] ] if Risk-Calculations-Procedure = "Assenza" [ ; the formula for Probability-of-Bankruptcy comes from Assenza et al. (2015), p. 15 set Probability-of-Bankruptcy (1 / (1 + e ^ ( (- Beta_1-K-Firms) - (Beta_2-K-Firms * leverage)))) ; the same as the C-firm, check above for details set T-expected (1 / Probability-of-Bankruptcy) ; calculate the life expectation of this firm (eq 24) let Numerator (1 + (Taylor-Interest-Rate / Installment-on-Debt)) let Denominator ((1 - (1 - Installment-on-Debt) ^ (T-expected + 1)) / Installment-on-Debt) let new-int Bank-gross-mark-up * ((numerator / denominator) - Installment-on-Debt) ; calculating the new interest rate (eq 26 or 8.9 in Assenza et al. 2015) ifelse Current-Retail-Loan > 0 [ set Interest-Retail max list 0 ((Interest-Retail * (Current-Retail-Loan - Need-Cash) + new-int * Need-Cash) / Current-Retail-Loan) ; update the interest rate as mean of the new and the later interest rate ] [ set Interest-Retail Taylor-interest-rate ] ] if Risk-Calculations-Procedure = "Teglio" [ ; the formula for Probability-of-Bankruptcy comes from Teglio et al. (2012), eq. 1 ; the original formula is Probability-of-Bankruptcy = 1 - (1 / e ^ ((current-retail-loan + need-cash)/ equity)) but the exponent is related to leverage, and it is more consistent to use this ; if we do Probability-of-Bankruptcy = 1 - (1 / e ^ (leverage), when leverage = 1 we have Probability-of-Bankruptcy 0.63, too low... so we modify the formula assuring leverage = 1 implies Probability = 1 ifelse ticks > 50 [ set Probability-of-Bankruptcy 1 - (1 / e ^ (0.0001 + 5 * leverage)) ] [ set Probability-of-Bankruptcy 0.0001 ] set T-expected (1 / Probability-of-Bankruptcy) ; calculate the life expectation of this firm (eq 24) ; the formula for Probability-of-Bankruptcy comes from Teglio et al. (2012), eq. 2 set Interest-Retail max list 0 (taylor-interest-rate + risk-spread * leverage * Probability-of-Bankruptcy) ; the leverage is a risk spread parameter here, approaching 1 as current retail loans get larger ] end to SubF-Go-Bankruptcy-Type-C ; this subfunction rules the process for the C-firm bankruptcy set C-Broken C-Broken + 1 ; increase the global parameter which count the broke status set Cases-of-Bankruptcy 0 ; reset the parameter that registers the cases of bankruptcy let Loss Current-Retail-Loan ; local variable ask Banks [ set Own-Bank-Capital Own-Bank-Capital - Loss ; the bank assumes the loss ] ifelse Capitalist-Bankruptcy? and random-float 1 > (1 / (1 + 0.01 * ticks)) [ let newfunding Initial-Liquidity-of-Firms ask one-of my-out-owners [ ; find out who is the owner of this firm ask other-end [ ; the owner ifelse Bank-Account-Household >= newfunding [ set Bank-Account-Household Bank-Account-Household - newfunding ; update the bank account of the capitalist, retrieving the money invested to recreate the firm (bakrupcy != die) ] [ set Bank-Account-Household 0 let C-Firms-damnation% 1 / (1 + Recession-lenght * 0.25) ; local variable, a probability depending on the recession lenght if random-float 1 > C-Firms-damnation% [ ; the longer the recession, the more firms will die set color yellow set Bankrupt? true SubF-Firm-Capitalist-Damnation ; the capitalist and the firm start a painful process of extintion ] ] ] ] ] [ ; in this alternative procedure the capitalist does not go bankrupt and become a worker and the firm does not die let newfunding Initial-Liquidity-of-Firms ask one-of my-out-owners [ ; use the capitalist to rebuild the firm ask other-end [ ; find out who is the owner of this firm set Bank-Account-Household max list 0 (Bank-Account-Household - newfunding) ; update the bank account of the capitalist, retrieving the money invested to recreate the firm (bakrupcy != die) ] ] set Current-Retail-Loan 0 ; reset the loan of the firm after the bankruptcy... this is a loss for the retail bank if Capital-Destruction? [ set Capital Initial-Capital ] ; reset the capital of the c-firm set Bank-Account-Firm newfunding ; iniciate the firm with the money from the capitalist whom owns the firm ] end to SubF-Go-Bankruptcy-Type-K ; this subfunction rules the process for how a K-Firm broke set K-Broken K-Broken + 1 ; increase the global parameter which count of broke status set Cases-of-Bankruptcy 0 ; reset this parameter, a probability calculated by retail banks let Loss Current-Retail-Loan ; local variable ask Banks [ set Own-Bank-Capital Own-Bank-Capital - Loss ; the bank assumes the loss ] ifelse Capitalist-Bankruptcy? and random-float 1 > (1 / (1 + 0.01 * ticks)) [ let newfunding Initial-Liquidity-of-Firms ask one-of my-out-owners [ ; find out who is the owner of this firm ask other-end [ ; the owner ifelse Bank-Account-Household >= newfunding [ set Bank-Account-Household Bank-Account-Household - newfunding ; update the bank account of the capitalist, retrieving the money invested to recreate the firm (bakrupcy != die) ] [ set Bank-Account-Household 0 let K-Firms-damnation% 1 / (1 + Recession-lenght * 0.25) ; local variable, a probability depending on the recession lenght if random-float 1 > K-Firms-damnation% [ ; the longer the recession, the more firms will die set color yellow set Bankrupt? true SubF-Firm-Capitalist-Damnation ; the capitalist and the firm start a painful process of extintion ] ] ] ] ] [ ; in this alternative procedure the capitalist do not go bankrupt and become a worker let newfunding Initial-Liquidity-of-Firms ask one-of my-out-owners [ ; use the capitalist to rebuild the firm ask other-end [ ; find out who is the owner of this firm set Bank-Account-Household max list 0 (Bank-Account-Household - newfunding) ; update the bank account of the capitalist, retrieving the money invested to recreate the firm (bakrupcy != die) ] ] set Current-Retail-Loan 0 ; reset the loan of the firm after the bankruptcy set Bank-Account-Firm newfunding ; iniciate the firm with the money from the capitalist whom owns the firm ] end to SubF-Firm-Capitalist-Damnation ask Capitalists with [Bankrupt? = true] [ set Current-Income 0 ; update the current income of the capitalist/owner let moneyfornewlife Initial-households-personal-assets ; the demoted capitalists get some aid for starting a new life as worker... set Bank-Account-Household moneyfornewlife ; update the bank account of the capitalist/owner if Do_We_Have_State? [ set State-Budget State-Budget - moneyfornewlife ; sorry Libertarians, but the State comes to help... set Helped-Households Helped-Households + 1 ] set Worker? true ; the capitalist becomes a worker... life is unfair set Bankrupt? false set Employed? false ; this worker is unemployed at the start set Demoted Demoted + 1 set color turquoise ; now you are a worker and look like one... almost set size 0.50 set Human-Wealth 1 set Desired-Consumption 0 set Consumption 0 set Price-List [ ] ask in-owner-neighbors [ die ] ; and the former firm he/she owned finally vanishes ] ; end procedure previous to bankruptcy set C-Firms Firms with [ C-Firm? ] ; updating the group with all C-Firms set K-Firms Firms with [ not C-Firm? ] ; updating the group with all K-firms set Capitalists Households with [ not Worker? ] ; updating the group with all Capitalist set Workers Households with [ Worker? ] ; updating the group with all workers end to SubF-Ask-for-Credit-to-Central-Bank ; this subfunction is called when the retail bank needs for a loan due to liquidity problems if Reserves / Total-Accounts_1 < Reserve-Requirement [ let Needed-Liquidity max list 0 (Total-Accounts_1 * Reserve-Requirement - Reserves) ; this is an innecesary precaution, given the condition but... set Central-Bank-Loans Central-Bank-Loans + Needed-Liquidity ] end to SubF-Distribute-Dividends ; function for the calculation and distribution of dividends by banks ifelse Do_We_Have_Central-Bank? [ set EBIT max list 0 (Interests-Received - Central-Bank-Loans * taylor-interest-rate) ; the profit income minus expenditures ] [ set EBIT max list 0 (Interests-Received) ; the profit income minus expenditures ] let div 0 ifelse Dividend-Payments-of-Banks? [ ; HUD control for activating dividends payments by means of a sophisticated procedure... if EBIT >= 0 [ ; if the profit is positive, the firm pay dividends and taxes ifelse Do_We_Have_State? [ set Profit EBIT * (1 - Corporate-Tax) ; this profit is net of taxes set State-Budget State-Budget + Corporate-Tax * EBIT ; the taxes go to the government set Own-Bank-Capital Own-Bank-Capital - Corporate-Tax * EBIT ; the bank pays the taxes ] [ set Profit EBIT ; this profit is net of taxes ] set Dividend dividend-payout-ratio-banks * Profit ; if there was a positive profit, setup dividend, the income of capitalists let Number-of-Capitalists count C-Firms + count K-Firms ; total number of Capitalists ifelse Own-Bank-Capital >= Dividend [ set Own-Bank-Capital Own-Bank-Capital - Dividend ; reduce the bank account by the dividend which will be paid to the capitalists set Div Dividend / Number-of-Capitalists ; calculate dividend as part of the total profit divided by capitalists (everyone have a share) ] [ set Div Own-Bank-Capital / Number-of-Capitalists ; calculate dividend as part of the total profit divided by capitalists (everyone have a share) set Own-Bank-Capital 0 ; there is no devidend payments if the capital of the bank falls below zero ] ask Capitalists [ ; call each of one of the capitalist ifelse Do_We_Have_State? [ set Current-Income Current-Income + div * (1 - Income-Tax) ; increase the income of the capitalist with this new dividend set Bank-Account-Household Bank-Account-Household + div * (1 - Income-Tax) ; update the bank account of the capitalist with the dividend net of taxes set State-Budget State-Budget + Income-Tax * div ; the State gets the income taxes ] [ set Current-Income Current-Income + div ; increase the income of the capitalist with this dividend set Bank-Account-Household Bank-Account-Household + div ; update the bank account of the capitalist ] ] ] ; if the profit is negative (losses) there is nothing to distribute... but we may have different problems, like own bank capital falling bellow the minimum level if Own-Bank-Capital >= 0 and Own-Bank-Capital < Initial-capital-of-the-bank [ ; if the losses are larger than the Own-Bank-Capital ifelse Do_We_Have_Central-Bank? [ let Need-Capital max list 0 (Initial-capital-of-the-bank - Own-Bank-Capital) set Central-Bank-loans Central-Bank-loans + Need-Capital ; the Own-Bank-Capital needs a suplement set Own-Bank-Capital Own-Bank-Capital + Need-Capital ] [ SubF-Bail-in-Banks ] ] if Own-Bank-Capital < 0 [ ; the bank has liquidity for compensating the loss ifelse Do_We_Have_Central-Bank? [ let Need-Capital max list 0 (abs Own-Bank-Capital) set Central-Bank-loans Central-Bank-loans + Need-Capital ; the Own-Bank-Capital needs a suplement set Own-Bank-Capital Own-Bank-Capital + Need-Capital SubF-Bail-in-Banks ] [ if Do_We_Have_State? and State-Budget >= abs Own-Bank-Capital [ set State-Budget State-Budget - abs Own-Bank-Capital set Own-Bank-Capital 0 ] set Own-Bank-Capital 0 SubF-Bail-in-Banks ] ] ] [ ; alternative (simpler) procedure, without any complication related to bankruptcy processes if EBIT >= 0 [ let Number-of-Capitalists count C-Firms + count K-Firms ifelse Do_We_Have_State? [ set Profit EBIT * (1 - Corporate-Tax) ; this profit is net of taxes set State-Budget State-Budget + Corporate-Tax * EBIT ; the taxes go to the government ] [ set Profit EBIT ; this profit is net of taxes ] set Dividend dividend-payout-ratio-banks * Profit ifelse Own-Bank-Capital >= Dividend [ set Div Profit / Number-of-Capitalists ; calculate dividend as part of the total profit divided by capitalists set Own-Bank-Capital Own-Bank-Capital - Dividend ] [ set Div Own-Bank-Capital / Number-of-Capitalists set Own-Bank-Capital 0 ] ask Capitalists [ ; call each of one of the capitalist ifelse Do_We_Have_State? [ set Current-Income Current-Income + div * (1 - Income-Tax) ; update the Current income set Bank-Account-Household Bank-Account-Household + div * (1 - Income-Tax) ; update the bank account of the household set State-Budget State-Budget + Income-tax * div ; the taxes go to the government ] [ set Current-Income Current-Income + div ; increase the income of the capitalist set Bank-Account-Household Bank-Account-Household + div ; update the bank account of the capitalist ] ] ] ] end to SubF-Bail-in-Banks ; this subfunction rules the process for the Bank bankruptcy and rebuilding using capitalits' resources. We ask banks here. set B-Broken B-Broken + 1 ; increase the global parameter that counts the broke status let Original-Shares Initial-Capital-of-the-bank / (count C-Firms + count K-Firms) ; the original price of a share, before any serious problem appears let Bank-Owners Capitalists with [Bank-Account-Household >= Original-Shares] ; this implies a bail-in, because the capitalits will be forced to buy again one share ifelse count Bank-Owners = 0 [ ; special procedure... if the owners cannot save the bank, the State will save the situation SubF-Bail-out-Banks ] [ let Broken-Capitalists Capitalists with [Bank-Account-Household < Original-Shares] ; excluded capitalists are those unable to restitute their share in the banking sector, and their number is adjusted below let New-Shares Original-Shares ; we prepare this instrumental variable for repeated use later let New-Shares_1 0 ; we prepare this instrumental variable for repeated use later while [New-Shares > New-Shares_1] [ set New-Shares_1 New-Shares set New-Shares Initial-Capital-of-the-bank / (count Bank-Owners) ; the capitalists unable to afford a new share are excluded, but as a consecuence, the price per share increases set Bank-Owners Capitalists with [Bank-Account-Household >= New-Shares] ; this implies a bail-in ifelse count Bank-Owners = 0 [ ; special procedure... if the owners cannot save the bank, the State will save the situation SubF-Bail-out-Banks stop ] [ set Broken-Capitalists Capitalists with [Bank-Account-Household < New-Shares] ; broken capitalists are unable to restitute their share in the banking sector, and they will lose their "capitalist" status ] ] if count Bank-Owners != 0 [ set Bail-ins Bail-ins + 1 ask Bank-Owners [ set Bank-Account-Household Bank-Account-Household - New-Shares ; update the bank account of the capitalist, reducing the account due to the money used to rebuild the bank ] ] ifelse Capitalist-Bankruptcy? and ticks > 100 [ ask Broken-Capitalists [ ; the capitalists unable to pay for the bail-in will be broken set Demoted Demoted + 1 let moneyfornewlife max list 0 (random-normal Initial-households-personal-assets 0.5) set Bank-Account-Household moneyfornewlife ; the capitalist unable to pay for the new shares get broken if Do_We_Have_State? [ set State-Budget State-Budget - moneyfornewlife ; sorry Libertarians, but the State comes to help... set Helped-Households Helped-Households + 1 ] set Worker? true ; the capitalist is broken, and he/she becomes a poor worker set Employed? false ; the ex-capitalist is now an unemployed worker and he has to look for an employment... life is hard... set Bankrupt? false set color turquoise ; just for fun, not necessary for the model, used only for display in HUD netlogo set Human-Wealth 1 ; initial value for Human Wealth, utilized to calculate the consumption process set Current-Income 0 ; intitial income set Desired-Consumption 0 ; initial value for desired consumption set Consumption 0 ; initial value for Consumption set Price-List [ ] ; setup for the list which will be used to colect the C-Firms visited ask one-of my-in-owners [ ; we identify the firm (K or C) previously owned by the broken capitalist... my-in-breed means "all links that you can use to travel to this node". ask end1 [ set Owner? false ] ; ...the firm at the other end of the link now is deprived of a proper owner die ; the link representing ownership dies, the problem now is looking for a new owner for that orphan firm... ] ] let Newcapitalist one-of Workers with-max [ Bank-Account-Household ] ; ...the orphan C-Firm or K-Firm needs a new owner, so we ask the worker with the highest savings to buy the Firm and become a capitalist ask Newcapitalist [ ; before we proceed to transform a worker into a capitalist, we broke his/her current labor contract with a (different) firm if Employed? [ ask in-hired-neighbors [ ; we contact with the firm for which this worker is employed... the only link of this worker, future capitalist, is the labor contract set Vacancy Vacancy + 1 ; the worker leaves, so the firm adjust the vacancies adding an open job to the record set Number-of-Employees Number-of-Employees - 1 ; the firm losses one worker, which now is a capitalist unwilling to work ask one-of my-out-hireds [ die ] ; the link, the labor contract, dies or disappear ] ] set shape "person" ; the metamorphosis of this person is complete now... and he comes to a new (better) life... set size 0.50 ; just for fun, not necessary for the model, used only for display in HUD Netlogo set color gray ; this "new rich" is like a rich (white) but not quite set Worker? false ; false only means he/she is now a happy capitalist set Employed? false set Promoted Promoted + 1 let My-New-Firm one-of Firms with [Owner? = false] move-to My-New-Firm create-owner-from My-New-Firm [set hidden? true] ; this creates a link between the firm and the capitalist ask My-New-Firm [ set Owner? true ] ] set Capitalists Households with [ not Worker? ] ; updating the group with all Capitalist set Workers Households with [ Worker? ] ; updating the group with all workers ] [ ask Broken-Capitalists [ let moneyfornewlife max list 0 (random-normal Initial-households-personal-assets 0.5) set Bank-Account-Household moneyfornewlife ; the capitalist unable to pay for the new shares get broken if Do_We_Have_State? [ set State-Budget State-Budget - moneyfornewlife ; sorry Libertarians, but the State comes to help... set Helped-Households Helped-Households + 1 ] set Human-Wealth 1 ; initial value for Human Wealth, utilized to calculate the consumption process set Current-Income 0 ; intitial income set Desired-Consumption 0 ; initial value for desired consumption set Consumption 0 ; initial value for Consumption set Price-List [ ] ; setup for the list which will be used to colect the C-Firms visited ] ] ] end to SubF-Bail-out-Banks if Do_We_Have_State? [ ; untenable losses... if there exist a government and taxes... (we are asking banks) set Bail-outs Bail-outs + 1 if State-Budget >= Initial-Capital-of-the-bank [ ; if the Central Bank exists and it buys public debt without limits, all the deficit is converted to government bonds sold to the CB set State-Budget State-Budget - Initial-Capital-of-the-bank ; in this case the government pays the recapitalization of the bank and the unpaid overdraft set Own-Bank-Capital Initial-Capital-of-the-bank ] if State-Budget < Initial-Capital-of-the-bank and Do_We_Have_Central-Bank? = true and QEasing? = true [ ; if the Central Bank does not exist, the State helps the bank only if the budget has enough resources set State-Budget State-Budget - Initial-Capital-of-the-bank ; in this case the government pays the recapitalization of the bank and the unpaid overdraft set Own-Bank-Capital Initial-Capital-of-the-bank ] ] end to Function-Update-Wages ; trade unions try to keep purchasing power of salaries or rate of salaries on GDP constant, but they loss power if Unemployment-Rate increases set Wage_1 Wage ; store the Wage value for use with adaptative functions set Labor-Share_1 (Employment_1 * Wage_1) / (GDP_1 * General-Price-Level_1) ; store the labor share on income (Labor-Share) value for use with adaptative functions set Labor-Share (Employment * Wage) / (GDP * General-Price-Level) ; total salaries as a percentage of the GDP, then Wage = (Labor-Share * GDP) / Number-of-Employees is the wage that keeps that proportion constant ifelse Update-Wages? [ ifelse Unemployment-Rate <= 0.12 [ ; if the Unemployment-Rate rate approaches the frictional Unemployment-Rate rate (of about 7%), then trade unions get stronger and wages rise if labor-share < 0.55 [ set Wage max list minimum-wage (max list (Labor-Share_1 * (GDP_1 * (General-Price-Level_1)) / Employment) (Wage * (1 + cpi))) ; the previous wage increased by the Consumption price index ] if labor-share > 0.75 [ set Wage max list minimum-wage (min list (Labor-Share_1 * (GDP_1 * (General-Price-Level_1)) / Employment) (Wage * (1 + cpi))) ; the previous wage increased by the Consumption price index ] ] [ ; the second option for wage comes from finding the value of wage in (Labor-Share_1 = Labor-Share) ifelse labor-share <= 0.40 [ set Wage max list wage minimum-wage ; even if unemplyment is high, when the rate of salaries on GDP falls bellow this threshold trade unions fight for preserving the current level of wages or set a minimum for them ] [ set Wage minimum-wage ; if the Unemployment-Rate rate is higher than the frictional Unemployment-Rate rate plus a margin and the labor share is not too low, the wages cannot be lower than a legal minimum ] ] ] [ set Wage minimum-wage ] end to Function-New-Firms-Entries ; if bakruptcy of firms occurs, a procedure for regenerating firms is activated if count C-Firms < 200 [ ; if the number of C-Firms is lower than the maximun, there is room for newcomers let C-Firms-newcomers% 1 / (1.33 + Recession-lenght * 0.66) ; local variable, a probability depending on the recession lenght if random-float 1 < C-Firms-newcomers% [ ; with a probability that depends on the GDP growth, new C-Firms appear in the economy ask one-of patches with [pycor < 8 and not any? Firms-here] [ sprout-firms 1 [ set shape "factory" ; just for fun, not necessary for the model, used only for display in HUD netlogo set size 0.75 ; just for fun, not necessary for the model, used only for display in HUD netlogo set color orange ; just for fun, not necessary for the model, used only for display in HUD netlogo set C-Firm? true ; proper of the Firms, true means it is a consumption producer firm set Owner? false ; this firm will have an owner, but at this moment does not have it set Price 2 ; initial value for price set Capital Initial-capital ; initial value for capital set Stock Initial-production-C-firms ; initial value for stock set Production Initial-production-C-firms ; initial value for production set Probability-of-Bankruptcy 0.001 set Revenue 0 ; initial value for revenue set Sales 0 ; initial value for sales set Need-Cash 0 ; initial value for cash needed before production, because lack of liquidity for starting it set Desired-Investment 0 ; initial value for desire investment set Investment 0 ; initial value for investment set Number-of-Employees 0 ; initial value for number of employees set Desired-Employees 0 ; initial value for desire employees set Price-List [ ] ; setup for the list which will be used to colect the K-Firms visited set Vacancy 0 ; initial value for vacancy set Current-Retail-Loan 0 ; the new firm is born like a virgin... set Bank-Account-Firm max list 0 (random-normal Initial-liquidity-of-Firms 1) ; initial money deposited at the bank by the firms set Bank-Account-Firm_1 Bank-Account-Firm set Investment-Memory Initial-Capital ; initial value for Investment-Memory, parameter utilized to calculate the desire investment set Util-Capacity 0 ; initial value for util-capacity ] ; end new firm commands ] ; end if random 100 set C-Firms Firms with [ C-Firm? ] ; updating the group with all K-firms let Newcapitalist-C n-of 1 Workers with-max [ Bank-Account-Household ] ; the new firm needs a new capitalist-owner ask Newcapitalist-C [ ; we ask the worker with the highest savings to buy the Firm and become a capitalist if Employed? [ ask in-hired-neighbors [ ; the new capitalist is a worker yet and we take its labor contract and... set Vacancy Vacancy + 1 ; the worker leaves, so the firm adjust the vacancies set Number-of-Employees Number-of-Employees - 1 ; the firm losses one worker ask one-of my-out-hireds [ die ] ] ] set color gray ; the color changes, because this capitalist is a new rich set Worker? false ; he/she is now a capitalist set Promoted Promoted + 1 let My-New-Firm one-of Firms with [Owner? = false] move-to My-New-Firm create-owner-from My-New-Firm [set hidden? true] ; this creates a link between the firm and the capitalist ask My-New-Firm [ set Owner? true ] ] set Capitalists Households with [ not Worker? ] ; updating the group with all Capitalist set Workers Households with [ Worker? ] ; updating the group with all workers ] ; end condition about room for new firms ] ; if bakruptcy of firms occurs, a procedure for regenerating firms is activated if count K-Firms < 50 [ ; if the number of C-Firms is lower than the maximun, there is room for newcomers let K-Firms-newcomers% 1 / (1.2 + Recession-lenght * 0.85) ; local variable, a probability if random-float 1 < K-Firms-newcomers% [ ; with a probability that depends on the GDP growth, new C-Firms appear in the economy ask one-of patches with [pycor >= 8 and not any? Firms-here] [ sprout-firms 1 [ set shape "factory" ; just for fun, not necessary for the model, used only for display in HUD netlogo set size 0.75 ; just for fun, not necessary for the model, used only for display in HUD netlogo set color brown ; just for fun, not necessary for the model, used only for display in HUD netlogo set C-Firm? false ; proper of the Firms, true means it is a consumption producer firm set Owner? false ; this firm will have an owner, but at this moment does not have it set Price 2 ; initial value for price set Capital Initial-Capital ; initial value for capital set Stock Initial-production-K-firms ; initial value for stock set Production Initial-production-K-firms ; initial value for production set Probability-of-Bankruptcy 0.001 set Revenue 0 ; initial value for revenue set Sales 0 ; initial value for sales set Need-Cash 0 ; initial value for cash needed before production, because lack of liquidity for starting it set Desired-Investment 0 ; initial value for desire investment set Investment 0 ; initial value for investment set Number-of-Employees 0 ; initial value for number of employees set Desired-Employees 0 ; initial value for desire employees set Price-List [ ] ; setup for the list which will be used to colect the K-Firms visited set Vacancy 0 ; initial value for vacancy set Current-Retail-Loan 0 ; the new firm is born like a virgin... set Bank-Account-Firm max list 0 (random-normal Initial-liquidity-of-Firms 1) ; initial money deposited at the bank by the firms set Bank-Account-Firm_1 Bank-Account-Firm set Investment-Memory Initial-Capital ; initial value for Investment-Memory, parameter utilized to calculate the desire investment set Util-Capacity 0 ; initial value for util-capacity ] ; end new firm commands ] set K-Firms Firms with [ not C-Firm? ] ; updating the group with all K-firms let Newcapitalist-K one-of Workers with-max [ Bank-Account-Household ] ; the new firm needs a new capitalist-owner ask Newcapitalist-K [ ; we ask the worker with the highest savings to buy the Firm and become a capitalist if Employed? [ ask in-hired-neighbors [ ; the new capitalist is a worker yet and we take its labor contract and... set Vacancy Vacancy + 1 ; the worker leaves, so the firm adjust the vacancies set Number-of-Employees Number-of-Employees - 1 ; the firm losses one worker ask one-of my-out-hireds [ die ] ] ] set color gray ; the color changes, because this capitalist is a new rich set Worker? false ; he/she is now a capitalist set Employed? false set Promoted Promoted + 1 let My-New-Firm one-of Firms with [Owner? = false] move-to My-New-Firm create-owner-from My-New-Firm [set hidden? true] ; this creates a link between the firm and the capitalist ask My-New-Firm [ set Owner? true ] ] set Capitalists Households with [ not Worker? ] ; updating the group with all Capitalist set Workers Households with [ Worker? ] ; updating the group with all workers ] ] ; end condition about room for new firms end ; FUNCTION-CALL-CENTRAL-BANK to Function-Call-Central-Bank if ticks > 10 [ SubF-Set-Interest-Rates ] SubF-Update-Monetary-Variables end to SubF-Set-Interest-Rates ; only consumption goods are final goods, because capital goods are intermediate let P_C min list (Productivity-of-capital * sum [Capital] of C-Firms) (Productivity-of-labor * sum [Number-of-Employees] of C-Firms) ; maximum potential production of consumption goods let P_K Productivity-of-labor * sum [Number-of-Employees] of K-Firms ; maximum potential production of capital goods set P_GDP (P_C * Goods-Price-Level + P_K * Capital-Price-Level) / (General-Price-Level) ; P_GDP is potential GDP, and this is the maximum production, by using all resources (Unemployment = 0) let sensity_inflation Taylor-rule-parameter-for-inflation * (gpi - desired-inflation) ; Taylor-rule-parameter-for-inflation & Desire-inflation-for-the-monetary-authority let sensity_product 0 if GDP != 0 and P_GDP != 0 [ set sensity_product Taylor-rule-parameter-for-product * (ln GDP - ln P_GDP) ; Taylor-rule-parameter-for-product ] let sensity_credit 0 if (sum [Total-Loans] of Banks > 0) and (sum [Total-Loans_1] of Banks > 0) [ set sensity_credit max list 0 (Taylor-rule-parameter-for-credit * (ln sum [Total-Loans] of Banks - ln sum [Total-Loans_1] of Banks)) ; the parameter for the credit component of the Taylor rule ] if taylor-rule = "none" [ set taylor-interest-rate natural-interest-rate ] if taylor-rule = "conservative" [ set taylor-interest-rate max list 0.01 ( (Slow_taylor) * (gpi + natural-interest-rate + sensity_inflation) + (1 - slow_taylor) * taylor-interest-rate ) ; conservative Taylor rule: inflation (eq 18 of Popoyan et al) ] if taylor-rule = "dual-mandate" [ set taylor-interest-rate max list 0.01 ( (Slow_taylor) * (gpi + natural-interest-rate + sensity_inflation + sensity_product) + (1 - slow_taylor) * taylor-interest-rate ) ; dual mandate Taylor rule: inflation and output gap (eq 30 of Silva or eq 19 of Popoyan et al) ] if taylor-rule = "three-mandate" [ set taylor-interest-rate max list 0.01 ( (Slow_taylor) * (gpi + natural-interest-rate + sensity_inflation + sensity_product + sensity_credit) + (1 - slow_taylor) * taylor-interest-rate ) ; three-mandate Taylor rule: inflation, output gap and credit (eq 20 of Popoyan et al) ] end to Function-Set-Macroprudential-Rules ; we follow here Popoyan et al (2017), pp. 120-121 and 125-127 ; First, we prepare the global variables needed below let Credit-on-GDP sum [Total-Loans] of Banks / GDP ; this is the basic ratio used in the Counter-Cyclical-Capital-Buffer defined in Basel III rules set Matrix-Basel-Buffer matrix:set-and-report Matrix-Basel-Buffer 0 Mjb Credit-on-GDP ; update the first row of the matrix with information about the explained variable: every (0, Mjb) element is replaced by Credit-on-GDP of the current period set Matrix-Basel-Buffer matrix:set-and-report Matrix-Basel-Buffer 1 Mjb ticks ; update the second row of the matrix with information about the explicative variable: every (1, Mjb) element is replaced by Credit-on-GDP of the previous period set Mjb Mjb + 1 if Mjb > (Time-Window2 - 1) [ set Mjb 0 ] ; move the matrix element to the next position, so the replacements in the matrix are sequential, and the time-window controls how many observations we'll have ; the Time-Winodw is set to 60 because this is the size used by Popoyana et al. in footnote 14 let A matrix:get-row Matrix-Basel-Buffer 0 ; create an object with the first row (0) of the matrix, which contains current Credit-on-GDP let B matrix:get-row Matrix-Basel-Buffer 1 ; create an object with the second row (1) of the matrix, which contains Credit-on-GDP of the previous period r:put "a" A ; call R and put there the object A r:put "b" B ; call R and put there the object B r:eval "c <- lm(a ~ b)" ; call R and ask to solve the OLS regression with the inputs A and B, lm stands for "linear model". The OLS regression is Credit-on-GDP = a + b * ticks + e let C r:get "c$fitted.values" ; call R and put the fitted values into an object C, which is a list let long-Run-Credit-on-GDP last C ; save the last fitted value as a new variable used in the calculation of the gap let Credit-on-GDP-Gap Credit-on-GDP - long-Run-Credit-on-GDP ; we create the gap variable here... and then we proceeed to the calculation of the capital buffer ; Now we start with the definition of the macroprudential rules and their implications for the available credit of banks ask Banks [ ; this is important because the rules are applied to a macro scale but also to a micro scale, for every bank ; Basel II set Available-Credit-Basel2 max list 0 (Own-Bank-Capital * 12.5 - Total-Loans) ; available-credit = Own-Bank-Capital * 12.5 - Total-Loans-Firms, the maximum limit minus the current level of loans ; let Minimum-Capital-Requirement-Basel2 Own-Bank-Capital / (Total-Loans + Available-Credit-Basel2) ; Basel II sets this ratio as 8% as a minimum ; Basel III-1 let Available-Credit-Basel31a max list 0 (Own-Bank-Capital * 22.2 - Total-Loans) ; available-credit = Own-Bank-Capital * 22.2 - Total-Loans-Firms, the maximum limit minus the current level of loans ; let Minimum-Capital-Requirement-Basel3 Own-Bank-Capital / (Total-Loans + Available-Credit-Basel31a) ; Basel III sets this ratio as 4,5% as a minimum let Available-Credit-Basel31b 0 set Capital-Buffer 0 let Buffer-Add-On 0 if Credit-on-GDP-Gap < 2 [ set Capital-Buffer 0 ; there is no buffer here, and therefore there are no specific constraits on new available-credits. The capital Buffer is a percentage on Total-Loans-Firms set Available-Credit-Basel31b "" ; no specific limits here... so Total-Accounts * (1 / Reserve-Requirement) would be the limit set Buffer-Add-On 0 ; the Capital Buffer is a % of the Total-Loans-Firms not available for firms, this is, for each $ loaned this % must be reserved as a buffer... ] ; end of first case if Credit-on-GDP-Gap <= 10 and Credit-on-GDP-Gap >= 2 [ set Capital-Buffer max (list 0 ((Credit-on-GDP-Gap - 2) * 0.003125)) ; 0.003125 = 0.025 / 8 and from here we have a range of values for the Capital-Buffer... (Total-Loans-Firms + Available-Credit-Basel32) set Available-Credit-Basel31b (Total-Accounts + Own-Bank-Capital + Central-Bank-Loans - Reserves - Total-Loans - Total-Loans * Capital-Buffer) / (1 + Capital-Buffer) ; Deposits-Total includes Own-Bank-Capital set Buffer-Add-On Capital-Buffer * (Total-Accounts + Available-Credit-Basel31b) ; the aggregate constraint is (Deposits-Total + Central-Bank-Loans + Own-Capital-Bank - Reserves - Total-Loans-Firms - Buffer-Add-On) = Available-Credit-Basel31b ] ; and aggregate Buffer-Add-On = Capital-Buffer * (Total-Loans-Firms + Available-Credit-Basel31)... if Credit-on-GDP-Gap > 10 [ set Capital-Buffer 0.025 set Available-Credit-Basel31b max (list 0 ((Total-Accounts + Own-Bank-Capital + Central-Bank-Loans - Reserves - Total-Loans - Total-Loans * Capital-Buffer) / (1 + Capital-Buffer))) ; Deposits-Total includes Own-Bank-Capital set Buffer-Add-On Capital-Buffer * (Total-Loans + Available-Credit-Basel31b) ; the aggregate constraint is (Deposits-Total + Total-Central-Bank-Loans + sum (Own-Capital-Bank) - Reserves - Total-Loans-Firms - Buffer-Add-On) = Available-Credit-Basel31b ] ; end of third case if Assets > 0 [let Leverage-Requirement-Basel3 Own-Bank-Capital / Assets ] ; this is the third ratio of the first macroprudential rule of Basel III, and the ratio has to be equal to or higher than 3% let Available-Credit-Basel31c max list 0 ((Own-Bank-Capital - 0.03 * Assets) / 0.03) ; 0.03 = Own-Bank-Capital / (Assets of Banks + Available-Credit-Basel31c) and therefore... set Available-Credit-Basel31 min (list Available-Credit-Basel31a Available-Credit-Basel31b Available-Credit-Basel31c) ; Basel III-2 let High-Quality-Liquid-Assets (Reserves + Own-Bank-Capital) * 1.75 set Available-Credit-Basel32 max list 0 ((High-Quality-Liquid-Assets - (taylor-interest-rate + Installment-on-Debt) * Central-Bank-Loans - 0.1 * Total-Accounts - 0.25 * Central-Bank-Loans + Interests-Received + Installments-Received - 0.5 * Total-Loans) * 2) let Expected-Net-Cash-Outflows (taylor-interest-rate + Installment-on-Debt) * Central-Bank-Loans + 0.1 * Total-Accounts + 0.25 * Central-Bank-Loans - Interests-Received - Installments-Received + 0.5 * (Total-Loans + Available-Credit-Basel32) let Liquidity-Coverage-Ratio High-Quality-Liquid-Assets / Expected-Net-Cash-Outflows ; Liquidity-Coverage-Ratio >= 1 ; setting the macroprudential rule at work if Macroprudential-Rules = "none" [ ; we have created a chooser called "macroprudential-rules" with several possibilities: none, basel2, basel31, basel32, basel312 set Available-Credit-Basel Total-Accounts / Reserve-Requirement ; none means there is no aggregate constraint... the only exception is the requirement-rate ] if Macroprudential-Rules = "Basel2" [ set Available-Credit-Basel Available-Credit-Basel2 ] if Macroprudential-Rules = "Basel3_1" [ set Available-Credit-Basel Available-Credit-Basel31 ] if Macroprudential-Rules = "Basel3_2" [ set Available-Credit-Basel Available-Credit-Basel32 ] if Macroprudential-Rules = "Basel3_12" [ set Available-Credit-Basel min (list Available-Credit-Basel31 Available-Credit-Basel32) ] ] end to SubF-Update-Monetary-Variables set Currency (Initial-Liquidity-of-Firms * 250 + Initial-households-personal-assets * 3250 + Initial-Capital-of-the-Bank * 2) ; Currency is "coins and bills": the initial deposits... any initial reserve is included ; the initial reserves are extracted from the variable "currency", which is divided between accounts and reserves... so the additional reserves has to take this in consideration let Monetary-Base-uses max list 0 (Currency + sum [Reserves] of Banks - Reserve-Requirement * Currency ) ; monetary base is "outside money": uses of the base approach let Monetary-Base-sources max list 0 (sum [Central-Bank-Loans] of Banks + Public-Debt - Account-of-State-at-Central-Bank - Central-Bank-Own-Capital) ; monetary base is "outside money": sources of the base approach if Monetary-Base-Calculation = "uses of the base" [ set Monetary-Base Monetary-Base-uses ] if Monetary-Base-Calculation = "sources of the base" [ set Monetary-Base Monetary-Base-sources ] set Money-Supply Currency + sum [Total-Accounts] of Banks ; Monetary-Base multiplied by the money multiplier (1/Reserve-Requirement) is the maximum Money-Supply end ; ... but the effective money supply is currency plus deposits to Function-Call-State ; the State get taxes, sells Public-Debt to the Central Bank if there is a deficit and buys Public-Debt to the Central Bank if there is a superavit and pays unemployment benefits set State-Budget State-Budget - Public-Debt * (Taylor-Interest-Rate * Installment-on-Debt) ; the unemploymet benefits was substracted from the State Budget when the State paid for it set Public-Debt Public-Debt - Public-Debt * Installment-on-Debt let State-Budget_1 State-Budget ; we record the budget balance if Do_We_Have_Central-Bank? = true [ if State-Budget < 0 and QEasing? = true [ ; if the Central Bank exists and it buys public debt without limits, all the deficit is converted to government bonds sold to the CB set Public-Debt Public-Debt + abs State-Budget ; new debt is added to the existing set State-Budget 0 ; when the deficit is covered, the State budget is in equilibrium ] ; if the Quantitative Easing is not activated the State Budget cannot be negative (we might consider a constraint of 3% of deficit instead of 0%) if State-Budget > 0 and Public-Debt >= State-Budget [ ; if there is a surplus... set Public-Debt Public-Debt - State-Budget ; part of the debt is paid with the current surplus set State-Budget 0 ; when the deficit is covered, the State budget is in equilibrium ] ; end of this case if State-Budget > 0 and Public-Debt < State-Budget [ ; if the Central Bank exists and there is a surplus... set Account-of-State-at-Central-Bank State-Budget - Public-Debt ; the surplus goes to the account of the State at the Central Bank, and this reduces the amount of money in the system set Public-Debt 0 set State-Budget 0 ] ] end

There are 3 versions of this model.

## Attached files

File | Type | Description | Last updated | |
---|---|---|---|---|

Sin título.jpeg | jpeg | Screnshot | 6 months ago, by Rubén Osuna | Download |

**Parent:** Macroeconomic ABM with Banking Instability and Macroprudential Rules

This model does not have any descendants.