The goal of this skill is not to manufacture precise illusions, but when the market is uncertain, to establish a magnitude-level judgment of size that can continue to be developed in Excel, based on a clear market definition, verifiable data, and a self-consistent formula chain.
Working principles
- Define the market first, then find data, then build the formula. When the market boundary is unclear, do not start calculating.
- Excel is the core deliverable, and all key TAM/SAM/SOM values must be carried by formulas; Markdown only explains the formulas, sources, and judgments.
- The first page of Excel must be the
核心结论overview page: use one page to show the year-by-year TAM/SAM/SOM for the next 5 years, which markets make up TAM, the yearly size of each market, and a one-sentence judgment. - Assumptions can be made, but steps cannot be skipped. Ratios, penetration rates, market shares, adoption rates, etc. must have their sources, analogies, constraints, or derivation logic written out.
- Do not use Monte Carlo, and do not output HTML/UI. Sensitivity is expressed through deterministic scenarios and key-driver tests in Excel.
- Do not attach meaningless "low credibility" labels to necessary but imperfect data. The key judgments are: is this the best currently available data? How is it transformed into the formula? Which conclusions are most affected by it?
- Cross-validation is used to discover differences in definitions, not to forcibly tune parameters so that two results agree.
Required reading reference
references/methodology.md: First principles, formula chains, and assumption discipline.references/data_sources.md: Data source hierarchy, source card, and common API routes.references/fermi_patterns.md: Decomposition patterns such as population, institutions, substitution, value chain, and value-based.references/industry_templates.md: Common variables for SaaS, Marketplace, Consumer, B2B, and Hardware.
Standard process
1. Lock down the market boundary
Must be clear:
- Product/service: what is included, what is excluded.
- Geographic scope: country, region, city, or global definition.
- Customer/user: B2B/B2C, segment, institution type, purchasing entity.
- Time definition: base year, forecast period, current/nominal prices, annualized/one-time.
- Unit: amount, sales volume, number of users, number of devices, capacity, or other.
If the boundary has two reasonable interpretations, split them into two definitions first; do not mix them into one number.
2. Choose the calculation architecture
Prefer methods that can explain the market formation mechanism:
- Top-down: industry total -> segment definition -> serviceable scope.
- Bottom-up: number of customers/users/devices -> adoption rate/frequency -> unit price/ARPU.
- Substitution: existing market -> substitution rate -> price or value adjustment.
- Value-chain: end market -> share of value segment -> serviceable portion.
- Value-based: number of target subjects -> problem frequency/loss/benefit -> willingness-to-pay ratio.
The common approach is a main model + one side check. The side check can be very rough, but it must be able to explain whether the result is in a reasonable magnitude.
3. Build source cards
Every piece of data entering the model must be traceable to a source card:
| Field | Requirement |
|---|---|
source_id |
Stable ID, such as SRC-001 |
provider |
Data provider |
dataset_or_title |
Dataset, report, or page name |
metric |
Metric used |
geography / period / unit |
Caliber |
value_or_path |
Value or extraction path |
url_or_endpoint |
URL/API endpoint/file path |
accessed_at |
Access date |
transform_note |
How to clean, convert, filter |
used_in |
Used for which assumption or formula |
4. Write assumption ledger
Each assumption must contain at least:
{
"key": "pene_rate",
"name": "目标市场渗透率",
"numeric_value": 0.20,
"unit": "%",
"source_ref": "SRC-003",
"logic": "甲市场 A/B 渗透率约 60%/40%;乙市场更适合 B 的低部署成本,同时面临 C 替代冲击,且当前教育成本更高,所以基准假设取 20%。",
"used_in": "TAM"
}
No "bare ratios":pene_rate = 5% Assumptions like this without context cannot enter the final model.
5. Generate Excel model
Use scripts/report_generator.py:
from scripts.report_generator import MarketSizingData, ReportGenerator
data = MarketSizingData(
market_name="中国某新兴服务市场",
geography="中国大陆",
base_year=2026,
forecast_years=5,
tam=9.6,
sam=5.76,
som=0.288,
unit="亿元",
cagr=0.08,
market_definition={
"产品/服务": {"in": "目标服务年费", "out": "硬件一次性收入"},
"地理": {"in": "中国大陆", "out": "港澳台及海外"},
},
market_segments=[
{
"name": "核心场景 A",
"base_value": 6.0,
"growth_rate": 0.10,
"logic": "由对象数、采用率、年费三项相乘得到,代表最大组成市场。",
},
{
"name": "验证场景 B",
"base_value": 3.6,
"growth_rate": 0.05,
"logic": "由相邻场景 proxy 推导,体量较小但更适合早期验证。",
},
],
source_cards=[
{
"source_id": "SRC-001",
"provider": "World Bank",
"dataset_or_title": "Population, total",
"metric": "SP.POP.TOTL",
"geography": "China",
"period": "2024",
"unit": "people",
"value_or_path": "1.408B",
"url_or_endpoint": "https://api.worldbank.org/v2/country/CN/indicator/SP.POP.TOTL",
"accessed_at": "2026-06-24",
"transform_note": "换算为亿人后进入 base_pop",
"used_in": "base_pop",
},
{
"source_id": "SRC-002",
"provider": "内部筛选逻辑",
"dataset_or_title": "目标人群筛选假设",
"metric": "核心人群占比",
"geography": "中国大陆",
"period": "基准年",
"unit": "%",
"value_or_path": "40%",
"url_or_endpoint": "logic-only",
"accessed_at": "2026-06-24",
"transform_note": "按年龄、收入和使用场景三层筛选。",
"used_in": "core_pop_pct",
},
{
"source_id": "SRC-003",
"provider": "Comparable market scan",
"dataset_or_title": "相邻市场渗透率对比",
"metric": "penetration benchmark",
"geography": "中国大陆",
"period": "latest available",
"unit": "%",
"value_or_path": "相邻市场约 40%",
"url_or_endpoint": "manual research notes",
"accessed_at": "2026-06-24",
"transform_note": "因教育成本和替代品冲击下调至 20%。",
"used_in": "pene_rate",
},
{
"source_id": "SRC-004",
"provider": "业务机制假设",
"dataset_or_title": "购买频次假设",
"metric": "年购买频次",
"geography": "中国大陆",
"period": "基准年",
"unit": "次/年",
"value_or_path": "12",
"url_or_endpoint": "logic-only",
"accessed_at": "2026-06-24",
"transform_note": "按月度订阅或月度复购处理。",
"used_in": "freq",
},
{
"source_id": "SRC-005",
"provider": "公开价格页/价格带",
"dataset_or_title": "目标服务价格假设",
"metric": "单次价格",
"geography": "中国大陆",
"period": "基准年",
"unit": "元",
"value_or_path": "100",
"url_or_endpoint": "manual pricing notes",
"accessed_at": "2026-06-24",
"transform_note": "取公开价格带中位数。",
"used_in": "price",
}
],
assumptions=[
{"key": "base_pop", "name": "基础人口", "numeric_value": 1.0, "unit": "亿人", "source_ref": "SRC-001", "logic": "只计入目标城市人群,按总人口筛选后换算。"},
{"key": "core_pop_pct", "name": "核心人群占比", "numeric_value": 0.40, "unit": "%", "source_ref": "SRC-002", "logic": "按年龄、收入和场景三层筛选得到。"},
{"key": "pene_rate", "name": "付费渗透率", "numeric_value": 0.20, "unit": "%", "source_ref": "SRC-003", "logic": "参考相邻市场 40% 渗透率,并因教育成本和替代品冲击折半。"},
{"key": "freq", "name": "年购买频次", "numeric_value": 12, "unit": "次/年", "source_ref": "SRC-004", "logic": "按月度订阅/复购频率处理。"},
{"key": "price", "name": "单次价格", "numeric_value": 100, "unit": "元", "source_ref": "SRC-005", "logic": "参考公开价格带的中位数。"},
{"key": "sam_ratio", "name": "可服务比例", "numeric_value": 0.60, "unit": "%", "logic": "扣除非目标渠道、地域和暂不可服务客户。"},
{"key": "som_share", "name": "年度可获取份额", "numeric_value": 0.05, "unit": "%", "logic": "按目标进入节奏、销售产能和竞品份额推导。"},
{"key": "cagr", "name": "年增长率", "numeric_value": 0.08, "unit": "%", "logic": "由用户增长、价格变化和渗透率提升合成。"},
],
)
ReportGenerator().generate(data, output_dir="./output", formats=["xlsx", "md"])
The default workbook contains:
核心结论: the first page for the user, showing year-by-year TAM/SAM/SOM, TAM composition, final-year share, and a one-sentence judgment.Market_Definition: market boundary, geography, customers, time, and unit calibers.Source_Cards: all data sources and conversion explanations that enter the model.Assumptions: all adjustable assumptions andlogic。Calculation_Model: intermediate formula chain.TAM_SAM_SOM: annual TAM/SAM/SOM details, must be single-year caliber, not 5-year total.Checks: formula hierarchy, source, logic, units, and composition total check.
6. Deliver Markdown memo
The Markdown must answer:
- What are the TAM/SAM/SOM for each of the next 5 years; cannot only write the forecast period total or the final-year figure.
- Which markets make up TAM, how large is each market year by year, and what is the final-year share.
- What the market boundary is.
- What the core formula chain is.
- Which data come from source cards, which are derivations, and which are assumptions.
- How TAM/SAM/SOM are derived from formulas.
- Whether the side check supports this magnitude.
- Which variables can most change the conclusion, and which input cell in Excel they correspond to.
Quality gate
Must check before completion:
- There are no Monte Carlo, HTML, Plotly, or display UI requirements as deliverables.
- There is
核心结论a first page, and the first page does not pile up process, only core readings, annual table, market composition, and a one-sentence judgment. - TAM/SAM/SOM are year-by-year single-year caliber; 5-year cumulative values must not be used to pass off as annual market size.
- If TAM is composed of multiple sub-markets, the composition items must total back to total TAM; if not, the caliber difference must be explained and noted in Checks.
- Key Excel output cells are formulas, not manually entered static values.
- All ratios, penetration rates, adoption rates, and market shares have
logic。 - in the assumptions,
source_refcan be found in the source card, or it is clearly explained why only logical assumptions can be used. - TAM >= SAM >= SOM; if this does not hold, the caliber must be explained, otherwise the model must be corrected.
- Unit conversions are traceable, for example people, hundred million people, yuan, hundred million yuan cannot be mixed.
- When the side check differs greatly from the main model, report the source of the difference, rather than changing assumptions to get closer to the result.
Common errors
- Directly writing "penetration rate 5%" without analogous markets, competitive constraints, adoption path, or sales capacity logic.
- Treating the total market in an industry report directly as your own SAM.
- Only marking "data uncertain" without explaining how it affects the formula.
- Outputting complex charts to look professional, without leaving an editable, traceable Excel model.
- Using HTML/Monte Carlo output from old scripts or old examples.