def test_encode_decode_network(self):
     network = AssetFundsNetwork.generate_random_network(
         0.5, 3, 2, [1] * 3, [2] * 3, [1] * 2, [2] * 3, [1] * 3, [1.5] * 3,
         ExponentialMarketImpactCalculator(1))
     network.save_to_file('../../../resources/encoding_decoding_test.json')
     decoded_network = AssetFundsNetwork.load_from_file(
         '../../../resources/encoding_decoding_test.json',
         ExponentialMarketImpactCalculator(1))
     self.assertEqual(network, decoded_network)
    def test_generate_random_network(self):
        num_funds = 3
        num_assets = 2

        assets_num_shares = [3, 4]
        initial_prices = [1, 2]
        volatility = [1.5, 1]

        initial_capitals = [100, 200, 300]
        initial_leverages = [1, 2, 3]
        tolerances = [4, 5, 6]

        g = AssetFundsNetwork.generate_random_network(
            0.5, num_funds, num_assets, initial_capitals, initial_leverages,
            initial_prices, tolerances, assets_num_shares, volatility,
            ExponentialMarketImpactCalculator(1))
        assets = g.assets
        funds = g.funds
        self.assertEqual(len(assets), num_assets)
        self.assertEqual(len(funds), num_funds)
        for i in range(len(assets)):
            asset = assets['a' + str(i)]
            self.assertEqual(initial_prices[i], asset.price)
            self.assertEqual(assets_num_shares[i], asset.daily_volume)
            self.assertEqual(volatility[i], asset.volatility)
        for i in range(len(funds)):
            fund = funds['f' + str(i)]
            self.assertEqual(initial_capitals[i], fund.initial_capital)
            self.assertEqual(initial_leverages[i], fund.initial_leverage)
            self.assertEqual(tolerances[i], fund.tolerance)
示例#3
0
def gen_network_nonuniform_funds(game_config, num_assets, assets_file,
                                 dir_name, num_low_risk, num_medium_risk,
                                 num_high_risk):
    game_config.num_assets = 10
    game_config.num_funds = num_low_risk + num_medium_risk + num_high_risk
    initial_capitals, initial_leverages, tolerances = gen_funds_parameters(
        num_low_risk, num_medium_risk, num_high_risk, game_config)
    #config.initial_fund_capital = 1000000
    # = [game_config.initial_fund_capital] * game_config.num_funds
    #initial_leverages = [game_config.initial_leverage] * game_config.num_funds
    #tolerances = [game_config.tolerance] * game_config.num_funds

    network = AssetFundsNetwork.generate_random_funds_network(
        density=game_config.density,
        num_funds=game_config.num_funds,
        initial_capitals=initial_capitals,
        initial_leverages=initial_leverages,
        tolerances=tolerances,
        num_assets=num_assets,
        assets_file=assets_file,
        mi_calc=ExponentialMarketImpactCalculator(
            game_config.impact_calc_constant))
    network.save_to_file(dir_name + 'network.json')

    return network
    def test_generate_network_from_graph(self):
        num_funds = 2
        num_assets = 2
        daily_volumes = [3, 4]
        volatility = [1.5, 1, 1.1]
        initial_prices = [1, 2]
        initial_capitals = [100, 200]
        initial_leverages = [1, 2]
        tolerances = [4, 5]
        investment_proportions = {'f0': [0.6, 0.4], 'f1': [1.0]}
        g = nx.DiGraph()
        g.add_nodes_from([0, 1, 2, 3])
        g.add_edges_from([(0, 2), (0, 3), (1, 3)])
        network = AssetFundsNetwork.gen_network_from_graph(
            g=g,
            investment_proportions=investment_proportions,
            initial_capitals=initial_capitals,
            initial_leverages=initial_leverages,
            assets_initial_prices=initial_prices,
            tolerances=tolerances,
            daily_volumes=daily_volumes,
            volatility=volatility,
            mi_calc=ExponentialMarketImpactCalculator(1))
        assets = network.assets
        funds = network.funds
        self.assertEqual(len(assets), num_assets)
        self.assertEqual(len(funds), num_funds)
        for i in range(len(assets)):
            asset = assets['a' + str(i)]
            self.assertEqual(initial_prices[i], asset.price)
            self.assertEqual(daily_volumes[i], asset.daily_volume)
            self.assertEqual(volatility[i], asset.volatility)
        for i in range(len(funds)):
            fund = funds['f' + str(i)]
            self.assertEqual(initial_capitals[i], fund.initial_capital)
            self.assertEqual(initial_leverages[i], fund.initial_leverage)
            self.assertEqual(tolerances[i], fund.tolerance)
        prot0 = funds['f0'].portfolio
        self.assertEqual(len(prot0.items()), 2)
        self.assertEqual(prot0['a0'], 120)
        self.assertEqual(prot0['a1'], 40)

        prot1 = funds['f1'].portfolio
        self.assertEqual(len(prot1.items()), 1)
        self.assertEqual(prot1['a1'], 300)
        self.assertTrue('a0' not in prot1)
def main():
    assets_num_shares = [5, 5]
    volatility = [1.5, 1, 1.1]
    initial_prices = [1, 2]
    initial_capitals = [100, 200]
    initial_leverages = [1, 2]
    tolerances = [4, 5]
    investment_proportions = {'f0': [0.6, 0.4], 'f1': [1.0]}
    g = nx.DiGraph()
    g.add_nodes_from([0, 1, 2, 3])
    g.add_edges_from([(0, 2), (0, 3), (1, 3)])
    network = AssetFundNetwork.AssetFundsNetwork.gen_network_from_graph(
        g, investment_proportions, initial_capitals, initial_leverages,
        initial_prices, tolerances, assets_num_shares, volatility,
        ExponentialMarketImpactCalculator(1))

    solver = SingleAgentDynamicProgrammingSolver(network, 10000000, 0.5)
    print(solver.results.value)
    print(solver.results.actions)
    def test_gen_network_from_graph_with_assets(self):
        num_funds = 2
        assets = {
            'A1': Asset(price=1, daily_volume=3, symbol='A1', volatility=1.5),
            'A2': Asset(price=2, daily_volume=4, symbol='A2', volatility=1)
        }
        initial_capitals = [100, 200]
        initial_leverages = [1, 2]
        tolerances = [4, 5]
        investment_proportions = {'f0': [0.6, 0.4], 'f1': [1.0]}
        g = nx.DiGraph()
        g.add_nodes_from([0, 1, 2, 3])
        g.add_edges_from([(0, 2), (0, 3), (1, 3)])
        network = AssetFundsNetwork.gen_network_from_graph_with_assets(
            g=g,
            investment_proportions=investment_proportions,
            initial_capitals=initial_capitals,
            initial_leverages=initial_leverages,
            tolerances=tolerances,
            assets=assets,
            mi_calc=ExponentialMarketImpactCalculator(1))
        assets = network.assets
        funds = network.funds
        self.assertEqual(len(assets), 2)
        self.assertEqual(len(funds), num_funds)
        self.assertTrue((network.assets, assets))
        for i in range(len(funds)):
            fund = funds['f' + str(i)]
            self.assertEqual(initial_capitals[i], fund.initial_capital)
            self.assertEqual(initial_leverages[i], fund.initial_leverage)
            self.assertEqual(tolerances[i], fund.tolerance)
        prot0 = funds['f0'].portfolio
        self.assertEqual(len(prot0.items()), 2)
        self.assertEqual(prot0['A1'], 120)
        self.assertEqual(prot0['A2'], 40)

        prot1 = funds['f1'].portfolio
        self.assertEqual(len(prot1.items()), 1)
        self.assertEqual(prot1['A2'], 300)
        self.assertTrue('A1' not in prot1)
示例#7
0
def gen_network_uniform_funds(game_config, num_assets, assets_file, dir_name):
    config = GameConfig()
    #    config.num_assets = 10
    #   config.num_funds = 4
    config.initial_fund_capital = 1000000
    initial_capitals = [game_config.initial_fund_capital
                        ] * game_config.num_funds
    initial_leverages = [game_config.initial_leverage] * game_config.num_funds
    tolerances = [game_config.tolerance] * game_config.num_funds

    network = AssetFundsNetwork.generate_random_funds_network(
        density=game_config.density,
        num_funds=num_assets,
        initial_capitals=initial_capitals,
        initial_leverages=initial_leverages,
        tolerances=tolerances,
        num_assets=num_assets,
        assets_file=assets_file,
        mi_calc=ExponentialMarketImpactCalculator(config.impact_calc_constant))
    network.save_to_file(dir_name + 'network.json')

    return network
 def test_updated_price_sell_exp(self):
     calc = ExponentialMarketImpactCalculator(2)
     a = Asset(price=2, daily_volume=100, volatility=1.5, symbol='a1')
     mi = calc.get_updated_price(10, a, -1)
     npt.assert_almost_equal(1.6374, mi, decimal=4)
 def test_updated_price_buy_exp(self):
     calc = ExponentialMarketImpactCalculator(2)
     a = Asset(price=2, daily_volume=100, volatility=1.5, symbol='a1')
     updated_price = calc.get_updated_price(10, a, 1)
     npt.assert_almost_equal(2.4428, updated_price, decimal=4)
 def test_market_impact_sell_order_exp(self):
     calc = ExponentialMarketImpactCalculator(2)
     a = Asset(price=2, daily_volume=100, volatility=1.5, symbol='a1')
     order = Sell('a1', 10)
     mi = calc.get_market_impact(order, a)
     npt.assert_almost_equal(0.8187, mi, decimal=4)
示例#11
0
def get_network_from_dir(dirname):
    config = GameConfig()
    return AssetFundsNetwork.load_from_file(
        dirname + '/network.json',
        ExponentialMarketImpactCalculator(config.impact_calc_constant))