test_reason_catalog_mapping.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from __future__ import annotations
  2. import unittest
  3. from pathlib import Path
  4. from dragon_branch_configs import alpha_first_glued_refined_hot_cap_config
  5. from dragon_rc1_golden_baseline import _load_indicator_snapshot
  6. from dragon_reason_types import RuleFamily, RuleLayer
  7. from dragon_rule_catalog import classify_aux_reason, classify_entry_reason, classify_exit_reason
  8. from dragon_shared import END_DATE, START_DATE
  9. from dragon_strategy import DragonRuleEngine
  10. class TestReasonCatalogMapping(unittest.TestCase):
  11. def setUp(self) -> None:
  12. self.base_dir = Path(__file__).resolve().parents[1]
  13. def test_key_reason_examples(self) -> None:
  14. entry = classify_entry_reason("glued_buy")
  15. self.assertEqual(entry.layer, RuleLayer.CORE)
  16. self.assertEqual(entry.family, RuleFamily.GLUED)
  17. entry_bridge = classify_entry_reason("predictive_error_reentry_buy")
  18. self.assertEqual(entry_bridge.layer, RuleLayer.BRIDGE)
  19. self.assertEqual(entry_bridge.family, RuleFamily.PREDICTIVE_BREAK)
  20. exit_bridge = classify_exit_reason("predictive_b1_break_exit")
  21. self.assertEqual(exit_bridge.layer, RuleLayer.BRIDGE)
  22. self.assertEqual(exit_bridge.family, RuleFamily.PREDICTIVE_BREAK)
  23. aux = classify_aux_reason("bearish_signal_after_exit:ql_sell")
  24. self.assertEqual(aux.layer, RuleLayer.BRIDGE)
  25. self.assertEqual(aux.family, RuleFamily.AUXILIARY)
  26. def test_release_window_trade_reasons_are_mapped(self) -> None:
  27. indexed, _ = _load_indicator_snapshot(self.base_dir)
  28. engine = DragonRuleEngine(config=alpha_first_glued_refined_hot_cap_config())
  29. _, details = engine.run(indexed)
  30. details = details[
  31. (details["buy_date"] >= START_DATE)
  32. & (details["buy_date"] <= END_DATE)
  33. & (details["sell_date"] >= START_DATE)
  34. & (details["sell_date"] <= END_DATE)
  35. ].copy()
  36. buy_unknown = sorted(
  37. {
  38. reason
  39. for reason in details["buy_reason"].astype(str).unique()
  40. if classify_entry_reason(reason).layer == RuleLayer.UNKNOWN
  41. }
  42. )
  43. sell_unknown = sorted(
  44. {
  45. reason
  46. for reason in details["sell_reason"].astype(str).unique()
  47. if classify_exit_reason(reason).layer == RuleLayer.UNKNOWN
  48. }
  49. )
  50. self.assertEqual(buy_unknown, [], msg=f"Unknown entry reasons: {buy_unknown}")
  51. self.assertEqual(sell_unknown, [], msg=f"Unknown exit reasons: {sell_unknown}")
  52. if __name__ == "__main__":
  53. unittest.main()