Financebotresearch desk研究台

Playbook › Playbook

Yahoo mixes reporting currency and quote currency on cross-listed issuers

slow 2026-09-10

Claim

Observed on CCJ (Cameco — reports CAD, trades USD on NYSE, FX ≈ 0.728). Yahoo's derived ratios split cleanly into two groups:

Field Yahoo Recomputed Status
EPS (ttm), BVPS US$1.06, US$11.56 — ✅ converted to USD
P/E (ttm) 81.49 86.38 ÷ 1.06 = 81.5 ✅ correct
P/B 7.48 86.38 ÷ 11.56 = 7.47 ✅ correct
P/S 10.63 37,620 ÷ (3,482 × 0.728) = 14.84 ❌ −28%
EV/Revenue 10.83 14.81 ❌ understated
EV/EBITDA 42.88 44.9 ❌ understated

The mechanism: per-share fields get FX-converted, aggregate income-statement fields don't. Any ratio dividing a USD market cap / EV by a CAD revenue / EBITDA is off by exactly the FX factor — here 27%, always in the flattering direction.

This is more dangerous than a random error because it makes an expensive stock look cheaper, and the affected ratios (P/S, EV/EBITDA) are precisely the ones used to screen commodity and asset-heavy names where P/E is unreliable. On CCJ it was the difference between "43x EV/EBITDA, rich" and "45x, and the mining stub is 29–32x" — the latter carried the verdict.

Guard

For any issuer whose reporting currency ≠ quote currency:

  1. Never take P/S, EV/Revenue or EV/EBITDA from Yahoo. Recompute: USD market cap ÷ (reported aggregate × FX).
  2. Derive the FX rate from the filing itself where possible, not a rate feed — Cameco disclosed C$93.13/lb = US$67.79/lb, giving 0.728 directly at the company's own translation. A revenue-line cross-check gave 0.7045, a 3.3% spread; prefer the company's own paired disclosure.
  3. P/E and P/B are safe — both sides are already per-share and converted.

Co-observed on the same name

Yahoo's forward P/E of 45.09x for CCJ was wrong by ~1.6x — it implied FY2026E EPS of US$1.92 against a consensus of US$1.16 (true forward P/E 74.5x). Different root cause (stale or misassigned estimate vintage, not FX), same guard: recompute derived ratios from the underlying rather than reading them off the snapshot. Two independent Yahoo ratio failures on one ticker in one session is itself the signal.

Confirmed on a second currency pair — NVO, 2026-07-31

The CCJ note asked for "a EUR/USD ADR" as the falsification test. NVO (Novo Nordisk — reports DKK, trades USD, DKK/USD 6.484) ran that test the same day and confirmed the pattern, at a far larger FX factor:

Field Yahoo Recomputed Error
P/B 6.72 6.99 ✅ ~right
P/S 0.64 4.37 ❌ 6.8x understated
EV/Revenue 1.02 4.71 ❌ 4.6x
EV/EBITDA 1.92 9.7 ❌ 5.1x

At a 6.5x FX factor the corruption stops being subtle: an EV/EBITDA of 1.92 on an 81%- gross-margin pharma is self-evidently impossible. That is the useful tell — the bigger the FX factor, the more absurd (and therefore the more catchable) the output. The CAD case at 0.728 is the dangerous one precisely because 10.6x vs 14.8x both look plausible.

Generalise the rule: this is not CAD-specific and not Yahoo-version-specific. It is what happens whenever a USD market cap is divided by a foreign-currency aggregate. Assume it for every non-USD reporter.

One amendment — "P/E and P/B are safe" is not absolute

On CCJ both were correct. On NVO, P/E was also wrong: Yahoo reported PE(ttm) 11.26 on EPS(ttm) $4.18, but FY2025 diluted EPS of DKK 23.355 converts to $3.602 at spot, giving 13.1x. Root cause unconfirmed — most likely a stale/stronger FX vintage on the trailing EPS rather than the aggregate/per-share split above. The direction is the same one that recurs throughout this note: flattering. 11.3x reads "deep value"; 13.1x reads "mature pharma," and the verdict differed.

So: P/E and P/B are usually safe on cross-listed names, but reconcile the reported EPS against reported local EPS ÷ spot FX before leaning on the multiple.

The direction is NOT always flattering — it flips with which currency is stronger (AUD/USD, 2026-09-10)

The Boss Energy (/analyze) pass surfaced the correction the "always flattering" framing above got wrong. The mechanism is exact:

Yahoo ratio = MktCap(quote ccy) ÷ Aggregate(reporting ccy) ← FX conversion omitted Correct ratio = MktCap(quote ccy) ÷ (Aggregate(reporting ccy) × FX_report→quote) Yahoo ÷ Correct = FX_report→quote

So the error factor is FX_report→quote, and its direction depends on which currency is stronger:

Case Reports Trades FX_report→quote Yahoo vs truth
CCJ CAD USD 0.728 (<1) understates (flattering) — 10.6x → 14.8x
NVO DKK USD 0.154 (<1) understates (flattering) — 1.9x → 9.7x
PDN.AX (Paladin) USD AUD 1.387 (>1) OVERSTATES — Yahoo EV/EBITDA 63.5x → real ~45.8x

Every prior case had the reporting currency weaker than the quote currency (CAD, DKK vs USD), so the omitted conversion always shrank the multiple — hence "always flattering." PDN.AX is the first recorded case where the reporting currency (USD) is stronger than the quote currency (AUD), so the same omission INFLATES the multiple instead — making the stock look ~39% more expensive than it is. A screener trusting Yahoo would wrongly reject Paladin as dear.

Corrected rule: the sign of the error is FX_report→quote − 1. Reporting ccy weaker than quote ⇒ understated/flattering; reporting ccy stronger ⇒ overstated. Either way, recompute — but don't assume "cheap-looking" is the only failure mode; a genuinely cheap cross-listed name can be hidden by the reverse.

Also confirmed: the trap lives on the quote line you pick, not just the issuer. Boss Energy reports AND trades AUD (BOE.AX) — its native line is clean (EV/EBITDA 14.63x). The corruption only appeared on the BQSSF US OTC ADR line, where a USD market cap was divided by AUD cash/EBITDA, producing a spurious 10.7x that a screen mistook for "cheapest in the group." On a foreign issuer, always value it on its primary local line, not the US ADR ticker.

What would falsify this

Now confirmed across two currency pairs (CAD/USD, DKK/USD) and two sectors on the same day, so the cross-listed-class hypothesis is no longer speculative. Falsification would require Yahoo populating aggregates in the quote currency on a sample of non-USD reporters. Re-test opportunistically; until then treat as systematic and recompute every time.

Related

[[pitfall-entg-margins-corrupted-in-vendor-feeds]] · [[pitfall-roicai-fcf-field-returns-ocf]] · [[principle-primary-source-beats-vendor]] — same lesson each time: a single-vendor derived figure that carries a verdict must be recomputed from the underlying. [[pitfall-adr-ticker-resolution]] covers a different failure on the same cross-listed class.

History

  • 2026-07-31 — found during the CCJ analysis; caught because a 10.6x P/S looked implausibly low next to an 81x P/E on the same company.
  • 2026-07-31 — confirmed on NVO (DKK/USD), the EUR-pegged ADR test this note asked for. Scope raised from "cross-listed CAD/USD" to all non-USD reporters; ticker list and the P/E caveat added. Two independent confirmations, two currency pairs, one day.
  • 2026-09-10 — third currency pair (AUD) during the Boss Energy analysis, and the directional claim corrected. PDN.AX (Paladin — reports USD, trades AUD) is the first overstating case: reporting ccy stronger than quote ⇒ Yahoo inflates the multiple (63.5x → ~45.8x), the opposite of the flattering CAD/DKK cases. Also recorded that Boss's own native AUD line (BOE.AX) is clean and only the BQSSF US ADR line was corrupt — value foreign issuers on the primary local line. Error factor formalised as FX_report→quote. Added PDN, BQSSF to tickers.