Step 0 reads LEARNINGS.md, scanner domain files, and research files to derive
the highest-priority untested hypothesis, proposes it to the user for confirmation,
then proceeds through the normal backtest flow.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Multiple runs on the same day (scheduled discovery, hypothesis runner, manual
re-runs) were each clobbering the shared YYYY-MM-DD.json file. Now merges by
loading existing picks and upserting new ones by ticker — later run wins.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Requesting only candidate tickers produced a different cache key from the
nightly prefetch, triggering a fresh yfinance download that hit rate limits
(4/75 tickers returned). Now loads the full universe (same key as nightly
prefetch) and slices to candidate tickers — always a cache hit.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Change recent_mover_action default from "filter" to "deprioritize" so candidates
that moved >10% in the past 7 days reach the ranker (with lowered priority + context
annotation) rather than being silently dropped
- Exempt mean_reversion pipeline candidates (rsi_oversold) from the recent-mover action
entirely — stocks that pulled back hard are the signal, not a disqualifier
- Hoist SCANNER_REGISTRY import to module level (removes duplicate inline imports)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Change recent_mover_action default from "filter" to "deprioritize" so candidates
that moved >10% in the past 7 days reach the ranker (with lowered priority + context
annotation) rather than being silently dropped
- Exempt mean_reversion pipeline candidates (rsi_oversold) from the recent-mover action
entirely — stocks that pulled back hard are the signal, not a disqualifier
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Plain `git stash` only stashes tracked modified files. Scripts like
track_recommendation_performance.py write new untracked files to
data/recommendations/ which block `git pull --rebase`. Adding
--include-untracked captures those files in the stash so the rebase
can proceed cleanly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The rsi_oversold scanner is a contrarian signal, not a momentum signal —
it fires on short-term panic pullbacks within uptrends and expects a 3-7 day
bounce. Keeping it in the momentum pipeline conflates two fundamentally
different signal types and could cause the ranker to misprice it.
Changes:
- Add mean_reversion pipeline (priority 6, deep_dive_budget 5) to default_config.py
- Move rsi_oversold scanner from pipeline="momentum" to pipeline="mean_reversion"
in both default_config.py and rsi_oversold.py
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The discovery run writes delisted_cache.json which isn't staged, causing
'cannot pull with rebase: You have unstaged changes' on all three commit steps.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- tradingagents/dataflows/universe.py: single source of truth for ticker
universe; all scanners now call load_universe(config) instead of
duplicating the 3-level fallback chain with hardcoded "data/tickers.txt"
- scripts/prefetch_ohlcv.py: nightly script using existing ohlcv_cache.py
incremental logic; first run downloads 1y history, subsequent runs append
only new trading days
- .github/workflows/prefetch.yml: runs at 01:00 UTC daily, before all other
workflows; commits updated parquet to repo
- Updated 6 scanners: minervini, high_52w_breakout, ml_signal, options_flow,
sector_rotation, technical_breakout — removed duplicate DEFAULT_TICKER_FILE
constants and _load_tickers_from_file() functions
- minervini, high_52w_breakout, technical_breakout: replace yf.download()
with download_ohlcv_cached() — reads from prefetched cache instead of
hitting yfinance at discovery time
- default_config.py: added discovery.ohlcv_cache_dir config key
- data/ohlcv_cache/: initial 1y backfill (588 tickers, 5.4MB parquet)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Both scanners were implemented by research PRs but never added to default_config.
Without entries they cannot be disabled or tuned from config and are invisible
to the settings UI. Also updated /research-strategy to make config entry mandatory.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>