def test_rolling_max():
    for array, config in product(arrays, configurations):
        s = Stream.source(array, dtype="float")
        w = s.rolling(**config).max().rename("w")
        expected = list(pd.Series(array).rolling(**config).max())

        assert_op([w], expected)
def test_cumsum():
    for array in arrays:
        s = Stream.source(array, dtype="float")
        w = s.cumsum().rename("w")
        expected = list(pd.Series(array).cumsum())

        assert_op([w], expected)
def test_div():
    expected = [1, 2, 3, 4, 5, 6]

    # (left, right) : (Stream, Stream)
    s1 = Stream.source([2, 4, 6, 8, 10, 12], dtype="float")
    s2 = Stream.source([2, 2, 2, 2, 2, 2], dtype="float")

    w1 = s1.div(s2).rename("w1")
    w2 = (s1 / s2).rename("w2")

    assert_op([w1, w2], expected)

    # (left, right) : (Stream, float)
    w1 = s1.div(2).rename("w1")
    w2 = (s1 / 2).rename("w2")

    assert_op([w1, w2], expected)
def test_rsub():
    # (left, right) : (float, Stream)
    s1 = 6
    s2 = Stream.source([1, 2, 3, 4, 5, 6], dtype="float")

    w = (s1 - s2).rename("w")

    assert_op([w], [5, 4, 3, 2, 1, 0])
def test_sub():
    expected = [0, 1, 2, 3, 4, 5]

    # (left, right) : (Stream, Stream)
    s1 = Stream.source([1, 2, 3, 4, 5, 6], dtype="float")
    s2 = Stream.source([1, 1, 1, 1, 1, 1], dtype="float")

    w1 = s1.sub(s2).rename("w1")
    w2 = (s1 - s2).rename("w2")

    assert_op([w1, w2], expected)

    # (left, right) : (Stream, float)
    w1 = s1.sub(1).rename("w1")
    w2 = (s1 - 1).rename("w2")

    assert_op([w1, w2], expected)
def test_radd():
    # (left, right) : (float, Stream)
    s1 = 1
    s2 = Stream.source([1, 2, 3, 4, 5, 6], dtype="float")

    w = (s1 + s2).rename("w")

    assert_op([w], [2, 3, 4, 5, 6, 7])
def test_clamp_min():
    array = [-1, 2, -3, 4, -5]

    s = Stream.source(array, dtype="float")

    w = s.clamp_min(0).rename("w")
    expected = list(pd.Series(array).apply(lambda x: x if x > 0 else 0))

    assert_op([w], expected)
def test_ffill():
    array = [-1, np.nan, -3, 4, np.nan]

    s = Stream.source(array, dtype="float")

    w = s.ffill().rename("w")
    expected = list(pd.Series(array).ffill())

    assert_op([w], expected)
def test_add():

    # (left, right) : (Stream, Stream)
    s1 = Stream.source([3, -4, 6, -7, 2, -6], dtype="float")
    s2 = Stream.source([-3, 4, -6, 7, -2, 6], dtype="float")

    w1 = s1.add(s2).rename("w1")
    w2 = (s1 + s2).rename("w2")

    assert_op([w1, w2], 6 * [0])

    # (left, right) : (Stream, float)
    s1 = Stream.source([1, 2, 3, 4, 5, 6], dtype="float")
    s2 = 1

    w1 = s1.add(s2).rename("w1")
    w2 = (s1 + s2).rename("w2")

    assert_op([w1, w2], [2, 3, 4, 5, 6, 7])
def test_rdiv():
    expected = [6, 3, 2, 3 / 2, 6 / 5, 1]

    # (left, right) : (Stream, Stream)
    s = Stream.source([2, 4, 6, 8, 10, 12], dtype="float")

    # (left, right) : (Stream, float)
    w = (12 / s).rename("w")

    assert_op([w], expected)
def test_rmul():
    expected = [2, 4, 6, 8, 10, 12]

    # (left, right) : (Stream, Stream)
    s = Stream.source([1, 2, 3, 4, 5, 6], dtype="float")

    # (left, right) : (Stream, float)
    w = (2 * s).rename("w")

    assert_op([w], expected)
def test_pow():
    array = [1, -2, 3, -4, 5, -6]

    s = Stream.source(array, dtype="float")

    s1 = s.pow(3).rename("s1")
    s2 = (s**3).rename("s2")

    expected = list(pd.Series(array)**3)

    assert_op([s1, s2], expected)
Exemple #13
0
def test_ewm_mean():

    array = [1, np.nan, 3, 4, 5, 6, np.nan, 7]

    s = Stream.source(array, dtype="float")

    for config in configurations:
        w = s.ewm(**config).mean().rename("w")
        expected = list(pd.Series(array).ewm(**config).mean())

        assert_op([w], expected)
Exemple #14
0
def test_push_one_datum():

    s1 = Stream.placeholder(dtype="float").rename("s1")
    s2 = Stream.placeholder(dtype="float").rename("s2")

    feed = PushFeed([s1, s2])

    assert isinstance(feed, PushFeed)

    output = feed.push({"s1": 1, "s2": 6})

    assert output == {"s1": 1, "s2": 6}

    m1 = s1.clamp_min(0)
    m2 = s2.clamp_max(0)

    feed = PushFeed(
        [s1.rename("v1"),
         s2.rename("v2"),
         m1.rename("v3"),
         m2.rename("v4")])

    arr1 = [1, -1, 2, -2, 3, -3, 4, -4, 5, -5]
    arr2 = [-5, 5, -4, 4, -3, 3, -2, 2, -1, 1]

    expected = {
        "v1": [1, -1, 2, -2, 3, -3, 4, -4, 5, -5],
        "v2": [-5, 5, -4, 4, -3, 3, -2, 2, -1, 1],
        "v3": [1, 0, 2, 0, 3, 0, 4, 0, 5, 0],
        "v4": [-5, 0, -4, 0, -3, 0, -2, 0, -1, 0]
    }

    for i in range(len(expected)):
        output = feed.push({"v1": arr1[i], "v2": arr2[i]})

        assert output == {
            "v1": expected["v1"][i],
            "v2": expected["v2"][i],
            "v3": expected["v3"][i],
            "v4": expected["v4"][i]
        }
Exemple #15
0
def test_bool_methods():
    s = Stream.source(
        ["hello", "my", "name", "i", "am", "the", "data", "feed"],
        dtype="string")

    w1 = s.upper().rename("w1")
    w2 = s.lower().rename("w2")
    w3 = w1.endswith("E").invert().rename("w3")

    feed = DataFeed([w1, w2, w3])
    feed.compile()

    assert feed.next() == {"w1": "HELLO", "w2": "hello", "w3": True}
Exemple #16
0
def test_str_accessor():

    s = Stream.source(
        ["hello", "my", "name", "i", "am", "the", "data", "feed"])

    w1 = s.str.upper().rename("w1")
    w2 = s.str.lower().rename("w2")
    w3 = w1.str.endswith("E").rename("w3")

    feed = DataFeed([w1, w2, w3])
    feed.compile()

    assert feed.next() == {"w1": "HELLO", "w2": "hello", "w3": False}
Exemple #17
0
def create_env_with_price_series(config: dict, price_stream: Stream[np.array]):

    np.seterr(divide="ignore")

    action_scheme = PortfolioAllocation(num_assets=config["num_assets"],
                                        commission=config["commission"])

    total_steps = config["total_steps"] + config["min_periods"]
    m = config["num_assets"]

    p_streams = [
        price_stream.apply(index(i), dtype="float").rename(f"p{i}")
        for i in range(m)
    ]
    lag_streams = [p_streams[i].lag().rename(f"l{i}") for i in range(m)]

    prices = Stream.group(lag_streams).apply(
        lambda x: np.array([x[f"l{i}"] for i in range(m)])).rename("prices")

    features = []
    for i in range(m):
        with NameSpace(f"p{i}"):
            features += make_features(p_streams[i])

    r_streams = [(p_streams[i] / lag_streams[i]).rename(f"r{i}")
                 for i in range(m)]
    y1 = Stream.group(r_streams).apply(
        lambda x: np.array([x[f"r{i}"] for i in range(m)])).rename("y(t+1)")

    weights = Stream.sensor(action_scheme,
                            lambda x: x.weights).rename("weights")
    pv = Stream.sensor(action_scheme, lambda x: x.p,
                       dtype="float").rename("pv")

    obs_group = Stream.group(features).rename("obs")
    state_group = Stream.group([y1]).rename("state")
    perform_group = Stream.group([prices, weights, pv]).rename("renderer")

    feed = DataFeed([obs_group, state_group, perform_group])

    env = TradingEnv(
        action_scheme=action_scheme,
        reward_scheme=Profit(),
        observer=Observer(feed=feed,
                          window_size=config["window_size"],
                          num_assets=config["num_assets"],
                          min_periods=config["min_periods"]),
        stopper=MaxStepsOrNoMoney(),
        informer=RebalanceInformer(),
        renderer=ReallocationChart(num_assets=config["num_assets"]))

    return env
Exemple #18
0
def test_pct_change():
    configs = [
        {"periods": 1, "fill_method": None},
        {"periods": 1, "fill_method": "pad"},
        {"periods": 1, "fill_method": "ffill"},
        {"periods": 2, "fill_method": None},
        {"periods": 2, "fill_method": "pad"},
        {"periods": 2, "fill_method": "ffill"},
    ]

    for array, config in product(arrays, configs):

        s = Stream.source(array, dtype="float")
        w = s.pct_change(**config).rename("w")
        expected = list(pd.Series(array).pct_change(**config))

        print(config)
        assert_op([w], expected)
Exemple #19
0
def test_boolean():

    s = Stream.source(["hello", "my", "name", "is", "slim", "shady"],
                      dtype="string")

    s.startswith("m").invert()