IMS / src / model / SFC / hh.jl
hh.jl
Raw
"""
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.income_exp_prev = agent.income_exp 
    agent.networth_prev = agent.networth
    return nothing
end

"""
    consumption!(agent::Household, model)  agent.consumption, agent.nominal_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_exp / model[agent.belongToFirm].prices +  model.α2 * agent.networth_prev / model[agent.belongToFirm].prices
    agent.nominal_consumption = agent.consumption * model[agent.belongToFirm].prices
    
    if !ismissing(agent.belongToBank)
        model[agent.belongToBank].flow -= agent.nominal_consumption
    end
    return agent.consumption, agent.nominal_consumption
end

"""
    loans!(agent::Household, model)  agent.loans

Households receive loans from the corresponding bank based on their demand for loans.
"""
function loans!(agent::Household, model)
    agent.loans = model.γ * (agent.networth_prev + agent.nominal_consumption)
    model[agent.belongToBank].loans += agent.loans 
    return agent.loans
end

"""
    non_performing_loans!(agent::Household, model)  model

A proportion of households' loans is non-performing.
"""
function non_performing_loans!(agent::Household, model)
    model[agent.belongToBank].npl += model.l * agent.loans
    return model
end

"""
    taxes!(agent::Household, τ)  agent.taxes

Households pay taxes on wages.
"""
function taxes!(agent::Household, τ)
    agent.taxes = τ * agent.wages
    return agent.taxes
end

"""
    expected_income!(agent::Household, model)  agent.income_exp

Households compute their expected available income.
"""
function expected_income!(agent::Household, model)
    agent.income_exp = agent.income_exp_prev + model.ϕ * (agent.income_prev - agent.income_exp_prev)
    return agent.income_exp
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
    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].il_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, model)  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.nominal_consumption
    model[agent.belongToBank].deposits += agent.deposits 
    return agent.deposits
end

"""
    networth!(agent::Household)  agent.networth

Update households' networth.
"""
function networth!(agent::Household)
    agent.networth = agent.deposits - agent.loans
    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.nominal_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)
    IMS.deposits!(agent, model)
    IMS.networth!(agent)
    IMS.balance!(agent)
    return model
end