Blum / backend /tests /test_alpha_operating_system.py
Italianhype's picture
Deploy BLUM v2.1 clean core
bee00f7 verified
Raw
History Blame Contribute Delete
6 kB
from datetime import date, datetime
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
from app.core.database import Base
from app.models import (
LearningBenchmarkComparison,
SniperScore,
TradePlan,
TradingGame,
TradingGameTrade,
)
from app.services.alpha_operating_system import (
AlphaGateService,
AlphaReadinessEngine,
BrainCommandSummaryService,
EdgeMapService,
PaperCopyTradingService,
TradingGameReadinessService,
)
from app.services.trading_game_runtime import TradingGameRuntimeSnapshotService
def setup_db() -> Session:
engine = create_engine("sqlite:///:memory:", future=True)
Base.metadata.create_all(engine)
return Session(engine)
def test_trading_game_readiness_explains_missing_source_data():
with setup_db() as db:
payload = TradingGameReadinessService().readiness(db)
assert payload["status"] == "WAITING_FOR_SOURCE_DATA"
assert "No TradingGame row" in payload["blocker"]
assert payload["evidence_grade"] == "insufficient"
def test_trading_game_readiness_ready_when_snapshots_and_eligible_trades_exist():
with setup_db() as db:
game = TradingGame(game_id="readiness-test", current_capital=105.0, target_capital=10000.0)
db.add(game)
db.flush()
for index in range(3):
db.add(
TradingGameTrade(
game_id=game.id,
ticker=f"T{index}",
setup_type="momentum_breakout",
entry_date=date(2025, 1, 2 + index),
exit_date=date(2025, 1, 5 + index),
entry_price=100.0,
position_size=0.2,
invalidation_level=96.0,
realized_r_multiple=1.0,
net_pnl_eur=1.0,
outcome_label="target_hit",
created_at=datetime.utcnow(),
)
)
db.commit()
TradingGameRuntimeSnapshotService().produce_ledger_snapshot(db, game_id=game.id, limit=10)
TradingGameRuntimeSnapshotService().produce_equity_snapshot(db, game_id=game.id, limit=10)
payload = TradingGameReadinessService().readiness(db)
assert payload["status"] == "READY"
assert payload["eligible_trade_count"] == 3
assert payload["ledger_snapshot_status"] == "ready"
assert payload["equity_snapshot_status"] == "ready"
def test_alpha_readiness_is_capped_without_live_and_benchmark_depth():
with setup_db() as db:
game = TradingGame(game_id="alpha-test", current_capital=150.0)
db.add(game)
db.flush()
for index in range(12):
db.add(
TradingGameTrade(
game_id=game.id,
ticker=f"A{index}",
setup_type="pullback_to_trend",
realized_r_multiple=2.0,
excess_return_vs_benchmark=4.0,
outcome_label="target_hit",
created_at=datetime.utcnow(),
)
)
db.commit()
payload = AlphaReadinessEngine().readiness(db)
assert payload["status"] == "INSUFFICIENT_EVIDENCE"
assert payload["alpha_readiness_score"] <= 60
assert "benchmark_comparison_missing" in payload["warnings"]
def test_alpha_gates_require_benchmark_and_live_samples():
with setup_db() as db:
payload = AlphaGateService().gates(db)
blocked = [row for row in payload["rows"] if not row["passed"]]
assert blocked
assert payload["all_required_gates_passed"] is False
def test_edge_map_uses_stored_trade_outcomes_without_recalculation():
with setup_db() as db:
game = TradingGame(game_id="edge-test")
db.add(game)
db.flush()
db.add_all(
[
TradingGameTrade(game_id=game.id, ticker="NVDA", setup_type="momentum_breakout", sector="Technology", realized_r_multiple=2.0, excess_return_vs_benchmark=5.0, outcome_label="target_hit"),
TradingGameTrade(game_id=game.id, ticker="AAPL", setup_type="momentum_breakout", sector="Technology", realized_r_multiple=-1.0, excess_return_vs_benchmark=-2.0, outcome_label="stopped_out"),
]
)
db.commit()
payload = EdgeMapService().edge_map(db)
assert payload["status"] == "ready"
assert payload["best_setups"][0]["entity"] == "momentum_breakout"
assert payload["sample_size"] == 2
def test_paper_copy_summary_is_paper_only_and_reuses_trade_plan_evidence():
with setup_db() as db:
db.add(
TradePlan(
ticker="NVDA",
setup_type="momentum_breakout",
actionability="actionable_if_confirmed",
entry_trigger="close above resistance with relative volume > 1.5x",
invalidation_level=120.0,
target_1=140.0,
confidence=72.0,
historical_setup_reliability=60.0,
)
)
db.commit()
payload = PaperCopyTradingService().summary(db, limit=5)
assert payload["paper_only"] is True
assert payload["no_broker_execution"] is True
assert payload["readiness"]["status"] == "READY_FOR_PAPER_MONITORING"
assert payload["rows"][0]["ticker"] == "NVDA"
def test_brain_command_summary_is_compact_and_truth_first():
with setup_db() as db:
db.add(LearningBenchmarkComparison(benchmark_name="SPY", result_label="underperforming", excess_return=-4.2, sample_size=12, statistical_confidence="low evidence"))
db.add(SniperScore(ticker="AMD", setup_type="pullback_to_trend", actionability="wait_for_trigger", sniper_score=68.0, confidence=60.0))
db.commit()
payload = BrainCommandSummaryService().summary(db)
assert payload["feature_set"] == "clean-core"
assert "capability_matrix" in payload
assert payload["policy"].startswith("Command reads compact evidence")