def test__calculate_pl(symbol, currency_unit):
    periods = 3
    dates = pd.date_range(start="2018-12-01", periods=periods)
    amounts = [1.0, -1.0]

    t00 = tr.Transaction(timestamp=dates[0], amount=amounts[0])
    t11 = tr.Transaction(timestamp=dates[1], amount=amounts[1])
    t10 = tr.Transaction(timestamp=dates[1], amount=amounts[0])
    t01 = tr.Transaction(timestamp=dates[0], amount=amounts[1])
    t20 = tr.Transaction(timestamp=dates[2], amount=amounts[0])

    mkt = backlight.datasource.from_dataframe(
        pd.DataFrame(index=dates, data=[[0], [1], [2]], columns=["mid"]),
        symbol,
        currency_unit,
    )

    trade = tr.make_trade([t00, t11])
    assert module._calculate_pl(trade, mkt) == 1.0

    trade = tr.make_trade([t00, t01])
    assert module._calculate_pl(trade, mkt) == 0.0

    trade = tr.make_trade([t11, t20])
    assert module._calculate_pl(trade, mkt) == -1.0

    trade = tr.make_trade([t00, t10, t20])
    assert module._calculate_pl(trade, mkt) == 3.0
Ejemplo n.º 2
0
def test_make_trade():
    periods = 2
    dates = pd.date_range(start="2018-12-01", periods=periods)
    amounts = range(periods)

    t00 = module.Transaction(timestamp=dates[0], amount=amounts[0])
    t11 = module.Transaction(timestamp=dates[1], amount=amounts[1])
    t01 = module.Transaction(timestamp=dates[0], amount=amounts[1])

    trade = module.make_trade([t00, t11])
    expected = pd.Series(index=dates, data=amounts[:2], name="amount")
    pd.testing.assert_series_equal(trade, expected)

    trade = module.make_trade([t00, t01])
    expected = pd.Series(index=[dates[0]],
                         data=[amounts[0] + amounts[1]],
                         name="amount")
    pd.testing.assert_series_equal(trade, expected)

    trade = module.make_trade([t11, t01, t00])
    expected = pd.Series(index=dates,
                         data=[amounts[0] + amounts[1], amounts[1]],
                         name="amount")
    pd.testing.assert_series_equal(trade, expected)
Ejemplo n.º 3
0
def test_exit_by_trailing_stop(market, signal, entries):
    symbol = "usdjpy"
    data = [
        [1.0],  # 00:00:00
        [2.0],  # 00:01:00
        [3.0],  # 00:02:00
        [4.0],  # 00:03:00
        [5.0],  # 00:04:00
        [4.0],  # 00:05:00
        [3.0],  # 00:06:00
        [2.0],  # 00:07:00
        [1.0],  # 00:08:00
        [0.0],  # 00:09:00
        [1.0],  # 00:10:00
    ]
    periods = len(data)
    market = backlight.datasource.from_dataframe(
        pd.DataFrame(
            index=pd.date_range(start="2018-06-06",
                                freq="1min",
                                periods=periods),
            data=data,
            columns=["mid"],
        ),
        symbol,
    )
    entries = make_trades(
        symbol,
        (
            make_trade([Transaction(pd.Timestamp("2018-06-06 00:00:00"), 1.0)
                        ]),
            make_trade(
                [Transaction(pd.Timestamp("2018-06-06 00:00:00"), -1.0)]),
            make_trade([Transaction(pd.Timestamp("2018-06-06 00:00:00"), 0.0)
                        ]),
            make_trade([Transaction(pd.Timestamp("2018-06-06 00:03:00"), 1.0)
                        ]),
            make_trade([Transaction(pd.Timestamp("2018-06-06 00:03:00"), 0.5)
                        ]),
            make_trade(
                [Transaction(pd.Timestamp("2018-06-06 00:03:00"), -1.0)]),
        ),
    )

    initial_stop = 2.0
    trailing_stop = 1.0
    trades = module.exit_by_trailing_stop(market, entries, initial_stop,
                                          trailing_stop)
    expected = make_trades(
        symbol,
        (
            make_trade([
                Transaction(pd.Timestamp("2018-06-06 00:00:00"), 1.0),
                Transaction(pd.Timestamp("2018-06-06 00:05:00"),
                            -1.0),  # trail stop
            ]),
            make_trade([
                Transaction(pd.Timestamp("2018-06-06 00:00:00"), -1.0),
                Transaction(pd.Timestamp("2018-06-06 00:02:00"),
                            1.0),  # loss cut
            ]),
            make_trade([Transaction(pd.Timestamp("2018-06-06 00:00:00"), 0.0)
                        ]),
            make_trade([
                Transaction(pd.Timestamp("2018-06-06 00:03:00"), 1.0),
                Transaction(pd.Timestamp("2018-06-06 00:05:00"),
                            -1.0),  # trail stop
            ]),
            make_trade([
                Transaction(pd.Timestamp("2018-06-06 00:03:00"), 0.5),
                Transaction(pd.Timestamp("2018-06-06 00:05:00"),
                            -0.5),  # loss cut
            ]),
            make_trade([
                Transaction(pd.Timestamp("2018-06-06 00:03:00"), -1.0),
                Transaction(pd.Timestamp("2018-06-06 00:10:00"),
                            1.0),  # trail stop
            ]),
        ),
    )

    pd.testing.assert_frame_equal(trades, expected)