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)
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)
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)
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
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)
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)
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)
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)
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)
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
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
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)
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)
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)
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()