← All posts

GM Before and After Bankruptcy: Why Entity Resolution Matters for Financial Data

Old GM (entity 4) filed for bankruptcy in 2009. New GM (entity 5) IPO’d in 2010. Same ticker, different company.

What’s the question?

General Motors Corporation filed for Chapter 11 bankruptcy on June 1, 2009 — the largest industrial bankruptcy in U.S. history at the time. The company was liquidated, its viable assets were transferred to a new legal entity, and General Motors Company conducted an IPO on November 18, 2010. Both entities traded under the ticker “GM.” Most financial databases treat them as one continuous company. They are not. The old GM was liquidated. The new GM inherited selected assets and liabilities but is a distinct legal entity with a different capital structure, different shareholders, and different accounting history. Mixing their financial data produces a phantom time series that represents no real company.

The approach

Use xfl.resolve(“GM”) to identify the two entities and their validity dates. Examine the entity_id, ticker validity periods, and S&P 500 membership for each. The full set of fields behind that call is given in the resolve reference. Then pull 10 years of annual fundamentals for the new GM (the current holder of the ticker) to show the post-IPO revenue and profitability trajectory.

import xfinlink as xfl

xfl.api_key = "YOUR_API_KEY"  # free at https://xfinlink.com/signup

# -- Resolve GM: two entities, one ticker -----------------------------------
info = xfl.resolve("GM")
entities = info["data"]["GM"]["entities"]

print("=== GM: Two Companies, One Ticker, One Bankruptcy ===")
print()

for e in entities:
    valid_from = e.get("ticker_valid_from", "?")
    valid_to = e.get("ticker_valid_to") or "present"
    name = e["name"]
    eid = e["entity_id"]
    print(f"{name} (pre-2009 bankruptcy)" if "Corporation" in name else f"{name}")
    print(f"  Entity ID: {eid}")
    print(f"  Ticker valid: {valid_from} to {valid_to}")

    # Check for S&P 500 membership
    memberships = e.get("index_membership", [])
    for m in memberships:
        if m.get("index") == "sp500":
            added = m.get("added", "?")
            removed = m.get("removed") or "current"
            print(f"   S&P 500: {added} to {removed}")
    print()

# -- New GM: annual fundamentals since IPO ---------------------------------
print("=== New GM: Revenue and Profitability Since IPO ===")
df = xfl.fundamentals(
    "GM",
    period_type="annual",
    fields=["revenue", "net_income"],
    period="10y",
)

df = df.sort_values("period_end")
for _, r in df.iterrows():
    rev_str = f"${r['revenue'] / 1e3:>5.0f}B" if r["revenue"] else "   N/A"
    ni_str = f"${r['net_income'] / 1e3:>4.0f}B" if r["net_income"] else "  N/A"
    print(
        f"  {str(r['period_end'])[:10]}  {r['entity_name']:<30s}  "
        f"rev={rev_str}  NI={ni_str}"
    )

# -- Key insight ------------------------------------------------------------
print()
print("=== Key Insight ===")
print("Old GM (entity 4): General Motors Corporation -- filed for bankruptcy June 2009.")
print("New GM (entity 5): General Motors Company -- IPO November 2010.")
print("Stitching their financials together would merge a bankrupt entity with its successor.")
print("Entity resolution keeps them separate.")

Output:

=== GM: Two Companies, One Ticker, One Bankruptcy ===

General Motors Corporation (pre-2009 bankruptcy)
  Entity ID: 4
  Ticker valid: 1962-07-02 to 2009-06-01

General Motors Company
  Entity ID: 5
  Ticker valid: 2010-11-18 to present
   S&P 500: 2013-06-07 to current

=== New GM: Revenue and Profitability Since IPO ===
  2016-12-31  General Motors Company          rev= $149B  NI=  $9B
  2017-12-31  General Motors Company          rev= $146B  NI= $-4B
  2018-12-31  General Motors Company          rev= $133B  NI=  $8B
  2019-12-31  General Motors Company          rev= $123B  NI=  $7B
  2020-12-31  General Motors Company          rev= $109B  NI=  $6B
  2021-12-31  General Motors Company          rev= $114B  NI= $10B
  2022-12-31  General Motors Company          rev= $144B  NI= $10B
  2023-12-31  General Motors Company          rev= $158B  NI= $10B
  2024-12-31  General Motors Company          rev= $172B  NI=  $6B
  2025-12-31  General Motors Company          rev= $168B  NI=  $3B

=== Key Insight ===
Old GM (entity 4): General Motors Corporation -- filed for bankruptcy June 2009.
New GM (entity 5): General Motors Company -- IPO November 2010.
Stitching their financials together would merge a bankrupt entity with its successor.
Entity resolution keeps them separate.

What this tells us

The entity data correctly separates old GM (entity 4, valid 1962–2009) from new GM (entity 5, valid 2010–present). The 17-month gap between the last trading day of old GM and the IPO of new GM is the bankruptcy restructuring period. New GM’s fundamental trajectory shows a company that peaked at $172B revenue in 2024 and $10B net income in 2021–2023, with a notable decline to $168B revenue and $3B net income in 2025 — potentially reflecting EV transition costs and competitive pressure.

So what?

For any analysis that spans the 2009 bankruptcy — long-term returns, growth rates, valuation multiples, financial ratios — using a single continuous “GM” series produces incorrect results. The entity_id system ensures that queries for GM after 2010 return only new GM data, and queries before 2009 return only old GM data. Any data vendor that does not maintain entity-level identifiers will silently mix these two companies. A privatisation followed by a re-listing raises the same identity question, which the DELL price history case traces.