Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Detect institutional whale activity in options for a given underlying. Use when the user asks about unusual options activity, large block trades, whale trades, or institutional options flow for a specific symbol.
.claude/skills/staskh-whale-hunting/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | -24% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 27% | 0% |
| case-14 | ✗→✓ | ▲ Improved | -31% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 3% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 84% | 0% |
Scans option chains for a given underlying to identify institutional-sized trades using a two-step approach:
> Note: If uv is not installed or pyproject.toml is not found, replace uv run python with python in all commands below.
bashuv run python .claude/skills/whale-hunting/scripts/whale_hunting.py SYMBOL [--months N] [--date YYYY-MM-DD] [--sigma F] [--sigma-z F] [--summary]
SYMBOL — Underlying ticker (e.g. AAPL, NVDA, SPY)--months — Max months until option expiration to consider (default: 2)--date — Trading date to analyze in YYYY-MM-DD format (default: latest trading day)--sigma — Std-deviation multiplier for crude outlier threshold (default: 3.0)--sigma-z — Modified Z-Score threshold for per-second small-sample detection (default: 3.5)--summary — Also compute per-ticker summary and include it in the JSON outputReturns JSON with:
underlying — The scanned symboltrading_date — Date analyzedsource — "massive" (per-second data) or "yahoo only" (daily chain data)total_whales — Total whale events foundtotal_call_invested — Sum of invested dollars in call whale eventstotal_put_invested — Sum of invested dollars in put whale eventscall_put_ratio — Call invested / put invested (null if no puts)whales — List of whale events:timestamp, ticker, type, strike, expiryclose, volume, transactions, invested, break_evensummary (present only when `--summary` is passed) — List of per-ticker aggregates:ticker, type, strike, expiry, whale_count, total_invested, break_evenbash# Hunt whales for AAPL (latest trading day) uv run python .claude/skills/whale-hunting/scripts/whale_hunting.py AAPL # Hunt whales for NVDA on a specific date uv run python .claude/skills/whale-hunting/scripts/whale_hunting.py NVDA --date 2026-03-13 # With per-ticker summary uv run python .claude/skills/whale-hunting/scripts/whale_hunting.py HOOD --months 3 --summary # Looser detection threshold uv run python .claude/skills/whale-hunting/scripts/whale_hunting.py SPY --sigma 2.0
After running the script, present the results as follows.
Header line: > Whale activity for {underlying} on {trading_date} — source: {source} > Call flow: ${total_call_invested:,.0f} | Put flow: ${total_put_invested:,.0f} | C/P ratio: {call_put_ratio:.2f}
When --summary was requested, render the summary array as a table:
| Time (ET) | Ticker | Type | Strike | Expiry | # Events | Total Invested | Break Even | |-----------|--------|------|--------|--------|----------|----------------|------------| | {timestamp} | {ticker} | {type} | {strike} | {expiry} | {whale_count} | ${total_invested:,.0f} | {break_even} |
Sort by total_invested descending. For multi-event rows use the time range of first–last event (e.g. 11:46–12:33).
Interpretation guidance:
source: "massive" — High-confidence; per-second block trade data from Massive APIsource: "yahoo only" — Fallback; daily-level data (Massive API key missing or no intraday data)transactions: 1 — Single block trade; strongest whale signalMASSIVE_API_KEY environment variable for per-second data. Without it, falls back to Yahoo Finance daily data.All timestamps and time-based calculations must use the America/New_York timezone. All JSON output must include generated_at (NY time string) and data_delay fields.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-17 | pass→pass | 7,927 | 3,718 | -53% | 1 | 1 | 0% | 1,449 | 1,901 | +31% | 0 | 0 | — |
case-01 | pass→pass | 11,227 | 28,504 | +154% | 1 | 1 | 0% | 2,494 | 4,025 | +61% | 0 | 0 | — |
case-02 | pass→pass | 8,394 | 8,448 | +1% | 1 | 1 | 0% | 1,594 | 2,651 | +66% | 0 | 0 | — |
case-03 | pass→pass | 6,621 | 4,959 | -25% | 1 | 1 | 0% | 1,348 | 2,155 | +60% | 0 | 0 | — |
case-04 | fail→fail | 10,853 | 5,264 | -51% | 1 | 1 | 0% | 1,569 | 1,386 | -12% | 0 | 0 | — |
case-05 | fail→fail | 14,002 | 5,092 | -64% | 1 | 1 | 0% | 2,115 | 1,358 | -36% | 0 | 0 | — |
case-06 | fail→fail | 11,657 | 5,806 | -50% | 1 | 1 | 0% | 1,845 | 1,345 | -27% | 0 | 0 | — |
case-07 | fail→pass | 27,282 | 3,657 | -87% | 1 | 1 | 0% | 2,378 | 1,799 | -24% | 0 | 0 | — |
case-08 | fail→fail | 11,870 | 2,249 | -81% | 1 | 1 | 0% | 1,985 | 1,460 | -26% | 0 | 0 | — |
case-09 | pass→pass | 9,554 | 2,140 | -78% | 1 | 1 | 0% | 1,554 | 1,468 | -6% | 0 | 0 | — |
case-10 | pass→pass | 13,953 | 6,214 | -55% | 1 | 1 | 0% | 2,116 | 2,038 | -4% | 0 | 0 | — |
case-11 | pass→pass | 11,873 | 5,773 | -51% | 1 | 1 | 0% | 1,816 | 2,036 | +12% | 0 | 0 | — |
case-12 | pass→pass | 12,605 | 5,639 | -55% | 1 | 1 | 0% | 1,784 | 1,895 | +6% | 0 | 0 | — |
case-13 | fail→pass | 10,454 | 6,548 | -37% | 1 | 1 | 0% | 1,642 | 2,081 | +27% | 0 | 0 | — |
case-14 | fail→pass | 12,295 | 1,318 | -89% | 1 | 1 | 0% | 1,859 | 1,292 | -31% | 0 | 0 | — |
case-15 | fail→pass | 9,069 | 1,874 | -79% | 1 | 1 | 0% | 1,461 | 1,500 | +3% | 0 | 0 | — |
case-16 | fail→pass | 6,194 | 3,138 | -49% | 1 | 1 | 0% | 941 | 1,727 | +84% | 0 | 0 | — |
case-18 | fail→pass | 12,666 | 4,585 | -64% | 1 | 1 | 0% | 1,824 | 1,944 | +7% | 0 | 0 | — |
case-19 | fail→pass | 7,936 | 1,832 | -77% | 1 | 1 | 0% | 1,219 | 1,418 | +16% | 0 | 0 | — |
case-20 | fail→pass | 10,459 | 1,986 | -81% | 1 | 1 | 0% | 1,719 | 1,425 | -17% | 0 | 0 | — |
case-21 | fail→pass | 13,495 | 1,742 | -87% | 1 | 1 | 0% | 1,988 | 1,331 | -33% | 0 | 0 | — |
case-22 | fail→pass | 33,777 | 2,013 | -94% | 1 | 1 | 0% | 2,014 | 1,389 | -31% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +45 percentage points is the difference between those two pass rates over the 18 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.