In the case of Bayer, SharesFD() and Shares() provide the correct number of shares outstanding as reported by financial disclosures. 3,308,000,000 shares outstanding provided by SharesCur() adjusts to give the correct market cap given the price of one ADR (3,308 mm share * US$33.38/share = US$110 Bn = EUR$88 Bn = 826 mm sharse * EUR$106/share). It’s wonky, I know, but this is just a consequence of the structure of some depository receipts. You also have to counter that ADRs on OTC exchanges have very low regulatory disclosure and data quality standards.
From what I can generalize from this immensely illustrative example for ADRs:
- Shares() and SharesFD() maps to financial data; inclusive of all common equity and equivalent shares.
- SharesCur() maps to exchange price data; may be inclusive only of one share class.
I am not sure how this anecdote will hold up for other examples of ADRs which you provide. But if it does, you should definitely not use SharesFD() * Price (or Shares() * Price) for ADRs. On the other hand, it is problematic to use SharesCur()Price for companies which have more than one share class; RDS.A vs RDS.B is a prime example in which PriceSharesCur() provides an incorrect Market Cap.
BTU is a different case; the discrepancy is due to a 2016 bankruptcy and share reclassification. The SharesFD() reflect the old capital structure and it likely hasn’t been updated because the Capital IQ analysts are lazy (i.e., they are not reading the revised prospectus or investor presentations). There should be 132.5 mm common and equivalent shares.
I am not sure how we counter the stale data problem, other than Max(SharesFDQ,SharesQ) is probably the most conservative metric to calculate per share financials. Company’s more often increase common share counts in bk due to senior claims converting into common, not the other way around.
If the Price and Shares() disconnect only applies to ADRs, then you can use a rule to only use SharesCur()*Price for ADRs (granted that you accept that you might miss multiple share classes).
For non-ADRs (where there is no wonky price to share count disconnect), using Max(SharesFDQ,SharesQ) runs the risk that the company’s share count or ownership structure has changed since the last analyst update. Using ShareCur()*Price risks the possibility of ignoring multiple share classes.
The alternative is to use MktCap. I know it is not perfect and there is a definite lack of transparency on how it is calculated, but it is probably the most complete measure of capitalization available to us. A major unresolved problem, then, is how to estimate historical market cap in a way which comparable with historical disclosures. FHist(“MktCap”, n) may be used in certain instances, but cannot be used in the general cases due the script interpreter’s inability to parse nested quotes.
Thank you for sharing these examples with us, Yuval. I think you’ve been able to kick up enough muck to warrant greater transparency into the inner workings of the capitalization “sausage factory”. Who knows… maybe P123 will dig up Capital IQ’s SQL script for MktCap???