Exemple #1
0
    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)
Exemple #2
0
    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)
Exemple #3
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)
Exemple #4
0
    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)
Exemple #5
0
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()
Exemple #6
0
    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)
Exemple #7
0
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()
Exemple #8
0
    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)
Exemple #9
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()
Exemple #11
0
 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])
Exemple #12
0
 def test_run_no_stock_market_data(self):
     stock_exchange = StockExchange()
     trader = BuyAndHoldTrader()
     self.assertRaises(AssertionError, stock_exchange.run, None, [trader])