def test_simulate_trade_sell_orders_in_buy_command(self):
        a1 = AssetFundNetwork.Asset(price=1, daily_volume=1, symbol='a1')
        a2 = AssetFundNetwork.Asset(price=2, daily_volume=1, symbol='a2')
        f1 = Fund('f1', {'a1': 10}, 100, 1, 1)
        f2 = Fund('f2', {'a2': 10}, 100, 1, 1)
        mi_calc = MarketImpactCalculator()
        mi_calc.get_updated_price = MagicMock()
        network = AssetFundNetwork.AssetFundsNetwork(funds={
            'f1': f1,
            'f2': f2
        },
                                                     assets={
                                                         'a1': a1,
                                                         'a2': a2
                                                     },
                                                     mi_calc=mi_calc,
                                                     limit_trade_step=False)
        exception = False
        try:
            network.submit_buy_orders([Buy('a1', 2), Sell('a1', 2)])
        except TypeError:
            exception = True

        mi_calc.get_updated_price.assert_not_called()
        self.assertTrue(exception)
    def test_simulate_trade_sell_more_than_buy(self):
        a1 = AssetFundNetwork.Asset(price=1, daily_volume=1, symbol='a1')
        a2 = AssetFundNetwork.Asset(price=2, daily_volume=1, symbol='a2')
        f1 = Fund('f1', {'a1': 10}, 100, 1, 1)
        f2 = Fund('f2', {'a2': 10}, 100, 1, 1)
        mi_calc = MarketImpactCalculator()
        mi_calc.get_updated_price = MagicMock(return_value=0.5)

        network = AssetFundNetwork.AssetFundsNetwork(funds={
            'f1': f1,
            'f2': f2
        },
                                                     assets={
                                                         'a1': a1,
                                                         'a2': a2
                                                     },
                                                     mi_calc=mi_calc,
                                                     limit_trade_step=False)
        network.submit_buy_orders([Buy('a1', 2)])
        network.submit_sell_orders([Sell('a1', 3)])
        log = network.simulate_trade()
        self.assertDictEqual({'a1': '1->0.5'}, log)
        mi_calc.get_updated_price.assert_called_once_with(1, a1, -1)
        self.assertFalse(network.buy_orders)
        self.assertFalse(network.sell_orders)
        self.assertTrue(a1.price == 0.5)
        self.assertTrue(a2.price == 2)
    def test_tree(self):
        a1 = AssetFundNetwork.Asset(price=1, daily_volume=100, symbol='a1')
        f1 = Fund('f1', {'a1': 10}, 100, 1, 1)
        f2 = Fund('f2', {'a1': 20}, 100, 1, 1)
        mi_calc = MarketImpactCalculator()
        mi_calc.get_updated_price = MagicMock()
        mi_calc.get_updated_price.side_effect = update_price_side_effects
        network = AssetFundNetwork.AssetFundsNetwork(funds={
            'f1': f1,
            'f2': f2
        },
                                                     assets={'a1': a1},
                                                     mi_calc=mi_calc,
                                                     limit_trade_step=False)

        action_manager = ActionsManager(network.assets, 0.5, 1, [50, 30])
        SysConfig.set("STEP_ORDER_SIZE", 0.5)

        f1.marginal_call = MagicMock(return_value=False)
        f2.marginal_call = MagicMock()
        f2.marginal_call.side_effect = f1_margin_call_side_effect
        actual_tree = PortfolioFlashCrashRootChanceGameState(
            action_manager, af_network=network, defender_budget=50)
        expected_tree = self.gen_tree()
        self.assertEqual(actual_tree.chance_prob(), {'p1': 0.75, 'p2': 0.25})
        self.assertEqual(actual_tree.tree_size, 8)
        self.cmp_tree(expected_tree, actual_tree)
    def test_simulate_trade_mix_trades(self):
        a1 = AssetFundNetwork.Asset(price=1, daily_volume=1, symbol='a1')
        a2 = AssetFundNetwork.Asset(price=2, daily_volume=1, symbol='a2')
        f1 = Fund('f1', {'a1': 10}, 100, 1, 1)
        f2 = Fund('f2', {'a2': 10}, 100, 1, 1)
        mi_calc = MarketImpactCalculator()
        mi_calc.get_updated_price = MagicMock(return_value=1.5)

        network = AssetFundNetwork.AssetFundsNetwork(funds={
            'f1': f1,
            'f2': f2
        },
                                                     assets={
                                                         'a1': a1,
                                                         'a2': a2
                                                     },
                                                     mi_calc=mi_calc,
                                                     limit_trade_step=False)

        network.submit_sell_orders([Sell('a2', 2)])
        network.submit_buy_orders([Buy('a1', 2)])

        log = network.simulate_trade()
        calls = [call(2, a2, -1), call(2, a1, 1)]
        mi_calc.get_updated_price.assert_has_calls(calls, any_order=True)
        self.assertDictEqual({'a1': '1->1.5', 'a2': '2->1.5'}, log)
        self.assertFalse(network.buy_orders)
        self.assertFalse(network.sell_orders)
    def test_simulate_trade_buy_equals_sell(self):
        a1 = AssetFundNetwork.Asset(price=1, daily_volume=1, symbol='a1')
        a2 = AssetFundNetwork.Asset(price=2, daily_volume=1, symbol='a2')
        f1 = Fund('f1', {'a1': 10}, 100, 1, 1)
        f2 = Fund('f2', {'a2': 10}, 100, 1, 1)
        mi_calc = MarketImpactCalculator()
        mi_calc.get_updated_price = MagicMock()

        network = AssetFundNetwork.AssetFundsNetwork(funds={
            'f1': f1,
            'f2': f2
        },
                                                     assets={
                                                         'a1': a1,
                                                         'a2': a2
                                                     },
                                                     mi_calc=mi_calc,
                                                     limit_trade_step=False)
        network.submit_buy_orders([Buy('a1', 3)])
        network.submit_sell_orders([Sell('a1', 3)])
        log = network.simulate_trade()
        mi_calc.get_updated_price.assert_not_called()
        self.assertFalse(log)
        self.assertFalse(network.buy_orders)
        self.assertFalse(network.sell_orders)
        self.assertTrue(a1.price == 1)
        self.assertTrue(a2.price == 2)
示例#6
0
 def test_get_possible_attacks(self):
     a1 = AssetFundNetwork.Asset(price=1, daily_volume=10, symbol='a1')
     a1.set_price(3)
     a2 = AssetFundNetwork.Asset(price=2, daily_volume=4, symbol='a2')
     a2.set_price(4)
     a3 = AssetFundNetwork.Asset(price=7, daily_volume=2, symbol='a3')
     f1 = Fund('f1', {'a1': 10, 'a2': 10, 'a3': 10}, 100, 1, 1)
     f2 = Fund('f2', {'a1': 10}, 100, 1, 1)
     SysConfig.set("STEP_ORDER_SIZE", 0.5)
     network = AssetFundNetwork.AssetFundsNetwork(
         funds={
             'f1': f1,
             'f2': f2
         },
         assets={
             'a1': a1,
             'a2': a2,
             'a3': a3
         },
         mi_calc=MockMarketImpactTestCalculator())
     actual_orders = get_possible_attacks(network, 10)
     expected_orders = []
     expected_orders.append(([Sell('a1', 5)], 5))
     expected_orders.append(([Sell('a2', 2)], 4))
     expected_orders.append(([Sell('a3', 1)], 7))
     expected_orders.append(([Sell('a1', 5), Sell('a2', 2)], 9))
     expected_orders.append(([], 0))
     self.assertEqual(actual_orders, expected_orders)
示例#7
0
 def test_funds_under_risk(self):
     a1 = AssetFundNetwork.Asset(price=1, daily_volume=100, symbol='a1')
     a2 = AssetFundNetwork.Asset(price=2, daily_volume=200, symbol='a2')
     f1 = Fund('f1', {'a1': 10, 'a2': 10, 'a3': 10}, 100, 1, 1)
     f2 = Fund('f2', {'a1': 10}, 100, 1, 1)
     network = AssetFundNetwork.AssetFundsNetwork(
         funds={
             'f1': f1,
             'f2': f2
         },
         assets={
             'a1': a1,
             'a2': a2
         },
         mi_calc=MockMarketImpactTestCalculator())
     network.reset_order_books = MagicMock()
     network.simulate_trade = MagicMock()
     network.submit_sell_orders = MagicMock()
     network.get_funds_in_margin_calls = MagicMock(return_value=['f1'])
     actions_mgr = ActionsManager(network.assets, 0.1)
     actual_funds = actions_mgr._ActionsManager__funds_under_risk(network)
     self.assertListEqual(actual_funds, ['f1'])
     network.reset_order_books.assert_called_once()
     network.submit_sell_orders.assert_called_once_with(
         [Sell('a1', 10), Sell('a2', 20)])
     network.simulate_trade.assert_called_once()
     network.get_funds_in_margin_calls.assert_called_once()
示例#8
0
 def dont_test_get_possible_defenses(self):
     a1 = AssetFundNetwork.Asset(price=1, daily_volume=10, symbol='a1')
     a2 = AssetFundNetwork.Asset(price=2, daily_volume=4, symbol='a2')
     a3 = AssetFundNetwork.Asset(price=7, daily_volume=2, symbol='a3')
     f1 = Fund('f1', {'a1': 10, 'a2': 10, 'a3': 10}, 100, 1, 1)
     f2 = Fund('f2', {'a1': 10}, 100, 1, 1)
     SysConfig.set("ORDER_SIZES", [0.5, 1])
     network = AssetFundNetwork.AssetFundsNetwork(
         funds={
             'f1': f1,
             'f2': f2
         },
         assets={
             'a1': a1,
             'a2': a2,
             'a3': a3
         },
         mi_calc=MockMarketImpactTestCalculator())
     actual_orders = get_possible_defenses(network, 10)
     expected_orders = []
     expected_orders.append(([Buy('a1', 5)], 5))
     expected_orders.append(([Buy('a1', 10)], 10))
     expected_orders.append(([Buy('a2', 2)], 4))
     expected_orders.append(([Buy('a2', 4)], 8))
     expected_orders.append(([Buy('a3', 1)], 7))
     expected_orders.append(([Buy('a1', 5), Buy('a2', 2)], 9))
     expected_orders.append(([], 0))
     self.assertEqual(actual_orders, expected_orders)
示例#9
0
 def test_get_possible_defenses_integ(self):
     a1 = AssetFundNetwork.Asset(price=1, daily_volume=100, symbol='a1')
     a2 = AssetFundNetwork.Asset(price=2, daily_volume=100, symbol='a2')
     a3 = AssetFundNetwork.Asset(price=3, daily_volume=100, symbol='a3')
     a4 = AssetFundNetwork.Asset(price=1, daily_volume=100, symbol='a4')
     f1 = Fund('f1', {'a1': 10, 'a2': 10, 'a3': 10}, 100, 1, 1)
     f2 = Fund('f2', {'a4': 10}, 100, 1, 1)
     network = AssetFundNetwork.AssetFundsNetwork(
         funds={
             'f1': f1,
             'f2': f2
         },
         assets={
             'a1': a1,
             'a2': a2,
             'a3': a3,
             'a4': a4
         },
         mi_calc=MockMarketImpactTestCalculator())
     actions_mgr = ActionsManager(network.assets, 0.1)
     history = {BUY: {'a1': 2}, SELL: {'a1': 1, 'a2': 2}}
     budget = 20
     actions_mgr._ActionsManager__funds_under_risk = MagicMock(
         return_value=['f1'])
     actual_defenses = actions_mgr.get_possible_defenses(
         network, budget, history)
     self.assertListEqual(actual_defenses, [([Buy('a2', 10)], 20), ([], 0)])
     actions_mgr._ActionsManager__funds_under_risk.assert_called_once_with(
         network)
    def test_store_file(self):
        a1 = AssetFundNetwork.Asset(price=10, daily_volume=1, symbol='a1')
        a2 = AssetFundNetwork.Asset(price=20, daily_volume=1, symbol='a2')
        f1 = MockFund('f1', a1, 1)
        f2 = MockFund('f2', a2, 1)
        network = AssetFundNetwork.AssetFundsNetwork(
            funds={
                'f1': f1,
                'f2': f2
            },
            assets={
                'a1': a1,
                'a2': a2
            },
            mi_calc=MockMarketImpactTestCalculator())

        solver = SingleAgentDynamicProgrammingSolver(network, 40, 1, 1)
        solver.store_solution('../../../resources/test_store_file.csv')
        expected_rows = []
        for budget in [40, 30, 20, 10]:
            expected_rows.append({
                'budget':
                str(budget),
                'value':
                str(solver.solutions[2][budget].value),
                'actions':
                str(solver.solutions[2][budget].actions)
            })
        i = 0
        with open('../../../resources/test_store_file.csv',
                  newline='') as csvfile:
            reader = csv.DictReader(csvfile)
            for row in reader:
                self.assertEqual(dict(row), expected_rows[i])
                i += 1
示例#11
0
    def test_single_agent(self):
        a1 = AssetFundNetwork.Asset(price=1, daily_volume=100, symbol='a1')
        a2 = AssetFundNetwork.Asset(price=1, daily_volume=100, symbol='a1')

        f1 = AssetFundNetwork.Fund('f1', {'a2': 10}, 100, 1, 1)
        f2 = AssetFundNetwork.Fund('f2', {'a1': 20}, 100, 1, 1)
        mi_calc = MarketImpactCalculator()
        mi_calc.get_updated_price = MagicMock()
        mi_calc.get_updated_price.side_effect = update_price_side_effects
        network = AssetFundNetwork.AssetFundsNetwork(funds={
            'f1': f1,
            'f2': f2
        },
                                                     assets={
                                                         'a1': a1,
                                                         'a2': a2
                                                     },
                                                     mi_calc=mi_calc,
                                                     limit_trade_step=True)

        f1.marginal_call = MagicMock(return_value=False)
        f2.marginal_call = MagicMock()
        f2.marginal_call.side_effect = f1_margin_call_side_effect
        actions_mgr = ActionsManager(network.assets, 0.1, 2)
        result = single_agent(actions_mgr, network, 200)
        print(result.value)
        print(result.actions)
        self.assertEqual(result.value, -1)
        self.assertListEqual(result.actions, [[Sell('a1', 20)], ['MARKET']])
    def test_gen_optimal_attacks(self):
        a1 = AssetFundNetwork.Asset(price=10, daily_volume=10, symbol='a1')
        a2 = AssetFundNetwork.Asset(price=20, daily_volume=10, symbol='a2')
        f1 = MockFund('f1', a1, 1)
        f2 = MockFund('f2', a2, 1)
        f2 = MockFund('f3', a2, 1)
        network = AssetFundNetwork.AssetFundsNetwork(
            funds={
                'f1': f1,
                'f2': f2
            },
            assets={
                'a1': a1,
                'a2': a2
            },
            mi_calc=MockMarketImpactTestCalculator())

        expected_portfolio = [
            ([], 0),
            ([Sell("a1", 5)], 50),
            ([Sell("a1", 10)], 100),
            ([Sell("a2", 5)], 100),
            ([Sell("a2", 10)], 200),
            ([Sell("a1", 5), Sell("a2", 5)], 150),
            ([Sell("a1", 10), Sell("a2", 5)], 200),
        ]
示例#13
0
    def test_get_attacks_in_budget(self):
        a1 = AssetFundNetwork.Asset(price=10, daily_volume=10, symbol='a1')
        a2 = AssetFundNetwork.Asset(price=20, daily_volume=10, symbol='a2')
        f1 = MockFund('f1', a1, 1)
        f2 = MockFund('f2', a2, 1)
        network = AssetFundNetwork.AssetFundsNetwork(
            funds={
                'f1': f1,
                'f2': f2
            },
            assets={
                'a1': a1,
                'a2': a2
            },
            mi_calc=MockMarketImpactTestCalculator())

        expected_portfolio = [
            ([], 0),
            ([Sell("a1", 5)], 50),
            ([Sell("a1", 10)], 100),
            ([Sell("a2", 5)], 100),
            ([Sell("a2", 10)], 200),
            ([Sell("a1", 5), Sell("a2", 5)], 150),
            ([Sell("a1", 10), Sell("a2", 5)], 200),
        ]
        solver = SingleAgentESSolver(network, 0.5, 2)
        actual_portfolio = solver.get_attacks_in_budget(200, True)
        expected_portfolio_str = sorted([(str(x), str(y))
                                         for (x, y) in expected_portfolio])
        actual_portfolio_str = sorted([(str(x), str(y))
                                       for (x, y) in actual_portfolio])
        self.assertEqual(expected_portfolio_str, actual_portfolio_str)
示例#14
0
 def test_get_possible_defenses(self):
     a1 = AssetFundNetwork.Asset(price=1, daily_volume=10, symbol='a1')
     a2 = AssetFundNetwork.Asset(price=2, daily_volume=4, symbol='a2')
     a3 = AssetFundNetwork.Asset(price=7, daily_volume=2, symbol='a3')
     f1 = Fund('f1', {'a1': 10, 'a2': 10, 'a3': 10}, 100, 1, 1)
     f2 = Fund('f2', {'a1': 10}, 100, 1, 1)
     SysConfig.set("STEP_ORDER_SIZE", 0.5)
     network = AssetFundNetwork.AssetFundsNetwork(
         funds={
             'f1': f1,
             'f2': f2
         },
         assets={
             'a1': a1,
             'a2': a2,
             'a3': a3
         },
         mi_calc=MockMarketImpactTestCalculator())
     actual_orders = get_possible_defenses(network, 10)
     expected_orders = []
     expected_orders.append(([Buy('a1', 5)], 5))
     expected_orders.append(([Buy('a2', 2)], 4))
     expected_orders.append(([Buy('a3', 1)], 7))
     expected_orders.append(([Buy('a1', 5), Buy('a2', 2)], 9))
     expected_orders.append(([], 0))
     actual_orders.sort(key=operator.itemgetter(1))
     expected_orders.sort(key=operator.itemgetter(1))
     self.assertEqual(len(actual_orders), len(expected_orders))
     for i in range(0, len(actual_orders)):
         actual_orders[i][0].sort(key=lambda x: x.asset_symbol)
         expected_orders[i][0].sort(key=lambda x: x.asset_symbol)
         self.assertListEqual(actual_orders[i][0], expected_orders[i][0])
         self.assertEqual(actual_orders[i][1], expected_orders[i][1])
    def not_test_solver_finds_best_attack_integration(self):
        a1 = AssetFundNetwork.Asset(50, 2, 'a1')
        a2 = AssetFundNetwork.Asset(20, 2, 'a2')
        a3 = AssetFundNetwork.Asset(30, 2, 'a3')
        f1 = AssetFundNetwork.Fund('f1', {'a1': 10}, {'a2': 10}, 1000, 1, 1)
        f2 = AssetFundNetwork.Fund('f2', {'a2': 10}, {'a3': 10}, 1000, 1, 1)

        network = AssetFundNetwork.AssetFundsNetwork(funds=[f1, f2],
                                                     assets=[a1, a2, a3])

        solver = SingleAgentDynamicProgrammingSolver(network, 10, 0.5)
        print(solver.results.value)
        print(solver.results.actions)
示例#16
0
 def dont_test_get_possible_attacks_single_asset_per_attack(self):
     a1 = AssetFundNetwork.Asset(price=1, daily_volume=2, symbol='a1')
     f1 = Fund('f1', {'a1': 10}, 100, 1, 1)
     SysConfig.set("ORDER_SIZES", [0.5, 1])
     network = AssetFundNetwork.AssetFundsNetwork(
         funds={'f1': f1},
         assets={'a1': a1},
         mi_calc=MockMarketImpactTestCalculator())
     actual_sell_orders = get_possible_attacks(network, 10)
     expected_sell_orders = []
     expected_sell_orders.append(([Sell('a1', 2)], 2))
     expected_sell_orders.append(([Sell('a1', 1)], 1))
     expected_sell_orders.append(([], 0))
     self.assertEqual(actual_sell_orders, expected_sell_orders)
 def test_simulate_trade_limit_trade_step(self):
     a1 = AssetFundNetwork.Asset(price=1, daily_volume=1000, symbol='a1')
     f1 = Fund('f1', {'a1': 10}, 100, 1, 1)
     mi_calc = MarketImpactCalculator()
     mi_calc.get_updated_price = MagicMock(return_value=1.5)
     network = AssetFundNetwork.AssetFundsNetwork(funds={'f1': f1},
                                                  assets={'a1': a1},
                                                  mi_calc=mi_calc)
     SysConfig.set('TIME_STEP_MINUTES', 1)
     SysConfig.set('DAILY_PORTION_PER_MIN', 0.001)
     network.submit_buy_orders([Buy('a1', 2)])
     log = network.simulate_trade()
     self.assertDictEqual({'a1': '1->1.5'}, log)
     mi_calc.get_updated_price.assert_called_once_with(1, a1, 1)
     self.assertEqual(network.buy_orders['a1'], 1)
    def test_solution2(self):
        a1 = AssetFundNetwork.Asset(price=2, daily_volume=500, symbol='a1')
        a2 = AssetFundNetwork.Asset(price=2, daily_volume=1000, symbol='a2')
        f1 = AssetFundNetwork.Fund('f1', {'a1': 10, 'a2': 10}, 16, 1, 1)
        f2 = AssetFundNetwork.Fund('f2', {'a1': 5, 'a2': 4}, 5, 2, 0.25)
        network = AssetFundNetwork.AssetFundsNetwork(funds = {'f1':f1, 'f2':f2},
                                                     assets={'a1':a1, 'a2':a2},
                                                     mi_calc=MockMarketImpactTestCalculator(),
                                                     intraday_asset_gain_max_range=None,
                                                     limit_trade_step=False
                                                     )

        actions,cost = single_fund_attack_optimal_attack_generator(network, 'f1',
                                                                   MockMarketImpactTestCalculator(),0.25,3)
        self.assertEqual(cost, 500)
        self.assertEqual(actions, [Sell('a1', 125),Sell('a1', 125)])
示例#19
0
 def dont_test_get_possible_defenses_unit(self):
     a1 = AssetFundNetwork.Asset(price=1, daily_volume=100, symbol='a1')
     a2 = AssetFundNetwork.Asset(price=2, daily_volume=100, symbol='a2')
     a3 = AssetFundNetwork.Asset(price=3, daily_volume=100, symbol='a3')
     a4 = AssetFundNetwork.Asset(price=1, daily_volume=100, symbol='a4')
     f1 = Fund('f1', {'a1': 10, 'a2': 10, 'a3': 10}, 100, 1, 1)
     f2 = Fund('f2', {'a4': 10}, 100, 1, 1)
     network = AssetFundNetwork.AssetFundsNetwork(
         funds={
             'f1': f1,
             'f2': f2
         },
         assets={
             'a1': a1,
             'a2': a2,
             'a3': a3,
             'a4': a4
         },
         mi_calc=MockMarketImpactTestCalculator())
     actions_mgr = ActionsManager(network.assets, 0.1)
     actions_mgr.funds_under_risk = MagicMock(return_value=['f1'])
     actions_mgr.get_single_orders = MagicMock(
         return_value=[Buy('a1', 10),
                       Buy('a2', 10),
                       Buy('a3', 10)])
     expected_order_set = [[Buy('a1', 10)]]
     actions_mgr.get_defenses_in_budget = MagicMock(
         return_value=[(expected_order_set, 10)])
     history = {BUY: {'a1': 2}, SELL: {'a1': 1, 'a2': 2}}
     budget = 60
     actual_defenses = actions_mgr.get_possible_defenses(
         network, budget, history)
     self.assertListEqual(actual_defenses, [(expected_order_set, 10),
                                            ([], 0)])
     actions_mgr.funds_under_risk.assert_called_once_with(network)
     defense_assets = {
         'a2': a2,
         'a1': a1,
         'a3': a3,
     }
     actions_mgr.get_single_orders.assert_called_once_with(defense_assets)
     filtered_defenses = [Buy('a2', 10), Buy('a3', 10)]
     actions_mgr.get_defenses_in_budget.assert_called_once_with(
         defense_assets, filtered_defenses)
    def test_order_limited_by_parameter(self):
        a1 = AssetFundNetwork.Asset(price=1, daily_volume=1, symbol='a1')
        a2 = AssetFundNetwork.Asset(price=2, daily_volume=2, symbol='a2')
        f1 = MockFund(symbol='f1', my_asset=a1, margin_ratio=0.9)
        f2 = MockFund(symbol='f2', my_asset=a2, margin_ratio=0.9)
        network = AssetFundNetwork.AssetFundsNetwork(
            funds={
                'f1': f1,
                'f2': f2
            },
            assets={
                'a1': a1,
                'a2': a2
            },
            mi_calc=MockMarketImpactTestCalculator())

        solver = SingleAgentDynamicProgrammingSolver(network, 4, 0.5, 2)
        self.assertEqual(solver.results.value, 1)
        self.assertEqual(solver.results.actions[0], Sell('a2', 2))
    def test_gen_weights(self):
        a1 = AssetFundNetwork.Asset(price=1, daily_volume=10, symbol='a1')
        a2 = AssetFundNetwork.Asset(price=2, daily_volume=4, symbol='a2')
        f1 = MockFund('f1', a1, 1)
        f2 = MockFund('f2', a2, 1)
        network = AssetFundNetwork.AssetFundsNetwork(
            funds={
                'f1': f1,
                'f2': f2
            },
            assets={
                'a1': a1,
                'a2': a2
            },
            mi_calc=MockMarketImpactTestCalculator())

        solver = SingleAgentDynamicProgrammingSolver(network, 4, 0.5, 1)
        self.assertEqual(solver.weights[1], 5)
        self.assertEqual(solver.weights[2], 4)
    def test_2(self):
        a1 = AssetFundNetwork.Asset(price=1, daily_volume=1, symbol='a1')
        a2 = AssetFundNetwork.Asset(price=2, daily_volume=1, symbol='a2')
        f1 = MockFund('f1', a1, 1)
        f2 = MockFund('f2', a2, 1)
        network = AssetFundNetwork.AssetFundsNetwork(
            funds={
                'f1': f1,
                'f2': f2
            },
            assets={
                'a1': a1,
                'a2': a2
            },
            mi_calc=MockMarketImpactTestCalculator())

        solver = SingleAgentDynamicProgrammingSolver(network, 3, 1, 1)
        self.assertEqual(solver.results.value, 2)
        self.assertEqual(solver.results.actions[0], Sell('a1', 1))
        self.assertEqual(solver.results.actions[1], Sell('a2', 1))
示例#23
0
    def test_minimax(self):
        a1 = AssetFundNetwork.Asset(price=100, daily_volume=390, symbol='a1')
        f1 = MockFund('f1', a1, 0.82)
        SysConfig.set("STEP_ORDER_SIZE", 2 / 390)
        SysConfig.set("TIME_STEP_MINUTES", 1)
        SysConfig.set('DAILY_PORTION_PER_MIN', 1 / 390)
        network = AssetFundNetwork.AssetFundsNetwork(
            funds={'f1': f1},
            assets={'a1': a1},
            mi_calc=MockMarketImpactTestCalculator(),
            limit_trade_step=True)

        #   value, actions, actual_tree = minimax(ROOT_ATTACKER, network, 205,190)
        actions_mgr = ActionsManager(network.assets, 2 / 390, 1)
        result = minimax(actions_mgr, ATTACKER, network, 205, 190, True)
        expected_tree = self.gen_tree()

        print(result.value)
        print(result.actions)
        self.compare_trees(result.tree, expected_tree)
        self.assertEqual(int(result.network.assets['a1'].price), 100)
示例#24
0
    def run_one_time_attack_tree_test(self, pruning=False):
        a1 = AssetFundNetwork.Asset(price=100, daily_volume=390, symbol='a1')
        a2 = AssetFundNetwork.Asset(price=100, daily_volume=390, symbol='a2')
        f1 = MockFund('f1', a1, 0.82)
        f2 = MockFund('f2', a2, 0.82)
        f3 = MockFund('f3', a2, 0.82)
        SysConfig.set("STEP_ORDER_SIZE", 2 / 390)
        SysConfig.set("TIME_STEP_MINUTES", 1)
        SysConfig.set('DAILY_PORTION_PER_MIN', 1 / 390)
        SysConfig.set("MAX_NUM_ORDERS", 1)
        network = AssetFundNetwork.AssetFundsNetwork(
            funds={
                'f1': f1,
                'f2': f2,
                'f3': f3
            },
            assets={
                'a1': a1,
                'a2': a2
            },
            mi_calc=MockMarketImpactTestCalculator(),
            limit_trade_step=True)

        #   value, actions, actual_tree = minimax(ROOT_ATTACKER, network, 205,190)
        actions_mgr = ActionsManager(network.assets, 2 / 390, 1)
        if pruning:
            result = alphabeta(actions_mgr, ATTACKER, network, 405, 190,
                               (-inf, inf), (inf, inf), True)
        else:
            result = minimax2(actions_mgr, ATTACKER, network, 405, 190, True)
        expected_tree = self.gen_tree2()

        print(result.value)
        print(result.actions)
        self.compare_trees(result.tree, expected_tree)
        self.assertEqual(int(result.network.assets['a1'].price), 81)
        self.assertEqual(int(result.network.assets['a2'].price), 99)
        self.assertEqual(int(network.assets['a1'].price), 100)
        self.assertEqual(int(network.assets['a2'].price), 100)
示例#25
0
 def test_gen_optimal_attacks(self):
     a1 = AssetFundNetwork.Asset(price=10, daily_volume=10, symbol='a1')
     a2 = AssetFundNetwork.Asset(price=20, daily_volume=10, symbol='a2')
     f1_margin_call = lambda assets: assets['a1'].price <= 8
     f2_margin_call = lambda assets: assets['a2'].price <= 19
     f3_margin_call = lambda assets: assets['a2'].price <= 19
     mi_calc = MockMarketImpactTestCalculator({
         'a1': {
             5: 9,
             10: 8
         },
         'a2': {
             5: 19,
             10: 18
         }
     })
     f1 = MockFund('f1', a1, f1_margin_call)
     f2 = MockFund('f2', a2, f2_margin_call)
     f3 = MockFund('f3', a2, f3_margin_call)
     network = AssetFundNetwork.AssetFundsNetwork(funds={
         'f1': f1,
         'f2': f2,
         'f3': f3
     },
                                                  assets={
                                                      'a1': a1,
                                                      'a2': a2
                                                  },
                                                  mi_calc=mi_calc,
                                                  limit_trade_step=False)
     solver = SingleAgentESSolver(network, 0.5, 2)
     actual_solutions = solver.gen_optimal_attacks()
     solution_2 = Solution(network, [Sell('a2', 5)], 2, ['f2', 'f3'], 100)
     solution_3 = Solution(network,
                           [Sell('a1', 10), Sell('a2', 5)], 3,
                           ['f1', 'f2', 'f3'], 200)
     expected_solutions = {1: solution_2, 2: solution_2, 3: solution_3}
     self.assertEqual(expected_solutions, actual_solutions)
 def test_reset_books(self):
     a1 = AssetFundNetwork.Asset(price=1, daily_volume=1, symbol='a1')
     a2 = AssetFundNetwork.Asset(price=2, daily_volume=1, symbol='a2')
     f1 = Fund('f1', {'a1': 10}, 100, 1, 1)
     f2 = Fund('f2', {'a2': 10}, 100, 1, 1)
     network = AssetFundNetwork.AssetFundsNetwork(
         funds={
             'f1': f1,
             'f2': f2
         },
         assets={
             'a1': a1,
             'a2': a2
         },
         mi_calc=MockMarketImpactTestCalculator(),
         limit_trade_step=True)
     network.submit_buy_orders([Buy('a1', 2)])
     network.submit_sell_orders([Sell('a1', 2)])
     self.assertTrue(network.sell_orders)
     self.assertTrue(network.buy_orders)
     network.reset_order_books()
     self.assertFalse(network.sell_orders)
     self.assertFalse(network.buy_orders)