/Users/ravf/projects/work/research/investments/funnel/.
| Stage | Output | Code |
|---|---|---|
| 1. Price refresh (yfinance) | 3,561 / 3,648 tickers refreshed (Yahoo rate-limited the rest) | refresh_prices.py + refresh_prices_chart.py |
| 2. Pre-filter SQL | 800 candidates ($50M-$5B mcap, P/TB<1.5 OR cash>50%MC OR EV/sales<1) | prefilter.py |
| 3. Quality ranking | Composite score: P/TB + cash/MC + low debt + FCF + EV/sales. China ADRs penalized. | rank.py |
| 4. Deep-dive (Opus subagents) | 80 stocks analyzed in 16 parallel batches | inject_reports.py |
| Ticker | Score | Name | Thesis (from agent reports) |
|---|---|---|---|
| OSG | 8 | Octave Specialty Group | Ambac post-rebrand. MGA platform + $1.6B NOLs at HoldCo. Sum-of-parts >> mcap. |
| OM | 7 | Outset Medical | Negative EV ($87M net cash > $83M mcap). Home dialysis + AGI tailwind. |
| ACTG | 7 | Acacia Research | Starboard-controlled. $361M cash + 4 operating businesses. ~50% of SOTP. |
| FPH | 7 | Five Point Holdings | CA land at 40-65% NAV. Net cash. $40M buyback authorized Apr 23. |
| CCRN | 7 | Cross Country Healthcare | Failed merger arb. $20M Aya term fee + $130M cash + $40M buyback. 46% deal discount. |
| SRBK | 7 | SR Bancorp | Mutual-to-stock conversion thrift. 80% of TBV. Active buyback. M&A target. |
| CYRX | 7 | Cryoport | CGT supply chain leader. AGI tailwind. $185M convertible 2026 catalyst. |
| CABO | 7 | Cable One | Physical fiber/coax moat. 3x P/FCF. Dropped 10% Apr 24. Target ~$70-80. |
| GASS | 7 | StealthGas | Paid off all $85M debt. Net cash. 0.49x book. 31 LPG carriers. |
| XPER | 7 | Xperi Inc. | Connected Car (DTS AutoStage in 14M vehicles) is AGI beneficiary. P/E 6.7. |
| SRL | 6 | Scully Royalty | Iron ore royalty + activist cleanup. Royalty currently in court interpleader. |
| MBLY | 6 | Mobileye Global | Real biz (Intel 70% stake) but screen MC was wrong; true mcap $7.77B. |
| HMY | 7 | Harmony Gold | Forward P/E 4.77, net cash, gold near ATH, copper transition optionality. |
| VALE | 7 | Vale SA | Carajás iron ore — one of most durable industrial assets globally. 4Bt+ reserves at 67% Fe. |
| WBD | 6 | Warner Bros Discovery | 3x'd to $27 on PSKY merger. Strategic IP value remains. |
| SBSW | 6 | Sibanye Stillwater | PGM recovery + gold + Keliber lithium. 2.5x in past year. |
| BCYC | 6 | Bicycle Therapeutics | Platform biotech with big-pharma partners. $626M cash on $337M mcap. |
| HURC | 6 | Hurco Companies | Real net cash 34% of mcap. Machine tools for AGI/robotics manufacturing. |
| AMPY | 6 | Amplify Energy | Eliminated $127M debt. Beta CA offshore platforms politically irreplaceable. |
| AII | 6 | American Integrity Insurance | FL specialty insurer. 3.95x earnings. 5.19% div. Hurricane risk is the trade. |
Many "cash-rich" stocks have offsetting debt: ANGI (net debt $194M not "cash 1.01x mc"), AMCX (net debt $1.35B), CNDT (net debt $556M), BXC (net debt $288M), ADV (net debt $1.43B = 3x mcap), CMCO (post-Kito 7-8x net leverage). Fix: filter on net cash (cash − debt) not gross cash.
Bank balance sheets always have huge "cash" (deposits sitting at the Fed) but it's not distributable. FFWM was already merged. OPY is a broker-dealer where operating cash isn't shareholder cash. Fix: exclude SIC banking codes from the cash-rich screen, use bank-specific metrics (P/TBV, NIM, NPAs, CRE concentration).
Several stocks show "low P/TB" because the data is stale; tangible book has gone negative since: AMWL (TBV -$78M), FORR (TBV -$12.6M), ACCO (TBV -$511M), EHTH ($1.13B "trade receivables" is constructive ASC 606 PV not real assets). Fix: re-pull TBV at filter time, exclude negative-TBV.
APWC (PEWC owns 81%, $11M float), BH (Sardar Biglari controls 74.3%), Vafias-controlled GASS (31% controller), Simmons family controls VHI (91%). The discount won't close — it's a governance feature, not a mispricing. Fix: flag insider ownership > 50% as a yellow card.
GDOT was an announced merger arb situation, not a fundamental value play. FONR has a definitive going-private deal at $19. Fix: cross-reference SEC 8-K M&A filings to flag arb situations.
Filtered manually after batch 1 produced too many of these. Permanent fixes needed in prefilter.py.
/Users/ravf/projects/work/research/investments/funnel/refresh_prices.py — yfinance pull (rate-limited)/Users/ravf/projects/work/research/investments/funnel/refresh_prices_chart.py — fallback via chart endpoint/Users/ravf/projects/work/research/investments/funnel/prefilter.py — SQL filter → tier2_candidates.json/Users/ravf/projects/work/research/investments/funnel/rank.py — composite quality score/Users/ravf/projects/work/research/investments/funnel/inject_reports.py — pulls reports from Google Drive into reports-v3.html/Users/ravf/projects/work/research/investments/funnel/tier2_candidates.json — 800 candidates/Users/ravf/projects/work/research/investments/funnel/deep_dive_queue.json — ranked listResearch/stocks/{TICKER}/