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)
コード例 #2
0
    def get_flash_crash_split_cfr_eq(self,
                                     defender_budget,
                                     attacker_budgets,
                                     network,
                                     step_order_size,
                                     max_order_num,
                                     iterations1,
                                     iterations2,
                                     game_2_pure=False):
        network.limit_trade_step = True
        # assets, step_order_size, max_order_num=1, attacker_budgets
        cfr_actions_mgr = ActionsManager(assets=network.assets,
                                         step_order_size=step_order_size,
                                         max_order_num=max_order_num,
                                         attacker_budgets=attacker_budgets)

        split_game_cfr = SplitGameCFR()

        root = PortfolioFlashCrashRootChanceGameState(
            action_mgr=cfr_actions_mgr,
            af_network=network,
            defender_budget=defender_budget)

        run_results = split_game_cfr.run(
            main_game_root=root,
            attacker_types=attacker_budgets,
            game1_iterations=iterations1,
            game2_iterations=iterations2,
            attacks_in_budget_dict=cfr_actions_mgr.
            get_portfolios_in_budget_dict(),
            subgame_keys=cfr_actions_mgr.get_portfolios().keys(),
            game_2_pure=game_2_pure)

        return run_results
コード例 #3
0
def count_game_states(game_network, lower_bound, ratios, portfolios=False):
    game_network.limit_trade_step = True
    defender_budget = lower_bound
    initial_network = copy.deepcopy(game_network)
    attacker_budgets = [int(defender_budget * r) for r in ratios]
    if portfolios:
        actions_mgr = ActionsManager(
            assets=game_network.assets,
            step_order_size=SysConfig.get("STEP_ORDER_SIZE"),
            max_order_num=1,
            attacker_budgets=attacker_budgets)
        root = PortfolioFlashCrashRootChanceGameState(
            action_mgr=actions_mgr,
            af_network=initial_network,
            defender_budget=defender_budget)
    else:
        actions_mgr = ActionsManager(game_network.assets,
                                     SysConfig.get("STEP_ORDER_SIZE"), 1)
        root = FlashCrashRootChanceGameState(action_mgr=actions_mgr,
                                             af_network=initial_network,
                                             defender_budget=defender_budget,
                                             attacker_budgets=attacker_budgets)
    print(count(root, 0))
    print('num_states =%d, num_assets=%d, num_funds = %d, num_attackers = %d' %
          (root.tree_size, len(game_network.assets), len(
              game_network.funds), len(ratios)))
コード例 #4
0
def get_split_cfr_exploitabilty(defender_budget, attacker_budgets, network,
                                step_order_size, max_order_num, iterations,
                                main_game_iteration_portion):
    network.limit_trade_step = True
    # assets, step_order_size, max_order_num=1, attacker_budgets
    cfr_actions_mgr = ActionsManager(assets=network.assets,
                                     step_order_size=step_order_size,
                                     max_order_num=max_order_num,
                                     attacker_budgets=attacker_budgets)

    split_game_cfr = SplitGameCFR()

    root = PortfolioFlashCrashRootChanceGameState(
        action_mgr=cfr_actions_mgr,
        af_network=network,
        defender_budget=defender_budget)

    (main_game_results, selector_game_result) = split_game_cfr.run(
        main_game_root=root,
        attacker_types=attacker_budgets,
        game1_iterations=ceil(iterations * main_game_iteration_portion),
        game2_iterations=ceil(iterations * (1 - main_game_iteration_portion)),
        attacks_in_budget_dict=cfr_actions_mgr.get_portfolios_in_budget_dict(),
        subgame_keys=cfr_actions_mgr.get_portfolios().keys())

    return main_game_results['exploitability'] + selector_game_result[
        'exploitability']
コード例 #5
0
    def _gen_split_main_game_root(self, network):
        self.split_actions_mgr = ActionsManager(assets=network.assets,
                                                step_order_size=self.params['step_order_size'],
                                                max_order_num=self.params['max_order_num'],
                                                attacker_budgets=self.params['attacker_budgets'])

        self.split_root = PortfolioFlashCrashRootChanceGameState(action_mgr=self.split_actions_mgr, af_network=network,
                                                                 defender_budget=self.params['defender_budget'])
コード例 #6
0
def count_portfolios_nodes(defender_budget, attacker_budgets, network,
                           step_order_size, max_order_num):
    split_actions_mgr = ActionsManager(assets=network.assets,
                                       step_order_size=step_order_size,
                                       max_order_num=max_order_num,
                                       attacker_budgets=attacker_budgets)

    root = PortfolioFlashCrashRootChanceGameState(
        action_mgr=split_actions_mgr,
        af_network=network,
        defender_budget=defender_budget)
    dummy_utilities = {
        pid: 0
        for pid in split_actions_mgr.get_probable_portfolios().keys()
    }
    p_selector_root = SelectorRootChanceGameState(
        attacker_budgets, dummy_utilities,
        split_actions_mgr.get_portfolios_in_budget_dict())
    return root.tree_size + p_selector_root.tree_size