Getting there
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
"""Unit tests for the regime state machine."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from polymaker.config import StrategyProfile
|
||||
from polymaker.domain import Regime
|
||||
from polymaker.strategy.regime import RegimeInputs, RegimeMachine
|
||||
|
||||
|
||||
def _inp(**over):
|
||||
base = dict(
|
||||
now=1000.0,
|
||||
tick=0.01,
|
||||
fv=0.50,
|
||||
prev_fv=0.50,
|
||||
vol_ratio=1.0,
|
||||
flow_z=0.0,
|
||||
inventory_util=0.0,
|
||||
hours_to_end=1000.0,
|
||||
)
|
||||
base.update(over)
|
||||
return RegimeInputs(**base)
|
||||
|
||||
|
||||
def test_default_is_quiet():
|
||||
p = StrategyProfile()
|
||||
assert RegimeMachine().decide(_inp(), p) == Regime.QUIET
|
||||
|
||||
|
||||
def test_halts_take_priority():
|
||||
p = StrategyProfile()
|
||||
m = RegimeMachine()
|
||||
assert m.decide(_inp(risk_halt=True), p) == Regime.HALTED
|
||||
assert m.decide(_inp(ws_stale=True), p) == Regime.HALTED
|
||||
assert m.decide(_inp(market_resolved=True), p) == Regime.HALTED
|
||||
assert m.decide(_inp(hours_to_end=1.0), p) == Regime.HALTED # inside halt window
|
||||
|
||||
|
||||
def test_fv_jump_triggers_event_and_cooloff():
|
||||
p = StrategyProfile() # event_jump_ticks=8, cooloff=60
|
||||
m = RegimeMachine()
|
||||
# jump of 0.10 = 10 ticks > 8 -> EVENT
|
||||
assert m.decide(_inp(fv=0.60, prev_fv=0.50), p) == Regime.EVENT
|
||||
# still in cooloff a moment later even without a jump
|
||||
assert m.decide(_inp(now=1030.0, fv=0.60, prev_fv=0.60), p) == Regime.EVENT
|
||||
# after cooloff expires, back to quiet
|
||||
assert m.decide(_inp(now=1100.0, fv=0.60, prev_fv=0.60), p) == Regime.QUIET
|
||||
|
||||
|
||||
def test_sweep_flag_triggers_event():
|
||||
p = StrategyProfile()
|
||||
assert RegimeMachine().decide(_inp(sweep_flagged=True), p) == Regime.EVENT
|
||||
|
||||
|
||||
def test_reduce_only_from_inventory_and_enddate():
|
||||
p = StrategyProfile() # reduce_only_hours=24
|
||||
m = RegimeMachine()
|
||||
assert m.decide(_inp(inventory_util=1.0), p) == Regime.REDUCE_ONLY
|
||||
assert m.decide(_inp(risk_reduce_only=True), p) == Regime.REDUCE_ONLY
|
||||
assert m.decide(_inp(hours_to_end=12.0), p) == Regime.REDUCE_ONLY
|
||||
|
||||
|
||||
def test_trending_from_flow_and_vol():
|
||||
p = StrategyProfile() # trend_flow_z=1.5
|
||||
m = RegimeMachine()
|
||||
assert m.decide(_inp(flow_z=2.0), p) == Regime.TRENDING
|
||||
assert m.decide(_inp(vol_ratio=3.0), p) == Regime.TRENDING
|
||||
|
||||
|
||||
def test_event_beats_reduce_only_and_trending():
|
||||
p = StrategyProfile()
|
||||
m = RegimeMachine()
|
||||
r = m.decide(_inp(sweep_flagged=True, inventory_util=1.0, flow_z=5.0), p)
|
||||
assert r == Regime.EVENT
|
||||
Reference in New Issue
Block a user