Esempio n. 1
0
class TestColumn:

    universe = Universe(
        pd.DataFrame({f"A{i}": range(10)
                      for i in range(10)},
                     index=[f"B{i}" for i in range(10)]))

    trades = [
        Trade(
            asset=["A0", "A1"],
            lot=[1, 2],
            open_bar="B0",
            shut_bar="B8",
            take=1.0,
            stop=-1.0,
        ),
        Trade(
            asset=["A2", "A3"],
            lot=[3, 4],
            open_bar="B1",
            shut_bar="B9",
            take=2.0,
            stop=-2.0,
        ),
    ]

    def _get_history(self):
        strategy = DeterminedTrader(trades=self.trades).run(self.universe)
        return History(strategy)

    def test_trade_id(self):
        result = self._get_history().trade_id
        assert np.array_equal(result, [0, 0, 1, 1])

    def test_order_id(self):
        result = self._get_history().order_id
        assert np.array_equal(result, [0, 1, 2, 3])

    def test_asset(self):
        result = self._get_history().asset
        assert np.array_equal(result, ["A0", "A1", "A2", "A3"])

    def test_open_bar(self):
        result = self._get_history().open_bar
        assert np.array_equal(result, ["B0", "B0", "B1", "B1"])

    def test_shut_bar(self):
        result = self._get_history().shut_bar
        assert np.array_equal(result, ["B8", "B8", "B9", "B9"])

    def test_take(self):
        result = self._get_history().take
        assert np.array_equal(result, [1.0, 1.0, 2.0, 2.0])

    def test_stop(self):
        result = self._get_history().stop
        assert np.array_equal(result, [-1.0, -1.0, -2.0, -2.0])

    def test_pnl(self):
        pass  # TODO
Esempio n. 2
0
    def test_hand(self, net):
        trade = Trade(asset=["A0", "A1"], lot=[2, -3], open_bar=1, shut_bar=3)
        result = trade.series_exposure(net=net, universe=self.universe_hand)
        if net:
            expected = [0, -19, 5, -22, 0, 0, 0]
        else:
            expected = [0, 23, 11, 26, 0, 0, 0]

        assert np.allclose(result, expected)
Esempio n. 3
0
class TestNOrders:
    """
    Test `Trade.n_orders`.
    """

    trade0 = Trade(asset="A0", lot=1.0)
    trade1 = Trade(asset=["A0", "A1"], lot=[2.0, 3.0])

    @pytest.mark.parametrize("trade, expected", [(trade0, 1), (trade1, 2)])
    def test_value(self, trade, expected):
        assert trade.n_orders == expected
Esempio n. 4
0
class TestArrayExposure:
    """
    Test `Trade.array_exposure()`.
    """

    universe_hand = Universe(
        pd.DataFrame(
            {"A0": [3, 1, 4, 1, 5, 9, 2], "A1": [2, 7, 1, 8, 2, 8, 1],},
            index=range(7),
            dtype=float,
        )
    )

    trade0 = Trade(asset=["A0", "A1"], lot=[2, -3], open_bar=1, shut_bar=3)
    trade1 = Trade(asset=["A1", "A0"], lot=[-3, 2], open_bar=1, shut_bar=3)
    expected0 = [[0, 0], [2, -21], [8, -3], [2, -24], [0, 0], [0, 0], [0, 0]]
    expected1 = [[0, 0], [-21, 2], [-3, 8], [-24, 2], [0, 0], [0, 0], [0, 0]]

    @pytest.mark.parametrize(
        "trade, expected", [(trade0, expected0), (trade1, expected1)],
    )
    def test_hand(self, trade, expected):
        result = trade.array_exposure(universe=self.universe_hand)
        assert np.allclose(result, expected)

    def test_value_zero(self):
        trade = Trade(asset=["A0", "A1"], lot=[0, 0], open_bar=1, shut_bar=3)
        result = trade.array_exposure(self.universe_hand)
        expected = np.zeros((self.universe_hand.n_bars, 2))
        assert np.allclose(result, expected)

    @pytest.mark.parametrize("seed", range(1))
    def test_linearity_add(self, seed):
        np.random.seed(seed)
        lot0, lot1 = np.random.random(2)
        trade0 = Trade(asset="A0", lot=lot0, open_bar=1, shut_bar=3)
        trade1 = Trade(asset="A0", lot=lot1, open_bar=1, shut_bar=3)
        tradeA = Trade(asset="A0", lot=lot0 + lot1, open_bar=1, shut_bar=3)
        result0 = trade0.array_exposure(self.universe_hand)
        result1 = trade1.array_exposure(self.universe_hand)
        resultA = tradeA.array_exposure(self.universe_hand)
        assert np.allclose(result0 + result1, resultA)

    @pytest.mark.parametrize("a", [-2.0, -1.0, 0.0, 1.0, 2.0])
    @pytest.mark.parametrize("seed", range(1))
    def test_linearity_mul(self, a, seed):
        universe = make_randomwalk(seed=seed)
        trade0 = RandomTrader(n_trades=1, seed=seed).run(universe).trades[0]
        tradeA = a * trade0
        result0 = trade0.array_exposure(universe)
        resultA = tradeA.array_exposure(universe)
        assert np.allclose(a * result0, resultA)
Esempio n. 5
0
class TestArrayLot:
    """
    Test `Trade.array_lot`.
    """

    trade0 = Trade(asset="A0", lot=1.0)
    trade1 = Trade(asset=["A0", "A1"], lot=[2.0, 3.0])

    @pytest.mark.parametrize("trade, expected", [(trade0, [1.0]),
                                                 (trade1, [2.0, 3.0])])
    def test_value(self, trade, expected):
        assert isinstance(trade.array_lot, np.ndarray)
        assert np.array_equal(trade.array_lot, expected)
Esempio n. 6
0
 def test_linearity_add(self, net, seed):
     np.random.seed(seed)
     lot0, lot1 = np.random.random(2)
     trade0 = Trade(asset="A0", lot=lot0, open_bar=1, shut_bar=3)
     trade1 = Trade(asset="A0", lot=lot1, open_bar=1, shut_bar=3)
     tradeA = Trade(asset="A0", lot=lot0 + lot1, open_bar=1, shut_bar=3)
     result0 = trade0.series_exposure(self.universe_hand, net=net)
     result1 = trade1.series_exposure(self.universe_hand, net=net)
     resultA = tradeA.series_exposure(self.universe_hand, net=net)
     assert np.allclose(result0 + result1, resultA)
Esempio n. 7
0
 def test_linearity_add(self, seed):
     np.random.seed(seed)
     lot0, lot1 = np.random.random(2)
     trade0 = Trade(asset="A0", lot=lot0, open_bar=1, shut_bar=3)
     trade1 = Trade(asset="A0", lot=lot1, open_bar=1, shut_bar=3)
     tradeA = Trade(asset="A0", lot=lot0 + lot1, open_bar=1, shut_bar=3)
     result0 = trade0._array_value(self.universe_hand)
     result1 = trade1._array_value(self.universe_hand)
     resultA = tradeA._array_value(self.universe_hand)
     assert np.allclose(result0 + result1, resultA)
Esempio n. 8
0
    def test_hand(self, net):
        universe = self.universe_hand
        trade0 = Trade("A0", lot=2.0, open_bar=1, shut_bar=5)
        trade1 = Trade("A1", lot=-3.0, open_bar=2, shut_bar=4)
        strategy = DeterminedTrader([trade0, trade1]).run(universe)
        result = Exposure(net=net).result(strategy)
        if net:
            # 0 2  8   2 10 18 0
            # 0 0 -3 -24 -3  0 0
            expected = [0, 2, 5, -22, 7, 18, 0]
        else:
            expected = [0, 2, 11, 26, 13, 18, 0]

        assert np.allclose(result, expected)
Esempio n. 9
0
def yield_trades(n_orders):
    """
    Examples
    --------
    >>> for trade in yield_trades(1):
    ...     print(trade)
    Trade(asset='A0', open_bar='B0', shut_bar='B1', lot=0.0, take=1.0, stop=-1.0)
    Trade(asset='A0', open_bar='B0', shut_bar='B1', lot=1, take=1.0, stop=-1.0)
    Trade(asset='A0', open_bar='B0', shut_bar='B1', lot=1.23, take=1.0, stop=-1.0)
    Trade(asset='A0', open_bar='B0', shut_bar='B1', lot=-1.23, take=1.0, stop=-1.0)
    Trade(asset='A0', open_bar='B0', shut_bar='B1', lot=123.4, take=1.0, stop=-1.0)
    Trade(asset='A0', open_bar='B0', shut_bar='B1', lot=-123.4, take=1.0, stop=-1.0)
    >>> for trade in yield_trades(2):
    ...     print(trade)
    Trade(asset=['A0', 'A1'], open_bar='B0', shut_bar='B1', lot=[0.0, 1], take=1.0, stop=-1.0)
    Trade(asset=['A0', 'A1'], open_bar='B0', shut_bar='B1', lot=[1, 1.23], take=1.0, stop=-1.0)
    Trade(asset=['A0', 'A1'], open_bar='B0', shut_bar='B1', lot=[1.23, -1.23], take=1.0, stop=-1.0)
    Trade(asset=['A0', 'A1'], open_bar='B0', shut_bar='B1', lot=[-1.23, 123.4], take=1.0, stop=-1.0)
    Trade(asset=['A0', 'A1'], open_bar='B0', shut_bar='B1', lot=[123.4, -123.4], take=1.0, stop=-1.0)
    Trade(asset=['A0', 'A1'], open_bar='B0', shut_bar='B1', lot=[-123.4, 0.0], take=1.0, stop=-1.0)
    """
    params_lot = [0.0, 1, 1.23, -1.23, 123.4, -123.4]

    if n_orders == 1:
        for lot in params_lot:
            yield Trade(
                asset="A0",
                open_bar="B0",
                shut_bar="B1",
                lot=lot,
                take=1.0,
                stop=-1.0,
            )
    else:
        for i, _ in enumerate(params_lot):
            asset = [f"A{i}" for i in range(n_orders)]
            lot = list(islice(cycle(params_lot), i, i + n_orders))
            yield Trade(
                asset=asset,
                open_bar="B0",
                shut_bar="B1",
                lot=lot,
                take=1.0,
                stop=-1.0,
            )
Esempio n. 10
0
 def test_result_zero_1(self, net, n_bars):
     universe = Universe(
         pd.DataFrame({
             "A0": np.linspace(0.0, 1.0, n_bars),
         }))
     strategy = DeterminedTrader([Trade("A0", lot=0.0)]).run(universe)
     result = self.MetricClass(net=net).result(strategy)
     expected = np.zeros(n_bars)
     assert np.allclose(result, expected)
Esempio n. 11
0
 def test_result_zero_0(self, net, n_bars):
     universe = Universe(
         pd.DataFrame({
             "A0": np.zeros(n_bars, dtype=float),
         }))
     strategy = DeterminedTrader([Trade("A0")]).run(universe)
     result = self.MetricClass(net=net).result(strategy)
     expected = np.zeros(n_bars)
     assert np.allclose(result, expected)
Esempio n. 12
0
 def test_result_zero(self, rate, init_wealth, n_bars):
     universe = Universe(
         pd.DataFrame({
             "A0": np.ones(n_bars, dtype=float),
         }))
     strategy = DeterminedTrader([Trade("A0")]).run(universe,
                                                    budget=init_wealth)
     result = self.MetricClass(rate=rate).result(strategy)
     expected = 0
     assert np.allclose(result, expected)
Esempio n. 13
0
class TestIsExecuted:
    """
    Test `Trade.is_executed`.
    """

    trade0 = Trade(asset="A0", lot=1.0)

    def test_value(self):
        trade = self.trade0
        assert not trade.is_executed
        trade = trade.execute(make_randomwalk(seed=42))
        assert trade.is_executed
Esempio n. 14
0
    def logic(self, universe):
        n_trade = int(universe.n_assets * self.percentile)
        date_range = pd.date_range(universe.bars[0],
                                   universe.bars[-1],
                                   freq="BM")

        for open_date in date_range[1:]:
            for asset in self.sorted_assets(universe, open_date)[:n_trade]:
                yield Trade(
                    asset=asset,
                    lot=self.bet / universe.prices.at[open_date, asset],
                    open_bar=open_date,
                    shut_bar=open_date + self.hold,
                    take=self.take,
                    stop=self.stop,
                )
Esempio n. 15
0
 def test_value_0(self):
     asset = "A0"
     open_bar = "B0"
     shut_bar = "B1"
     lot = 1.0
     take = 2.0
     stop = -2.0
     trade = Trade(
         asset=asset,
         open_bar=open_bar,
         shut_bar=shut_bar,
         lot=lot,
         take=take,
         stop=stop,
     )
     expected = "Trade(asset='A0', open_bar='B0', shut_bar='B1', lot=1.0, take=2.0, stop=-2.0)"
     assert repr(trade) == expected
Esempio n. 16
0
    def logic(self, universe):
        if self.seed is not None:
            np.random.seed(self.seed)
            random.seed(self.seed)

        for _ in range(self.__n_trades):
            n_orders = np.random.randint(1, self.max_n_orders + 1, size=1)[0]

            asset = random.sample(list(universe.assets), n_orders)
            lot = (self.max_lot -
                   self.min_lot) * np.random.rand(n_orders) - self.min_lot
            open_bar, shut_bar = sorted(random.sample(list(universe.bars), 2))

            yield Trade(asset=asset,
                        lot=lot,
                        open_bar=open_bar,
                        shut_bar=shut_bar)
Esempio n. 17
0
 def logic(self, universe):
     asset = np.array(list(self.weight.keys()))
     lot = (np.array(list(self.weight.values())) /
            universe.prices.loc[:, self.weight.keys()].iloc[0, :].values)
     yield Trade(asset=asset, lot=lot, open_bar=universe.bars[0])
Esempio n. 18
0
 def logic(self, univers):
     yield Trade(asset=["A0", "A1"])
     yield Trade(asset=["A2", "A3"])
Esempio n. 19
0
 def test_value_1(self):
     asset = "A0"
     trade = Trade(asset=asset)
     expected = "Trade(asset='A0', lot=1.0)"  # default value of lot = 1.0
     assert repr(trade) == expected
Esempio n. 20
0
 def test_value_zero(self):
     trade = Trade(asset=["A0", "A1"], lot=[0, 0], open_bar=1, shut_bar=3)
     result = trade._array_value(self.universe_hand)
     expected = np.zeros((self.universe_hand.n_bars, 2))
     assert np.allclose(result, expected)