"""
Define households' actions.
"""
"""
prev_vars!(agent::Household) → nothing
Update households' previous variables.
"""
function prev_vars!(agent::Household)
agent.deposits_prev = agent.deposits
agent.loans_prev = agent.loans
agent.income_prev = agent.income
agent.networth_prev = agent.networth
return nothing
end
"""
consumption!(agent::Household, model) → agent.consumption
Households make their consumption decisions. The outflow of consumption is then updated for the matching bank.
"""
function consumption!(agent::Household, model)
agent.consumption = model.α1 * agent.income_prev + model.α2 * agent.networth_prev +
model.α3 * agent.loans_prev
if !ismissing(agent.belongToBank)
model[agent.belongToBank].flow -= agent.consumption
end
return agent.consumption
end
"""
update_lev!(agent::Household, changes_rates_hh, pref) → agent.lev
Update leverage dependent on current interest rates. If credit rates are higher (lower) than in the previous period,
desired leverage decreases (increases) by a small adjustment factor.
"""
function update_lev!(agent::Household, change_rates_hh, pref)
change_rates_hh == 0.0 && return
if change_rates_hh > 0.0 && change_rates_hh > 1e-06
agent.lev -= agent.lev * pref
elseif change_rates_hh < 0.0 && abs(change_rates_hh) > 1e-06
agent.lev += agent.lev * pref
end
return agent.lev
end
"""
loans_demand!(agent::Household) → agent.loans_demand
Households define their demand for loans based on current consumption and desired leverage.
"""
function loans_demand!(agent::Household)
agent.loans_demand = agent.lev * agent.consumption
return agent.loans_demand
end
"""
loans!(agent::Household, model) → agent.loans
Households receive loans from the corresponding bank based on their demand for loans and the bank's liquidity preference.
"""
function loans!(agent::Household, model)
agent.loans = agent.loans_demand * model[agent.belongToBank].liq_pref
model[agent.belongToBank].loans += agent.loans
return agent.loans
end
"""
taxes!(agent::Household, τ) → agent.taxes
Households pay taxes on wages.
"""
function taxes!(agent::Household, τ)
agent.taxes = τ * agent.wages
return agent.taxes
end
"""
income!(agent::Household, profits) → agent.income
Households compute their available income.
"""
function income!(agent::Household, profits)
agent.income = agent.wages + agent.deposits_interests + profits - agent.taxes - agent.loans_interests - agent.repayment + agent.defaulted_loans
return agent.income
end
"""
interests_payments!(agent::Household, model) → agent.loans_interests, agent.deposits_interests
Households compute their interest payments and receipts from loans and deposits of the previous period.
"""
function interests_payments!(agent::Household, model)
agent.loans_interests = (agent.loans_prev) * model[agent.belongToBank].ilh_rate_prev
model[agent.belongToBank].loans_interests += agent.loans_interests
agent.deposits_interests = agent.deposits_prev * model[agent.belongToBank].id_rate_prev
model[agent.belongToBank].deposits_interests += agent.deposits_interests
return agent.loans_interests, agent.deposits_interests
end
"""
deposits!(agent::Household) → agent.deposits
Households decide the amount of deposits they wish to hold (buffer variable).
"""
function deposits!(agent::Household, model) # id
agent.deposits += (agent.loans - agent.loans_prev) + agent.income - agent.consumption
model[agent.belongToBank].deposits += agent.deposits
return agent.deposits
end
"""
repayment!(agent::Household, model) → agent.repayment
Households repay a constant proportion of their loans over time.
"""
function repayment!(agent::Household, model)
if agent.loans_prev != 0.0
agent.repayment = agent.loans_prev * model.γ
model[agent.belongToBank].repayment += agent.repayment
agent.defaulted_loans = 0.1 * agent.loans_prev
model[agent.belongToBank].defaulted_loans += agent.defaulted_loans
end
return agent.repayment, agent.defaulted_loans
end
"""
networth!(agent::Household) → agent.networth
Update households' networth.
"""
function networth!(agent::Household)
agent.networth += agent.income - agent.consumption
return agent.networth
end
"""
balance!(agent::Household) → agent.balance_current
Update households' balance for SFC checks.
"""
function balance!(agent::Household)
agent.balance_current = (agent.loans - agent.loans_prev) + agent.income - agent.consumption - (agent.deposits - agent.deposits_prev)
return agent.balance_current
end
"""
SFC!(agent::Household, model) → model
Define households' SFC actions and update their accounting.
"""
function SFC!(agent::Household, model)
CViM.deposits!(agent, model)
CViM.networth!(agent)
CViM.balance!(agent)
return model
end