コード例 #1
0
def test_full_reserve_functionality():
    central_bank.clear()
    central_bank.min_reserve = Decimal(0.04)
    central_bank.mbs_relative_reserve = Decimal(0.1)
    central_bank.securities_relative_reserve = Decimal(0.05)
    bank.min_reserve = Decimal(0.04)

    bank.loan_ir = Decimal(0.05)
    bank.loan_duration = Period(10, Interval.YEAR)
    bank.reserves_interval = Period(1, Interval.DAY)
    bank.income_from_interest = Decimal(0.8)
    client.defaulting_mode = DefaultingMode.NONE

    central_bank.start_transactions()
    bank.book_asset(BalanceEntries.SECURITIES, Decimal(10.0))
    bank.book_liability(BalanceEntries.EQUITY, Decimal(10.0))
    client.borrow(Decimal(2000.0))
    assert central_bank.end_transactions()
    central_bank.start_transactions()
    bank.update_reserves()
    assert central_bank.end_transactions()

    assert round(bank.asset(BalanceEntries.RESERVES)\
           + bank.asset(BalanceEntries.MBS)\
           + bank.asset(BalanceEntries.SECURITIES), 8) > round(Decimal(80), 8)
    assert round(bank.asset(BalanceEntries.SECURITIES), 8) == round(Decimal(10.0), 8)
    assert round(bank.asset(BalanceEntries.LOANS) + bank.asset(BalanceEntries.MBS), 8) == round(Decimal(2000.0), 8)
    assert round(bank.asset(BalanceEntries.MBS), 8) == round(Decimal(8.0), 8)
コード例 #2
0
def test_income_defaulting():
    central_bank.clear()
    bank.loan_ir = Decimal(0.05 * Period.YEAR_DAYS)
    bank.loan_duration = Period(10, Interval.DAY)
    bank.client_interaction_interval = Period(1, Interval.DAY)
    bank.income_from_interest = Decimal(0.8)
    client.defaulting_mode = DefaultingMode.FIXED
    client.fixed_defaulting_rate = Decimal(0.25)
    client.defaults_bought_by_debt_collectors = Decimal(1.0)

    central_bank.start_transactions()
    client.borrow(Decimal(2000.0))
    assert central_bank.end_transactions()
    central_bank.start_transactions()
    bank.process_income_and_spending()
    assert central_bank.end_transactions()

    assert round(client.asset(BalanceEntries.DEPOSITS), 8) == round(Decimal(1727.5), 8)
    assert round(client.asset(BalanceEntries.UNRESOLVED_DEBT), 8) == round(Decimal(50.0), 8)
    assert round(client.liability(BalanceEntries.DEBT), 8) == round(Decimal(1800.0), 8)
    assert round(client.liability(BalanceEntries.UNRESOLVED_DEBT), 8) == round(Decimal(50.0), 8)
    assert round(client.liability(BalanceEntries.EQUITY), 8) == round(Decimal(-72.5), 8)
    assert round(client.balance.total_balance, 8) == round(Decimal(1777.5), 8)

    assert round(bank.asset(BalanceEntries.LOANS), 8) == round(Decimal(1800.0), 8)
    assert round(bank.liability(BalanceEntries.DEPOSITS), 8) == round(Decimal(1727.5), 8)
    assert round(bank.liability(BalanceEntries.EQUITY), 8) == round(Decimal(72.5), 8)
    assert round(bank.balance.total_balance, 8) == round(Decimal(1800.0), 8)
コード例 #3
0
def test_reserve_mbs_growth():
    central_bank.clear()
    central_bank.min_reserve = Decimal(0.05)
    central_bank.mbs_relative_reserve = Decimal(0.1)
    central_bank.securities_relative_reserve = Decimal(0.0)
    bank.min_reserve = Decimal(0.05)
    bank.max_mbs_assets = Decimal(1.0)
    bank.max_security_assets = Decimal(1.0)
    bank.loan_ir = Decimal(0.05)
    bank.loan_duration = Period(10, Interval.YEAR)
    bank.reserves_interval = Period(1, Interval.DAY)
    bank.income_from_interest = Decimal(0.8)
    client.defaulting_mode = DefaultingMode.NONE

    central_bank.start_transactions()
    client.borrow(Decimal(2000.0))
    assert central_bank.end_transactions()
    central_bank.start_transactions()
    bank.update_reserves()
    assert central_bank.end_transactions()
    central_bank.start_transactions()
    central_bank.grow_mbs(Decimal(0.1))
    bank.update_reserves()
    assert central_bank.end_transactions()

    assert round(bank.asset(BalanceEntries.MBS), 8) == round(Decimal(11.0), 8)
    assert round(bank.asset(BalanceEntries.LOANS), 8) == round(Decimal(1990.0), 8)
    assert round(bank.asset(BalanceEntries.RESERVES), 8) == round(Decimal(90.0), 8)
    assert round(bank.liability(BalanceEntries.MBS_EQUITY), 8) == round(Decimal(11.0), 8)
    assert round(bank.liability(BalanceEntries.DEPOSITS), 8) == round(Decimal(2000.0), 8)
    assert round(bank.liability(BalanceEntries.EQUITY), 8) == round(Decimal(-10.0), 8)
    assert round(bank.balance.total_balance, 8) == round(Decimal(2091.0), 8)
コード例 #4
0
def set_no_sec_parameters():
    reset()

    # simulator
    simulator.collect_interval = Period(1, Interval.MONTH)

    # economy
    economy.cycle_length = Period(1, Interval.DAY)
    economy.growth_rate = 0.03
    economy.inflation = 0.0
    economy.mbs_growth = 0.0
    economy.security_growth = 0.0
    economy.lending_satisfaction_rate = 1.0

    # central bank
    economy.central_bank.min_reserve = 0.01
    economy.central_bank.mbs_relative_reserve = 0.0
    economy.central_bank.securities_relative_reserve = 0.0
    economy.central_bank.reserve_ir = 0.0
    economy.central_bank.surplus_reserve_ir = -0.005
    economy.central_bank.reserve_interest_interval = Period(1, Interval.DAY)
    economy.central_bank.loan_ir = 0.0025
    economy.central_bank.loan_duration = Period(1, Interval.DAY)
    economy.central_bank.loan_interval = Period(1, Interval.DAY)
    economy.central_bank.qe_mode = QEMode.NONE
    economy.central_bank.qe_interval = Period(1, Interval.MONTH)
    economy.central_bank.helicopter_mode = HelicopterMode.NONE
    economy.central_bank.helicopter_interval = Period(1, Interval.MONTH)

    # bank
    economy.bank.min_reserve = 0.01
    economy.bank.reserves_interval = Period(1, Interval.DAY)
    economy.bank.min_risk_assets = 0.0
    economy.bank.max_risk_assets = 0.0
    economy.bank.max_mbs_assets = 1.0
    economy.bank.max_security_assets = 1.0
    economy.bank.client_interaction_interval = Period(1, Interval.MONTH)
    economy.bank.savings_ir = 0.0
    economy.bank.loan_ir = 0.025
    economy.bank.loan_duration = Period(20, Interval.YEAR)
    economy.bank.no_loss = True
    economy.bank.income_from_interest = 0.2
    economy.bank.retain_profit_percentage = 0.2
    economy.bank.spending_mode = SpendingMode.PROFIT
    economy.bank.profit_spending = 0.8

    # private sector
    economy.client.savings_rate = 0.0
    economy.client.borrow_for_securities = 0.0
    economy.client.defaulting_mode = DefaultingMode.NONE
コード例 #5
0
ファイル: bank.py プロジェクト: HapponomyOrg/EMU_simulation
    def __init__(self, central_bank: CentralBank):
        super().__init__(
            OrderedSet([BalanceEntries.RESERVES, BalanceEntries.LOANS, BalanceEntries.MBS, BalanceEntries.SECURITIES]),
            OrderedSet([BalanceEntries.DEPOSITS, BalanceEntries.SAVINGS, BalanceEntries.DEBT, BalanceEntries.EQUITY,
                        BalanceEntries.MBS_EQUITY]))
        self.__central_bank: CentralBank = central_bank
        self.central_bank.bank = self
        self.__installments: List[Decimal] = [Decimal(0.0)]

        self.reserves_interval: Period = Period(1, Interval.MONTH) # Interval when reserves are updated
        self.__min_reserve: Decimal = central_bank.min_reserve

        self.risk_assets_interval: Period = Period(1, Interval.MONTH)
        self.__min_risk_assets: Decimal = Decimal(0.0)
        self.__max_risk_assets: Decimal = Decimal(1.0) # Maximum % of assets being MBS and/or Securities

        # The sum of the two following parameters must always be >= 1.0
        self.__max_mbs_assets: Decimal = Decimal(1.0) # Max % of risk assets
        self.__max_security_assets: Decimal = Decimal(1.0) # Max % of risk assets

        self.client_interaction_interval: Period = Period(1, Interval.MONTH)

        self.__savings_ir: Decimal = Decimal(0.02)
        self.__loan_ir: Decimal = Decimal(0.025)
        self.loan_duration: Period = Period(20, Interval.YEAR)

        self.no_loss: bool = True
        self.__income_from_interest: Decimal = Decimal(0.8)
        self.__retain_profit_percentage: Decimal = Decimal(0.2)

        self.spending_mode: SpendingMode = SpendingMode.PROFIT
        self.__fixed_spending: Decimal = Decimal(0.0)
        self.__profit_spending: Decimal = Decimal(0.8)
        self.__equity_spending: Decimal = Decimal(0.0)
        self.__capital_spending: Decimal = Decimal(0.0)

        # Cycle flags. Some actions can only be executed once per cycle.
        self.__risk_assets_updated: bool = False
        self.__income_and_spending_processed: bool = False
        self.__savings_processed: bool = False
        self.__debt_paid: bool = False
        self.__reserves_updated: bool = False

        # Cycle attributes
        self.__installment = Decimal(0.0)
        self.__client_installment: Decimal = Decimal(0.0)
        self.__client_installment_shortage: Decimal = Decimal(0.0)
        self.__expected_income: Decimal = Decimal(0.0)
        self.__income: Decimal = Decimal(0.0)
        self.__costs: Decimal = Decimal(0.0)
コード例 #6
0
def test_pay_savings_interest():
    central_bank.clear()

    # Set interest rate per day
    bank.savings_ir = Decimal(0.1) * Period.YEAR_DAYS
    bank.client_interaction_interval = Period(1, Interval.DAY)

    client.savings_rate = Decimal(0.1)

    central_bank.start_transactions()
    client.borrow(Decimal(1000.0))
    bank.process_client_savings()
    assert central_bank.end_transactions()

    assert round(client.asset(BalanceEntries.DEPOSITS), 8) == round(Decimal(900.0), 8)
    assert round(client.asset(BalanceEntries.SAVINGS), 8) == round(Decimal(110.0), 8)
    assert round(client.liability(BalanceEntries.DEBT), 8) == round(Decimal(1000.0), 8)
    assert round(client.liability(BalanceEntries.EQUITY), 8) == round(Decimal(10.0), 8)
    assert round(client.balance.total_balance, 8) == round(Decimal(1010.0), 8)

    assert round(bank.asset(BalanceEntries.LOANS), 8) == round(Decimal(1000.0), 8)
    assert round(bank.liability(BalanceEntries.DEPOSITS), 8) == round(Decimal(900.0), 8)
    assert round(bank.liability(BalanceEntries.SAVINGS), 8) == round(Decimal(110.0), 8)
    assert round(bank.liability(BalanceEntries.EQUITY), 8) == round(Decimal(-10.0), 8)
    assert round(bank.balance.total_balance, 8) == round(Decimal(1000.0), 8)
コード例 #7
0
def test_fixed_qe():
    init_parameters()
    central_bank.qe_mode = QEMode.FIXED
    central_bank.qe_fixed = 100.0
    central_bank.qe_interval = Period(1, Interval.DAY)

    central_bank.start_transactions()
    client.trade_securities_with_bank(Decimal(10.0))
    assert round(client.balance.asset(BalanceEntries.DEPOSITS),
                 8) == round(Decimal(10.0), 8)
    assert round(client.balance.asset(BalanceEntries.SECURITIES),
                 8) == round(Decimal(0.0), 8)
    assert round(client.balance.liability(BalanceEntries.EQUITY),
                 8) == round(Decimal(10.0), 8)
    bank.book_asset(BalanceEntries.SECURITIES, Decimal(50.0))
    bank.book_liability(BalanceEntries.EQUITY, Decimal(50.0))
    central_bank.process_qe()
    central_bank.end_transactions()

    assert round(central_bank.asset(BalanceEntries.SECURITIES),
                 8) == round(Decimal(100.0), 8)
    assert round(central_bank.liability(BalanceEntries.RESERVES),
                 8) == round(Decimal(100.0), 8)
    assert round(bank.asset(BalanceEntries.RESERVES),
                 8) == round(Decimal(100.0), 8)
    assert round(bank.liability(BalanceEntries.DEPOSITS),
                 8) == round(Decimal(50.0), 8)
    assert round(bank.liability(BalanceEntries.EQUITY),
                 8) == round(Decimal(50.0), 8)
コード例 #8
0
def test_period_completion():
    year: Period = Period(1, Interval.YEAR)
    month = Period(1, Interval.MONTH)
    week = Period(1, Interval.WEEK)

    assert year.period_complete(Period.YEAR_DAYS - 1)
    assert month.period_complete(Period.MONTH_DAYS - 1)
    assert week.period_complete(Period.WEEK_DAYS - 1)
コード例 #9
0
    def __init__(self):
        self.__central_bank: CentralBank = CentralBank()
        PrivateActor(Bank(self.central_bank))

        self.cycle_length: Period = Period(1, Interval.DAY)
        self.__growth_rate: Decimal = Decimal(0.014)
        self.__inflation: Decimal = Decimal(0.019)
        self.__mbs_growth: Decimal = Decimal(0.0)
        self.__security_growth: Decimal = Decimal(0.0)
        self.__lending_satisfaction_rate = Decimal(1.0)
コード例 #10
0
def init_parameters():
    central_bank.clear()

    central_bank.min_reserve = 0.04
    central_bank.mbs_relative_reserve = 0.0
    central_bank.securities_relative_reserve = 0.0

    # set interest rates per day
    central_bank.reserve_ir = 0.0 * Period.YEAR_DAYS
    central_bank.surplus_reserve_ir = -0.005 * Period.YEAR_DAYS
    central_bank.loan_ir = 0.01 * Period.YEAR_DAYS
    central_bank.loan_duration = Period(1, Interval.DAY)
    central_bank.loan_interval = Period(1, Interval.DAY)

    central_bank.qe_mode = QEMode.NONE
    central_bank.qe_fixed = 0.0
    central_bank.qe_debt_related = 0.0
    central_bank.helicopter_mode = HelicopterMode.NONE
    central_bank.helicopter_fixed = 0.0
    central_bank.helicopter_debt_related = 0.0

    bank.max_reserve = 0.04
    bank.min_liquidity = 0.05
    bank.savings_ir = 0.02 * Period.YEAR_DAYS
    bank.loan_ir = 0.025 * Period.YEAR_DAYS
    bank.loan_duration = Period(20, Interval.YEAR)
    bank.loan_interval = Period(1, Interval.DAY)
    bank.no_loss = True
    bank.income_from_interest = 0.8
    bank.retain_profit = True
    bank.retain_profit_percentage = 0.2
    bank.spending_mode = SpendingMode.PROFIT
    bank.fixed_spending = 0.0
    bank.profit_spending = 0.8
    bank.equity_spending = 0.0
    bank.capital_spending = 0.0

    client.savings_rate = 0.02
    client.defaulting_rate = 0.0
コード例 #11
0
    def __init__(self, min_reserve: Decimal = 0.04):
        super().__init__(
            OrderedSet([
                BalanceEntries.LOANS, BalanceEntries.SECURITIES,
                BalanceEntries.HELICOPTER_MONEY, BalanceEntries.INTEREST
            ]), OrderedSet([BalanceEntries.RESERVES, BalanceEntries.EQUITY]))
        self.__min_reserve = Decimal(min_reserve)
        self.__mbs_reserve: Decimal = Decimal(
            0.0)  # max % of 'reserve' in the form of MBS
        self.__securities_reserve: Decimal = Decimal(
            0.0)  # max % of 'reserve' in the form of securities

        self.__reserve_ir: Decimal = Decimal(0.0)
        self.__surplus_reserve_ir: Decimal = Decimal(-0.005)
        self.reserve_interest_interval: Period = Period(1, Interval.DAY)

        self.__loan_ir: Decimal = Decimal(0.01)
        self.loan_duration: Period = Period(3, Interval.DAY)
        self.loan_interval: Period = Period(3, Interval.DAY)

        self.qe_mode: QEMode = QEMode.NONE
        self.__qe_fixed: Decimal = Decimal(0.0)
        self.__qe_debt_related = Decimal(0.0)
        self.qe_interval: Period = Period(1, Interval.MONTH)

        self.helicopter_mode: HelicopterMode = HelicopterMode.NONE
        self.__helicopter_fixed: Decimal = Decimal(0.0)
        self.__helicopter_debt_related: Decimal = Decimal(0.0)
        self.helicopter_interval: Period = Period(1, Interval.MONTH)

        # Cycle parameters
        self.__inflation_processed: bool = False
        self.__mbs_growth_processed: bool = False
        self.__security_growth_processed: bool = False
        self.__reserves_processed: bool = False
        self.__loans_processed: bool = False
        self.__qe_processed: bool = False
        self.__helicopter_money_processed: bool = False
コード例 #12
0
def test_income_and_spending():
    central_bank.clear()

    bank.loan_ir = Decimal(0.1 * Period.YEAR_DAYS)
    bank.loan_duration = Period(10, Interval.DAY)
    bank.client_interaction_interval = Period(1, Interval.DAY)
    bank.income_from_interest = Decimal(0.5)
    bank.spending_mode = SpendingMode.PROFIT
    bank.profit_spending = 0.8

    bank.savings_ir = Decimal(0.01) * Period.YEAR_DAYS
    bank.client_interaction_interval = Period(1, Interval.DAY)

    client.defaulting_mode = DefaultingMode.NONE
    client.savings_rate = Decimal(0.1)

    client.borrow(Decimal(100000.0))

    central_bank.start_transactions()
    bank.process_client_savings()
    assert round(client.asset(BalanceEntries.SAVINGS), 8) == round(Decimal(10100.0), 8)
    assert round(client.asset(BalanceEntries.DEPOSITS), 8) == round(Decimal(90000.0), 8)

    bank.process_income_and_spending()
    assert round(client.liability(BalanceEntries.DEBT), 8) == round(Decimal(90000.0), 8)
    assert round(client.asset(BalanceEntries.SAVINGS), 8) == round(Decimal(10100.0), 8)
    assert round(client.asset(BalanceEntries.DEPOSITS), 8) == round(Decimal(75920.0), 8)

    assert central_bank.end_transactions()

    assert client.asset(BalanceEntries.DEPOSITS) == bank.liability(BalanceEntries.DEPOSITS)
    assert client.asset(BalanceEntries.SAVINGS) == bank.liability(BalanceEntries.SAVINGS)
    assert client.liability(BalanceEntries.DEBT) == bank.asset(BalanceEntries.LOANS)
    assert round(bank.income, 8) == round(Decimal(20000), 8)
    assert round(bank.costs, 8) == round(Decimal(16020), 8)
    assert round(bank.income_shortage, 8) == round(Decimal(0.0), 8)
    assert round(bank.profit, 8) == round(Decimal(3980.0), 8)
コード例 #13
0
def test_full_income():
    central_bank.clear()

    bank.loan_ir = Decimal(0.05 * Period.YEAR_DAYS)
    bank.loan_duration = Period(10, Interval.DAY)
    bank.client_interaction_interval = Period(1, Interval.DAY)
    bank.income_from_interest = Decimal(0.8)
    client.defaulting_mode = DefaultingMode.NONE

    central_bank.start_transactions()
    client.borrow(Decimal(2000.0))
    assert central_bank.end_transactions()
    central_bank.start_transactions()
    bank.process_income_and_spending()
    assert central_bank.end_transactions()

    assert round(client.asset(BalanceEntries.DEPOSITS), 8) == round(Decimal(1775.0), 8)
    assert round(client.liability(BalanceEntries.DEBT), 8) == round(Decimal(1800.0), 8)
    assert round(client.liability(BalanceEntries.EQUITY), 8) == round(Decimal(-25.0), 8)
    assert round(client.balance.total_balance, 8) == round(Decimal(1775.0), 8)

    assert round(bank.asset(BalanceEntries.LOANS), 8) == round(Decimal(1800.0), 8)
    assert round(bank.liability(BalanceEntries.DEPOSITS), 8) == round(Decimal(1775.0), 8)
    assert round(bank.liability(BalanceEntries.EQUITY), 8) == round(Decimal(25.0), 8)
コード例 #14
0
def test_reserves_no_securities():
    central_bank.clear()
    central_bank.min_reserve = Decimal(0.05)
    central_bank.mbs_relative_reserve = Decimal(0.0)
    central_bank.securities_relative_reserve = Decimal(0.0)
    bank.min_reserve = Decimal(0.05)
    bank.loan_ir = Decimal(0.05 * Period.YEAR_DAYS)
    bank.loan_duration = Period(10, Interval.DAY)
    bank.client_interaction_interval = Period(1, Interval.DAY)
    bank.reserves_interval = Period(1, Interval.DAY)
    bank.income_from_interest = Decimal(0.8)
    client.defaulting_mode = DefaultingMode.NONE

    central_bank.start_transactions()
    client.borrow(Decimal(2000.0))
    assert central_bank.end_transactions()
    central_bank.start_transactions()
    bank.process_income_and_spending()
    bank.update_reserves()
    assert central_bank.end_transactions()

    assert round(central_bank.asset(BalanceEntries.LOANS), 8) == round(Decimal(88.75), 8)
    assert round(central_bank.liability(BalanceEntries.RESERVES), 8) == round(Decimal(88.75), 8)
    assert round(central_bank.balance.total_balance, 8) == round(Decimal(88.75), 8)

    assert round(client.asset(BalanceEntries.DEPOSITS), 8) == round(Decimal(1775.0), 8)
    assert round(client.liability(BalanceEntries.DEBT), 8) == round(Decimal(1800.0), 8)
    assert round(client.liability(BalanceEntries.EQUITY), 8) == -round(Decimal(25.0), 8)
    assert round(client.balance.total_balance, 8) == round(Decimal(1775.0), 8)

    assert round(bank.asset(BalanceEntries.RESERVES), 8) == round(Decimal(88.75), 8)
    assert round(bank.asset(BalanceEntries.LOANS), 8) == round(Decimal(1800.0), 8)
    assert round(bank.liability(BalanceEntries.DEPOSITS), 8) == round(Decimal(1775.0), 8)
    assert round(bank.liability(BalanceEntries.DEBT), 8) == round(Decimal(88.75), 8)
    assert round(bank.liability(BalanceEntries.EQUITY), 8) == round(Decimal(25.0), 8)
    assert round(bank.balance.total_balance, 8) == round(Decimal(1888.75), 8)
コード例 #15
0
 def __init__(self, generator: DataGenerator):
     self.collect_interval: Period = Period(1, Interval.DAY)
     self.__generator: DataGenerator = generator
     self.__collector = DataCollector(self)
     self._initialize_data_structure()