The definition manual corresponding to Stage 2 (financials) of the company-research SOP, also used for any follow-up question of "how are the results". Principles:Cumulative values are the raw material, the single quarter is the basic unit, TTM shows scale, the latest period shows the turn; every step of splitting / summing / ratio is one calc call。
0. Four iron rules
- What A-share financial reports disclose isreporting-period cumulative values(Q1 / H1 / Q1–Q3 / full year); any "single quarter" "QoQ" must be obtained via
quarterizesplit out, not subtracted in your head. - Deducted non-recurring vs net profit attributable to parent: the valuation numerator uses deducted non-recurring (one-off gains/losses cannot be ×4), the main growth judgment uses net profit attributable to parent (same definition as consensus EPS), report the two side by side, and when the difference is large it must be explained (investment income / subsidies / impairment / fair value changes).
- Numerator and denominator in the same period and same definition: YoY against the same quarter, TTM against TTM, do not compare a cumulative value with a single quarter.
- Ratios (gross margin / net margin / expense ratio / debt ratio / proportion) are all
ratio(numerator, denominator, label, unit_in), you ensure the two numbers are in the same unit, calc does not convert units.
1. Definition map
| Definition | Definition | calc function | Use | Prohibited |
|---|---|---|---|---|
| Cumulative value (YTD) | Original value disclosed for the reporting period | —(evidence) | Raw material | Do not directly compare reporting periods of different lengths |
| Single quarter | Q1 = YTD(Q1);Qn = YTD(n) − YTD(n−1) | quarterize(cumulative, unit, money=true) |
Basic unit | Previous period missing → no value for that quarter, do not substitute an average |
| Latest single quarter | Latest non-empty single quarter | latest_quarter(single_quarters, unit, money=true) |
Valuation numerator (deducted non-recurring), turn judgment | — |
| TTM | Sum of the last 4 quarters | ttm_sum(single_quarters, end_period, unit, money=true) |
Scale, TTM PE | If any quarter is missing, not_meaningful(do not make do with 3 quarters) |
| TTM YoY | TTM(end) ÷ TTM(end − 4 quarters) − 1 | ttm_yoy(...) |
Sustainable growth fact, cross-validate forward CAGR | Requires 8 consecutive quarters |
| QoQ | Q(end) ÷ Q(end − 1) − 1 | qoq(...) |
Inflection / momentum signal | Prohibited as a growth rate, prohibited to annualize, prohibited as a PEG denominator |
| Single-quarter YoY | Q(end) ÷ Q(end − 4) − 1 | growth_rate(current, base, label) |
See the direction of "this quarter relative to last year" | Prohibited as a PEG denominator (low base falsely inflates) |
| Ratio | Ratio of two line items in the same period and same unit | ratio(numerator, denominator, label, unit_in) |
Gross margin / net margin / expense ratio / debt ratio / operating cash flow ÷ net profit | Denominator ≤ 0 → not_meaningful, write it as is |
For the EPS series (yuan/share) use money=false; for amount-type money=true, calc normalizes the unit.
2. Breakdown process (consistent with the SOP financials stage)
fetch_financials(★ required) → cumulative value series of revenue / net profit attributable to parent / deducted non-recurring / EPS (last 8–12 reporting periods).quarterizeRun each once: revenue_cum, net_profit_parent_cum, net_profit_deducted_cum (unit=yuan, money=true).latest_quarter(deducted non-recurring) → valuation numerator;ttm_sum(attributable to parent and non-recurring each once) → intermediate quantity;ttm_yoy(primarily attributable to parent, non-recurring listed alongside) → growth fact;qoq(latest single-quarter non-recurring) → inflection signal.- Three-statement cross-check (○ optional endpoints):
sina_income_statement/sina_balance_sheet/sina_cashflow(A-share),em_global_income/em_global_balance/em_global_cashfloworyahoo_financials(US / HK;period= annual full year / quarterly single quarter / trailing last four quarters, amounts in reporting currency). Only for verification and supplementary line items (gross profit, expenses, operating cash flow, receivables, inventory, interest-bearing debt),line item original values recorded as-is from the source, no conversion. - Ratios: gross margin =
ratio(毛利, 营收); net margin =ratio(净利润, 营收); expense ratio =ratio(某费用, 营收); operating cash flow / net profit =ratio(经营现金流净额, 净利润); debt-to-asset ratio =ratio(总负债, 总资产)——one call per ratio, numerator and denominator same period and same unit, record calc id. - Every calc call passes
--run-dir(the CLI writes the record of that calculation into the run directory'scalcs/, and the orchestrator merges them at the end into the contract artifactcalculations.json; do not manually write any file), the stage JSON references calculation_id; gaps go through the structured gaps of SOP §2.
3. Quality check checklist (write into the inference section)
- One-off gains/losses: when the difference between attributable to parent and non-recurring exceeds 20%, the source must be explained (investment income / government subsidies / impairment / fair value changes), and state which basis is used for valuation and which for growth.
- Seasonality: mark whether the latest single quarter is Q1 / Q2 / Q3 / Q4, and the company's historical peak/off-season direction (from the single-quarter series), and flag the directional bias of "single quarter × 4" (valuation §1).
- Reporting period alignment: year-over-year against the same quarter, TTM against TTM; for cross-company comparison, first list each one's reporting period.
- Cash flow vs profit: operating cash flow ÷ net profit < 1 over the long term → mark "profit quality to be investigated", and look at changes in receivables / inventory (three-statement cross-check).
- Assets and liabilities: interest-bearing debt, receivables / inventory growth vs revenue growth (use
growth_rateto calculate each once and then compare, do not do mental math). - Audit and announcements: annual report audit opinion, differences between earnings forecasts / flash reports and the formal report (
fetch_announcements/cninfo_announcements)。
4. Interpretation template ("look at the latest period for turning points, look at TTM for scale")
| Question | What to look at | calc |
|---|---|---|
| Accelerating or decelerating? | Latest single-quarter non-recurring quarter-over-quarter (inflection), single-quarter year-over-year direction, two consecutive quarters' trend | qoq、growth_rate |
| Has the growth been realized? | Difference between TTM year-over-year (attributable to parent) and forward CAGR | ttm_yoy → valuation's forward_vs_ttm_judgement |
| How is profit quality? | Non-recurring / attributable to parent, operating cash flow / net profit, gross margin trend | ratio |
| How large is the scale? | TTM revenue / profit | ttm_sum |
Five-question self-check (research constitution §1): calculated or mental math? Are there fields pulled that could overturn the conclusion? Source / use, same period? Turning point vs scale? Did strong conclusions seek counterevidence?
4b. Earnings preview and review
Only describe performance after the past few earnings reports, do not predict the next one; the "Earnings Preview and Review" card in the interface (orchestrator earnings_brief view) is exactly this basis.
- Next earnings date: A-share
next_disclosure(Eastmoney scheduled disclosure table; the company may change the date, subject to exchange announcements; if the date has been changed, or the scheduled date has passed without disclosure, state it clearly); Hong Kong and US stocksyahoo_analyst_estimates's earnings date (state clearly whether the Yahoo ticker is an estimated date or a company-announced date; pre-market/post-market not noted). - Reaction-day change:
earnings_reaction(klines, events, lookback=4). For A-shares, periodic reports use the official disclosure date, timing=before_open (for announcements released in the evening, the official date is the next day); for Hong Kong and US stocks, convert the release time to exchange local time to determine pre-market / intraday / post-market; local 00:00 is treated as unknown time and not passed. K-lines use adjusted prices: A-sharestx_kline(forward-adjusted), Hong Kong and US stocksyahoo_klineadjclose. The change includes the broader market that day,do not write it as excess return。 - Actual vs expected:
earnings_surprise. A-shares: cumulative net profit attributable to parent for the period (fetch_financialsnet_profit_parent_cum) compared with the performance forecast range for the period (earnings_forecast, for the same period take the latest announcement; low / high, unit=yuan); Hong Kong and US stocks: actual earnings per share compared with Yahoo's consensus estimate for the quarter. - Consensus estimate divergence:
consensus_dispersion(low, mean, high). For A-shares, what Tonghuashun provides isfull-yearearnings per share; state clearly "it is full-year, not for this quarter"; for Hong Kong and US stocks, Yahoo is for the current quarter; if the cutoff date does not match the current quarter, write the gap. - Do not do: use average gains/losses to infer the next move, target prices, or judgments like "it will rise if it beats expectations."
5. Output
- Fact table: metric | value | unit | reporting period | source (ev id)
- Derived table: basis | value | reporting period | calc id
- Inference section: seasonality / one-off gains and losses / earnings quality / turning-point judgment (each with supporting id; confidence marked according to the four tiers in Research Constitution §1)
- Gaps: which period / which line item is missing, which sources were tried, impact on conclusions
6. Things not to do
- Do not do mental math, do not convert units yourself, do not combine 3 quarters into TTM, do not use quarter-over-quarter as growth rate.
- Do not treat consensus estimates as facts (that is the estimates stage, and mark them as forecasts).
- Do not give investment action recommendations.