CViM / 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.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