This page states how the datasets in the data room are built: where the numbers come from, which rules turn a filing into a cell, and what the pipeline does when a filing does not carry what the schema asks for. It is written so that any figure published here can be reconstructed by someone with the same filings.
1. Universe
The universe is the top 200 KOSPI common shares by market capitalisation, plus ten smaller companies already under coverage on this site, with financial companies removed. Preferred shares, REITs and SPACs are excluded before the ranking is taken. After the financial exclusion described below, 183 companies remain.
The ranking covers 97.1% of the market capitalisation of all KOSPI common shares at the base date. That is a wide net, but it is worth being precise about what it is not: this is not an official exchange index and does not track one. Official indices apply free-float, liquidity and sector-balance rules that a plain market-capitalisation ranking does not, so membership differs. The official index constituent list is not obtainable through the data sources this pipeline uses, and rather than approximate it and call it by its name, the universe is defined by a rule anyone can reproduce from a public listing snapshot.
2. Why financial companies are excluded
Banks, insurers, securities firms and financial holding companies are removed from the universe. This is not a judgement about them; it is that the schema on these pages does not describe them.
- A bank’s balance sheet carries loans receivable and deposit liabilities where a manufacturer carries receivables and inventory. “Total borrowings” cannot be separated from operating liabilities, so the net-cash column has no meaning.
- The income statement is built on operating revenue and operating expense, so the operating-profit line does not mean what it means elsewhere in the table.
- Regulatory capital ratios are the first material for valuing these businesses, and the schema has no place for them.
The exclusion is applied by industry code: KSIC 64121 (banking), 64201 (trust and collective investment), 64913 (specialised credit finance), 65 (insurance) and 66 (financial and insurance services) are removed in full. The one code that needs a hand is KSIC 64992, “holding companies”, which contains both financial holding companies and ordinary industrial ones. Removing the code wholesale would delete exactly the companies this table exists to show. So within 64992 only the eight financial holding companies are removed by name — Shinhan, Hana, KB, Woori, BNK, iM, JB and Korea Investment Holdings — and the industrial holding companies stay.
3. The controlling-interest split
This is the reason the flagship table exists. Consolidated statements add up a parent and everything it controls, including subsidiaries it does not wholly own. The part of consolidated equity that belongs to those other shareholders is non-controlling interests, and it is not the parent shareholders’ money.
A screener that divides market capitalisation by total equity therefore compares the price of one company against assets that partly belong to somebody else. The table reports both readings side by side:
- P/B total — market capitalisation ÷ total equity.
- P/B owners — market capitalisation ÷ equity attributable to owners of the parent.
- Gap — how much higher the second is than the first, in per cent.
The same split is applied to earnings: P/E is computed against controlling-interest net profit, not consolidated net profit. Market capitalisation is ordinary shares issued times the closing price at the base date; preferred shares are excluded, which matters for the handful of companies that have them.
4. The two identity rules
Some companies never print a controlling-interest line, because they have no non-controlling interests to separate. Leaving those cells empty would drop real companies out of the comparison for a formatting reason. Two rules fill them, and both are arithmetic identities inside the same statement, not estimates:
- Where controlling-interest equity is absent and both total equity and non-controlling interests are present in the filing, controlling-interest equity is total equity less non-controlling interests.
- Where controlling-interest profit is absent and the balance sheet either states non-controlling interests as zero or carries no such line at all, controlling-interest profit is net profit in full.
Every cell completed this way carries the ID flag in the table and a corresponding field in the JSON and CSV, so a reader can exclude them. Nine companies in the current dataset are affected. No other gap is filled: where neither the standard account code nor the account name resolves and no identity applies, the cell stays empty and the case is recorded in the exceptions dictionary.
5. Total borrowings and net cash
Net cash is cash and cash equivalents, plus short-term financial instruments, less total borrowings. The difficult term is the last one, and the pilot that preceded this dataset was built largely to find out why.
Mapping four component accounts — short-term borrowings, current portion of long-term debt, long-term borrowings and bonds — fails on real filings in at least six distinct ways. Some companies report a single aggregate line called simply “borrowings” and never split it. Some file the line with no standard account code at all, so only the account name resolves. Some carry convertible, exchangeable and warrant bonds as separate accounts. Some annotate the account name in parentheses so an exact match misses it. Some have no borrowings at all, which is a true zero rather than a gap. Only a minority decompose cleanly.
So the definition used here does not depend on the decomposition:
Total borrowings = the sum of every leaf line on the balance sheet whose account name contains “borrowing” or “bond”, excluding lease liabilities.
Subtotal rows are named for the section they close — “current liabilities”, “total liabilities” — so they never match the pattern and cannot be double-counted. As a guard, every company-year is checked against the condition that total borrowings must not exceed total liabilities; across the full dataset there are no violations. The individual lines summed for each company are preserved in the workbook so the sum can be audited.
Two treatments are stated rather than hidden. Lease liabilities under IFRS 16 are excluded from total borrowings and preserved in a separate column; they are contractual obligations but not borrowings under the definition above. Mezzanine instruments — convertible, exchangeable and warrant bonds — are included, and also preserved separately, because they are contractual debt until converted. A reader who disagrees with either treatment can recompute from the preserved columns.
The definition has one blind spot. Some companies split the balance sheet only into financial and non-financial liabilities. Their borrowings then sit inside aggregate captions — “current financial liabilities”, “non-current financial liabilities” — and no account name contains “borrowing” or “bond”. The rule above cannot see them, and reads the company as having no borrowings at all.
Those aggregate captions are not added to total borrowings. Lease liabilities, deposits received and derivative liabilities sit inside them, so adding the whole caption would break the definition above and overstate debt. The filing does not say how the caption divides, so splitting it would be an estimate.
Instead the exposure is bounded. Every financial-liability line on the balance sheet is collected — derivative and “other” captions included, with no judgement made about what any caption contains — and one question is asked: if every one of them were borrowings, how far could the published figure move?
If treating the entire aggregate as borrowings could move net cash over market capitalisation by one percentage point or more, net cash is left blank and the table carries
NC?. If it could move it by less than one point, the figure is published.
This is a worst-case bound, not an estimate. No view is taken on what the aggregate captions actually hold; a number is published only when the answer survives the most unfavourable reading of them. That is what makes the following sentence unconditional — every net-cash-to-market-capitalisation figure in this dataset is accurate to within one percentage point even if every aggregate financial-liability line on the balance sheet turned out to be borrowings.
The limit is set against net cash over market capitalisation rather than against total liabilities because the question that matters is not how large the aggregate is on the balance sheet, but how far it could move the number being published. The test is therefore denominated in the same unit as the published figure.
On the base date, net cash is published for 97 of the 183 companies. Across those 97 the bound is at most 0.951 percentage points, with a median of 0.004. The remaining 86 carry an empty net cash column, and each company page states which case applies — 85 exceed the bound, and one reports its statements in a currency other than the won. Each company’s aggregate total and its bound are in the CSV columns agg_fin_liab_eok and agg_fin_bound_pp; the individual lines are in agg_fin_lines.
The “no borrowings” label is now conditional in the same way. The absence of borrowing and bond accounts is no longer sufficient on its own: a company is described as carrying no borrowings only when its aggregate financial liabilities also fall under the bound. Fifteen companies meet both conditions on the base date.
6. Preliminary and filed figures
Korean companies release results twice: a fair-disclosure preliminary announcement within weeks of the period end, and the filed report some weeks later. The two are usually close and occasionally not. Interim rows in the dataset therefore carry a flag — F for a filed report, P for a preliminary release.
The difference is small but real. Checking every company for which both existed for FY2025, most figures agreed exactly; the discrepancies fell into two groups. Some came from the unit the preliminary release used — companies that announce in trillions of won publish only two decimal places, which loses precision against a filing stated in won. The rest were genuine revisions between the preliminary announcement and the audited filing. KT&G’s controlling-interest net profit moved −0.754% and its operating profit +0.438% between its January preliminary release and the March annual report — beyond what rounding explains. That single case is why the flag exists.
A related trap sits inside the filed reports themselves. In an interim filing the headline income-statement column holds the three-month figure, and the cumulative half-year total sits in a separate field. Reading the wrong one halves the result. Every flow item in this dataset is taken from the cumulative field.
7. Consolidated versus separate statements
Consolidated statements are used wherever they exist. A company with no subsidiaries files none, and for those the pipeline falls back to separate statements and marks the row OFS. For an OFS company there is no controlling / non-controlling split to make, so the two P/B readings are identical by construction and the gap is zero — not because the company has no non-controlling interests worth noting, but because the concept does not apply. Three companies in the current dataset are on this basis.
8. Shareholder returns
Dividend per share is taken from the dividend section of the annual report for the most recent five years. Treasury holdings come from the treasury-share section of the same report, counting ordinary shares at period end and skipping the subtotal rows that would otherwise be added twice.
Cancellation history needed its own route. There is no filing type called “treasury share cancellation” in the material-events channel where buybacks and disposals appear; cancellations are filed to the exchange channel under “share cancellation decision”, and capital reductions are a third, separate filing that must not be confused with either. Collecting only the material-events channel returns no cancellations at all for companies that plainly cancel shares, which is how the gap was found. The dataset collects the two channels separately and reports acquisition, disposal, cancellation and capital reduction as four distinct counts.
9. Sectors
The sector label is a coarse mapping from the company’s KSIC industry code, and it should be read as such. KSIC assigns one representative code per company, which misdescribes conglomerates whose subsidiaries span industries — a group holding company can be filed under electronic components or chemicals. A short manual override list reassigns those to Conglomerate (Holding); the list is published in the pipeline source and the exceptions dictionary. Anyone using sector for anything load-bearing should substitute a purpose-built classification.
10. Traceability
Every figure series carries the DART receipt number of the filing it came from. In the table the equity and profit receipt numbers are links that open the original document in the DART viewer; in the CSV they are columns. The rule is that one cell resolves to one filing — there is no figure in these datasets that cannot be pointed at a document.
The pipeline is checked against that promise rather than trusted on it. Random companies and figures are re-read from the original filings each run and matched against the published values; the current dataset passed twenty of twenty such checks, and the twenty companies with the widest controlling-interest gap — where an error would do the most damage — were additionally checked against the accounting identity that total equity equals controlling plus non-controlling interests, which held in all twenty.
11. Update policy
Datasets are refreshed within five business days of the filing that changes them — the annual report in March, the half-year report in August, and the quarterly reports in between. Market figures are restated to a new base date at each refresh, and the base date is shown on the dataset and carried in the JSON and CSV. Preliminary rows are replaced with filed figures at the first refresh after the report appears, and the flag changes from P to F.
12. What these numbers are not
They are descriptions of filings, not opinions about companies. A wide gap between the two P/B readings says a company has large non-controlling interests; it does not say the shares are cheap or dear. Net cash above market capitalisation says what a balance sheet holds; it does not say the cash will reach shareholders. Nothing on these pages is a recommendation to buy or sell any security, and nothing carries a price target or a trade timing. See the disclaimer for the full terms.
13. Dataset changelog
Every change to a published dataset is recorded here with its date, its reason and how many companies it moved. A figure that has been corrected should be traceable to the correction, not quietly replaced.
v1.3 — 2026-08-15
Net cash is published only when it passes a bound check. Total borrowings are defined as the sum of the balance-sheet lines whose account name contains “borrowing” or “bond”. Companies that split the balance sheet only into financial and non-financial liabilities carry their borrowings inside aggregate captions that this name test cannot see. From v1.3 every financial-liability line on the balance sheet is collected and, on the assumption that all of them are borrowings, the resulting movement in net cash over market capitalisation is measured. If it could reach one percentage point or more, net cash is left blank and the row carries NC?. The full rule is in §5.
Fewer figures are published. Net cash now appears for 97 companies rather than 182, and is positive for 51 rather than 80. Companies at 30% or more of market capitalisation fall from 17 to 9, and those described as carrying no borrowings from 32 to 15. Of the 85 rows that became blank, 29 had been showing a larger net cash position than the filings support in v1.1 and v1.2. What shrank is not the cash these companies hold but the range over which the filings can be closed.
What remains carries a guarantee. Across the 97 published figures the bound is at most 0.951 percentage points, with a median of 0.004. Every published net-cash-to-market-capitalisation figure is accurate to within one percentage point even under the worst reading of the aggregate captions.
The “no borrowings” label is stricter. The absence of borrowing and bond accounts is no longer sufficient; the aggregate financial liabilities must also fall under the bound.
Ratio cells in the workbook were corrected. A loss-making year produced a negative P/E, and negative equity a negative P/B, in the workbook alone, where the table and the company pages left both blank. All three are now blank. Ratios that divided figures already rounded to hundreds of millions of won are computed from the underlying amounts again, which removes a discrepancy between the workbook and the table for companies with small profits.
Earlier files remain in place. The v1.1 and v1.2 CSVs are still downloadable at their original addresses; only the download on the table page now points at the v1.3 file. The first analysis carries no net cash figure — it deals with the price-to-book gap alone — so nothing in it requires correction.
v1.2 — 2026-08-15
Share counts are now read as at the base date. Market capitalisation, price-to-book and price-to-earnings divide the base-date closing price by the share count listed on that day, taken from the same exchange snapshot the universe is drawn from. Until v1.2 they used the share count printed in the FY2025 annual report, which is stated as at the financial year-end and therefore misses splits, consolidations, bonus and paid-in issues, cancellations and mergers that happened afterwards. The filed count is kept as shares_filing with its receipt number, and where the two differ by more than 5% the shares_note column names the filings found in between.
Effect. 64 of 183 companies changed at least one ratio. Eighteen had a share count that had moved by more than 5%; of those, fifteen are explained by a filing found on the record and three are recorded as diverged without an identified cause. The largest movements were LS Electric (+400% market capitalisation, a five-for-one share split), HD Construction Equipment (+176%), Osung Advanced Materials (−90%, a ten-to-one consolidation) and Gaon Cable (+80%, a bonus issue).
Two figures withheld rather than corrected. The share-count table in LS Eco Energy’s FY2025 annual report (receipt 20260316001365) states figures a million times the listed count — a unit error in the filing itself. Until v1.2 that error passed through into the published table as a price-to-book of 6,551,758×. The filed count is now withheld rather than rescaled, and the ratios are computed from the listed count, which puts the company at 6.55×. Doosan Bobcat reports its financial statements in US dollars; the ratios that would divide a won market capitalisation by a dollar balance sheet are now left blank rather than converted at a single spot rate. Both companies are marked QUEUE.
Headline figures that changed. The count of companies reading below 1.0× moved from 69 to 70 on total equity and from 65 to 66 on the owners’ share, because one company crossed the line. The median gap moved from +2.40% to +2.41% and the mean from +21.64% to +21.76%. The holding-company median gap (+28.90%), the number of companies above a 50% gap (20) and above 100% (10), and the four companies that cross 1.0× when non-controlling interests are removed are all unchanged — the share count cancels out of the ratio between the two P/B readings, so nothing about the gap itself moved.
The v1.1 CSV remains downloadable at its original address. Anyone who already has that link keeps it; the download on the table page now points at the v1.2 file.
v1.1 — 2026-08-14
First published edition. 183 companies, base date 2026-08-14, built from DART filings with the rules set out above.
