165 lines
4.3 KiB
Python
165 lines
4.3 KiB
Python
import pytest
| |
import numpy.testing as npt
| |
| |
from common.utils import *
| |
from common.utils import add_area_ratio
| |
from common.gen_signals import *
| |
| |
| |
def test_decimal():
| |
val = "4.1E-7"
| |
dec = to_decimal(val)
| |
assert round_down_str(dec, 8) == "0.00000041"
| |
| |
assert round_down_str("4.1E-7", 8) == "0.00000041"
| |
| |
assert round_down_str("10.000000001", 8) == "10.00000000" # 8 zeros and then 1
| |
| |
val = "10.000000009" # 8 zeros and then 9
| |
assert round_str(val, 8) == "10.00000001"
| |
| |
assert round_down_str(val, 8) == "10.00000000"
| |
| |
to_sell = Decimal("0.01185454") # What we can get from the server with 8 digits
| |
assert round_down_str(to_sell, 6) == "0.011854" # We need to round but so smaller value (otherwise exception with not enough funds)
| |
| |
pass
| |
| |
| |
def test_signal_generation():
| |
data = [
| |
(222, 1, 2),
| |
(333, 2, 1),
| |
(444, 0, 1),
| |
]
| |
df = pd.DataFrame(data, columns=["aaa", "high_60_20", "low_60_04"])
| |
| |
models = {
| |
"buy": {"high_60_20": 1, "low_60_04": 1}, # All higher
| |
"sell": {"high_60_20": 1, "low_60_04": 1}, # All lower
| |
}
| |
| |
signals = generate_signals(df, models)
| |
| |
# Check existence
| |
assert "buy" in df.columns.to_list()
| |
assert "sell" in df.columns.to_list()
| |
| |
# Check values of signal columns
| |
assert [1,1,0] == list(df["buy"])
| |
assert [0,0,1] == list(df["sell"])
| |
| |
| |
def test_depth_density():
| |
# Example 1
| |
depth = [
| |
[1, 1],
| |
[3, 1],
| |
[4, 1],
| |
[5, 1], # Bin border
| |
[6, 1],
| |
[7, 1],
| |
]
| |
| |
bins_ask = discretize_ask(depth=depth, bin_size=4.0, start=None)
| |
bins = discretize("ask", depth, bin_size=4.0, start=None)
| |
| |
assert bins_ask == [1, 1]
| |
assert bins == [1, 1]
| |
| |
depth = [[-x[0], x[1]] for x in depth] # Invert price so that it decreases
| |
| |
bins = discretize("bid", depth, bin_size=4.0, start=None)
| |
| |
assert bins == [1, 1]
| |
| |
# Example 2
| |
depth = [
| |
[1, 1],
| |
[3, 1],
| |
[4, 20], # Will be split between two bins
| |
# [5, 1], # Bin border
| |
[6, 1],
| |
[7, 1],
| |
]
| |
| |
bins_ask = discretize_ask(depth=depth, bin_size=4.0, start=None)
| |
bins = discretize("ask", depth=depth, bin_size=4.0, start=None)
| |
| |
assert bins_ask == [5.75, 5.75]
| |
assert bins == [5.75, 5.75]
| |
| |
depth = [[-x[0], x[1]] for x in depth] # Invert price so that it decreases
| |
| |
bins = discretize("bid", depth=depth, bin_size=4.0, start=None)
| |
| |
assert bins == [5.75, 5.75]
| |
| |
# Example 3
| |
depth = [
| |
# 0 Start (previous point volume assumed to be 0)
| |
[1, 1],
| |
# 2 Bin border
| |
[3, 1],
| |
[4, 1], # Bin border
| |
[5, 2],
| |
]
| |
| |
bins_ask = discretize_ask(depth=depth, bin_size=2.0, start=0.0)
| |
bins = discretize("ask", depth=depth, bin_size=2.0, start=0.0)
| |
| |
assert bins_ask == [0.5, 1.0, 1.5]
| |
assert bins == [0.5, 1.0, 1.5]
| |
| |
depth = [[-x[0], x[1]] for x in depth] # Invert price so that it decreases
| |
| |
bins = discretize("bid", depth=depth, bin_size=2.0, start=0.0)
| |
| |
assert bins == [0.5, 1.0, 1.5]
| |
| |
# Example 4 - empty bin
| |
depth = [
| |
# 0 Start (previous point volume assumed to be 0)
| |
[1, 1],
| |
# 2 Bin border
| |
# Empty bin
| |
# 4 Bin border
| |
[5, 2],
| |
]
| |
| |
bins = discretize("ask", depth=depth, bin_size=2.0, start=0.0)
| |
| |
pass
| |
| |
| |
def test_area_ratio():
| |
price = [10, 20, 30, 20, 10, 20, 30]
| |
df = pd.DataFrame(data={"price": price})
| |
| |
features = add_area_ratio(df, is_future=False, column_name="price", windows=4)
| |
# Last element has to be computed from previous 3 elements
| |
assert df[df.columns[1]].iloc[-1] == -1 # all elements less than this one
| |
assert df[df.columns[1]].iloc[-2] == 0 # 1 is less and 1 is greater than this one
| |
| |
features = add_area_ratio(df, is_future=True, column_name="price", windows=4)
| |
# First element has to be computed from next 3 elements
| |
assert df[df.columns[1]].iloc[0] == 1 # all elements greater than this one
| |
assert df[df.columns[1]].iloc[1] == 0 # 1 is less and 1 is greater than this one
| |
| |
pass
| |
| |
| |
def test_linear_trends():
| |
price = [10, 20, 40, 40, 30, 10]
| |
df = pd.DataFrame(data={"price": price})
| |
| |
features = add_linear_trends(df, is_future=False, column_name="price", windows=2)
| |
npt.assert_almost_equal(df["price_trend_2"].values, np.array([0, 10, 20, 0, -10, -20]))
| |
| |
features = add_linear_trends(df, is_future=True, column_name="price", windows=2)
| |
npt.assert_almost_equal(df["price_trend_2"].values, np.array([10, 20, 0, -10, -20, np.nan]))
| |
| |
features = add_linear_trends(df, is_future=False, column_name="price", windows=6)
| |
npt.assert_almost_equal(df["price_trend_6"].values, np.array([0, 10, 15, 11, 6, 0.857143]))
| |
| |
pass
|