monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x1220cbda0> def test_load_dataset_from_snapshots_joins_scan_and_outcomes(monkeypatch): """load_dataset_from_snapshots joins raw scan candidates (per day) with realized short outcomes into CriticalSellCase — mocked I/O (no NFS/Alpaca).""" from datetime import date as _d from types import SimpleNamespace # One trading day, two candidates. def fake_scan(**kwargs): return [ {"symbol": "AAA", "cmf": -0.40, "score": 90, "priority": "critical_sell", "direction": "short", "summary": "", "snapshot_path": "x", "row": {"short_ratio": 0.5}}, {"symbol": "BBB", "cmf": -0.35, "score": 80, "priority": "critical_sell", "direction": "short", "summary": "", "snapshot_path": "y", "row": {}}, ] def fake_outcomes(detections_by_day, **kwargs): out = [] for day, dets in detections_by_day.items(): for d in dets: out.append(SimpleNamespace( detection_day=day, entry_day=day, symbol=d.symbol, cmf=d.cmf, score=d.score, entry_open=10.0, same_day_close=9.8, next_close=9.7, t0_short_ret_pct=2.0, t1_short_ret_pct=3.0, )) return out > import rtrader.services.channel_scalp_service as _svc tests/services/test_critical_sell_ga.py:97: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ rtrader/services/channel_scalp_service.py:3335: in _ensure_ray_task() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _ensure_ray_task(): global _ray_evaluate_symbol if _ray_evaluate_symbol is not None: return import ray > @ray.remote(num_cpus=1, max_retries=2, retry_exceptions=True) ^^^^^^^^^^ E AttributeError: module 'ray' has no attribute 'remote' rtrader/services/channel_scalp_service.py:3305: AttributeError