NuminorBeta

Code and unit traps in China A-share data

Short answer: the traps that cost the most are the ones that return numbers. A sentiment code read backwards, a ratio in the wrong unit, or a line item matched on the wrong column all produce a full result set with plausible values and no error. Here are the ones our own onboarding notes flag.

Sentiment: 2 is negative

In SmarTag, emotionindicator is 0 neutral, 1 positive, and 2 negative. Do not assume 0 means negative. (Data cut 2026-09-16.)

Read it as an ordinal and the sign of every sentiment signal you build is wrong, while the magnitudes stay perfectly reasonable.

Ownership ratios use two different units inside one dataset

In ChinaScope Affiliate, the ownership-graph stakes (ratio, vote_ratio, directrate, indirectrate, totalrate) are decimal fractions from 0 to 1. The shareholder-register ratio is a percentage from 0 to 100. Convert before comparing across tables. (Data cut 2026-05-16.)

Same word, same dataset, factor of one hundred apart.

Entity category codes

Also in Affiliate: parent_cat, subs_cat, jc_cat, related_cat, and the controller's cat each mark an entity as a natural person (1), an institution (2), or invalid and unresolved (0). Note that 0 is not a category of entity, it is the absence of a resolution, so counting it as a third type of holder overstates your entity universe. (Data cut 2026-05-16.)

Standardized codes sit beside the as-reported label, not instead of it

In ChinaScope Financial Notes, every schedule pairs the issuer's as-reported line label (item_orig) with a standardized category code (item_code), so the same component lines up across companies and periods even where firms word it differently. A receivable-aging label of 1年以内(含1年) maps to 0-12M. (Data cut 2026-04-09.)

Match on item_code for cross-company comparison. Keep item_orig when you need to show what the filer actually wrote, which is usually the moment somebody questions a number.

Currency and sign

Amounts in Financial Notes are RMB. currency is CNY on essentially every row, with a negligible foreign-currency tail that should be converted rather than mixed in. (Data cut 2026-04-09.)

Negatives occur and deserve a look rather than a filter. A minority of balance, movement and impairment columns carry negative values in the full data, usually a handful of rows, but occasionally material: long-term-loan balance lines carry tens of thousands of them. The data does not state why, so treat negatives as anomalies to sanity-check rather than as normal figures. (Data cut 2026-04-09.)

The join that has to happen before any of this means anything

In Fundamentals, the line-item fact carries no dates, no entity and no currency of its own. Join it to filing on report_id to attach publish_date, report_date, company_id, secu, currency and the schedule. A standardized line appearing under two schedules has two report_id values with possibly different figures, and keying on report_id keeps them apart. (Data cut 2026-04-14.)

Datasets this page draws on

Related questions