def test_run_two_days_two_traders(self): stock_exchange = StockExchange() stock_market_data = StockMarketData([Company.A, Company.B], [Period.TESTING]).deepcopy_first_n_items(2) trader1 = BuyAndHoldTrader() trader2 = BuyAndHoldTrader() result = stock_exchange.run(stock_market_data, [trader1, trader2]) # test final day final_day = stock_market_data.get_most_recent_trade_day() self.assertEqual(final_day, Date(2012, 1, 4)) # test final portfolio1 final_portfolio1 = result[trader1][final_day] self.assertIsNotNone(final_portfolio1) self.assertEqual(final_portfolio1.cash, 24.807061999999974) self.assertEqual(final_portfolio1.get_stock(Company.A), 14) self.assertEqual(final_portfolio1.get_stock(Company.B), 3) self.assertEqual(final_portfolio1.get_value(stock_market_data), 1005.0684910000001) # test final portfolio2 final_portfolio2 = result[trader2][final_day] self.assertIsNotNone(final_portfolio2) self.assertEqual(final_portfolio2.cash, 24.807061999999974) self.assertEqual(final_portfolio2.get_stock(Company.A), 14) self.assertEqual(final_portfolio2.get_stock(Company.B), 3) self.assertEqual(final_portfolio2.get_value(stock_market_data), 1005.0684910000001)
def test_trader_no_stock(self): trader = BuyAndHoldTrader('test_color', 'test_name') portfolio = Portfolio(1000) stock_market_data = StockMarketData([], [Period.TESTING]) order_list = trader.trade(portfolio, stock_market_data) self.assertIsNotNone(order_list) self.assertEqual(len(order_list), 0)
def test_get_final_portfolio_value(self): stock_exchange = StockExchange() stock_market_data = StockMarketData([Company.A, Company.B], [Period.TESTING]).deepcopy_first_n_items(2) trader1 = BuyAndHoldTrader() trader2 = BuyAndHoldTrader() stock_exchange.run(stock_market_data, [trader1, trader2]) # test final portfolio value self.assertEqual(stock_exchange.get_final_portfolio_value(trader1), 1005.0684910000001) self.assertEqual(stock_exchange.get_final_portfolio_value(trader2), 1005.0684910000001)
def test_trade_one_stock(self): trader = BuyAndHoldTrader('test_color', 'test_name') portfolio = Portfolio(1000) stock_market_data = StockMarketData([Company.A], [Period.TESTING]) order_list = trader.trade(portfolio, stock_market_data) self.assertIsNotNone(order_list) self.assertEqual(len(order_list), 1) self.assertEqual(order_list[0].type, OrderType.BUY) self.assertEqual(order_list[0].company, Company.A) self.assertEqual(order_list[0].amount, 9)
def main_orig(): """ Code from the original main routine. Visualizes portfolio value over the testing period for different traders. """ # Load stock market data for testing period stock_market_data = StockMarketData([Company.A, Company.B], [Period.TESTING]) # create new stock exchange with initial portfolio cash for each traders stock_exchange = StockExchange(2000.0) # create the traders bah_trader = BuyAndHoldTrader('black', 'Buy and hold') tt_trader_obscure = TrustingTrader(ObscureExpert(Company.A), ObscureExpert(Company.B), 'green', 'Trust experts') tt_trader2 = TrustingTrader2(ObscureExpert(Company.A), ObscureExpert(Company.B), 'limegreen', 'Trust experts for sell only') dql_trader = deep_q_learning_trader.DeepQLearningTrader( ObscureExpert(Company.A), ObscureExpert(Company.B), True, False, 'red', plot_name='Deep Q-learning trader') # run the stock exchange over the testing period, with 100 skipped trading days stock_exchange.run(stock_market_data, [bah_trader, tt_trader_obscure, tt_trader2, dql_trader]) # visualize the results stock_exchange.visualize_last_run()
def test_run_two_days_incorrect_offset(self): stock_exchange = StockExchange() stock_market_data = StockMarketData([Company.A, Company.B], [Period.TESTING]).deepcopy_first_n_items(2) trader = BuyAndHoldTrader() # too small and too big self.assertRaises(AssertionError, stock_exchange.run, stock_market_data, [trader], -1) self.assertRaises(AssertionError, stock_exchange.run, stock_market_data, [trader], 2)
def main_print_model_performance(): """ Just prints the final portfolio value and v score (return % per trading day) for training and testing data set for different traders. """ stock_market_data_train = StockMarketData([Company.A, Company.B], [Period.TRAINING]) # stock_market_data_train = stock_market_data_train.deepcopy_first_n_items( # int(stock_market_data_train.get_row_count() / 5)) stock_market_data_test = StockMarketData([Company.A, Company.B], [Period.TESTING]) bah_trader = BuyAndHoldTrader(name='buy and hold') tt_trader1 = TrustingTrader(ObscureExpert(Company.A), ObscureExpert(Company.B), 'green', 'trust experts, prefer A') tt_trader2 = TrustingTrader2(ObscureExpert(Company.A), ObscureExpert(Company.B), 'limegreen', 'trust experts for sell only') dql_trader = deep_q_learning_trader.DeepQLearningTrader( ObscureExpert(Company.A), ObscureExpert(Company.B), True, False, 'red') all_traders = [bah_trader, tt_trader1, tt_trader2, dql_trader] trader_names = [] for trader in all_traders: if isinstance(trader, deep_q_learning_trader.DeepQLearningTrader ) and trader.plot_name is not None: trader_name = trader.plot_name else: trader_name = trader.get_name() trader_names.append(trader_name) max_trader_name_length = max((len(name) for name in trader_names)) for trader, trader_name in zip(all_traders, trader_names): is_first_line = True for dataset, dataset_name, starting_cash in [ (stock_market_data_train, 'train', 10000.0), (stock_market_data_test, 'test', 2000.0) ]: stock_exchange = StockExchange(starting_cash) stock_exchange.run(dataset, [trader]) p = stock_exchange.get_final_portfolio_value(trader) samples = dataset.get_row_count() v = 100.0 * (math.pow(p / starting_cash, 1 / samples) - 1.0) if is_first_line: header = ('{: <' + str(max_trader_name_length) + '}').format(trader_name) else: header = ' ' * max_trader_name_length header += f' ({dataset_name: <5}): ' print(f'{header}{v:.5f}% return per trading day' f' (final portfolio value of {p:.1e})') is_first_line = False if isinstance(trader, BuyAndHoldTrader): trader.reset()
def test_run_two_days_correct_offset(self): stock_exchange = StockExchange() stock_market_data = StockMarketData([Company.A, Company.B], [Period.TESTING]).deepcopy_first_n_items(2) trader = BuyAndHoldTrader() result = stock_exchange.run(stock_market_data, [trader], 1) # test final day final_day = stock_market_data.get_most_recent_trade_day() self.assertEqual(final_day, Date(2012, 1, 4)) # test final portfolio final_portfolio = result[trader][final_day] self.assertIsNotNone(final_portfolio) self.assertEqual(final_portfolio.cash, 1000.0) self.assertEqual(final_portfolio.get_stock(Company.A), 0) self.assertEqual(final_portfolio.get_stock(Company.B), 0) self.assertEqual(final_portfolio.get_value(stock_market_data), 1000.0)
def test_create_bah_trader(self): trader = BuyAndHoldTrader('test_color', 'test_name') self.assertIsNotNone(trader) self.assertEqual(trader.get_color(), 'test_color') self.assertEqual(trader.get_name(), 'test_name')
pyplot.legend(trader_names) pyplot.show() # This main method evaluates all traders over the testing period and visualize the results. if __name__ == "__main__": mpl.rcParams["savefig.directory"] = os.chdir( os.path.dirname(__file__) + '\\eval') # Load stock market data for testing period stock_market_data = StockMarketData([Company.A, Company.B], [Period.TESTING]) # create new stock exchange with initial portfolio cash for each traders stock_exchange = StockExchange(2000.0) # create the traders bah_trader = BuyAndHoldTrader() tt_trader_obscure = TrustingTrader(ObscureExpert(Company.A), ObscureExpert(Company.B), 'green', 'tt obscure') dql_trader = deep_q_learning_trader.DeepQLearningTrader( ObscureExpert(Company.A), ObscureExpert(Company.B), True, False, 'red') # run the stock exchange over the testing period, with 100 skipped trading days stock_exchange.run(stock_market_data, [bah_trader, tt_trader_obscure, dql_trader]) # visualize the results stock_exchange.visualize_last_run()
def test_run_zero_days(self): stock_exchange = StockExchange() stock_market_data = StockMarketData([Company.A, Company.B], [Period.TESTING]).deepcopy_first_n_items(0) trader = BuyAndHoldTrader() self.assertRaises(AssertionError, stock_exchange.run, stock_market_data, [trader])
def test_run_no_stock_market_data(self): stock_exchange = StockExchange() trader = BuyAndHoldTrader() self.assertRaises(AssertionError, stock_exchange.run, None, [trader])