37 lines
1.5 KiB
Python
37 lines
1.5 KiB
Python
from __future__ import annotations
|
|
|
|
import pandas as pd
|
|
|
|
from web_core.constants import TREND_BEAR, TREND_BULL, TREND_NEUTRAL
|
|
from web_core.insights import compute_session_stats, compute_signal_quality, detect_regime
|
|
|
|
|
|
def _make_analyzed(rows: int = 12) -> pd.DataFrame:
|
|
idx = pd.date_range("2025-01-01", periods=rows, freq="h")
|
|
classifications = ["fake", "real_bull", "fake", "real_bear"] * (rows // 4) + ["fake"] * (rows % 4)
|
|
trends = [TREND_NEUTRAL, TREND_BULL, TREND_BULL, TREND_BEAR] * (rows // 4) + [TREND_BEAR] * (rows % 4)
|
|
closes = [100 + i for i in range(rows)]
|
|
return pd.DataFrame({"classification": classifications[:rows], "trend_state": trends[:rows], "Close": closes}, index=idx)
|
|
|
|
|
|
def test_detect_regime_flags_choppy_when_fake_ratio_high() -> None:
|
|
df = _make_analyzed(12)
|
|
out = detect_regime(df, lookback=12)
|
|
assert out in {"Choppy", "Trending"}
|
|
|
|
|
|
def test_compute_signal_quality_returns_expected_keys() -> None:
|
|
df = _make_analyzed(20)
|
|
quality = compute_signal_quality(df, trend_now=TREND_BULL, volume_filter_enabled=True)
|
|
assert set(quality.keys()) == {"score", "label", "fake_ratio"}
|
|
assert quality["label"] in {"Low", "Medium", "High"}
|
|
|
|
|
|
def test_compute_session_stats_has_numeric_outputs() -> None:
|
|
df = _make_analyzed(20)
|
|
stats = compute_session_stats(df, session_started_at=0.0)
|
|
assert isinstance(stats["wins"], int)
|
|
assert isinstance(stats["losses"], int)
|
|
assert isinstance(stats["avg_move_pct"], float)
|
|
assert isinstance(stats["fake_ratio_pct"], float)
|