Example #1
0
def run_experiments(network,
                    lower_bound,
                    jump,
                    upper_bound,
                    dirname,
                    iterations=1000):
    filename = dirname + '//all_algs_results.json'
    if os.path.exists(filename):
        os.remove(filename)

    defender_budget = lower_bound
    ratios = [0.75, 1, 1.25, 1.5]
    initial_netowork = copy.deepcopy(network)
    cfr_actions_mgr = ActionsManager(network.assets,
                                     SysConfig.get("STEP_ORDER_SIZE"), 1)
    minimax_actions_mgr = ActionsManager(network.assets,
                                         SysConfig.get("STEP_ORDER_SIZE"), 2)
    while defender_budget <= upper_bound:
        attacker_budgets = [int(defender_budget * r) for r in ratios]
        minimax_results = run_minimax_experiments_for_defender_budget(
            minimax_actions_mgr, network, defender_budget, "minimax",
            attacker_budgets)
        cfr_results = compute_cfr_equilibrium(cfr_actions_mgr, network,
                                              defender_budget,
                                              attacker_budgets, iterations)
        update_result_file(defender_budget, attacker_budgets, minimax_results,
                           cfr_results, filename)
        defender_budget += jump
Example #2
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])
Example #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)))
Example #4
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)
Example #5
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)
    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)
Example #7
0
 def __init__(self, price, daily_volume, symbol, volatility = 0):
     self.zero_time_price = price
     self.price = price
     self.daily_volume = daily_volume
     self.avg_minute_volume = daily_volume/MINUTES_IN_TRADING_DAY
     self.symbol = symbol
     self.volatility = volatility
     self.max_shares_to_trade_in_ts = ceil(SysConfig.get('TIME_STEP_MINUTES')\
                                   *SysConfig.get('DAILY_PORTION_PER_MIN')*daily_volume)
Example #8
0
 def test_gen_liquidation_orders(self):
     SysConfig.set("MINUTE_VOLUME_LIMIT", 0.1)
     assets = {
         'XXX': Asset(2, 3900, 1.5, 'XXX'),
         'YYY': Asset(1, 7900, 1.5, 'yyy'),
         'ZZZ': Asset(1, 7900, 1.5, 'yyy')
     }
     fund = Fund('F1', {'XXX': 10, 'YYY': 11, 'ZZZ': 2}, 5, 2, 0.25)
     expected_orders = [Sell('XXX', 1), Sell('YYY', 2), Sell('ZZZ', 2)]
     expected_portfolio = {'XXX': 9, 'YYY': 9}
     orders = fund.gen_liquidation_orders(assets)
     self.assertEqual(orders, expected_orders)
     self.assertEqual(fund.portfolio, expected_portfolio)
Example #9
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)
Example #11
0
 def get_single_orders_multiple_options(self, gen_order_func):
     orders = []
     for asset in self.assets.values():
         for size in SysConfig.get('ORDER_SIZES'):
             order = gen_order_func(asset, size)
             orders.append(order)
     return orders
Example #12
0
def run_csv_exps():
    dt = datetime.today()
    dt = str(dt).split(' ')[0]
    res_dir = '../../results/stats/' + dt.replace(":", "_").replace(" ",
                                                                    "_") + '/'
    if not os.path.exists(res_dir):
        os.mkdir(res_dir)
    exp_params = {
        'defender_budget': 2000000000,
        'attacker_budgets': [4000000000, 6000000000],
        'main_game_iteration_portion': 0.9,
        'min_iterations': 10,
        'max_iterations': 100,
        'jump': 10,
        'num_assets': 3,
        'step_order_size': SysConfig.get("STEP_ORDER_SIZE") * 2,
        'max_order_num': 1
    }

    with open(res_dir + 'params.json', 'w') as fp:
        json.dump(exp_params, fp)

    compute_node_size_csv(res_dir=res_dir,
                          max_num_attackers=4,
                          max_num_portfolios=4,
                          portfolio_size=10)
    count_game_nodes_csv(res_dir=res_dir,
                         defender_budget=exp_params['defender_budget'],
                         attacker_budgets=exp_params['attacker_budgets'],
                         max_num_assets=4)
    def test_flash_crash_split_eq_ppa_cfr(self):
        exp_params = {
            'defender_budget': 2000000000,
            'attacker_budgets': [4000000000, 6000000000],
            'main_game_iteration_portion': 0.9,
            'min_iterations': 10,
            'max_iterations': 100,
            'jump': 10,
            'num_assets': 3,
            'step_order_size': SysConfig.get("STEP_ORDER_SIZE") * 2,
            'max_order_num': 1
        }
        network = get_network_from_dir('../resources/three_assets_net')
        network.limit_trade_step = True
        main_game_results, selector_game_result = self.get_flash_crash_split_cfr_eq(
            exp_params['defender_budget'], exp_params['attacker_budgets'],
            network, exp_params['step_order_size'],
            exp_params['max_order_num'], 8, 20)

        vanilla_actions_mgr = ActionsManager(
            assets=network.assets,
            step_order_size=exp_params['step_order_size'],
            max_order_num=exp_params['max_order_num'],
            attacker_budgets=exp_params['attacker_budgets'])

        network.limit_trade_step = True
        root = PPAFlashCrashRootChanceGameState(
            action_mgr=vanilla_actions_mgr,
            af_network=network,
            defender_budget=exp_params['defender_budget'],
            attacker_budgets=exp_params['attacker_budgets'])

        vanilla_results = compute_complete_game_equilibrium(
            root, exp_params['attacker_budgets'], 30)

        # print(vanilla_results)
        # print(eq_split)
        print('PPA')
        print('defender = ' + str(vanilla_results['defender']))
        print('attackers = ' + str(vanilla_results['attackers']))
        print('sigma = ' + str(vanilla_results['sigma']))
        print('Split')
        print('defender = ' + str(selector_game_result['defender']))
        print('attackers = ' + str(selector_game_result['attackers']))
        print('sigma = ' + str(selector_game_result['sigma']))
        self.assertTrue(
            numpy.isclose(float(vanilla_results['defender']),
                          float(selector_game_result['defender']),
                          rtol=0.01,
                          atol=0.01,
                          equal_nan=False))
        for at in exp_params['attacker_budgets']:
            self.assertTrue(
                numpy.isclose(float(vanilla_results['attackers'][at]),
                              float(selector_game_result['attackers'][at]),
                              rtol=0.01,
                              atol=0.01,
                              equal_nan=False))
            self.assertDictEqual(vanilla_results['sigma'][at],
                                 selector_game_result['sigma'][at])
Example #14
0
    def simulate_trade(self):
        log = {}
        order_keys = set(self.sell_orders.keys())
        order_keys.update(self.buy_orders.keys())
        for order_key in order_keys:
            if not order_key: #empty order
                continue
            buy = self.buy_orders[order_key] if order_key in self.buy_orders else 0
            sell = self.sell_orders[order_key] if order_key in self.sell_orders else 0
            balance = buy - sell
            if balance == 0:
                del self.buy_orders[order_key]
                del self.sell_orders[order_key]
                continue
            if self.limit_trade_step:
                max_shares_to_trade_in_ts = ceil(SysConfig.get('TIME_STEP_MINUTES')\
                                      *SysConfig.get('DAILY_PORTION_PER_MIN')* self.assets[order_key].daily_volume)
                #max_shares_to_trade = self.assets[order_key].max_shares_to_trade_in_ts
                shares_to_trade = min(abs(balance), max_shares_to_trade_in_ts)
            else:
                shares_to_trade = abs(balance)

            if balance < 0: #sell > buy
                self.sell_orders[order_key] -= (shares_to_trade + buy)
                if self.sell_orders[order_key] == 0:
                    del self.sell_orders[order_key]
                if buy > 0:
                    del self.buy_orders[order_key]
                sign = -1
            else:
                self.buy_orders[order_key] -= (shares_to_trade + sell)
                if self.buy_orders[order_key] == 0:
                    del self.buy_orders[order_key]
                if sell > 0:
                    del self.sell_orders[order_key]
                sign = 1
            updated_price  = self.mi_calc.get_updated_price(shares_to_trade, self.assets[order_key], sign)
            log[order_key] = '{0}->{1}'.format(self.assets[order_key].price, updated_price)
            self.assets[order_key].price = updated_price
        return log
Example #15
0
def count_game_states_old(game_network, lower_bound, ratios, network):
    network.limit_trade_step = True
    defender_budget = lower_bound
    actions_mgr = ActionsManager(network.assets,
                                 SysConfig.get("STEP_ORDER_SIZE"), 1)
    initial_network = copy.deepcopy(game_network)
    attacker_budgets = [int(defender_budget * r) for r in ratios]
    root = FlashCrashRootChanceGameState(action_mgr=actions_mgr,
                                         af_network=initial_network,
                                         defender_budget=defender_budget,
                                         attacker_budgets=attacker_budgets)
    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)))
Example #16
0
 def gen_liquidation_orders(self, assets: Dict[str, Asset]):
     orders = []
     assets_to_remove = []
     for asset_symbol, num_shares in self.portfolio.items():
         asset = assets[asset_symbol]
         shares_limit = floor(asset.avg_minute_volume * SysConfig.get("MINUTE_VOLUME_LIMIT"))
         shares_to_sell = min(shares_limit, num_shares)
         orders.append(Sell(asset_symbol, shares_to_sell))
         self.portfolio[asset_symbol] -= shares_to_sell
         if self.portfolio[asset_symbol] == 0:
             assets_to_remove.append(asset_symbol)
     for asset_symbol in assets_to_remove:
         self.portfolio.pop(asset_symbol)
     return orders
    def test_flash_crash_split_eq_cfr(self):
        exp_params = {
            'defender_budget': 2000000000,
            'attacker_budgets': [4000000000, 6000000000],
            'main_game_iteration_portion': 0.9,
            'min_iterations': 10,
            'max_iterations': 100,
            'jump': 10,
            'num_assets': 3,
            'step_order_size': SysConfig.get("STEP_ORDER_SIZE") * 2,
            'max_order_num': 1
        }
        network = get_network_from_dir('../resources/three_assets_net')
        network.limit_trade_step = True
        (main_game_results,
         selector_game_result) = self.get_flash_crash_split_cfr_eq(
             exp_params['defender_budget'], exp_params['attacker_budgets'],
             network, exp_params['step_order_size'],
             exp_params['max_order_num'], 800, 200)

        vanilla_actions_mgr = ActionsManager(
            assets=network.assets,
            step_order_size=exp_params['step_order_size'],
            max_order_num=exp_params['max_order_num'])
        vanilla_results = compute_cfr_equilibrium(
            vanilla_actions_mgr, network, exp_params['defender_budget'],
            exp_params['attacker_budgets'], 1000)
        print('Vanilla')
        print('defender = ' + str(vanilla_results['defender']))
        print('attackers = ' + str(vanilla_results['attackers']))
        print('Split')
        print('defender = ' + str(selector_game_result['defender']))
        print('attackers = ' + str(selector_game_result['attackers']))
        self.assertTrue(
            numpy.isclose(float(vanilla_results['defender']),
                          float(selector_game_result['defender']),
                          rtol=0.01,
                          atol=0.01,
                          equal_nan=False))
        for at in exp_params['attacker_budgets']:
            self.assertTrue(
                numpy.isclose(float(vanilla_results['attackers'][at]),
                              float(selector_game_result['attackers'][at]),
                              rtol=0.01,
                              atol=0.01,
                              equal_nan=False))
Example #18
0
def run_csv_exps():
    dt = datetime.today()
    dt = str(dt).split(' ')[0]
    res_dir = '../../results/stats/' + dt.replace(":", "_").replace(" ",
                                                                    "_") + '/'
    if not os.path.exists(res_dir):
        os.mkdir(res_dir)
    exp_params = {
        'defender_budget': 2000000000,
        'attacker_budgets': [4000000000, 6000000000],
        'main_game_iteration_portion': 0.8,
        'min_iterations': 10,
        'max_iterations': 1000,
        'jump': 10,
        'num_assets': 3,
        'step_order_size': SysConfig.get("STEP_ORDER_SIZE"),
        'max_order_num': 1
    }

    with open(res_dir + 'params.json', 'w') as fp:
        json.dump(exp_params, fp)
    iteration_stats_csv(
        res_dir=res_dir,
        defender_budget=exp_params['defender_budget'],
        attacker_budgets=exp_params['attacker_budgets'],
        main_game_iteration_portion=exp_params['main_game_iteration_portion'],
        min_iterations=exp_params['min_iterations'],
        max_iterations=exp_params['max_iterations'],
        jump=exp_params['jump'],
        num_assets=3,
        step_order_size=exp_params['step_order_size'],
        max_order_num=exp_params['max_order_num'])

    return
    iteration_stats_assets_csv(
        res_dir=res_dir,
        defender_budget=exp_params['defender_budget'],
        attacker_budgets=exp_params['attacker_budgets'],
        main_game_iteration_portion=exp_params['main_game_iteration_portion'],
        min_iterations=exp_params['min_iterations'],
        max_iterations=exp_params['max_iterations'],
        jump=exp_params['jump'],
        num_assets_range=range(2, 4),
        step_order_size=exp_params['step_order_size'],
        max_order_num=exp_params['max_order_num'])
Example #19
0
def run_flash_crash_csv_exps():
    res_dir = setup_dir('flash_crash')
    exp_params = {
        'main_game_iteration_portion': 1.0,
        'min_iterations': 100,
        'max_iterations': 1100,
        'game_size': 3,
        'jump': 100,
        'defender_budget': 2000000000,
        #'attacker_budgets': [4000000000, 6000000000,  8000000000 ],
        'attacker_budgets': [4000000000, 8000000000, 12000000000],
        'step_order_size': SysConfig.get("STEP_ORDER_SIZE") * 2,
        'max_order_num': 1
    }

    with open(res_dir + 'params.json', 'w') as fp:
        json.dump(exp_params, fp)

    root_generator = FlashCrashRootGenerator(exp_params)

    iteration_stats_csv(
        res_dir=res_dir,
        root_generator=root_generator,
        params=exp_params,
        main_game_iteration_portion=exp_params['main_game_iteration_portion'],
        min_iterations=exp_params['min_iterations'],
        max_iterations=exp_params['max_iterations'],
        jump=exp_params['jump'],
        game_size=exp_params['game_size'],
        game_name='flash_crash')

    return
    iteration_stats_csv(
        res_dir=res_dir,
        root_generator=root_generator,
        params=exp_params,
        main_game_iteration_portion=exp_params['main_game_iteration_portion'],
        min_iterations=exp_params['min_iterations'],
        max_iterations=exp_params['max_iterations'],
        jump=exp_params['jump'],
        game_size=exp_params['num_assets'],
        game_name='flash_crash')
Example #20
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)
def count_flash_crash_game_nodes():
    #    dt = datetime.today()
    #    dt = str(dt).split(' ')[0]
    #    res_dir = '../../results/stats/' + dt.replace(":", "_").replace(" ", "_") + '/'
    #   if not os.path.exists(res_dir):
    #       os.mkdir(res_dir)
    res_dir = setup_dir('flash_crash')
    exp_params = {
        'defender_budget': 2000000000,
        'attacker_budgets': [4000000000, 6000000000],
        'step_order_size': SysConfig.get("STEP_ORDER_SIZE"),
        'max_order_num': 1
    }

    root_generator = FlashCrashRootGenerator(exp_params)
    count_game_nodes_csv(root_generator=root_generator,
                         res_dir=res_dir,
                         game_size_range=range(3, 6),
                         params=exp_params,
                         game_name='flash_crash',
                         game_size_fields_name='num_assets')
Example #22
0
def count_game_nodes_csv(res_dir,
                         defender_budget,
                         attacker_budgets,
                         max_num_assets,
                         num_exp=10):
    results = []
    for i in range(1, max_num_assets + 1):
        print('num assets = ' + str(i))
        dirname, network = gen_new_network(i)
        network.limit_trade_step = True
        step_order_size = SysConfig.get("STEP_ORDER_SIZE")
        max_order_num = 1
        print(str(datetime.now()) + ': split')
        split = count_portfolios_nodes(defender_budget=defender_budget,
                                       attacker_budgets=attacker_budgets,
                                       network=network,
                                       step_order_size=step_order_size,
                                       max_order_num=max_order_num)
        print(str(datetime.now()) + ': vanilla')
        vanilla = count_ppa_nods(defender_budget=defender_budget,
                                 attacker_budgets=attacker_budgets,
                                 network=network,
                                 step_order_size=step_order_size,
                                 max_order_num=max_order_num)

        results.append({
            'num_assets': str(i),
            'vanilla_cfr': vanilla,
            'split_cfr': split
        })

    with open(res_dir + 'count_game_nodes_ppa.csv', 'w',
              newline='') as csvfile:
        writer = csv.DictWriter(
            csvfile, fieldnames=['num_assets', 'vanilla_cfr', 'split_cfr'])
        writer.writeheader()
        for row in results:
            writer.writerow(row)
Example #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)
Example #24
0
 def __init__(self):
     sc = SysConfig()
     self._conn = sqlite3.connect(sc.getdatabasefiename())
     self._c = self._conn.cursor()
Example #25
0
 def __init__(self):
     xml = SimpleXML(Path.executeDirectory())
     try:
         self.__lngSect = xml.openSection(SysConfig().lngFile)
     except Exception, err:
         raise err
Example #26
0
def get_single_orders(assets, gen_order_func):
    orders = []
    for asset in assets.values():
        order = gen_order_func(asset, SysConfig.get('STEP_ORDER_SIZE'))
        orders.append(order)
    return orders