test_rc1_golden_regression.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from __future__ import annotations
  2. import json
  3. import unittest
  4. from pathlib import Path
  5. from dragon_branch_configs import alpha_first_glued_refined_hot_cap_config
  6. from dragon_rc1_golden_baseline import (
  7. EVENTS_CORE_COLUMNS,
  8. MANIFEST_OUTPUT,
  9. TRADES_CORE_COLUMNS,
  10. _df_sha256,
  11. _load_indicator_snapshot,
  12. main as build_golden_baseline,
  13. )
  14. from dragon_shared import END_DATE, START_DATE
  15. from dragon_strategy import DragonRuleEngine
  16. class TestRC1GoldenRegression(unittest.TestCase):
  17. def setUp(self) -> None:
  18. self.base_dir = Path(__file__).resolve().parents[1]
  19. self.manifest_path = self.base_dir / MANIFEST_OUTPUT
  20. if not self.manifest_path.exists():
  21. build_golden_baseline()
  22. def test_rc1_core_hash_and_summary_match_manifest(self) -> None:
  23. manifest = json.loads(self.manifest_path.read_text(encoding="utf-8"))
  24. indexed, _ = _load_indicator_snapshot(self.base_dir)
  25. engine = DragonRuleEngine(config=alpha_first_glued_refined_hot_cap_config())
  26. events, trades = engine.run(indexed)
  27. events = events[
  28. (events["date"] >= START_DATE)
  29. & (events["date"] <= END_DATE)
  30. ].copy()
  31. trades = trades[
  32. (trades["buy_date"] >= START_DATE)
  33. & (trades["buy_date"] <= END_DATE)
  34. & (trades["sell_date"] >= START_DATE)
  35. & (trades["sell_date"] <= END_DATE)
  36. ].copy()
  37. events.sort_values(["date", "side", "layer", "reason"], inplace=True)
  38. trades.sort_values(["buy_date", "sell_date", "buy_reason", "sell_reason"], inplace=True)
  39. events_core_hash = _df_sha256(events[EVENTS_CORE_COLUMNS])
  40. trades_core_hash = _df_sha256(trades[TRADES_CORE_COLUMNS])
  41. self.assertEqual(events_core_hash, manifest["artifacts"]["events"]["core_sha256"])
  42. self.assertEqual(trades_core_hash, manifest["artifacts"]["trades"]["core_sha256"])
  43. returns = trades["return_pct"].astype(float)
  44. self.assertEqual(int(len(trades)), int(manifest["summary"]["trade_count"]))
  45. self.assertEqual(int(len(events)), int(manifest["summary"]["event_count"]))
  46. self.assertAlmostEqual(float((returns > 0).mean()), float(manifest["summary"]["win_rate"]), places=12)
  47. self.assertAlmostEqual(float(returns.mean()), float(manifest["summary"]["avg_return"]), places=12)
  48. self.assertAlmostEqual(float(returns.median()), float(manifest["summary"]["median_return"]), places=12)
  49. if __name__ == "__main__":
  50. unittest.main()