{"id":51604801,"url":"https://github.com/AdvancingTitans/stock-analysis","last_synced_at":"2026-07-13T15:00:40.057Z","repository":{"id":360695169,"uuid":"1251062095","full_name":"AdvancingTitans/stock-analysis","owner":"AdvancingTitans","description":"Evidence-driven stock market analysis CLI for A-shares, Hong Kong stocks, US stocks, funds, and portfolios.","archived":false,"fork":false,"pushed_at":"2026-07-08T07:42:27.000Z","size":894,"stargazers_count":9,"open_issues_count":1,"forks_count":3,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-08T09:17:08.629Z","etag":null,"topics":["a-shares","ai-agent","chinese-stock-market","cli","data-quality","eastmoney","finance","financial-data","hong-kong-stocks","investment","market-data","portfolio-analysis","pypi","python","quantitative-finance","sentiment-analysis","stock-market","technical-analysis","trading","us-stocks"],"latest_commit_sha":null,"homepage":"https://github.com/AdvancingTitans/stock-analysis","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AdvancingTitans.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-27T07:58:25.000Z","updated_at":"2026-07-08T07:42:32.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/AdvancingTitans/stock-analysis","commit_stats":null,"previous_names":["advancingtitans/stock-analysis"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/AdvancingTitans/stock-analysis","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AdvancingTitans%2Fstock-analysis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AdvancingTitans%2Fstock-analysis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AdvancingTitans%2Fstock-analysis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AdvancingTitans%2Fstock-analysis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AdvancingTitans","download_url":"https://codeload.github.com/AdvancingTitans/stock-analysis/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AdvancingTitans%2Fstock-analysis/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35426086,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-13T02:00:06.543Z","response_time":119,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["a-shares","ai-agent","chinese-stock-market","cli","data-quality","eastmoney","finance","financial-data","hong-kong-stocks","investment","market-data","portfolio-analysis","pypi","python","quantitative-finance","sentiment-analysis","stock-market","technical-analysis","trading","us-stocks"],"created_at":"2026-07-12T01:00:29.515Z","updated_at":"2026-07-13T15:00:40.041Z","avatar_url":"https://github.com/AdvancingTitans.png","language":"Python","funding_links":[],"categories":["🔥 AI Powered Systematic Trading Systems","Tools and Platforms","Skills \u0026 Plugins","数据源"],"sub_categories":["On-Chain / DeFi Quantitative Strategies","Community Skills"],"readme":"# stock-analysis\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"./README.md\"\u003eEnglish\u003c/a\u003e |\n  \u003ca href=\"./README.zh-CN.md\"\u003e简体中文\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/social-preview.png\" alt=\"stock-analysis social preview\" width=\"860\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eEvidence-first stock market analysis for AI agents, quant researchers, and investors who want auditable daily notes.\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  A/HK/US stocks · Funds · Portfolios · JSON Evidence Packs · Data-quality scoring · Multi-source fallback · Investor lenses\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/thuquant/awesome-quant\"\u003e\u003cimg alt=\"Listed in thuquant/awesome-quant\" src=\"https://img.shields.io/badge/listed%20in-thuquant%2Fawesome--quant-2ea44f\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/leoncuhk/awesome-quant-ai\"\u003e\u003cimg alt=\"Listed in leoncuhk/awesome-quant-ai\" src=\"https://img.shields.io/badge/listed%20in-leoncuhk%2Fawesome--quant--ai-2ea44f\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  Listed in \u003ca href=\"https://github.com/thuquant/awesome-quant\"\u003ethuquant/awesome-quant\u003c/a\u003e via merged PR\n  \u003ca href=\"https://github.com/thuquant/awesome-quant/pull/48\"\u003e#48\u003c/a\u003e.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  Listed in \u003ca href=\"https://github.com/leoncuhk/awesome-quant-ai\"\u003eleoncuhk/awesome-quant-ai\u003c/a\u003e\n  under \u003cem\u003eTools and Platforms / Data Providers\u003c/em\u003e via merged PR\n  \u003ca href=\"https://github.com/leoncuhk/awesome-quant-ai/pull/39\"\u003e#39\u003c/a\u003e.\n\u003c/p\u003e\n\n`stock-analysis` turns public market data into deterministic Markdown reports and machine-readable evidence. It is built for repeatable market recaps, not black-box trading signals.\n\n```bash\nuv tool install stock-analysis\n\nstock-analysis --market daily\nstock-analysis --market stock --symbol 600519\nstock-analysis --market screen --fiscal-year 2025 --universe-file official_universe.json --filter roe_weighted:gt:8% --sort roe_weighted:desc\nstock-analysis --market global --format full --with-holdings --emit-evidence\n```\n\n\u003e The output is for research only and does not constitute investment advice.\n\n## Why It Exists\n\nMost market \"AI analysis\" starts with a prompt and ends with a fluent paragraph. `stock-analysis` starts with evidence:\n\n- Fetch public market data across A-shares, Hong Kong stocks, US stocks, funds, and portfolios.\n- Normalize symbols, timestamps, source metadata, and missing fields before writing conclusions.\n- Score report quality from six evidence modules instead of pretending every data source worked.\n- Emit JSON files that AI agents, notebooks, cron jobs, or human reviewers can inspect and diff.\n\nIf a data source fails, the report records the gap. Missing metrics stay missing; they are not filled with zeroes or guessed from nearby signals.\n\n## Start with the investor question\n\nChoose the investing question you have rather than assembling low-level flags. Each scenario starts with deterministic evidence (checkable prices, disclosed financial facts, or public events); an Agent may interpret it, but cannot bypass its source, trading-date, and completeness rules.\n\n| If you need to… | Use it when… | Scenario | Deterministic entrypoint |\n|---|---|---|---|\n| Understand today's market | You want market context before, during, or after a trading session. | `/market-recap` | `--market daily` |\n| Fact-check a ticker | You only need price, recent performance, turnover, and disclosed facts—not an opinion. | `/stock-snapshot` | `--market stock --symbol` |\n| Decide whether a company merits more research | You are considering a position, a hold, or a structured fact check. | `/stock-review` | `--market stock-review --symbol` |\n| See what actually changed after results | A quarterly or annual report has been released and you want disclosed financial facts. | `/earnings-review` | `--market earnings --symbol` |\n| Investigate a sharp move cautiously | You want price, volume, and public events without treating a headline as proof of cause. | `/price-move` | `--market price-move --symbol` |\n| Check whether holdings are too concentrated | You have already saved complete holdings information. | `/portfolio-review` | `--market portfolio` |\n| Find A-shares meeting explicit financial conditions | You have hard conditions such as ROE or revenue growth and need repeatable results. | `/stock-screen` | `--market screen …` |\n| Record and revisit your investment case | You have an investment hypothesis and want to check it against later facts. | `/thesis-create`, `/thesis-review` | `--market thesis-create|thesis-review --symbol` |\n\nClaude Code supports native `/command` entrypoints. In Codex, Custom Prompts appear as `/prompts:stock-review`; after installing the generated Skills, an Agent can match a plain-language request such as “review Tencent” to the relevant Skill and run its deterministic command. Intent matching happens in the host Agent from the Skill description, not in the `stock-analysis` Python package. The same canonical catalog generates every entrypoint, so their workflow contract does not drift.\n\n## How the system works\n\n```mermaid\nflowchart TB\n    U[\"Investor / Codex / Claude Code / Hermes\"] --\u003e S[\"Scenario entry\\nmarket recap · snapshot · review · earnings · price move · portfolio · thesis\"]\n    S --\u003e O[\"Research orchestration\\nintent, scope, framework, counter-evidence\"]\n    O --\u003e E[\"Evidence Engine\\nMarket Pack M1–M6 · Company Pack C1–C8 · Fund · Portfolio\"]\n    E --\u003e G[\"Data governance\\nsymbols · trade dates · source routes · validation · missing-data suppression\"]\n    G --\u003e D[\"Public sources\\nTencent · Sina · Eastmoney · Tiantian Fund · filings/news · optional browser\"]\n    E --\u003e R[\"Markdown report + JSON Evidence + local thesis state\"]\n    R --\u003e O\n```\n\nThe essential boundary is deliberate: **the scenario chooses the research question, code obtains and validates evidence, and a lens only interprets the available evidence.** Market M1–M6 is for market/portfolio state; the separate C1–C8 Company Evidence Pack answers “what do we actually know about this company?” rather than treating market heat or a one-day move as a company fact.\n\n```mermaid\nflowchart LR\n    Q[\"Question\"] --\u003e P[\"Primary public source\"]\n    P --\u003e V{\"Valid fields and date?\"}\n    V -- Yes --\u003e N[\"Normalize + calculate\"] --\u003e J[\"Evidence JSON\"] --\u003e A[\"Report / Agent reasoning\"]\n    V -- No --\u003e F[\"Validated alternate source\"] --\u003e V2{\"Verified?\"}\n    V2 -- Yes --\u003e N\n    V2 -- No --\u003e G[\"Explicit evidence gap\"] --\u003e J\n```\n\n## Agent installation\n\nFrom a checkout, generate and verify the tracked entrypoints:\n\n```bash\npython3 scripts/sync_agent_entrypoints.py --check\nscripts/install-agent-entrypoints.sh codex\nscripts/install-agent-entrypoints.sh claude\n```\n\nThe installer copies Codex Skills into `${CODEX_HOME:-~/.codex}/skills` and Claude commands into `${CLAUDE_CONFIG_DIR:-~/.claude}/commands`. It does not install data-source dependencies or modify a portfolio profile.\n\n## Report Showcase\n\n| Committee recap | Buffett recap | Simons recap |\n|---|---|---|\n| [2026-07-09 Investment committee recap](reports/20260709-投委会-行情复盘.md)\u003cbr\u003e![Global market recap](assets/全球市场复盘_1.png) | [2026-07-09 Buffett recap](reports/20260709-巴菲特-行情复盘.md)\u003cbr\u003e![Buffett global recap](assets/全球市场复盘（巴菲特）_1.png) | [2026-07-09 Simons recap](reports/20260709-西蒙斯-行情复盘.md)\u003cbr\u003e![Simons global recap](assets/全球市场西蒙斯视角行情分析_1.png) |\n\n| Buffett stock lens | Simons stock lens | Fund profile |\n|---|---|---|\n| [Kweichow Moutai 600519](reports/20260709-巴菲特-贵州茅台600519.md)\u003cbr\u003e![Moutai Buffett lens](assets/贵州茅台个股分析（巴菲特）_1.png) | [Kweichow Moutai 600519](reports/20260709-西蒙斯-贵州茅台600519.md)\u003cbr\u003e![Moutai Simons lens](assets/贵州茅台个股分析（西蒙斯）_1.png) | [Semiconductor ETF 512480](reports/20260709-512480-半导体ETF基金分析.md)\u003cbr\u003e![Semiconductor fund analysis](assets/半导体基金分析_1.png) |\n\nBrowse the [report directory](reports/) for the six 2026-07-09 Markdown reports, screenshots, social-share assets, and automation examples.\n\n## What You Get\n\n| Capability | What it means |\n|---|---|\n| Evidence Pack JSON | `evidence_YYYYMMDD.json` plus M1-M6 module files for audit, automation, and agent handoff. |\n| A/HK/US/fund coverage | One CLI for broad market snapshots, single stocks, funds, and portfolio exposure. |\n| Data-source routing | Tencent/Sina first where stable, Eastmoney for unique China-market data, browser fallback only when needed. |\n| Quality scoring | Reports carry a 100-point evidence quality score and identify missing modules. |\n| Investor lenses | Built-in Buffett, Munger, Graham, Simons, Dalio, Duan Yongping, Zhang Kun, and other structured lenses. |\n| Portfolio memory | Optional local holdings profile with benchmark comparison, concentration risk, and FX normalization. |\n| Deterministic A-share screening | Strict annual-report conditions with official-Universe gating, per-stock PASS/FAIL/UNKNOWN decisions, and one auditable Evidence JSON. |\n| Guarded market-data evidence | Northbound flow requires a validated full-day sequence; fund profiles expose per-fund field coverage; listed A-shares/ETFs get 5d/20d/60d price-volume metrics and split-normalized premium/discount series when public samples are complete. |\n\n## Quickstart\n\nInstall from PyPI:\n\n```bash\nuv tool install stock-analysis\nstock-analysis --market daily\n```\n\nRun from a local checkout:\n\n```bash\ngit clone https://github.com/AdvancingTitans/stock-analysis.git\ncd stock-analysis\nuv run stock-analysis --market daily\n```\n\nCommon commands:\n\n```bash\n# Auto-select summary/key-points/full by Beijing market session\nstock-analysis --market daily\n\n# Full global recap with auditable JSON evidence\nstock-analysis --market global --format full --emit-evidence\n\n# Deterministic single-stock snapshot, no LLM required\nstock-analysis --market stock --symbol 600519\n\n# Use when you want a structured company fact check: it gives facts and gaps, not a buy score\nstock-analysis --market stock-review --symbol 600519 --emit-evidence\n\n# Use after a results release: disclosed structured financial facts only\nstock-analysis --market earnings --symbol 600519 --emit-evidence\n\n# Use after a sharp move: price, volume, and public events without asserting causality\nstock-analysis --market price-move --symbol 600519 --emit-evidence\n\n# Create and later compare a local structured thesis snapshot\nstock-analysis --market thesis-create --symbol 600519\nstock-analysis --market thesis-review --symbol 600519\n\n# Deterministic fund snapshot with public profile and holdings data\nstock-analysis --market fund --symbol 161725\n\n# Deterministic A-share annual-report screen; requires a complete official Security Master snapshot\nstock-analysis --market screen --fiscal-year 2025 --universe-file official_universe.json \\\n  --filter roe_weighted:gt:8% --filter revenue_growth_yoy:gt:8% \\\n  --sort roe_weighted:desc --limit 20 --emit-evidence\n\n# Diagnose Tencent, Sina, Eastmoney, browser, and optional mootdx routes\nstock-analysis --market diagnose\n```\n\n## Evidence Modules\n\n### Company Evidence Pack (C1–C8)\n\nThink of this as a “facts to check before doing more research” list. It is neither a stock screener nor an automatic buy/sell answer.\n\n**When does it run?** Use `/stock-review` or `stock-analysis --market stock-review --symbol \u003csymbol\u003e` when you want to answer “should I spend more time researching or holding this company?” Running it does not create a portfolio, save an investment case, or assign a composite score. A thesis is saved locally only when you explicitly run `thesis-create`.\n\n**What will you get?** The report separates checked facts, missing public data, and the next evidence you would need. For example, if financial quality and valuation facts are available, it shows their period and source. If there is not enough observable material on moat, management, or capital allocation, it says the evidence is missing instead of calling the company “high quality.”\n\n| Module | Investor question | What it checks first |\n|---|---|---|\n| C1 Business quality | How does the company make money? | Quote, market, and available business facts; missing business breakdowns stay gaps. |\n| C2 Financial quality | Are earnings and cash flow supported by disclosed facts? | Revenue, margins, ROE, leverage, operating cash flow, and free cash flow where disclosed. |\n| C3 Growth quality | Is the claimed growth visible in disclosed numbers? | Structured revenue/profit history; it does not guess the source of growth. |\n| C4 Moat evidence | Is there evidence for pricing power, stickiness, or cost advantage? | Observable evidence only; absent data is explicit. |\n| C5 Management and capital allocation | Can buybacks, dividends, deals, dilution, or governance events be checked? | Available public events; no management verdict where coverage is absent. |\n| C6 Valuation and margin of safety | What do price and valuation-related facts say today? | Quote, disclosed financial facts, and calculable metrics; never a “buy score.” |\n| C7 Risk and counter-evidence | What facts would weaken the original case? | Price/volume anomalies, disclosed risks, and evidence gaps. |\n| C8 Catalysts and thesis tracking | What public events should be revisited next? | News/event samples and the local-thesis review entrypoint. |\n\n**Simplest choice:** run `stock-review` once, then read its available and missing modules. If you only want today’s price and recent movement, use `stock-snapshot`. If results have just been released, use `earnings-review`. If the price has moved sharply, use `price-move`. These are four different questions and should not substitute for one another.\n\nCompany research has a different data boundary from daily market recap. `company_evidence_\u003csymbol\u003e_\u003cdate\u003e.json` stores C1–C8 verified facts and gaps. The current structured financial adapter is A-share focused; HK/US primary-filing fields intentionally remain gaps until a verified adapter exists, so those results are not a complete fundamental-research conclusion.\n\nEvery financial fact records its period, currency, accounting scope, source type, source, and confidence so that you can trace a number back to its origin. The metric registry at [`config/metric_registry.json`](config/metric_registry.json) declares how a metric is validated and which framework can use it. It never produces a composite “buy score.”\n\nWhen `--emit-evidence` is enabled, the CLI writes:\n\n```text\nevidence_YYYYMMDD.json\nm1_YYYYMMDD.json\nm2_YYYYMMDD.json\nm3_YYYYMMDD.json\nm4_YYYYMMDD.json\nm5_YYYYMMDD.json\nm6_YYYYMMDD.json\n```\n\nThe six-module score is designed for report trust, not performance marketing:\n\n| Module | Focus | Weight |\n|---|---:|---:|\n| M1 | Cross-market index state, breadth, liquidity, benchmark context | 20 |\n| M2 | Sector and concept rotation | 20 |\n| M3 | Short-term sentiment and limit-up structure | 20 |\n| M4 | Risk, failed breakouts, downside pressure | 15 |\n| M5 | Portfolio exposure, style, concentration, holdings pulse | 15 |\n| M6 | Resilient directions and next-session watchlist | 10 |\n\nFull reports keep the same structure even when quality is low, but missing modules are called out naturally in the relevant section.\n\nFor current-day A-share reports, whole-market breadth is counted only after every Eastmoney `clist` page reconciles; a Sina `hs_a` fallback must paginate to EOF with unique valid codes. Historical reports keep strict breadth unavailable rather than relabeling industry-board components as all-market breadth. Tencent daily K lines add 5d/20d/60d returns, volume z-score, and ATR only when the sample is complete.\n\n## Built For Agents\n\n`stock-analysis` is intentionally agent-friendly:\n\n- Deterministic CLI first; LLM layers can consume evidence later.\n- Markdown for human review, JSON for machine workflows.\n- Explicit source events and fallback reasons.\n- Stable command surface for cron jobs, notebooks, Hermes, Codex, Claude Code, and other tool-calling agents.\n\nExample agent prompt:\n\n```text\nRun stock-analysis --market global --format full --emit-evidence.\nUse the Markdown report for the user-facing recap.\nUse evidence_YYYYMMDD.json to verify every strong conclusion before summarizing.\nIf a module is missing, say which evidence was unavailable instead of guessing.\n```\n\nSee [examples/agent.md](examples/agent.md) for a daily agent workflow and [examples/github-actions-daily-recap.yml](examples/github-actions-daily-recap.yml) for a scheduled GitHub Actions recap that uploads the report plus Evidence Pack.\n\n## What It Is Not\n\n- Not a trading bot.\n- Not a broker integration.\n- Not a promise of complete market data.\n- Not a replacement for professional financial advice.\n- Not a black-box LLM report generator.\n\n## Data Source Strategy\n\n| Scenario | Primary route | Fallback route |\n|---|---|---|\n| A-share quotes and valuation | Tencent → Sina | Eastmoney `stock/get` |\n| A-share indices | Tencent → Sina | Eastmoney index endpoints |\n| Board rankings | Eastmoney `clist` | Tonghuashun public pages → browser fallback |\n| HK quotes | Tencent/Sina | Eastmoney `stock/get` |\n| US quotes | Sina/Tencent | Eastmoney `searchapi` → `stock/get` |\n| Funds | Eastmoney/Tiantian fund pages | Sina fund fallback |\n| Deep tick/order-book data | Optional `mootdx` | Basic Tencent/Sina quotes |\n\nYahoo is intentionally not part of the recommended default path.\n\n## Investor Lenses\n\nThe lens engine can render the same evidence through different investment frameworks. Supported lenses include:\n\n`buffett`, `munger`, `graham`, `klarman`, `lynch`, `o_neil`, `wood`, `dalio`, `soros`, `livermore`, `minervini`, `simons`, `duan_yongping`, `zhang_kun`, and `feng_liu`.\n\nLenses change evidence priority and narrative structure. They do not override data quality rules or invent missing numbers.\n\n### Built-in Lens and Committee Boundaries\n\nCurrent CLI version: `4.5.0`.\n\n`LensEngine` is the report orchestration layer. The default mode is `committee`, which combines M1-M6 evidence into a deeper cross-module analysis. Natural-language callers can ask for requests such as \"analyze Kweichow Moutai in Buffett mode\" or \"run an adversarial debate between Buffett and Munger on Tencent.\" If `committee` mode fails, the engine falls back to `single` mode and preserves the fallback reason in metadata.\n\nCommittee reports use a fixed spine: executive summary → market index overview → portfolio analysis when complete holdings are available → six-module deep recap → integrated portfolio guidance and risk notes. The closing guidance should cover the current state, benchmark outperformance or underperformance, conditional position actions, the next-session watchlist, and key risks. Evidence appendices stay outside the morning, intraday, midday, and after-close narrative body. If any M1-M6 module is missing, the relevant section must say that the evidence is unavailable.\n\n`--market stock --symbol \u003ccode\u003e` and `--market fund --symbol \u003ccode\u003e` are deterministic evidence views. They do not require users to install any external quote CLI. Browser routes are fallback-only paths for repeated API failures or page-only data. Engineering details belong in evidence and diagnose output, not in the user-facing report body.\n\nNorthbound flow is shown only after a current-day full-session validation (coverage through 14:50, sufficient minute samples, and a sane opening baseline). Historical or incomplete streams remain unavailable. Fund-profile completeness is evaluated for every fund and every field, so an ETF with no published fee values cannot be compared as if fees were known. Board rankings carry their source taxonomy, and classifications from different providers are not comparable without normalization.\n\nListed-fund premium/discount uses Tencent forward-adjusted daily closes against paginated official NAV. Public share-split events are normalized before the two series are compared; any unparseable corporate action suppresses the series. A fund-page annualized tracking-error value is labeled as disclosed metadata, never as a locally recomputed daily tracking error.\n\nFund profiles use Tiantian Fund's public `pingzhongdata` page to supplement long-term performance, front-end fees, fund size, and fund manager context. This path does not require login or an API key. Fund snapshots should show long-term performance, front-end fees, fund manager information, and any disclosed gaps.\n\nInvestment memory defaults to `~/.stock_analysis/profile.json` and can be overridden with `STOCK_ANALYSIS_PROFILE`. A complete holding must include the symbol, buy date, and either share quantity or purchase amount. If newly supplied user information conflicts with saved investment memory, confirm that the new information is complete, then prefer the user's latest input and overwrite the saved memory.\n\nWhen a user explicitly asks for a specific investor style, the whole report must be written from that lens. Do not merely append an expert comment at the end. Single-expert and multi-expert reports have different structures, but neither should impersonate an investor or fabricate expert quotes.\n\n## Contributing\n\nGood first contributions:\n\n- Add or harden a public data-source adapter.\n- Improve a report template or investor lens.\n- Add examples for a new region, symbol type, or agent workflow.\n- Report a source failure with `--market diagnose` output.\n- Submit this project to a high-fit Awesome List or agent tool directory.\n\nStart with [CONTRIBUTING.md](CONTRIBUTING.md) and [ROADMAP.md](ROADMAP.md).\n\n## Awesome List Blurb\n\nUse this one-liner when submitting the project to curated lists:\n\n\u003e [stock-analysis](https://github.com/AdvancingTitans/stock-analysis) - Evidence-driven market recap CLI for AI agents and quant researchers, supporting A/HK/US stocks, funds, portfolios, auditable JSON Evidence Packs, data-quality scoring, investor lenses, and multi-source fallback routing.\n\nHigh-fit targets include `awesome-quant-ai`, `awesome-ai-in-finance`, `awesome-quant`, and `awesome-systematic-trading`.\n\n## Development\n\n```bash\nuv sync\nuv run --with pytest pytest -q\nuv run --with ruff ruff check\n```\n\n## License\n\nMIT\n\nThis project is for research only and does not constitute investment advice. Markets involve risk.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FAdvancingTitans%2Fstock-analysis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FAdvancingTitans%2Fstock-analysis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FAdvancingTitans%2Fstock-analysis/lists"}