Pricing Convertible-Bond Dilution Without SEIBRO: Black-Scholes on the DART Filing

Source code → github.com/pon00050/kr-derivatives

Korean convertible bonds (전환사채) and bonds with warrants (신주인수권부사채) are one of the most studied dilution vectors on KOSDAQ. A controlling shareholder authorizes the company to issue a CB with a conversion price set below the current stock price; the bondholder — often an affiliated party — converts at the discount; minority shareholders absorb the dilution. The structure is legal. The pattern is well-documented. Detecting it across the entire DART universe is what has been hard.

The reason it has been hard is not analytical. It is structural. The natural primary source — SEIBRO, the Korea Securities Depository’s bondholder register — has been returning resultCode=99 since early 2026, with the public-data provider revising the dataset and no firm restoration timeline. Closed-source alternatives exist but forbid redistribution, which rules them out for any MIT-licensed derivative. For an open-data forensic project, both options are dead ends.

This library is the workaround. It treats the embedded conversion option as what it is — a European call on the underlying stock — and prices it from DART filing data plus KRX prices, both of which are free. The resulting screen runs across 2,934 KOSDAQ CB/BW issuances without touching SEIBRO.

The trade-offs are real, and most of this post is about them.


What the Math Actually Does

A convertible bond, stripped to its economic core, is a straight bond plus a call option on the issuer’s stock. The bondholder has the right but not the obligation to convert face-value debt into equity at a pre-agreed conversion price. That right is a European call (or near-European; the actual contract usually has American-style features, but the at-issuance valuation is well-approximated by Black-Scholes).

If you can value that embedded call, you can answer the forensic question directly: was the option priced fairly at issuance, or was the bondholder handed value the company did not receive in return?

The library exposes that answer in one function:

from kr_derivatives import CBSpec, cb_issuance_score

score = cb_issuance_score(
    CBSpec.from_parquet_row(row),
    stock_price=close_at_board_date,
    sigma=hist_vol,
    r=ktb_rate,
)
# {"dilution_flag": True, "moneyness": 1.23, "bs_call_value": 3241, ...}

moneyness is the ratio of stock price to conversion price at the board approval date. A value above 1 means the CB was issued in-the-money — the bondholder profited at issuance, before any subsequent repricing. bs_call_value is the Black-Scholes value of the embedded conversion option at issuance, in KRW per share. discount_to_theory is the portion of that option value above intrinsic — the part transferred to the bondholder beyond what immediate exercise would have captured.

The forensic signal is not “moneyness > 1 = fraud.” It is: a portfolio of CBs from companies systematically issuing in-the-money, especially with the structural patterns that show up in subsequent repricing schedules, is the screening universe. Human review takes it from there.


What the Numbers Look Like

Across the most recent full run (Run 4, 2026-03-16), the screen scored 2,934 KOSDAQ CB/BW issuances drawn from DART. 970 — 33.1% — flagged as in-the-money at issuance.

That flag rate is not a fraud rate. The KOSDAQ CB market has structural reasons for at-issuance discounts: distressed issuers attract bondholders by pricing the conversion option below market; some sectors have legitimate reasons for the practice. The flag rate is the screen’s recall on a specific structural pattern. False-positive rates need to be evaluated against a labeled enforcement dataset — which is the role of the kr-enforcement-cases sibling project.

The moneyness distribution is heavy-tailed. 605 of 2,934 rows score below 0.5 (deeply out-of-the-money). 1,112 rows score between 0.8 and 1.0 (slightly OTM, often near-intrinsic). 430 rows score between 1.0 and 1.1 (barely ITM — the most ambiguous band). 256 rows score 1.1–1.5. 154 score 2–5x. 53 score 5–10x. 4 score above 10x.

Those final four — companies with stock prices more than ten times conversion price at issuance — were the subject of the most intensive investigation in Run 4. After cross-referencing DART’s stockTotqySttus.json (total issued share counts by reporting period) and crDecsn.json (capital reduction decisions), six were resolved as data artifacts (stock splits or consolidations the original extractor had missed) and four were confirmed as genuine extreme cases — KOSDAQ micro-caps issuing at the par-value floor of KRW 500 against trading prices in the thousands. Those four are real forensic signals. The screen finds them.


What This Screen Cannot Do

Three structural limitations should be visible to anyone using the output, and the library exposes the relevant fields so they can be filtered.

Sigma fallback rate: 53.6%. Over half of scored rows fall back to a 40% volatility assumption because their KRX ticker has fewer than thirty days of price history before the board date. Many CB issuers are KOSDAQ micro-caps with thin coverage in pykrx. The flag itself is unaffected — the moneyness ratio S/K does not depend on sigma — but bs_call_value and discount_to_theory are approximate for the fallback rows. They overstate option value for low-vol stocks and understate for high-vol ones. For analysis that depends on the dollar magnitude of dilution, filter to rows where the historical sigma was computed.

Board-date approximation: 56.1% among flagged rows. 544 of the 970 flagged rows use the CB’s issue_date as a proxy for the actual board_date — the day the board approved the issuance — because board_date is missing or unparseable in the underlying DART filing. The price reference (stock_price in the score input) is the close on that proxy date. For a CB that closed weeks after board approval, the proxy date can be materially different. A stock that moved 5–10% between actual board approval and proxy date can flip a barely-ITM flag in either direction. For high-conviction forensic claims on individual issuances, verify board_date against the original DART filing.

Borderline cluster at moneyness 1.0–1.1: 430 rows, 44% of all flags. These are the rows most sensitive to both prior limitations. The screen flags them honestly — they did issue at-or-just-above conversion price — but the certainty that any individual flag is a real forensic signal is weaker than for the deeper-ITM cohort. For triage that needs higher precision, raise the moneyness threshold to 1.2 or 1.5.

There is also a Phase 2 of this library (repricing_coercion_score) that compares each repricing event’s new conversion price to the Black-Scholes option value at the repricing date. That function exists in the API surface but raises NotImplementedError until SEIBRO repricing data is available — repricing event data is what SEIBRO gates and what no DART feed substitutes.


Why It Was Built This Way

The temptation when the primary data source breaks is to wait. SEIBRO will fix the API. The 공공데이터포털 will republish the dataset. The build queue will shift. In Q1 of 2026, that wait was already six weeks long with no announced resolution date.

Reframing the problem as an option-pricing question rather than a bondholder-tracking question dissolves the dependency. DART discloses the conversion price, the issue date, and the maturity date for every CB. KRX provides the underlying stock prices. KTB rates come from the FRED API. Volatility comes from KRX historical prices. None of those are gated. The Black-Scholes value of the embedded option falls out of those four inputs.

The cost of the reframe is the loss of the bondholder-side data. With SEIBRO, you can see who held the CB at any point, when they converted, and at what price. Without it, you only see the option’s at-issuance value and the disclosed terms. That is enough for at-issuance dilution screening, which is the bulk of the forensic signal. It is not enough for repricing coercion analysis (Phase 2) or for tracking specific bondholder behaviors over time. The library is honest about that boundary.

The library is at github.com/pon00050/kr-derivatives. MIT license. 118 tests, including golden-value Black-Scholes regressions against published references. Install with uv add git+https://github.com/pon00050/kr-derivatives.