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.)