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)
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)
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] }
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}
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}
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
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)
def test_boolean(): s = Stream.source(["hello", "my", "name", "is", "slim", "shady"], dtype="string") s.startswith("m").invert()