コード例 #1
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
 def test_get_request_return_turn_over_when_last_data_is_None(self):
     bnh = StrategyBuyAndHold()
     bnh.initialize(50000, 100)
     dummy_info = {}
     dummy_info["closing_price"] = 20000000
     bnh.update_trading_info(dummy_info)
     requests = bnh.get_request()
     self.assertEqual(requests[0]["price"], 20000000)
     self.assertEqual(requests[0]["amount"], 0.0005)
     self.assertEqual(requests[0]["type"], "buy")
     bnh.update_trading_info(None)
     requests = bnh.get_request()
     self.assertEqual(requests, None)
コード例 #2
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
 def test_get_request_return_None_when_balance_is_smaller_than_min_price(
         self):
     bnh = StrategyBuyAndHold()
     bnh.initialize(900, 10)
     bnh.is_simulation = False
     dummy_info = {}
     dummy_info["closing_price"] = 20000
     bnh.update_trading_info(dummy_info)
     bnh.balance = 9.5
     requests = bnh.get_request()
     self.assertEqual(requests, None)
コード例 #3
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
 def test_get_request_return_turn_over_when_balance_is_smaller_than_min_price_at_simulation(
     self, ):
     bnh = StrategyBuyAndHold()
     bnh.initialize(900, 10)
     bnh.is_simulation = True
     dummy_info = {}
     dummy_info["date_time"] = "2020-02-25T15:41:09"
     dummy_info["closing_price"] = 20000
     bnh.update_trading_info(dummy_info)
     bnh.balance = 9.5
     requests = bnh.get_request()
     self.assertEqual(requests[0]["price"], 0)
     self.assertEqual(requests[0]["amount"], 0)
コード例 #4
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
 def test_get_request_return_None_when_balance_is_smaller_than_total_value(
         self):
     bnh = StrategyBuyAndHold()
     bnh.initialize(5000, 10)
     dummy_info = {}
     dummy_info["closing_price"] = 62000000
     bnh.update_trading_info(dummy_info)
     bnh.balance = 10000
     requests = bnh.get_request()
     self.assertEqual(requests, None)
コード例 #5
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
    def test_update_result_remove_from_waiting_requests(self):
        bnh = StrategyBuyAndHold()
        bnh.initialize(100000, 10)
        self.assertEqual(bnh.balance, 100000)
        bnh.waiting_requests["orange"] = "orage_request"

        dummy_result = {
            "type": "sell",
            "request": {
                "id": "orange"
            },
            "price": 10000,
            "amount": 5,
            "msg": "melon",
            "balance": 9500,
            "state": "done",
        }
        bnh.update_result(dummy_result)
        self.assertEqual(bnh.balance, 149975)
        self.assertEqual(bnh.result[-1]["type"], "sell")
        self.assertEqual(bnh.result[-1]["request"]["id"], "orange")
        self.assertEqual(bnh.result[-1]["price"], 10000)
        self.assertEqual(bnh.result[-1]["amount"], 5)
        self.assertEqual(bnh.result[-1]["msg"], "melon")
        self.assertEqual(bnh.result[-1]["balance"], 9500)
        self.assertFalse("orange" in bnh.waiting_requests)
コード例 #6
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
 def test_get_request_return_None_when_data_is_invaild(self):
     bnh = StrategyBuyAndHold()
     bnh.initialize(100, 10)
     dummy_info = {}
     bnh.update_trading_info(dummy_info)
     request = bnh.get_request()
     self.assertEqual(request, None)
コード例 #7
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
 def test_get_request_use_balance_when_balance_is_smaller_than_target_budget(
         self):
     bnh = StrategyBuyAndHold()
     bnh.initialize(1000, 10)
     dummy_info = {}
     dummy_info["closing_price"] = 20000
     bnh.update_trading_info(dummy_info)
     bnh.balance = 100
     requests = bnh.get_request()
     self.assertEqual(requests[0]["price"], 20000)
     self.assertEqual(requests[0]["amount"], 0.005)
コード例 #8
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
 def test_get_request_return_turn_over_when_target_budget_is_too_small_at_simulation(
         self):
     bnh = StrategyBuyAndHold()
     bnh.initialize(100, 100)
     bnh.is_simulation = True
     dummy_info = {}
     dummy_info["date_time"] = "2020-02-25T15:41:09"
     dummy_info["closing_price"] = 20000
     bnh.update_trading_info(dummy_info)
     requests = bnh.get_request()
     self.assertEqual(requests[0]["price"], 0)
     self.assertEqual(requests[0]["amount"], 0)
コード例 #9
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
    def test_get_request_return_correct_request_with_cancel_requests(self):
        bnh = StrategyBuyAndHold()
        bnh.initialize(50000, 100)
        bnh.waiting_requests["mango_id"] = {"request": {"id": "mango_id"}}
        bnh.waiting_requests["orange_id"] = {"request": {"id": "orange_id"}}
        dummy_info = {}
        dummy_info["closing_price"] = 20000000
        bnh.update_trading_info(dummy_info)
        requests = bnh.get_request()

        self.assertEqual(requests[0]["id"], "mango_id")
        self.assertEqual(requests[0]["type"], "cancel")

        self.assertEqual(requests[1]["id"], "orange_id")
        self.assertEqual(requests[1]["type"], "cancel")

        self.assertEqual(requests[2]["price"], 20000000)
        self.assertEqual(requests[2]["amount"], 0.0005)
        self.assertEqual(requests[2]["type"], "buy")
コード例 #10
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
 def test_initialize_update_initial_balance(self):
     bnh = StrategyBuyAndHold()
     self.assertEqual(bnh.is_intialized, False)
     bnh.initialize(50000, 50)
     self.assertEqual(bnh.budget, 50000)
     self.assertEqual(bnh.balance, 50000)
     self.assertEqual(bnh.min_price, 50)
     self.assertEqual(bnh.is_intialized, True)
     bnh.initialize(100, 10)
     self.assertEqual(bnh.budget, 50000)
     self.assertEqual(bnh.balance, 50000)
     self.assertEqual(bnh.min_price, 50)
コード例 #11
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
    def test_update_result_insert_into_waiting_requests(self):
        bnh = StrategyBuyAndHold()
        bnh.initialize(100000, 10)
        self.assertEqual(bnh.balance, 100000)

        dummy_result = {
            "type": "sell",
            "request": {
                "id": "orange"
            },
            "price": 10000,
            "amount": 5,
            "msg": "melon",
            "balance": 9500,
            "state": "requested",
        }
        bnh.update_result(dummy_result)
        self.assertEqual(bnh.balance, 100000)
        self.assertEqual(len(bnh.result), 0)
        self.assertTrue("orange" in bnh.waiting_requests)
コード例 #12
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
    def test_update_result_append_result(self):
        bnh = StrategyBuyAndHold()
        bnh.initialize(100, 10)

        dummy_result = {
            "type": "orange",
            "request": {
                "id": "banana"
            },
            "price": 500,
            "amount": 0.001,
            "msg": "melon",
            "balance": 500,
            "state": "done",
        }
        bnh.update_result(dummy_result)
        self.assertEqual(bnh.result[-1]["type"], "orange")
        self.assertEqual(bnh.result[-1]["request"]["id"], "banana")
        self.assertEqual(bnh.result[-1]["price"], 500)
        self.assertEqual(bnh.result[-1]["amount"], 0.001)
        self.assertEqual(bnh.result[-1]["msg"], "melon")
        self.assertEqual(bnh.result[-1]["balance"], 500)
コード例 #13
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
    def test_update_result_update_balance_at_sell(self):
        bnh = StrategyBuyAndHold()
        bnh.initialize(100000, 10)
        self.assertEqual(bnh.balance, 100000)

        dummy_result = {
            "type": "sell",
            "request": {
                "id": "orange"
            },
            "price": 10000,
            "amount": 5,
            "msg": "melon",
            "balance": 9500,
            "state": "done",
        }
        bnh.update_result(dummy_result)
        self.assertEqual(bnh.balance, 149975)
        self.assertEqual(bnh.result[-1]["type"], "sell")
        self.assertEqual(bnh.result[-1]["request"]["id"], "orange")
        self.assertEqual(bnh.result[-1]["price"], 10000)
        self.assertEqual(bnh.result[-1]["amount"], 5)
        self.assertEqual(bnh.result[-1]["msg"], "melon")
        self.assertEqual(bnh.result[-1]["balance"], 9500)
コード例 #14
0
    def test_ITG_run_simulation_with_bnh_strategy(self):
        trading_snapshot = simulation_data.get_data("bnh_snapshot")
        operator = SimulationOperator()
        strategy = StrategyBuyAndHold()
        strategy.is_simulation = True
        count = 100
        budget = 100000
        interval = 0.001
        time_limit = 15
        end_str = "2020-04-30T16:30:00"

        data_provider = SimulationDataProvider()
        data_provider.initialize_simulation(end=end_str, count=count)
        trader = SimulationTrader()
        trader.initialize_simulation(end=end_str, count=count, budget=budget)
        analyzer = Analyzer()
        analyzer.is_simulation = True

        operator.initialize(
            data_provider,
            strategy,
            trader,
            analyzer,
            budget=budget,
        )

        operator.set_interval(interval)
        operator.start()
        start_time = time.time()
        while operator.state == "running":
            time.sleep(0.5)
            if time.time() - start_time > time_limit:
                self.assertTrue(False, "Time out")
                break

        trading_results = operator.get_trading_results()
        self.check_equal_results_list(trading_results, trading_snapshot)

        waiting = True
        start_time = time.time()
        report = None

        def callback(return_report):
            nonlocal report
            nonlocal waiting
            report = return_report
            waiting = False
            self.assertFalse(waiting)

        operator.get_score(callback)

        while waiting:
            time.sleep(0.5)
            if time.time() - start_time > time_limit:
                self.assertTrue(False, "Time out")
                break

        self.assertIsNotNone(report)
        self.assertEqual(report[0], 100000)
        self.assertEqual(report[1], 97220)
        self.assertEqual(report[2], -2.78)
        self.assertEqual(report[3]["KRW-BTC"], -2.693)
コード例 #15
0
    def test_ITG_strategy_buy_and_hold_full(self):
        strategy = StrategyBuyAndHold()
        self.assertEqual(strategy.get_request(), None)
        strategy.initialize(50000, 5000)
        # 거래 정보 입력 - 1
        strategy.update_trading_info({
            "market": "KRW-BTC",
            "date_time": "2020-04-30T14:51:00",
            "opening_price": 11288000.0,
            "high_price": 11304000.0,
            "low_price": 11282000.0,
            "closing_price": 11304000.0,
            "acc_price": 587101574.8949,
            "acc_volume": 51.97606868,
        })
        # 거래 요청 정보 생성
        request = strategy.get_request()
        expected_request = {
            "type": "buy",
            "price": 11304000.0,
            "amount": 0.0008,
        }
        self.assertEqual(request[0]["type"], expected_request["type"])
        self.assertEqual(request[0]["price"], expected_request["price"])
        self.assertEqual(request[0]["amount"], expected_request["amount"])
        # 거래 결과 입력 - 정상 체결 됨
        strategy.update_result({
            "request": {
                "id": request[0]["id"],
                "type": "buy",
                "price": 11304000.0,
                "amount": 0.0009,
                "date_time": "2020-04-30T14:51:00",
            },
            "type": "buy",
            "price": 11304000.0,
            "amount": 0.0009,
            "msg": "success",
            "balance": 0,
            "state": "done",
            "date_time": "2020-04-30T14:51:00",
        })
        self.assertEqual(strategy.balance, 39821)

        # 거래 정보 입력 - 2
        strategy.update_trading_info({
            "market": "KRW-BTC",
            "date_time": "2020-04-30T14:52:00",
            "opening_price": 11304000.0,
            "high_price": 21304000.0,
            "low_price": 11304000.0,
            "closing_price": 21304000.0,
            "acc_price": 587101574.8949,
            "acc_volume": 51.97606868,
        })
        # 거래 요청 정보 생성
        request = strategy.get_request()
        expected_request = {
            "type": "buy",
            "price": 21304000.0,
            "amount": 0.0004,
        }
        self.assertEqual(request[0]["type"], expected_request["type"])
        self.assertEqual(request[0]["price"], expected_request["price"])
        self.assertEqual(request[0]["amount"], expected_request["amount"])
        # 거래 결과 입력 - 요청되었으나 체결 안됨
        self.assertEqual(strategy.balance, 39821)
        strategy.update_result({
            "request": {
                "id": request[0]["id"],
                "type": "buy",
                "price": 11304000.0,
                "amount": 0.0009,
                "date_time": "2020-04-30T14:52:00",
            },
            "type": "buy",
            "price": 11304000.0,
            "amount": 0.0009,
            "msg": "success",
            "balance": 0,
            "state": "requested",
            "date_time": "2020-04-30T14:52:00",
        })
        self.assertEqual(strategy.balance, 39821)
        last_id = request[0]["id"]

        # 거래 정보 입력 - 3
        strategy.update_trading_info({
            "market": "KRW-BTC",
            "date_time": "2020-04-30T14:52:00",
            "opening_price": 21304000.0,
            "high_price": 21304000.0,
            "low_price": 21304000.0,
            "closing_price": 21304000.0,
            "acc_price": 587101574.8949,
            "acc_volume": 51.97606868,
        })
        # 거래 요청 정보 생성
        request = strategy.get_request()
        expected_request = {
            "type": "buy",
            "price": 21304000.0,
            "amount": 0.0004,
        }
        self.assertEqual(request[0]["type"], "cancel")
        self.assertEqual(request[0]["id"], last_id)
        self.assertEqual(request[1]["type"], expected_request["type"])
        self.assertEqual(request[1]["price"], expected_request["price"])
        self.assertEqual(request[1]["amount"], expected_request["amount"])
        # 거래 결과 입력 - 일부 체결됨
        self.assertEqual(strategy.balance, 39821)
        strategy.update_result({
            "request": {
                "id": request[0]["id"],
                "type": "buy",
                "price": 21304000.0,
                "amount": 0.0009,
                "date_time": "2020-04-30T14:52:00",
            },
            "type": "buy",
            "price": 21304000.0,
            "amount": 0.0002,
            "msg": "success",
            "balance": 0,
            "state": "done",
            "date_time": "2020-04-30T14:52:00",
        })
        self.assertEqual(strategy.balance, 35558)

        # 거래 정보 입력 - 4
        strategy.update_trading_info({
            "market": "KRW-BTC",
            "date_time": "2020-04-30T14:52:00",
            "opening_price": 21304000.0,
            "high_price": 41304000.0,
            "low_price": 21304000.0,
            "closing_price": 41304000.0,
            "acc_price": 587101574.8949,
            "acc_volume": 51.97606868,
        })
        # 거래 요청 정보 생성
        request = strategy.get_request()
        expected_request = {
            "type": "buy",
            "price": 41304000.0,
            "amount": 0.0002,
        }
        self.assertEqual(request[0]["type"], expected_request["type"])
        self.assertEqual(request[0]["price"], expected_request["price"])
        self.assertEqual(request[0]["amount"], expected_request["amount"])
        # 거래 결과 입력 - 정상 체결됨
        self.assertEqual(strategy.balance, 35558)
        strategy.update_result({
            "request": {
                "id": request[0]["id"],
                "type": "buy",
                "price": 41304000.0,
                "amount": 0.0009,
                "date_time": "2020-04-30T14:52:00",
            },
            "type": "buy",
            "price": 41304000.0,
            "amount": 0.0002,
            "msg": "success",
            "balance": 0,
            "state": "done",
            "date_time": "2020-04-30T14:52:00",
        })
        self.assertEqual(strategy.balance, 27293)

        # 거래 정보 입력 - 5
        strategy.update_trading_info({
            "market": "KRW-BTC",
            "date_time": "2020-04-30T14:52:00",
            "opening_price": 41304000.0,
            "high_price": 61304000.0,
            "low_price": 41304000.0,
            "closing_price": 61304000.0,
            "acc_price": 587101574.8949,
            "acc_volume": 51.97606868,
        })
        # 거래 요청 정보 생성
        request = strategy.get_request()
        expected_request = {
            "type": "buy",
            "price": 61304000.0,
            "amount": 0.0001,
        }
        self.assertEqual(request[0]["type"], expected_request["type"])
        self.assertEqual(request[0]["price"], expected_request["price"])
        self.assertEqual(request[0]["amount"], expected_request["amount"])
        # 거래 결과 입력 - 정상 체결됨
        self.assertEqual(strategy.balance, 27293)
        strategy.update_result({
            "request": {
                "id": request[0]["id"],
                "type": "buy",
                "price": 61304000.0,
                "amount": 0.0009,
                "date_time": "2020-04-30T14:52:00",
            },
            "type": "buy",
            "price": 61304000.0,
            "amount": 0.0002,
            "msg": "success",
            "balance": 0,
            "state": "done",
            "date_time": "2020-04-30T14:52:00",
        })
        self.assertEqual(strategy.balance, 15026)

        # 거래 정보 입력 - 6
        strategy.update_trading_info({
            "market": "KRW-BTC",
            "date_time": "2020-04-30T14:52:00",
            "opening_price": 61304000.0,
            "high_price": 61304000.0,
            "low_price": 61304000.0,
            "closing_price": 61304000.0,
            "acc_price": 587101574.8949,
            "acc_volume": 51.97606868,
        })
        # 거래 요청 정보 생성
        request = strategy.get_request()
        expected_request = {
            "type": "buy",
            "price": 61304000.0,
            "amount": 0.0001,
        }
        self.assertEqual(request[0]["type"], expected_request["type"])
        self.assertEqual(request[0]["price"], expected_request["price"])
        self.assertEqual(request[0]["amount"], expected_request["amount"])
        # 거래 결과 입력 - 정상 체결됨
        self.assertEqual(strategy.balance, 15026)
        strategy.update_result({
            "request": {
                "id": request[0]["id"],
                "type": "buy",
                "price": 61304000.0,
                "amount": 0.0002,
                "date_time": "2020-04-30T14:52:00",
            },
            "type": "buy",
            "price": 61304000.0,
            "amount": 0.0002,
            "msg": "success",
            "balance": 0,
            "state": "done",
            "date_time": "2020-04-30T14:52:00",
        })
        self.assertEqual(strategy.balance, 2759)

        # 거래 정보 입력 - 7
        strategy.update_trading_info({
            "market": "KRW-BTC",
            "date_time": "2020-04-30T14:52:00",
            "opening_price": 61304000.0,
            "high_price": 61304000.0,
            "low_price": 61304000.0,
            "closing_price": 61304000.0,
            "acc_price": 587101574.8949,
            "acc_volume": 51.97606868,
        })
        # 거래 요청 정보 생성
        request = strategy.get_request()
        self.assertEqual(request, None)
        self.assertEqual(strategy.balance, 2759)
コード例 #16
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
 def test_update_trading_info_ignore_info_when_not_yet_initialzed(self):
     bnh = StrategyBuyAndHold()
     bnh.update_trading_info("mango")
     self.assertEqual(len(bnh.data), 0)
コード例 #17
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
    def test_get_request_return_same_datetime_at_simulation(self):
        bnh = StrategyBuyAndHold()
        bnh.initialize(1000, 100)
        bnh.is_simulation = True
        dummy_info = {}
        dummy_info["date_time"] = "2020-02-25T15:41:09"
        dummy_info["closing_price"] = 20000000
        bnh.update_trading_info(dummy_info)
        requests = bnh.get_request()
        self.assertEqual(requests[0]["date_time"], "2020-02-25T15:41:09")

        dummy_info["date_time"] = "2020-02-25T23:59:59"
        dummy_info["closing_price"] = 20000000
        bnh.update_trading_info(dummy_info)
        requests = bnh.get_request()
        self.assertEqual(requests[0]["date_time"], "2020-02-25T23:59:59")
コード例 #18
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
 def test_update_trading_info_append_info_to_data(self):
     bnh = StrategyBuyAndHold()
     bnh.initialize(100, 10)
     bnh.update_trading_info("mango")
     self.assertEqual(bnh.data.pop(), "mango")
コード例 #19
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
 def test_update_result_ignore_result_when_not_yet_initialized(self):
     bnh = StrategyBuyAndHold()
     bnh.update_result("orange")
     self.assertEqual(len(bnh.result), 0)
コード例 #20
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
 def test_get_request_return_None_when_not_yet_initialized(self):
     bnh = StrategyBuyAndHold()
     request = bnh.get_request()
     self.assertEqual(request, None)
コード例 #21
0
ファイル: strategy_bnh_test.py プロジェクト: msaltnet/smtm
 def test_get_request_return_None_when_data_is_empty(self):
     bnh = StrategyBuyAndHold()
     bnh.initialize(100, 10)
     request = bnh.get_request()
     self.assertEqual(request, None)