Add local-LLM (Ollama) news/catalyst scoring #2

Merged
fez5587 merged 2 commits from claude/ollama-trading-signal-analysis-3cl0oe into master 2026-06-21 18:42:30 -04:00
fez5587 commented 2026-06-19 18:41:36 -04:00 (Migrated from github.com)

Leverage a local Ollama model to interpret news catalysts for the small-cap
momentum strategy — distinguishing bullish catalysts (FDA approval, M&A) from
dilutive offerings the technicals alone can't see. Advisory-first, then automate.

Phase 1 (advisory; no change to trade behavior):

  • research/ingestion/news_enrichment.py: stdlib urllib call to Ollama with
    structured JSON output, classifying each headline into a catalyst type,
    sentiment, conviction and dilution flag. Graceful degradation (None on any
    failure) so trading is never blocked.
  • news_catalyst_cache table + populate the previously-dead news_events.sentiment.
  • Runs on the existing interval Scheduler (off the hot path), gated by
    OllamaConfig; deduped by the raw_news_items payload hash.
  • Surface the advisory on the dashboard approval queue (projection + api + UI).

Phase 2 (automation; ships gated OFF):

  • Optional catalyst_score blended into calculate_setup_quality (None reproduces
    the exact legacy weights); pure pass-through via evaluate_setup.
  • Dilution veto in TradingExecutionService (slow + fast paths) emitting a
    catalyst_dilution_veto risk event, behind NEWS_DILUTION_VETO_ENABLED.

Config (OllamaConfig.from_env), .env.example docs, and tests for parsing,
persistence/dedupe, the projection, the score blend, the veto, and an
end-to-end enrich->advisory flow (Ollama mocked). Default model moves to
qwen2.5:7b-instruct (best small-model JSON, fits a 12GB GPU).

Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01M5HTMkaadGDnAPtXe2hWwg

Leverage a local Ollama model to interpret news catalysts for the small-cap momentum strategy — distinguishing bullish catalysts (FDA approval, M&A) from dilutive offerings the technicals alone can't see. Advisory-first, then automate. Phase 1 (advisory; no change to trade behavior): - research/ingestion/news_enrichment.py: stdlib urllib call to Ollama with structured JSON output, classifying each headline into a catalyst type, sentiment, conviction and dilution flag. Graceful degradation (None on any failure) so trading is never blocked. - news_catalyst_cache table + populate the previously-dead news_events.sentiment. - Runs on the existing interval Scheduler (off the hot path), gated by OllamaConfig; deduped by the raw_news_items payload hash. - Surface the advisory on the dashboard approval queue (projection + api + UI). Phase 2 (automation; ships gated OFF): - Optional catalyst_score blended into calculate_setup_quality (None reproduces the exact legacy weights); pure pass-through via evaluate_setup. - Dilution veto in TradingExecutionService (slow + fast paths) emitting a catalyst_dilution_veto risk event, behind NEWS_DILUTION_VETO_ENABLED. Config (OllamaConfig.from_env), .env.example docs, and tests for parsing, persistence/dedupe, the projection, the score blend, the veto, and an end-to-end enrich->advisory flow (Ollama mocked). Default model moves to qwen2.5:7b-instruct (best small-model JSON, fits a 12GB GPU). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01M5HTMkaadGDnAPtXe2hWwg
Sign in to join this conversation.