def setup_banks1(): simInfo = SimulationInfo() parameterDefs = simulator.define_parameters() eParams = Parameters(parameterDefs) banks = [] econ = Economy(simInfo, "Economy1", eParams) for i in range(5): params = Parameters(parameterDefs, econ.params) banks.append(Bank(simInfo, "bank%s" % i, econ, params)) econ.params.set('fireSaleFactor', 0.0) inv1 = econ.create_investment() inv2 = econ.create_investment() inv3 = econ.create_investment() inv1.buy(50, banks[0]) inv2.buy(10, banks[1]) inv2.buy(20, banks[2]) inv2.buy(40, banks[4]) inv3.buy(10, banks[1]) inv3.buy(20, banks[2]) inv3.buy(30, banks[3]) inv3.buy(40, banks[4]) # total investments: 0 50, 1 20, 2 40, 3 30, 4 80 banks[0].add_loan(banks[1], amount=1) banks[0].add_loan(banks[2], amount=2) banks[0].add_loan(banks[3], amount=3) banks[0].add_loan(banks[4], amount=4) banks[1].add_loan(banks[0], amount=10) banks[2].add_loan(banks[0], amount=20) banks[3].add_loan(banks[0], amount=30) banks[4].add_loan(banks[0], amount=40) # lending: 0 10, 1 10, 2 20, 3 30, 4 40 # borrowing: 0 100, 1 1, 2 2, 3 3, 4 4 # matrix: 0 1 2 3 4 # 10 0 0 0 0 # 20 0 0 0 0 # 30 0 0 0 0 # 40 0 0 0 0 banks[0].deposits = 10 banks[1].deposits = 20 banks[2].deposits = 30 banks[3].deposits = 40 banks[4].deposits = 50 # liabilities: 0 110, 1 21, 2 32, 3 43, 4 54 banks[0].cash = 50 banks[1].cash = 20 banks[2].cash = 15 banks[3].cash = 10 banks[4].cash = 5 # assets: 0 110, 1 50, 2 75, 3 70, 4 125 # capital: 0 0, 1 29, 2 43, 3 27, 4 71 return banks, econ, simInfo
def test_investments_buy2(self): parameterDefs = simulator.define_parameters() eParams = Parameters(parameterDefs) econ = Economy(self.simInfo, "Economy1", eParams) newI = econ.create_investment() econ.params.set('fireSaleFactor', 0.0) self.simInfo.updateCount = 1 newI.set_price(2) q, v = newI.buy(3, "buyer1") eq_(q, 3, "expected quantity 3 but got %r (1)" % q) eq_(v, 6, "expected consideration 6 but got %r (1)" % v) check_asset_network(self.simInfo, nodes=2, edges=1, tag="buy3") check_asset_holding(newI, "buyer1", quantity=3, value=6, tag="buy3") check_asset_totals(self.simInfo, newI, 3, 2, tag="buy3") self.simInfo.updateCount = 2 q, v = newI.buy(4, "buyer2") eq_(q, 4, "expected quantity 4 but got %r (2)" % q) eq_(v, 8, "expected consideration 8 but got %r (2)" % v) check_asset_network(self.simInfo, nodes=3, edges=2, tag="buy4") check_asset_holding(newI, "buyer1", quantity=3, value=6, tag="buy4") check_asset_holding(newI, "buyer2", quantity=4, value=8, tag="buy4") check_asset_totals(self.simInfo, newI, 7, 2, tag="buy4") self.simInfo.updateCount = 3 q, v = newI.buy(2, "buyer3") eq_(q, 2, "expected quantity 2 but got %r (3)" % q) eq_(v, 4, "expected consideration 4 but got %r (3)" % v) check_asset_network(self.simInfo, nodes=4, edges=3, tag="buy5") check_asset_holding(newI, "buyer1", quantity=3, value=6, tag="buy5") check_asset_holding(newI, "buyer2", quantity=4, value=8, tag="buy5") check_asset_holding(newI, "buyer3", quantity=2, value=4, tag="buy5") check_asset_totals(self.simInfo, newI, 9, 2, tag="buy3") self.simInfo.updateCount = 4 q, v = newI.sell(5, "buyer2") eq_(q, 4, "expected quantity 4 but got %r (4)" % q) eq_(v, 8, "expected consideration 8 but got %r (4)" % v) check_asset_network(self.simInfo, nodes=4, edges=2, tag="buy5") check_asset_holding(newI, "buyer1", quantity=3, value=6, tag="buy5") check_asset_holding(newI, "buyer2", quantity=0, value=0, tag="buy5") check_asset_holding(newI, "buyer3", quantity=2, value=4, tag="buy5") check_asset_totals(self.simInfo, newI, 5, 2, tag="buy3")
def test_firesale(self): parameterDefs = simulator.define_parameters() eParams = Parameters(parameterDefs) simInfo = SimulationInfo() econ = Economy(simInfo, "Economy1", eParams) inv = [] holders = [] for i in range(5): inv.append(econ.create_investment()) holders.append("holder%s" % i) econ.params.set('fireSaleFactor', 1.0) # price is affected by sales simInfo.updateCount = 1 for i in range(5): inv[0].buy(5, holders[i]) inv[1].buy(5, holders[i]) # one holder sells a bit of the investment simInfo.updateCount = 2 q, v = inv[0].sell(1, holders[0]) assert v < 1, "expected consideration < 1 but is %f" % v eq_(v, inv[0].currentPrice, "expected consideration equal to price but they are %f, %f" % (v, inv[0].currentPrice)) check_asset_holding(inv[0], holders[0], quantity=4, value=4 * v, tag="fs1") check_asset_holding(inv[0], holders[1], quantity=5, value=5 * v, tag="fs1") price1 = inv[0].currentPrice simInfo.updateCount = 3 q, v = inv[0].sell(3, holders[2]) # a total of 4 has now been sold price2 = inv[0].currentPrice assert price2 < price1, "expected price < %f but is %f (fs2)" % (price1, price2) assert approx_equal(v, price2 * q, 0.00001), "expected consideration %f but is %f (fs2)" % (price2 * q, v) simInfo.updateCount = 4 inv[1].sell(4, holders[3]) # sell 4, so price should be same as inv0 price3 = inv[1].currentPrice assert approx_equal(price2, price3, 0.00001), "expected price to be %f but is %f (fs3)" % (price2, price3) pHistory = inv[1].priceHistory when, price = pHistory[-1] eq_(4, when, "expected last item in price history to be at time 4 but got %r" % when) eq_(price3, price, "expected last item in price history to be price %f but got %f" % (price3, price))
def test_investment_shock(self): parameterDefs = simulator.define_parameters() eParams = Parameters(parameterDefs) econ1 = Economy(self.simInfo, "Economy1", eParams) eParams = Parameters(parameterDefs) econ2 = Economy(self.simInfo, "Economy2", eParams) inv = [] for i in range(10): inv.append(econ1.create_investment()) inv.append(econ2.create_investment()) econ1.params.set('investmentShockFactor', .5) econ1.params.set('investmentShockProportion', .8) self.simInfo.updateCount = 2 victims = econ1.do_investment_shock() eq_(len(victims), 8, "expected 8 investments to be affected but got %r" % len(victims)) for victim in victims: eq_(victim.currentPrice, 0.5, "expected price of %s to be .5 but got %f" % (victim.id_, victim.currentPrice)) econ2.params.set('investmentShockFactor', .25) econ2.params.set('investmentShockProportion', .1) victims = econ2.do_investment_shock() eq_(len(victims), 1, "expected 1 investments to be affected but got %r" % len(victims)) for victim in victims: eq_(victim.currentPrice, 0.75, "expected price of %s to be .75 but got %f" % (victim.id_, victim.currentPrice))
def setUp(self): self.simInfo = SimulationInfo() parameterDefs = simulator.define_parameters() eParams = Parameters(parameterDefs) self.simInfo.theParameters = eParams self.econ = Economy(self.simInfo, "Economy1", eParams) self.banks = [] self.investments = [] for i in range(5): params = Parameters(parameterDefs, self.econ.params) self.banks.append(Bank(self.simInfo, "bank%s" % i, self.econ, params)) self.investments.append(self.econ.create_investment()) random.seed(1234)
def test_investment_create(self): econ = Economy(self.simInfo, "Economy1") newI = econ.create_investment() eq_(newI.id_, "Economy1-inv0", "Expected investment to have name %r but is %r" % ("Economy1-inv0", newI.id_)) eq_(1, len(econ.investments), "expected one investment but got %r" % len(econ.investments)) inv = econ.investments[0] eq_(newI, inv, "expected the same investment") eq_(econ, inv.economy, "should be in this economy") check_asset_network(self.simInfo, 1, 0, "inv1") self.simInfo.updateCount = 1 econ.create_investment() check_asset_network(self.simInfo, 2, 0, "inv2") eq_(2, len(econ.investments), "expected 2 investments but got %r" % len(econ.investments)) self.simInfo.updateCount = 2 econ.create_investments(5) eq_(7, len(econ.investments), "expected 7 investments but got %r" % len(econ.investments)) check_asset_network(self.simInfo, 7, 0, "inv3")
def test_revalue(self): econ1 = Economy(self.simInfo, "Economy1") econ2 = Economy(self.simInfo, "Economy2") inv = [] for i in range(5): inv.append(econ1.create_investment()) inv.append(econ2.create_investment()) self.simInfo.updateCount = 1 econ1.revalue_investments(1.5) for i in range(5): eq_(1.5, inv[i * 2].currentPrice, "expected current price to be 1.5 but was %f for %r" % (inv[i * 2].currentPrice, i * 2)) eq_(1, inv[i * 2 + 1].currentPrice, "expected current price to be 1.0 but was %f for %r" % (inv[i * 2 + 1].currentPrice, i * 2 + 1)) self.simInfo.updateCount = 2 inv[1].set_price(20) econ2.revalue_investments(.1) eq_(2, inv[1].currentPrice, "expected current price to be 2, but was %f" % inv[1].currentPrice) pHistory = inv[1].priceHistory when, price = pHistory[-1] eq_(2, when, "expected last item in price history to be at time 2 but got %r" % when) eq_(2, price, "expected last item in price history to be price 2 but got %f" % price)
def test_investments_buy1(self): parameterDefs = simulator.define_parameters() eParams = Parameters(parameterDefs) econ = Economy(self.simInfo, "Economy1", eParams) newI = econ.create_investment() hLen = len(newI.priceHistory) self.simInfo.updateCount = 1 newI.set_price(1.0) hLen1 = len(newI.priceHistory) eq_(hLen + 1, hLen1, "expected %r items in price history but got %r" % (hLen + 1, hLen1)) when, price = newI.priceHistory[hLen1 - 1] eq_(1, when, "expected last item in price history to be at time 0 but was %r" % when) eq_(1.0, price, "expected last price in price history to be 1.0 but was %r" % price) self.simInfo.updateCount = 2 q, v = newI.buy(1, "buyer1") eq_(q, 1, "expected quantity 1 but got %r (1)" % q) eq_(v, 1, "expected consideration 1 but got %r (1)" % v) check_asset_network(self.simInfo, nodes=2, edges=1, tag="buy1") check_asset_holding(newI, "buyer1", 1, 1.0, tag="buy1") check_asset_totals(self.simInfo, newI, 1, 1.0, "buy1") hHistory = newI.holdingHistory["buyer1"] eq_(1, len(hHistory), "expected 1 item in holding history but got %r" % len(hHistory)) when, amount = hHistory[-1] eq_(2, when, "expected last item in holding history to be at time 1 but got %r" % when) eq_(1, amount, "expected last item in holding history to be amount 1 but got %r" % amount) self.simInfo.updateCount = 3 newI.set_price(2.0) q, v = newI.buy(3, "buyer1") eq_(q, 3, "expected quantity 3 but got %r (2)" % q) eq_(v, 6, "expected consideration 6 but got %r (2)" % v) check_asset_network(self.simInfo, nodes=2, edges=1, tag="buy1") check_asset_holding(newI, "buyer1", 4, 8.0, tag="buy2") check_asset_totals(self.simInfo, newI, 4, 2.0, tag="buy2") eq_(newI.value("buyer2"), 0, "expected buyer2 value to be 0 but is %r" % newI.value("buyer2")) eq_(newI.quantity("buyer2"), 0, "expected buyer2 quantity to be 0 but is %r" % newI.quantity("buyer2")) # now sell some self.simInfo.updateCount = 4 newI.set_price(5.0) econ.params.set('fireSaleFactor', 0.0) # selling has no effect on price q, v = newI.sell(3, "buyer1") eq_(q, 3, "expected quantity 3 but got %r (4)" % q) eq_(v, 15, "expected consideration 15 but got %r (4)" % v) check_asset_network(self.simInfo, nodes=2, edges=1, tag="sell1") check_asset_holding(newI, "buyer1", 1, 5.0, "sell1") check_asset_totals(self.simInfo, newI, 1, 5.0, "sell1") self.simInfo.updateCount = 5 q, v = newI.sell(1, "buyer2") eq_(q, 0, "expected quantity 0 but got %r" % q) eq_(v, 0, "expected consideration 0 but got %r" % v) check_asset_network(self.simInfo, nodes=2, edges=1, tag="sell2") check_asset_holding(newI, "buyer1", 1, 5.0, "sell2") check_asset_totals(self.simInfo, newI, 1, 5.0, "sell2") self.simInfo.updateCount = 6 q, v = newI.sell(-6, "buyer1") eq_(q, 0, "expected quantity 0 but got %r (4.5)" % q) eq_(v, 0, "expected consideration 0 but got %r (4.5)" % v) check_asset_network(self.simInfo, nodes=2, edges=1, tag="sell3") check_asset_holding(newI, "buyer1", 1, 5.0, "sell3") check_asset_totals(self.simInfo, newI, 1, 5.0, "sell3") pHistory = newI.priceHistory when, price = pHistory[-1] eq_(4, when, "expected last item in price history to be at time 4 but got %r" % when) eq_(5.0, price, "expected last item in price history to be price 5 but got %r" % price) self.simInfo.updateCount = 7 newI.set_price(3) q, v = newI.sell(5, "buyer1") eq_(q, 1, "expected quantity 1 but got %r (5)" % q) eq_(v, 3, "expected consideration 3 but got %r (5)" % v) check_asset_network(self.simInfo, nodes=2, edges=0, tag="sell4") check_asset_holding(newI, "buyer1", 0, 0, "sell4") check_asset_totals(self.simInfo, newI, 0, 3, "sell4") self.simInfo.updateCount = 8 q, v = newI.buy(-6, "buyer1") eq_(q, 0, "expected quantity 0 but got %r (6)" % q) eq_(v, 0, "expected consideration 0 but got %r (6)" % v) hHistory = newI.holdingHistory["buyer1"] when, amount = hHistory[-1] eq_(7, when, "expected last item in holding history to be at time 7 but got %r" % when) eq_(0.0, amount, "expected last item in holding history to be amount 0 but got %r" % amount) pHistory = newI.priceHistory when, price = pHistory[-1] eq_(7, when, "expected last item in price history to be at time 7 but got %r" % when) eq_(3.0, price, "expected last item in price history to be price 3 but got %r" % price)
class TestUpdate: def setUp(self): self.simInfo = SimulationInfo() parameterDefs = simulator.define_parameters() eParams = Parameters(parameterDefs) self.simInfo.theParameters = eParams self.econ = Economy(self.simInfo, "Economy1", eParams) self.banks = [] self.investments = [] for i in range(5): params = Parameters(parameterDefs, self.econ.params) self.banks.append(Bank(self.simInfo, "bank%s" % i, self.econ, params)) self.investments.append(self.econ.create_investment()) random.seed(1234) def test_loan_default(self): for i in range(4): # a chain of banks loanAmount = 5 * (i + 1) self.simInfo.loanNetwork.add_edge(self.banks[i + 1], self.banks[i], amount=loanAmount) self.banks[i].cash = 6 self.banks[0].deposits = 2 self.banks[4].deposits = 19 # at the outset, bank has capital -1, 1-4 have capital 1, for b, cap in zip(range(5), [-1, 1, 1, 1, 1]): bc = self.banks[b].equity_value() eq_(cap, bc, "Expected bank %s to have capital %r but has %r" % (b, cap, bc)) simulator.do_updates(self.simInfo) bankHistories = results.collect_bank_histories(self.simInfo) # they should all have gone bust for b in range(5): assert self.banks[b].totalDefault < 1.0, "expected bank %s to have defaulted but it has not" % b eq_(5, len(bankHistories.defaults), "5 banks should be bust but there are %r" % len(bankHistories.defaults)) # and they should be in order for b in range(5): eq_(bankHistories.defaults[b][1], self.banks[b].id_, "expected %r to go bust would be %r but it is %r" % (b, self.banks[b], bankHistories.defaults[b][1])) def test_investment_default1(self): self.simInfo.theParameters.set('assetSalesFactor', 1.2) # fudge factor self.simInfo.theParameters.set('targetCashProportion', 0.0) self.econ.params.set('fireSaleFactor', 5.0) # large fire sale effect for i in range(4): # a chain of banks self.investments[i].buy(10, self.banks[i]) self.investments[i].buy(10, self.banks[i + 1]) self.banks[i + 1].deposits = 15 self.investments[0].buy(10, self.banks[0]) self.investments[3].buy(10, self.banks[4]) self.banks[0].cash = -15 # at the outset, they all have capital 5 for b, cap in zip(range(5), [5, 5, 5, 5, 5]): bc = self.banks[b].equity_value() eq_(cap, bc, "Expected bank %s to have capital %r but has %r" % (b, cap, bc)) # bank 0 is going to have to sell its investments simulator.do_updates(self.simInfo) # 2 should have gone bust. bank 0 will have sold a lot of investment 0, which will make bank 1 bust. # but bank 1 has no reason to sell, so no other banks feel the effects. assert self.banks[0].totalDefault < 1.0, "bank 0 should have defaulted but has not" assert self.banks[1].totalDefault < 1.0, "bank 1 should have defaulted but has not" balanceSheetHistories, borrowingHistories, defaultHistories = results.collect_bank_histories(self.simInfo) investmentHistories = results.collect_investment_histories(self.simInfo) eq_(2, len(defaultHistories), "Should be 2 default events but got %r" % len(defaultHistories)) # and they should be in order for b in range(len(defaultHistories)): eq_(defaultHistories[b][1], self.banks[b].id_, "expected %r to go bust would be %r but it is %r" % (b, self.banks[b], defaultHistories[b][1])) pHistories = investmentHistories.prices eq_(6, len(pHistories), "expected 6 price records but got %r" % len(pHistories)) lastPrice = pHistories[-1] eq_(2, lastPrice.when, "expected last price record to have time 2 but got %r" % lastPrice.when) eq_(self.investments[0].id_, lastPrice.investmentId, "expected last price record to be for %r but got %r" % (self.investments[0].id_, lastPrice.investmentId)) hHistories = investmentHistories.holdings lastHolding = hHistories[-1] eq_(2, lastHolding.when, "expected last holding change to be at time 2 but got %r" % lastHolding.when) eq_(self.investments[0].id_, lastHolding.investmentId, "expected last holding record to be for %r but got %r" % (self.investments[0].id_, lastHolding.investmentId)) def test_investment_default2(self): self.econ.params.set('fireSaleFactor', 5.0) # large fire sale effect self.econ.params.set('assetSalesFactor', 1.2) # fudge factor self.econ.params.set('targetCashProportion', 0.0) # non-negative cash for i in range(5): # disconnected banks self.investments[i].buy(20, self.banks[i]) self.banks[i].deposits = 15 # at the outset, they all have capital 5 for b, cap in zip(range(5), [5, 5, 5, 5, 5]): bc = self.banks[b].equity_value() eq_(cap, bc, "Expected bank %s to have capital %r but has %r" % (b, cap, bc)) self.econ.do_deposit_withdrawals(.9) simulator.do_updates(self.simInfo) for b in range(5): assert self.banks[b].totalDefault < 1.0, "expected bank %s to have defaulted but it has not" % b