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)
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)
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)
def get_network_from_dir(dirname): config = GameConfig() return AssetFundsNetwork.load_from_file( dirname + '/network.json', ExponentialMarketImpactCalculator(config.impact_calc_constant))