Find Alpha — 3-Horizon Screener
Goal: Find 3 tickers per time horizon (swing / position / LEAPS) where market hasn't fully priced the upside. Not "good companies" — mispriced setups.
Companion to review-investment-screenshot. Output of this skill feeds INTO that skill for full review.
🔍 Pre-flight checklist — run BEFORE returning any candidate
Discovery is the easy half. Execution discipline is where alpha leaks. Every candidate output MUST pass:
- Macro regime gate — trigger
macro-warning skill first. Regime determines which horizons to run:
- 🟢 GREEN: all 3 horizons (swing + position + LEAPS)
- 🟡 YELLOW: position + LEAPS only (skip swing — chop kills swings)
- 🔴 RED: LEAPS only at deep value, no swing/position adds. Output should default to "no swings/positions this week" in RED.
- Insider strict per candidate — already in Hard Rules #1 below. Don't bend it for a "great story."
- 3-tier entry MANDATORY per candidate — output "Entry: $X" alone is insufficient. Must be T1 (trigger) / T2 (50DMA or 20% drawdown) / T3 (200DMA or 38% drawdown). User should never have to ask "but at what price specifically?"
- Position size capped per horizon (already defined in horizons below — enforce strictly):
- Swing: 1-2% per pick · Position: 2-4% · LEAPS: 3-5%
- High-beta total book ≤ 50%.
- Tax flag for Swing horizon — Swing = 1-3 weeks = STCG when exited. If user is in high bracket, surface that explicitly in output ("STCG ~30% federal — net win must clear that").
- No "speculative" hidden in confidence — If thesis is unverified, label "🟡 SPECULATIVE" in confidence column. Don't bundle speculation into 8/10 ratings.
"Look carefully" rule: blacklisted names (APH, EME, ETN, PWR, POWL, GEV) and similar distribution-at-top patterns return via news cycles. Always re-verify with insider_ratio.py, don't trust the cached blacklist as the only filter. New distribution patterns appear; refresh the blacklist quarterly.
See README's Hard Rules for the full anti-pattern list.
When to invoke
- User asks: "find alpha", "find me 3 tickers", "what's the next MRVL setup", "screen swing trades", "weekly alpha scan"
- Scheduled run (Monday pre-market, weekly)
- After major macro event (Fed decision, big earnings) — universe regime may have shifted
Hard rules (carry over from review-investment-screenshot)
- Insider data must come from
insider_ratio.py --window 90 (openinsider primary) — never trust yfinance net% headline.
- Form 4 code "P" only counts as buy. A/M/F/G are RSU/exercise/tax — NOT buys, regardless of how news headlines describe them. Verified false positives: UNH "10 directors 4/1/2026" (all DSU grants), PLTR "Karp 1.47M shares" (RSU vesting).
- Filter out 52w-high distribution traps (positions where insider net is "+net buy" but absolute SELL $ >> BUY $). Verified blacklist: APH, EME, ETN, PWR, POWL, GEV.
- Each candidate must have action + size + reason (entry, stop, target, why).
- **Confidence < 7/10 → don't include**. Quality > quantity. If only 2 candidates pass at swing horizon, output 2 not 3.
- No backtest fabrication. If thesis is unverified, label "speculative."
- Theme fit explicit — name the cluster (CPU inference, AI DC photonics, nuclear, etc.) not "AI play."
- Use
cluster_buy_scan.py to discover new candidates — it hits openinsider.com/latest-cluster-buys directly. Don't rely on news article "cluster buy" claims; verify Form 4 code = "P" for every name.
The 3 horizons + their alpha sources
Horizon 1: Swing (1-3 weeks)
Primary signals (any 2 must hit):
- Earnings within 21 days + ESP > +3% + last 4Q beat ≥ 3
- Short squeeze: short % of float > 15% + days-to-cover > 5
- Gamma squeeze: ATM/OTM call OI > put OI 3:1 within 30 DTE
- Insider cluster buy within last 14 days (≥2 insiders, ratio ≥ 3:1)
- Mean reversion: 10-15% drop from 30d high + RSI < 30 + bounce confirmed
Sizing: 1-2% of book per pick (small, fast, high-uncertainty).
Stop: -8% from entry or break of MA20.
Script: swing_scan.py
Horizon 2: Position (1-3 months)
Primary signals (any 2 must hit):
- Insider cluster buy within 60 days (ratio buy:sell ≥ 2:1, $ value > $500k)
- Analyst PT raises (3+ in last 30 days)
- Quarter earnings revision: NTM EPS revision > +5% in last 30 days
- Mean reversion: near MA200 + RSI 30-50 + recent insider activity
- Catalyst within 30-90 days (product launch, FDA, contract, M&A rumor)
Sizing: 2-4% of book per pick.
Stop: -12% from entry or thesis break.
Script: position_scan.py
Horizon 3: LEAPS Thesis (6-12+ months)
Primary signals (any 2 must hit):
- Founder/family/10%+ holder open-market buy ≥ $5M (AMKR Kim family pattern)
- Forward P/E < 25x AND revenue growth > 20% (GARP)
- Below MA200 (early cycle) + cash > 15% of mcap + low debt
- Multi-year secular thesis: CPU inference, AI DC photonics, edge AI, nuclear power, US re-shoring
- New CEO with skin-in-the-game (LSCC pattern: $1M+ open-market buy in first 3 months)
Sizing: 3-5% of book per pick. Use deep-ITM LEAPS (delta 0.85+) as stock replacement.
Stop: -25% from entry or fundamental thesis break.
Script: leaps_scan.py
Workflow when invoked
- Start with cluster-buy discovery — fast pass to surface market-wide candidates:
uv run --with yfinance python $(ls ~/.claude/{skills,plugins/claude-investment-skills}/review-investment-screenshot/scripts/cluster_buy_scan.py 2>/dev/null | head -1) --days 30 --min-value 500000 --min-insiders 2 --detail --enrich
- Run the 3 scripts in parallel:
uv run --with yfinance python $(ls ~/.claude/{skills,plugins/claude-investment-skills}/find-alpha/scripts/swing_scan.py 2>/dev/null | head -1) &
uv run --with yfinance python $(ls ~/.claude/{skills,plugins/claude-investment-skills}/find-alpha/scripts/position_scan.py 2>/dev/null | head -1) &
uv run --with yfinance python $(ls ~/.claude/{skills,plugins/claude-investment-skills}/find-alpha/scripts/leaps_scan.py 2>/dev/null | head -1) &
wait
- For each finalist (top 5 from each script), call
insider_ratio.py --window 90 to verify (uses openinsider primary).
- Cross-check any "cluster" claims at openinsider.com/[TICKER] for Form 4 code "P".
- For each verified candidate, do a 2-paragraph deep dive: thesis, why mispriced, what could break it.
- Output formatted table (see below).
Output format
# Alpha Scan — [DATE]
## 📊 Macro regime (gate — drives which horizons output)
🟢/🟡/🔴 — [1-line: composite score, sectors hot/cold, regime call]
[If 🔴 → "Only LEAPS horizon below. Swing/Position disabled this scan."]
## 🎯 Top 3 SWING (1-3 weeks) — [SKIP if regime != 🟢]
| Rank | Ticker | Thesis (1 line) | T1 | T2 | T3 | Stop | Target | Size | Confidence |
| 1 | XXX | ... | $X | $X | $X | $X | $X | 1.5% | 8/10 |
Where T1=trigger, T2=50DMA or -20%, T3=200DMA or -38%. ⚠️ STCG warning: 1-3 week swing = short-term cap gains when exited.
[For each: 2-paragraph deep dive. Must explicitly call out macro regime + insider verification.]
## 🎯 Top 3 POSITION (1-3 months) — [SKIP if regime == 🔴]
[Same structure with T1/T2/T3, size 2-4%]
## 🎯 Top 3 LEAPS (6-12+ months)
[Same structure with T1/T2/T3 for underlying, size 3-5%, mention dec 2027 vs jan 2028 expiry choice]
## ⚠️ Disqualified candidates
[Names that came up in scan but failed insider_ratio strict check. Include WHY (e.g. "INTC: 4 sells, 0 buys 90d", "PLTR: Karp Rule 10b5-1 vesting only — looks like buy but isn't").]
## 🧮 Sizing summary
- Current high-beta book exposure: X% (cap 50%)
- This scan's adds if all accepted: +Y%
- Post-add high-beta: Z% [warn if > 50%]
Tool cheat-sheet
| Task |
Script |
| Market-wide cluster-buy discovery |
`$(ls ~/.claude/{skills,plugins/claude-investment-skills}/review-investment-screenshot/scripts/cluster_buy_scan.py 2>/dev/null |
| 1-3 week swing alpha scan |
`$(ls ~/.claude/{skills,plugins/claude-investment-skills}/find-alpha/scripts/swing_scan.py 2>/dev/null |
| 1-3 month position alpha scan |
`$(ls ~/.claude/{skills,plugins/claude-investment-skills}/find-alpha/scripts/position_scan.py 2>/dev/null |
| LEAPS alpha scan |
`$(ls ~/.claude/{skills,plugins/claude-investment-skills}/find-alpha/scripts/leaps_scan.py 2>/dev/null |
| Verify candidate insider strict (openinsider primary) |
`$(ls ~/.claude/{skills,plugins/claude-investment-skills}/review-investment-screenshot/scripts/insider_ratio.py 2>/dev/null |
| Live quote/MAs |
`$(ls ~/.claude/{skills,plugins/claude-investment-skills}/review-investment-screenshot/scripts/quote_pull.py 2>/dev/null |
| Option walls |
`$(ls ~/.claude/{skills,plugins/claude-investment-skills}/review-investment-screenshot/scripts/option_walls.py 2>/dev/null |
| Max pain |
`$(ls ~/.claude/{skills,plugins/claude-investment-skills}/review-investment-screenshot/scripts/max_pain.py 2>/dev/null |
Schedule integration
This skill is configured to auto-run via cron:
- Mondays 8:00 AM ET (pre-market): full 3-horizon scan
- Daily 9:15 AM ET (15 min before open): swing-only scan (catches overnight catalysts)
- First of each month: LEAPS-only deep scan
Schedule managed via schedule skill. Trigger names:
weekly-alpha-scan (Monday)
daily-swing-scan (weekdays)
monthly-leaps-scan (1st of month)
To pause: /schedule pause [trigger-name]. To run on-demand: just ask "run alpha scan now."
Hard exclusions (verified distribution-at-top, do not surface)
These appeared with positive net% but failed strict buy-vs-sell check on 2026-04-24:
- APH, EME, ETN, PWR, POWL, GEV — all CEO/Officer dumping at 52w high
These will be auto-filtered by scripts via blacklist.
Anti-patterns (will reject candidates if these appear)
- "Insider net buy %" used as primary signal without dollar ratio
- Tax-withholding events counted as sales (filtered automatically)
- RSU grants counted as buys (filtered automatically)
- Single-Director small buy ($<$200k) without C-suite confirmation
- Stock at 52w high + recent C-suite open market sell > $5M (auto-blacklist)
1---2name: find-alpha3description: Find alpha across 3 time horizons (1-3 week swing, 1-3 month position, 6-12+ month LEAPS). Each scan returns top 3 candidates with strict filters (insider real buying not RSU, theme fit, catalyst, valuation). Designed to be invoked manually OR via schedule (weekly Monday pre-market). Companion to review-investment-screenshot skill.4---56# Find Alpha — 3-Horizon Screener78**Goal:** Find 3 tickers per time horizon (swing / position / LEAPS) where market hasn't fully priced the upside. Not "good companies" — **mispriced setups**.910**Companion to** `review-investment-screenshot`. Output of this skill feeds INTO that skill for full review.1112---1314## 🔍 Pre-flight checklist — run BEFORE returning any candidate1516Discovery is the easy half. Execution discipline is where alpha leaks. Every candidate output MUST pass:17181. **Macro regime gate** — trigger `macro-warning` skill first. Regime determines which horizons to run:19 - 🟢 GREEN: all 3 horizons (swing + position + LEAPS)20 - 🟡 YELLOW: position + LEAPS only (skip swing — chop kills swings)21 - 🔴 RED: LEAPS only at deep value, no swing/position adds. Output should default to "no swings/positions this week" in RED.222. **Insider strict per candidate** — already in Hard Rules #1 below. Don't bend it for a "great story."233. **3-tier entry MANDATORY per candidate** — output "Entry: $X" alone is insufficient. Must be T1 (trigger) / T2 (50DMA or 20% drawdown) / T3 (200DMA or 38% drawdown). User should never have to ask "but at what price specifically?"244. **Position size capped per horizon** (already defined in horizons below — enforce strictly):25 - Swing: 1-2% per pick · Position: 2-4% · LEAPS: 3-5%26 - High-beta total book ≤ 50%.275. **Tax flag for Swing horizon** — Swing = 1-3 weeks = STCG when exited. If user is in high bracket, surface that explicitly in output ("STCG ~30% federal — net win must clear that").286. **No "speculative" hidden in confidence** — If thesis is unverified, label "🟡 SPECULATIVE" in confidence column. Don't bundle speculation into 8/10 ratings.2930**"Look carefully" rule**: blacklisted names (APH, EME, ETN, PWR, POWL, GEV) and similar distribution-at-top patterns return via news cycles. Always re-verify with `insider_ratio.py`, don't trust the cached blacklist as the only filter. New distribution patterns appear; refresh the blacklist quarterly.3132See [README's Hard Rules](../README.md#%EF%B8%8F-hard-rules-never-violate) for the full anti-pattern list.3334---3536## When to invoke3738- User asks: "find alpha", "find me 3 tickers", "what's the next MRVL setup", "screen swing trades", "weekly alpha scan"39- Scheduled run (Monday pre-market, weekly)40- After major macro event (Fed decision, big earnings) — universe regime may have shifted4142## Hard rules (carry over from review-investment-screenshot)43441. **Insider data must come from `insider_ratio.py --window 90` (openinsider primary)** — never trust yfinance net% headline.452. **Form 4 code "P" only counts as buy.** A/M/F/G are RSU/exercise/tax — NOT buys, regardless of how news headlines describe them. Verified false positives: UNH "10 directors 4/1/2026" (all DSU grants), PLTR "Karp 1.47M shares" (RSU vesting).463. **Filter out 52w-high distribution traps** (positions where insider net is "+net buy" but absolute SELL $ >> BUY $). Verified blacklist: APH, EME, ETN, PWR, POWL, GEV.474. **Each candidate must have action + size + reason** (entry, stop, target, why).485. **Confidence < 7/10 → don't include**. Quality > quantity. If only 2 candidates pass at swing horizon, output 2 not 3.496. **No backtest fabrication**. If thesis is unverified, label "speculative."507. **Theme fit explicit** — name the cluster (CPU inference, AI DC photonics, nuclear, etc.) not "AI play."518. **Use `cluster_buy_scan.py` to discover new candidates** — it hits openinsider.com/latest-cluster-buys directly. Don't rely on news article "cluster buy" claims; verify Form 4 code = "P" for every name.5253---5455## The 3 horizons + their alpha sources5657### Horizon 1: Swing (1-3 weeks)58**Primary signals (any 2 must hit):**59- Earnings within 21 days + ESP > +3% + last 4Q beat ≥ 360- Short squeeze: short % of float > 15% + days-to-cover > 561- Gamma squeeze: ATM/OTM call OI > put OI 3:1 within 30 DTE62- Insider cluster buy within last 14 days (≥2 insiders, ratio ≥ 3:1)63- Mean reversion: 10-15% drop from 30d high + RSI < 30 + bounce confirmed6465**Sizing:** 1-2% of book per pick (small, fast, high-uncertainty).66**Stop:** -8% from entry or break of MA20.67**Script:** `swing_scan.py`6869### Horizon 2: Position (1-3 months)70**Primary signals (any 2 must hit):**71- Insider cluster buy within 60 days (ratio buy:sell ≥ 2:1, $ value > $500k)72- Analyst PT raises (3+ in last 30 days)73- Quarter earnings revision: NTM EPS revision > +5% in last 30 days74- Mean reversion: near MA200 + RSI 30-50 + recent insider activity75- Catalyst within 30-90 days (product launch, FDA, contract, M&A rumor)7677**Sizing:** 2-4% of book per pick.78**Stop:** -12% from entry or thesis break.79**Script:** `position_scan.py`8081### Horizon 3: LEAPS Thesis (6-12+ months)82**Primary signals (any 2 must hit):**83- Founder/family/10%+ holder open-market buy ≥ $5M (AMKR Kim family pattern)84- Forward P/E < 25x AND revenue growth > 20% (GARP)85- Below MA200 (early cycle) + cash > 15% of mcap + low debt86- Multi-year secular thesis: CPU inference, AI DC photonics, edge AI, nuclear power, US re-shoring87- New CEO with skin-in-the-game (LSCC pattern: $1M+ open-market buy in first 3 months)8889**Sizing:** 3-5% of book per pick. Use deep-ITM LEAPS (delta 0.85+) as stock replacement.90**Stop:** -25% from entry or fundamental thesis break.91**Script:** `leaps_scan.py`9293---9495## Workflow when invoked96971. **Start with cluster-buy discovery** — fast pass to surface market-wide candidates:98 ```bash99 uv run --with yfinance python $(ls ~/.claude/{skills,plugins/claude-investment-skills}/review-investment-screenshot/scripts/cluster_buy_scan.py 2>/dev/null | head -1) --days 30 --min-value 500000 --min-insiders 2 --detail --enrich100 ```1012. **Run the 3 scripts in parallel:**102 ```bash103 uv run --with yfinance python $(ls ~/.claude/{skills,plugins/claude-investment-skills}/find-alpha/scripts/swing_scan.py 2>/dev/null | head -1) &104 uv run --with yfinance python $(ls ~/.claude/{skills,plugins/claude-investment-skills}/find-alpha/scripts/position_scan.py 2>/dev/null | head -1) &105 uv run --with yfinance python $(ls ~/.claude/{skills,plugins/claude-investment-skills}/find-alpha/scripts/leaps_scan.py 2>/dev/null | head -1) &106 wait107 ```1083. For each finalist (top 5 from each script), **call `insider_ratio.py --window 90` to verify** (uses openinsider primary).1094. Cross-check any "cluster" claims at openinsider.com/[TICKER] for Form 4 code "P".1105. For each verified candidate, do a **2-paragraph deep dive**: thesis, why mispriced, what could break it.1116. Output formatted table (see below).112113## Output format114115```116# Alpha Scan — [DATE]117118## 📊 Macro regime (gate — drives which horizons output)119🟢/🟡/🔴 — [1-line: composite score, sectors hot/cold, regime call]120[If 🔴 → "Only LEAPS horizon below. Swing/Position disabled this scan."]121122## 🎯 Top 3 SWING (1-3 weeks) — [SKIP if regime != 🟢]123| Rank | Ticker | Thesis (1 line) | T1 | T2 | T3 | Stop | Target | Size | Confidence |124| 1 | XXX | ... | $X | $X | $X | $X | $X | 1.5% | 8/10 |125126Where T1=trigger, T2=50DMA or -20%, T3=200DMA or -38%. ⚠️ STCG warning: 1-3 week swing = short-term cap gains when exited.127128[For each: 2-paragraph deep dive. Must explicitly call out macro regime + insider verification.]129130## 🎯 Top 3 POSITION (1-3 months) — [SKIP if regime == 🔴]131[Same structure with T1/T2/T3, size 2-4%]132133## 🎯 Top 3 LEAPS (6-12+ months)134[Same structure with T1/T2/T3 for underlying, size 3-5%, mention dec 2027 vs jan 2028 expiry choice]135136## ⚠️ Disqualified candidates137[Names that came up in scan but failed insider_ratio strict check. Include WHY (e.g. "INTC: 4 sells, 0 buys 90d", "PLTR: Karp Rule 10b5-1 vesting only — looks like buy but isn't").]138139## 🧮 Sizing summary140- Current high-beta book exposure: X% (cap 50%)141- This scan's adds if all accepted: +Y%142- Post-add high-beta: Z% [warn if > 50%]143```144145---146147## Tool cheat-sheet148149| Task | Script |150|------|--------|151| **Market-wide cluster-buy discovery** | `$(ls ~/.claude/{skills,plugins/claude-investment-skills}/review-investment-screenshot/scripts/cluster_buy_scan.py 2>/dev/null | head -1) --days 30 --min-value 500000 --min-insiders 2 --detail --enrich` (always run first) |152| 1-3 week swing alpha scan | `$(ls ~/.claude/{skills,plugins/claude-investment-skills}/find-alpha/scripts/swing_scan.py 2>/dev/null | head -1)` |153| 1-3 month position alpha scan | `$(ls ~/.claude/{skills,plugins/claude-investment-skills}/find-alpha/scripts/position_scan.py 2>/dev/null | head -1)` |154| LEAPS alpha scan | `$(ls ~/.claude/{skills,plugins/claude-investment-skills}/find-alpha/scripts/leaps_scan.py 2>/dev/null | head -1)` |155| **Verify candidate insider strict** (openinsider primary) | `$(ls ~/.claude/{skills,plugins/claude-investment-skills}/review-investment-screenshot/scripts/insider_ratio.py 2>/dev/null | head -1) "TICKER" --window 90` (mandatory cross-check). Add `--source both` for high-stakes calls. |156| Live quote/MAs | `$(ls ~/.claude/{skills,plugins/claude-investment-skills}/review-investment-screenshot/scripts/quote_pull.py 2>/dev/null | head -1)` |157| Option walls | `$(ls ~/.claude/{skills,plugins/claude-investment-skills}/review-investment-screenshot/scripts/option_walls.py 2>/dev/null | head -1)` |158| Max pain | `$(ls ~/.claude/{skills,plugins/claude-investment-skills}/review-investment-screenshot/scripts/max_pain.py 2>/dev/null | head -1)` |159160---161162## Schedule integration163164This skill is configured to auto-run via cron:165- **Mondays 8:00 AM ET (pre-market)**: full 3-horizon scan166- **Daily 9:15 AM ET (15 min before open)**: swing-only scan (catches overnight catalysts)167- **First of each month**: LEAPS-only deep scan168169Schedule managed via `schedule` skill. Trigger names:170- `weekly-alpha-scan` (Monday)171- `daily-swing-scan` (weekdays)172- `monthly-leaps-scan` (1st of month)173174To pause: `/schedule pause [trigger-name]`. To run on-demand: just ask "run alpha scan now."175176---177178## Hard exclusions (verified distribution-at-top, do not surface)179180These appeared with positive net% but failed strict buy-vs-sell check on 2026-04-24:181- **APH, EME, ETN, PWR, POWL, GEV** — all CEO/Officer dumping at 52w high182183These will be auto-filtered by scripts via blacklist.184185## Anti-patterns (will reject candidates if these appear)186187- "Insider net buy %" used as primary signal without dollar ratio188- Tax-withholding events counted as sales (filtered automatically)189- RSU grants counted as buys (filtered automatically)190- Single-Director small buy ($<$200k) without C-suite confirmation191- Stock at 52w high + recent C-suite open market sell > $5M (auto-blacklist)