test_search_recent_regime_router_v2.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import importlib.util
  2. import sys
  3. from pathlib import Path
  4. import pandas as pd
  5. import pytest
  6. from okx_codex_trader.models import Candle
  7. def load_module():
  8. path = Path(__file__).resolve().parents[1] / "scripts" / "search_recent_regime_router_v2.py"
  9. spec = importlib.util.spec_from_file_location("search_recent_regime_router_v2", path)
  10. assert spec is not None
  11. module = importlib.util.module_from_spec(spec)
  12. assert spec.loader is not None
  13. sys.modules[spec.name] = module
  14. spec.loader.exec_module(module)
  15. return module
  16. def test_required_horizons_are_declared():
  17. module = load_module()
  18. assert [label for label, _ in module.HORIZONS] == ["7d", "14d", "30d", "90d", "6m", "1y", "3y"]
  19. def test_exit_price_for_risk_hit_uses_open_on_short_stop_gap():
  20. module = load_module()
  21. position = {"side": "short", "stop_price": 101.0, "take_profit_price": 98.0}
  22. candle = Candle(symbol="ETH-USDT-SWAP", ts=1, open=102.0, high=103.0, low=99.0, close=100.0, volume=1.0)
  23. assert module.exit_price_for_risk_hit(position, candle) == pytest.approx(102.0)
  24. def test_weak_trend_routes_to_cash():
  25. module = load_module()
  26. spec = module.RouterSpec(
  27. name="test",
  28. trend_sma=3,
  29. btc_momentum_lookback=2,
  30. eth_momentum_lookback=2,
  31. vol_lookback=3,
  32. corr_lookback=3,
  33. ratio_lookback=3,
  34. btc_trend_min=0.01,
  35. btc_momentum_min=0.01,
  36. eth_momentum_min=0.01,
  37. max_btc_vol=0.01,
  38. max_eth_vol=0.01,
  39. min_corr=0.4,
  40. ratio_z_entry=0.5,
  41. stop_loss_pct=0.01,
  42. take_profit_pct=0.02,
  43. max_hold_bars=10,
  44. )
  45. index = 3
  46. assert module.regime_side(
  47. index=index,
  48. eth_close=pd.Series([100.0, 100.1, 100.0, 100.05]),
  49. btc_close=pd.Series([100.0, 100.1, 100.0, 100.05]),
  50. eth_sma=pd.Series([float("nan"), float("nan"), 100.0, 100.0]),
  51. btc_sma=pd.Series([float("nan"), float("nan"), 100.0, 100.0]),
  52. eth_vol=pd.Series([float("nan"), float("nan"), 0.001, 0.001]),
  53. btc_vol=pd.Series([float("nan"), float("nan"), 0.001, 0.001]),
  54. corr=pd.Series([float("nan"), float("nan"), 0.8, 0.8]),
  55. ratio_z=pd.Series([float("nan"), float("nan"), 0.0, 0.0]),
  56. spec=spec,
  57. ) == ("cash", "weak_trend_cash")