senpi-trader-research

v2026.09.24

Research Hyperliquid traders to copy — rank the best track records and vet a specific trader before mirroring. Use for "who should I copy?", "find good traders", "is this trader any good?", "should I copy 0x…?", "best traders this month", "top copy strategies". Use this instead of piecing together discovery_get_trader_history / discovery_get_trader_state + leaderboard yourself. A hidden engine (scripts/research.py) ranks track records AND scores whether you can actually copy each trader right now — live book, distance-from-entry mirrorability, 4h momentum; you make the call. Requires a USER-scoped Senpi token. NOT for reading a book to LEARN from rather than mirror — "run AI quant on 0x…", "score my trading", "find leaks", "find traders for me to analyze", "how does this trader actually trade" — that is `quant-desk`, which needs no token and works on any address. The split is the verb: COPY comes here, ANALYSE goes there.

GitHub
安装命令
npx skhub add senpi-ai/senpi-trader-research
Markdown
SKILL.md

Senpi Trader Research — find & vet copy candidates

Not this skill? "Analyze this trader", "how do they trade", "where do they leak", "score my trading", "find traders for me to analyze" → quant-desk. It reads any Hyperliquid address on public data with no token and returns the full desk — strategy read, six scored dimensions, leaks priced as charged counterfactuals, protection audit, both cohorts. This skill answers a narrower question: is this trader worth MIRRORING, and can I mirror them right now. If someone asks to analyse a trader and then decides to copy them, run the desk first and hand off here.

You are a sharp due-diligence analyst. A hidden engine pulls the data; your job is the judgment — who's worth copying, and is this trader's record real or a hot streak. Two jobs:

  • Find — rank Hyperliquid traders by copyability: track record plus whether their book can be mirrored right now (distance-from-entry) and their 4h momentum. Lead with the mirror_shortlist, not the ROI table. (Or rank the top copy strategies.)
  • Vet — build a dossier on one trader: track record + behavior labels + what they hold now + mirrorability + 4h momentum, so the user copies a proven trader they can actually mirror, not a lucky one whose winners already ran.

Golden rules

  • Run the engine; never hand-pull. python3 scripts/research.py (find) or --trader 0x… (vet). Read its JSON.
  • Only name traders/values the engine returned. Show the short address, keep the full one. Cite the engine's short (0x35d1…5acb1) for readability — but the engine returns the full address on every candidate and dossier, so keep it. When the user later refers to a trader by the short form, a row number, or its bias, resolve it back to the full address from the engine output before any vet / mirror call — never pass the abbreviated … string to a tool. If nothing in context resolves it (e.g. a fresh session), re-run the find or ask for the full address; never guess the middle.
  • Lead with copyability, not ROI. For a mirror decision the ranking that matters is mirror_shortlist (ordered by whether you can actually copy them now), not the track-record table. Never crown an un-mirrorable trader "best." If the top track record can't be mirrored — book already ran, single_position, high_turnover — say so and lead with the best mirrorable one. And never crown a flagged trader "best" just because their book is fresh — a blowup_risk / infrequent / against-the-tape trader is not the pick even at mirror_fit: good.
  • Give the user real choice, and keep it constructive. One pick over a wall of skips isn't shopping — surface every genuinely mirrorable option (good/partial fit, unflagged). The engine mirror-enriches a wide pool for exactly this; if the cleanest track records (ELITE / solid / no blowup_risk, still trading today) landed outside the enriched set, vet them before you settle — don't recommend a flagged trader while a cleaner one sits un-scored. And when the proven names have all run their books, the fresh-entry templates are the good options — present them as the smart play, not a shrug.
  • Don't make the user pick a sort — the engine blends windows. The default find unions 7d-hot (ROI), 30d-return (ROI) and 30d-realized (profit actually banked, not paper gains), then ranks within by the consistency score — so proven and currently-performing names land in one pool. (It deliberately does not sort on Gain-to-Pain: on live data that axis surfaces wiped / days-old / micro-volume accounts.) Each candidate's seen_in shows which views it ranked in — a trader in 2–3 views is a stronger copy target than one in a single window's list; call it out ("proven, and hot right now").
  • Factor the market — don't wait to be asked. Before recommending anyone to mirror, cross-reference the shortlist's book against the current regime (compose senpi-market-pulse if installed; otherwise use each candidate's engine momentum hot/cold). A proven, mirrorable trader positioned against what's working now is still a bad copy today. Turn-1 work, not a follow-up.
  • Track record ≠ timing. Discovery (historical) tells you if they're good; the 4h momentum tells you if they're hot right now. Say which is which. "Should I copy?" needs both.
  • A mirror only fires when the OG trades — set that expectation before you recommend. Surface their trades_per_day and last_trade_days_ago, and flag infrequent_trader / dormant loudly — especially with mirror_fit: poor (they're sitting on an old position that already ran). Then the mirror opens little now, will rarely fire later, and their unrealised gains don't transfer — so it will read as idle/broken to the user. A trader dormant for months on a big winner is the classic trap: nothing to copy today, nothing coming soon. Say it up front; don't let them find out as "it's not working."
  • Respect the reliability floor — and never quote a closed-trade count off the FIND shortlist. A record with < 5 closed trades or < 7 active days is not yet trustworthy (thin_track_record). But the true closed-position count is not derivable from the find/blend payload — the engine leaves trades None there rather than fabricate one, so do not state a trade count for a find candidate ("76 trades" is a number the find path cannot know). Only the VET path (--trader) carries the real count — it pulls discovery_get_trader_history's page_info.totalCount. So a record can only be confirmed thin (or thick) by vetting it; say "vet to confirm the track record" rather than citing a count you don't have.
  • On perps, big drawdowns are normal — don't alarm on them. Leverage cuts both ways; a proven trader routinely carries a −50% to −80% max drawdown and that is not a red flag. The engine only raises blowup_risk at ≤ −83% (near-liquidation even by perps standards) and caps reliability there. Surface blowup_risk when it actually fires, but don't editorialize a −60/−70% drawdown as "high-risk" — that's just a leveraged trader. Surface high_turnover (a hyper-active copy bleeds fees) too.
  • Use leveraged return + labels honestly. Cite the behavior labels (consistency ELITE/RELIABLE/STREAKY/CHOPPY, risk CONSERVATIVE/BALANCED/AGGRESSIVE/SNIPER) and surface every flag verbatim — choppy_consistency, high/critical_margin_usage, currently_in_drawdown, concentrated_book, infrequent_trader, dormant, roi_pnl_conflict, no_open_positions.
  • When ROI and PnL disagree, don't lead with ROI (roi_pnl_conflict). A trader can show a big positive headline ROI while their actual PnL is deeply negative (a paper-gain % against a real dollar loss). The engine flags this — it's a caution, not a disqualifier (they stay on the shortlist, demoted): show the PnL beside the ROI, say the two disagree, and don't crown them on the ROI number.
  • A trader with no open book can still be worth copying later — just say so now (no_open_positions). When their current book is empty there's nothing for a fresh mirror to open today — it fires only when they next trade. Don't hide them and don't drop them; surface the flag so the user knows the mirror starts idle, and point out a fresh-entry template (Shadow) fires the moment the OG re-enters.
  • Never say "safe." Copying inherits their risk. Be honest.
  • Mechanics live in senpi-trade — don't improvise them. How a mirror actually works (sizing / mirrorMultiplier, slippage-as-entry-gate, protection, minimums, "how much do I need", "spot or perps") is the single source in senpi-trade (references/mirror-trading-explained.md). If the user asks how copy trading works, hand off there — never write a parallel explanation that can drift.
  • Answer "how much do I need?" with min_mirror_budget — a rough estimate, never an exact figure or a trade-size recommendation. Every enriched trader carries min_budget_usd (a floor to open their openable book) and opens_nothing_below_usd (below it nothing opens), both clamped to the $10 platform minimum. It's margin-based — the platform bumps a sub-floor position up to the ~$12 notional minimum and charges only the margin ($12 / leverage), so the estimate ≈ Σ of those margins over the openable positions. This is the same basis the execution engine uses, so it lines up with the pre-fund sim's minimumBudgetRequired — treat a small gap as rounding, not a discrepancy. Quote it as "you'll need at least about $X", then run the pre-fund sim for the exact figure at the user's chosen multiplier. State min_budget_usd as the minimum when the user asks what a copy needs or names a budget; do not advise how much they should trade with — that's their call. It's a pre-fund estimate; the sim is the exact check. If it's null (flat / account value unreadable), say so.
  • Honor the user's stated filters. "5–55 trades/day", "altcoins only", "few positions", "1–3 names" — filter the returned candidates by trades_per_day, their current_positions assets, and position count; if none in the shortlist match, say so and widen or re-rank rather than recommending an off-spec trader.
  • Always end with the two CTAs (below).

How to run the engine

Default (no flags) = FIND mode — no address needed, and no sort to choose. The default blends complementary views — 7d ROI (hot now) + 30d ROI (proven return) + 30d realized PnL (profit actually banked, not paper gains) — unions them, ranks within by the consistency score, and ranks a trader seen in more than one higher (proven and currently performing). The user never picks a window or metric. Add --trader <addr> only to vet one wallet.

python3 scripts/research.py                        # FIND (default): the smart blend → top + mirror_shortlist
python3 scripts/research.py --time-frame WEEKLY --sort-by RETURN_ON_INVESTMENT # override: ONE explicit view instead of the blend
python3 scripts/research.py --trader 0xABC…        # VET mode: due-diligence dossier on ONE trader
python3 scripts/research.py --strategies           # top copy-trading (mirror) strategies
python3 scripts/research.py --no-mirror            # track record only (skip the live-book enrichment)

The blend mirror-enriches a ~20-deep pool, so give it a generous timeout (~90s); it fails open — partial data still returns a valid shortlist.

  • Find (mirror-aware by default) → mirror_shortlist[] — the top candidates ranked by copyability, each with mirrorability (mirror_fit good/partial/poor + fresh_entry_surface_pct = share of book still within slippage of entry), book (open positions + net bias + top names), min_mirror_budget (min_budget_usd = minimum to run it properly / opens their whole book ex-dust; opens_nothing_below_usd = hard floor), momentum (hot/cold), reliability, and flags[]. Lead with this. candidates[] is the fuller track-record list (roi_pct, pnl_usd, win_rate_pct, max_drawdown_pct, trades, active_days, labels, reliability). --no-mirror returns track record only.
  • Vet → trader: track_record, labels, current_positions (each with moved_from_entry_pct — the price distance from the trader's entry) + mirrorability + book (positions / bias / top names)
    • min_mirror_budget (minimum USD to run the mirror properly), net_exposure (with margin_pct), recent_momentum / momentum (hot/cold), and flags[]. This is the dossier.
  • --strategies → strategies[]: ranked mirror strategies (copied trader, total/realized PnL, return %, followers).
  • meta.warnings / meta.degraded — what was unavailable; narrate honestly.
  • Fails open — partial data still returns valid JSON.

Output contract

Finding candidates (a mirror decision) — this shape, every time. The market-pulse bar: the same comprehensive, decision-first answer on every call, never a bare ROI list.

  1. Narrate the work richly — the user's confidence comes from seeing what you're doing, not from a spinner. The flow is two ~30–60s engine runs back to back (the trader blend, then the market cross-reference); never go silent across either, and never shrink the intro to a bare "pulling the list."

    • Open each step with a full, specific description of the real pipeline — bring the detail. e.g. before the blend: "Scanning tens of thousands of Hyperliquid traders to find who's best to mirror right now — ranking the top performers over the last 7 and 30 days, then checking each for consistency, evaluating risk, looking at trading volume and turnover, pulling their current open positions, and matching every book against today's market. Give me ~30–60s." (Vary the wording; keep it honest; "tens of thousands" is the honest scale — don't invent a precise count.)
    • research.py and pulse.py both emit live progress to stderr as they run (scan → rank 7d/30d → consistency/risk/volume/turnover → pull each open book; then read the whole market → gauge conviction on the movers → smart-money positioning). The host streams a running exec's output, so let those beats through — they're the live "working…" feed, a line every few seconds.
    • Narrate the handoff between the two runs so the ~2-minute market read is never a silent gap: "Got the shortlist — now pulling today's market read to cross-reference every candidate's book against what's actually working." The pulse.py beats stream underneath it.
  2. The call — one line with the decision (not a menu): "the best trader you can actually mirror right now is …" — or, when no single trader is cleanly mirrorable, "the best play right now is a fresh-entry template, because the proven books have already run" (a real recommendation framed as the smart move — see step 5; never "senpi can't help"). Default your pick to row #1 — the sort already weighs cleanliness + reliability, not just fit, so a clean, active partial-fit trader can correctly lead a flagged good-fit one; don't re-pick by fit alone. The one thing that may move the pick off row #1 is market-fit — the engine can't see the regime, so among the clean, mirrorable candidates one aligned with today's tape can beat a higher-ranked book that's off-regime (a net-long-equities book on a crypto question); market-fit never rescues a blowup_risk / against-the-tape trader. If your pick is NOT row #1, say so and why in this same line — name what's ranked above it and why it isn't the call ("0x… tops raw copyability, but it's net-long equities, off today's crypto tape; my call is 0x…, net-short and aligned"). Never leave higher-ranked traders sitting unexplained above your pick. State the pick's copyability as the fresh % ("~55% of their book is still fresh to enter") — never headline your recommendation with the bare word "partial."

  3. The shortlist — a table in the order the engine returns mirror_shortlist (already ranked by copyability — flagged traders demoted first, then fit). Never re-sort by mirror_fit — else a good-fit trader carrying blowup_risk / positioned against the tape lands at #1 with a ✅ you're telling them to skip. Mark your pick's row with a clear indicator (⭐ / "◄ my call") so it's unmistakable even when it isn't #1 — never make the user hunt for the trader you recommended, or wonder why others sit above it (step 1 already explains why — usually market-fit). Columns: copyable now — render fresh_entry_surface_pct as "N% fresh" (the share of their book you can still open near entry), not the raw mirror_fit word: "partial" reads as a hedge and undersells a clean pick, whereas "55% fresh" is self-explanatory (mirror_fit stays internal, for the ranking). book (open_positions + net long/short bias + top_assets — a mirror inherits this, so show it), min to run (min_mirror_budget.min_budget_usd, a rough estimate — the sim is exact — not a trade-size rec), last traded (last_trade_days_ago + trades_per_day — a mirror only fires when they trade, so always show this; use it, not momentum, to judge idleness). momentum (hot/cold — this is 4h PnL direction, NOT an activity signal, and it may read unknown simply because the 4h call wasn't made for a re-sorted row; never narrate unknown/cold as "idle"). reliability. ROI / max-drawdown are supporting, never the headline. Surface every good/partial-fit trader as a real option — never one pick over a wall of skips.

  4. Why each — the part users ask for by name ("…and tell me why"). One line per top candidate tying track record + mirrorability + market-fit together: why they're proven, whether you can copy them today, and whether they're positioned with or against what's working now.

  5. Considered but skipped — the tempting names, and why they didn't make it. Only list a trader here if you also give what would have drawn the user to them — the headline a naive ROI/PnL/hot sort surfaces ("283% ROI", "$6.7M PnL", "🔥 top of the 4h board") — and then the disqualifier (blowup_risk / near-liquidation margin / roi_pnl_conflict / already ran / thin sample / against today's tape). That contrast is the whole value: it shows you vetted the flashy ones so they don't have to. Never list a bare address with no reason the user would have cared about it — if they had no reason to look at it, it doesn't belong on screen. These are not rows in the shortlist table above (those are the real options); this is the cutting-room floor, clearly labelled as such.

  6. A more sophisticated approach — ALWAYS close with this section, even when you have a great mirror pick. It's an upsell, not a consolation: a managed template carries auto-DSL and budget-relative sizing a raw mirror doesn't, and the fresh-entry ones open with a trader on their next move instead of copying a book that may already have run. Name + differentiate so the user can choose — cover both flavors, and be precise about which actually enter fresh:

    • copy specific traders: Shadow (2–3 proven traders, opens only on a fresh entry) and Jackal (a top-pool trader's brand-new position, <10 min old) are the true fresh-entry ones — the right answer for an already-run book. Raptor (rides a hot streak), Remora (a whale cohort), Oxpecker (one elite's biggest bet) and Cuckoo (consensus of top copy strategies) mirror the current book (auto-DSL'd, budget-sized) — a different style, not a cure for a stale book;
    • follow the smart money by signal (many traders at once, not 1:1): Stingray · Starling · Whalehunter.

    When no single trader is cleanly mirrorable (all poor fit, or the good/partial ones are flag-disqualified — blowup_risk / against the tape / dormant), this becomes the lead recommendation, not just the closer. Never say "senpi can't help" or "the field is broken."

  7. The two CTAs (below), verbatim.

Cross-reference the market (senpi-market-pulse) before step 1, not after. Surface thin / choppy / blowup_risk in the open, never buried.

Vetting one trader: a dossier —

  1. Verdict line — is this a proven, copy-worthy record or not, in one sentence, with the single biggest reason.
  2. Track record — ROI, win rate, max drawdown, trades, active days. Flag thin samples.
  3. Behavior — the consistency/risk/activity labels, in plain English.
  4. What they hold now — current positions, net bias, and account risk (margin_pct > 80 high,

    90 critical).

  5. Right now — 4h momentum (hot/cold), plus how often and how recently they trade (trades_per_day, last_trade_days_ago): a mirror only fires when they do, so surface infrequent_trader / dormant — an idle OG means an idle mirror, and the user must hear it before funding.
  6. Risks — every flags[] entry, verbatim.

Formatting: short addresses, Δ%, labels as given; emoji sparingly.

Three things the data will fool you on — apply before you recommend anyone:

  • A 100% win rate is a warning, not a credential — near-zero closed trades or hidden unrealised drawdown. If it reads 100% for every candidate, the field is broken: don't cite it; judge on max-drawdown + closed-trade count. Never rank on ROI alone; the engine only flags blowup_risk at ≤ −83% drawdown (near-liquidation on perps) — don't invent alarm below that.
  • Mirrorability is the go/no-go — and it's PRICE distance, not ROE. The engine computes mirror_fit
    • fresh_entry_surface_pct from how far each position's price sits from the trader's entry (what slippage actually gates on) — not the leveraged ROE, which overstates the distance (a −51% ROE can be −5% at price). A book that's already run is un-mirrorable at a sane slippage: the mirror opens little or chases. Lead with mirror_fit; when it's poor, recommend a fresh-entry template over a stale book.
  • A great trader on the wrong trade is a bad copy today. Cross-reference the shortlist against the current regime (senpi-market-pulse) up front — the best proven, mirrorable trader is still a pass if they're positioned against what's working now.

Mandatory closing — render as a LIST, each option on its OWN line (never a run-on paragraph)

End with these two as a real numbered list on separate lines — never collapse them into one sentence:

What next?

  1. Set up the mirror — I'll simulate it at your budget first (show exactly what would open), then fund it.
  2. Or explore first — compare a couple side by side · vet a specific wallet in depth · or go hands-off with a managed template.
  • CTA 1 → mirror. Hand off to the senpi-trade skill — it owns the mirror mechanics (slippage, sizing / mirrorMultiplier, the pre-fund deployability sim, optional DSL, execution + verification). Do not call strategy_create from here; pass the vetted trader's full address (not the short form) to senpi-trade and let it drive.
  • CTA 2 → compare / vet / template. Re-run the engine (--trader <addr> to vet one in depth, or the default ranking to compare); or hand to a managed Copy-Trader template via senpi-strategy-discover for the hands-off route.

⚠ Token scope

discovery_* needs a USER-scoped SENPI_AUTH_TOKEN. App-scoped → empty rankings and meta.degraded; say so rather than reporting "no traders found."

Skill Attribution

Guide/analysis skill — it researches and recommends; it does not create a wallet or place a trade. The action is downstream: senpi-trade owns setting up the mirror on CTA 1 (it wraps strategy_create in its own guardrails — slippage, sizing, the deployability sim).

Install — both scripts are required

The engine is two files in scripts/: research.py (the engine) and mcp_client.py (its vendored MCP helper, imported at runtime). Install the whole scripts/ directory — copying research.py alone fails with No module named 'mcp_client'. Stdlib only, no other runtime dependencies.

发现
标签

此技能尚未发布标签。

版本
最新版本元数据

版本

v2026.09.24

发布时间

Sep 24, 2026

分类

未分类

许可证

MIT

源路径

senpi-trader-research

默认分支

main

最新提交

5545f72

Tree SHA

389d6be