feat: signal math upgrade — probabilistic, regime-aware scoring pipeline

Implement full probabilistic signal processing pipeline gated behind
probabilistic_scoring_enabled feature flag in risk_configs:

- Bayesian log-likelihood accumulator with Beta posterior and entropy
- Regime detector (trend-following, panic, mean-reversion, uncertainty)
- Source accuracy tracker with per-source historical prediction accuracy
- Sigmoid confidence gate replacing binary gate
- Information gain surprise weighting for rare events
- Adaptive recency decay with event-specific half-lives
- Regime multiplier replacing market context multiplier
- Weighted disagreement entropy for contradiction detection
- Multiplicative macro exposure with conditional integration
- Graph-distance attenuated competitive signal propagation
- Exponentially weighted momentum with volatility scaling
- Expected value recommendation gate

All changes backward-compatible: flag=false preserves exact current behavior.
New outputs stored in existing JSONB columns (no schema changes except
source_accuracy table via migration 034).

Tests: 26 property-based tests (14 correctness properties), 99 unit tests,
1789 total tests passing with zero regressions.
This commit is contained in:
Celes Renata
2026-04-29 11:41:48 +00:00
parent 8c3c1aab43
commit 4e010bc048
24 changed files with 6058 additions and 60 deletions
+14
View File
@@ -224,6 +224,15 @@ class TrendSummary(BaseModel):
market_context: Optional[MarketContext] = None
generated_at: datetime = Field(default_factory=lambda: datetime.now(tz=timezone.utc))
# New optional fields for probabilistic mode
p_bull: Optional[float] = None # Bayesian bullish probability
alpha: Optional[float] = None # Beta posterior α
beta_param: Optional[float] = None # Beta posterior β (named to avoid shadowing)
bayesian_confidence: Optional[float] = None # 1 - 4αβ/(α+β)²
entropy: Optional[float] = None # Shannon entropy H
regime: Optional[str] = None # Market regime classification
pipeline_mode: str = "heuristic" # "heuristic" or "probabilistic"
# --- Recommendation ---
@@ -246,6 +255,11 @@ class Recommendation(BaseModel):
model_metadata: ModelMetadata = Field(default_factory=ModelMetadata)
generated_at: datetime = Field(default_factory=lambda: datetime.now(tz=timezone.utc))
# New optional fields for probabilistic mode
expected_value: Optional[float] = None # EV = P_bull·R_up - P_bear·R_down
p_bull: Optional[float] = None # Bayesian bullish probability used
pipeline_mode: str = "heuristic" # "heuristic" or "probabilistic"
# --- Global News Interpolation ---