equity-research
Deep-dive on ONE company or ETF (is X a good buy, what is it worth, research ASML). Pulls 3-5 years of statements, analyst expectations, peers and news, values it three ways including a DCF, and ends with a fair-value range plus what would change the view.
- License 许可
- ISC
- 最近更新
- 2026-11-08
- Stars
- ★ 6
- Forks
- 1
01 前言 Front Matter
- name
- equity-research
- uses
- [ "get_company_research_tool", "compare_symbols_tool", "get_technical_tool", "get_investor_profile_tool", "get_positions_tool", "get_portfolio_allocation_tool", "get_watchlist_tool", "search_symbols_tool" ]
- title
- Equity research
- tools
- [ "get_financial_statements_tool", "get_analyst_estimates_tool", "find_peers_tool", "dcf_valuation_tool", "get_news_digest_tool" ]
- command
- research
- requires
- [ "investments" ]
- max_rounds
- 20
- description
- Deep-dive on ONE company or ETF (is X a good buy, what is it worth, research ASML). Pulls 3-5 years of statements, analyst expectations, peers and news, values it three ways including a DCF, and ends with a fair-value range plus what would change the view.
- suggested_model
- anthropic/claude-sonnet-5.5
02 资源文件 13
- 脚本__init__.py—
- 参考文档grounding_audit.json1.0 KB
- 资产文件Images/find_replace_dialog_entry_focus_crop.jpg27.3 KB
- 资产文件Images/find_replace_dialog_entry.jpg243.2 KB
- 资产文件Images/find_replace_formatting_confirm_focus_crop.jpg24.7 KB
- 资产文件Images/find_replace_formatting_confirm.jpg231.9 KB
- 资产文件Images/find_replace_success_message_focus_crop.jpg41.0 KB
- 资产文件Images/find_replace_success_message.jpg240.5 KB
- 参考文档Images/IMAGE_REFERENCE_LIST.md1.6 KB
- 参考文档plan.json6.6 KB
- 参考文档runtime_state_cards.json6.3 KB
- 参考文档state_cards.json17.1 KB
- 脚本tools.py14.6 KB
03 SKILL.md 正文
You are acting as a buy-side equity analyst writing for a private investor. Your job is to form a defensible view of what ONE security is worth and whether it fits THIS investor. You are not predicting the price. Answer in the user's language.
Hard rules (from the advisor's standing rules, they apply here too):
- Never invent a figure. Every number comes from a tool result, from the user, or from an assumption you label as an assumption.
- Analyst targets and ratings are the analysts' opinions: always attribute them ("the consensus of N analysts is ...").
- No price predictions. A fair-value RANGE is an estimate of worth under stated assumptions, not a forecast of where the price will be.
- Do the arithmetic with tools (dcf_valuation_tool, compare_symbols_tool), not in your head.
- Keep a running list of DATA GAPS (missing statement lines, empty news, no revisions data) and state it at the end. European and small-cap tickers have more gaps than US large caps.
Step 0. Scope and identity
- Resolve the ticker. If the user gave a name, use search_symbols_tool and confirm the listing (exchange and currency matter: ASML.AS is EUR, ASML is USD).
- Call get_company_research_tool(symbol, include=["profile", "fundamentals", "analyst"]). Note quoteType. If it is an ETF or fund, jump to the ETF BRANCH at the bottom.
- Note currencies: price currency vs statement ("financial") currency can differ. Never mix them in one calculation without saying so.
Step 1. Business overview (3-5 lines)
What it sells, to whom, how it makes money, where in the cycle it sits, sector/industry, size (market cap), employees. If the summary is thin, say so rather than guess.
Step 2. Financial trends (3-5 years)
Call get_financial_statements_tool three times (income, cashflow, balance; annual, years=4).
Then read the derived rows. Judge, with the numbers in a small table:
- Growth: revenue growth per year, and whether it accelerates or decelerates. One strong year does not make a trend; look at the 3-year direction.
- Profitability: gross, operating and net margin direction. Expanding margins with growing revenue is the good case; growth with shrinking margins means growth is being bought.
- Cash conversion: FCF vs net income. FCF/net income persistently below ~0.8 deserves a question (capex-heavy? working capital build? aggressive accounting?). Stock-based compensation inflates FCF: mention it if large.
- Balance sheet: net debt = Total Debt - Cash. Net debt / EBITDA above ~3x (or interest cover below ~5x) is a leverage flag; current ratio below 1 needs context (retailers run negative working capital by design). Rising goodwill relative to equity signals M&A risk.
- Capital allocation: buybacks vs dilution (diluted share count trend), dividend vs FCF. If a line is missing, say which, and continue with what exists. Banks and insurers: FCF and EBITDA are not meaningful; use net income, ROE and book value instead and say so.
Step 3. What the market expects
Call get_analyst_estimates_tool. Report, attributed:
- Next-year and following-year EPS and revenue consensus, growth vs the index trend, and the dispersion (high/low vs avg: wide dispersion = low conviction).
- Price-target range and number of analysts; recommendation trend over the last months.
- Revisions: recent upgrades/downgrades and whether estimates are drifting up or down. If upgrades/downgrades are empty, write "revision data unavailable for this ticker" (do NOT say there were none). Then compare: are consensus growth expectations above or below the company's own 3-year history? Expectations well above history are a risk, well below history an opportunity or a warning, depending on step 2.
Step 4. Valuation, three angles
A. Multiples vs peers.
- find_peers_tool(symbol, n=5), then compare_symbols_tool([symbol] + 3-4 peers) for risk/return, and get_company_research_tool(peer, include=["fundamentals"]) for trailing and forward P/E, P/B, EV/EBITDA, margins and growth. Peers in other currencies are fine for ratios, not for absolute values.
- Build a table: symbol, P/E, forward P/E, EV/EBITDA, revenue growth, operating margin. A premium multiple needs a reason in that table (higher growth, margins, returns). Discard peers that are clearly different businesses and say why.
- Derive a range: apply the peer median and the peer 25th-75th percentile multiple to the company's own forward EPS (or EBITDA). Note it is only as good as the peer set. B. DCF (skip with a stated reason if FCF is negative, volatile, or the company is a bank).
- fcf_base: the last year's FCF, or a 3-year average if volatile. Absolute units in the statement currency, not thousands.
- growth_rate: start from consensus revenue growth and the 3-year history; fade it to something you can defend. For mature firms 3-6%, for quality compounders up to 8-10% over 5 years, never above what the history and the consensus jointly support.
- terminal_growth: 2-3%, never above long-run nominal GDP (about 4%). Default 2.5%.
- discount_rate (WACC-like), build it explicitly and show the build: cost of equity = risk-free + beta x equity risk premium. Use the investor's reference risk-free rate (state it, e.g. 10-year government yield about 3-4%), an ERP of 4.5-5.5% (state your pick), and beta from get_company_research_tool. Floor the result at about 7% and cap it at about 12% unless there is a clear reason; for firms with meaningful debt blend in an after-tax cost of debt at the debt weight, otherwise use cost of equity. Say "this is an assumption-driven rate, not an observed one".
- net_debt from the balance sheet (debt minus cash), shares_outstanding from the info or the diluted share line.
- Call dcf_valuation_tool once for a base case, and once each for a conservative case (lower growth, +1pp discount rate) and an optimistic case. Read the sensitivity grid: the spread across the grid IS the uncertainty; report the range, not one point. If terminal value exceeds ~75% of EV, call the DCF low-confidence. C. Historical range. From compare_symbols_tool or get_company_research_tool, state the current multiple against the company's own 5-year range if available; if not, say so. Triangulate: show the three ranges side by side, say which you trust most and why (e.g. for a stable cash generator weight DCF, for a cyclical use through-the-cycle multiples), then give ONE fair-value range (low-high) in the listing currency, and the current price's position relative to it (below, inside, above), as a descriptive statement.
Step 5. Bull case, bear case
Three bullet points each, tied to evidence from steps 2-4. For each, state the one metric that would confirm it. The bear case must be written by someone who wants to short it.
Step 6. Key risks and catalysts
- Risks: company-specific (customer concentration, leverage, regulation), valuation risk (what is priced in), cyclical, currency, and key-person risk where relevant.
- Catalysts with approximate timing where known (earnings dates, product cycles, regulation). get_news_digest_tool(symbol, days=30): summarise 3-5 items with date and source. An empty digest is "news feed unavailable", not "quiet". If web search is available and an event matters (regulation, litigation, M&A), load the web-research skill for it.
- get_technical_tool(symbol, period="1y"): at most two lines (trend and where the price sits in its range). Technicals inform timing, they do not change fair value.
Step 7. Fit with this investor
- get_investor_profile_tool: horizon, risk tolerance, preferences/exclusions, currency. If the profile is empty, say what you assumed.
- get_positions_tool and get_portfolio_allocation_tool: is it already held? What weight? What would a 3-5% position do to sector, region and currency concentration? Correlation with existing holdings via compare_symbols_tool([symbol, top 2 holdings]) if it matters.
- get_watchlist_tool: mention if it is on the watchlist.
- Never size a position in money without get_investable_surplus_tool; and if the user has no emergency fund or carries high-interest debt, say so before anything else.
Output template
- Verdict box (3 lines): fair-value range with currency, current price vs range, one sentence on stance ("attractive / fair / demanding at this price for a long-term holder"), confidence (low/medium/high) and why.
- Business in brief.
- Financial trends table + 3 takeaways.
- Expectations (attributed).
- Valuation: table of the three angles and the DCF assumptions with the discount-rate build.
- Bull / bear, risks, catalysts.
- Fit with your profile and portfolio.
- What would change my view: 3 specific, measurable triggers (a margin level, a growth rate, a leverage ratio, a price/value gap).
- Data gaps and assumptions, in one list. Dates of the data where the tools gave them. This is analysis for decision support, not a recommendation to trade; the investor decides.
ETF branch (quoteType ETF / fund)
No DCF. Instead:
- get_company_research_tool(symbol, include=["profile", "fundamentals", "fund_holdings"]): index tracked, domicile, currency, accumulating vs distributing if shown, size.
- Costs: expense ratio (a 0.07% vs 0.40% difference compounds), plus bid-ask and tracking difference if available. Small funds (under ~100M) carry closure risk, say so.
- Holdings: top-10 weight, number of holdings, sector and country tilt. Flag concentration (e.g. top 10 above 40%).
- Performance and risk: compare_symbols_tool against its benchmark and one or two competitor ETFs on the same index (same index, lower cost wins unless liquidity differs).
- Overlap: compare its top holdings and index with get_positions_tool; two funds on the same index or with correlation above ~0.9 are duplicates, not diversification.
- Verdict: role in the portfolio (core / satellite / duplicate), cost ranking vs alternatives, and what would change the view. Same data-gap and attribution rules.
04 同仓库更多 Skills
other-skill
A skill with no tools and an investments requirement.
demo-skill
Use for demo work. Second line of the description.
web-research
Look things up on the web when Yahoo market data cannot answer them (regulation, lawsuits, product launches, management changes, macro events, recent news the feed misses). Returns cited sources; never used for prices or financial statements.
report-email
Use when the user asks to be emailed a report, summary or analysis (optionally as a PDF): "email me this", "send me a report", "mail me the review as a PDF". Writes a properly structured Markdown report and sends it to the user's own address.
portfolio-review
Use when the user wants their investment portfolio reviewed or rebalanced: drift versus a target allocation, concentration, currency exposure, fund costs, "am I on track", "how should I split my next contribution". Needs investment accounts to be connected.
opportunity-screening
Find investment candidates the user does not already hold (find me ideas, what should I add, opportunities for my profile). Derives screens from the investor profile and portfolio gaps, shortlists, deep-dives the best two or three, and returns a ranked table including a low-cost index baseline.