# D46-F01-A05 — Stock-Split/Consolidation EPS Restatement

> **Domain:** D46 — Earnings and Per-Share Analytics  
> **Family:** D46-F01 — Earnings and Share Foundations  
> **Status:** Article-ready  
> **Last reviewed:** 2026-07-22

## Executive summary

A stock split or share consolidation changes the number of shares represented by each ownership unit without, by itself, changing the earnings available to shareholders. To keep earnings per share (EPS) comparable, prior-period share denominators and per-share amounts are restated to the new share basis.

For a split factor \(F\):

\[
F=\frac{\text{post-split shares}}{\text{pre-split shares}}
\]

\[
W^*=W\times F
\qquad
\text{EPS}^*=\frac{\text{EPS}}{F}
\]

[IAS 33.26–29 and 64](https://www.ifrs.org/content/dam/ifrs/publications/pdf-standards/english/2022/issued/part-a/ias-33-earnings-per-share.pdf?bypass=on) and [FASB Statement No. 128 paragraph 54](https://storage.fasb.org/fas128.pdf) support retrospective adjustment for plain stock splits and reverse splits for all periods presented. If the qualifying change occurs after period-end but before authorization or issuance, the presented per-share calculations use the new share count and disclose that fact.

The word **plain** is important. Under IAS 33.29, a consolidation combined with a special dividend can have the overall effect of a fair-value share repurchase: resources fall along with the share count, so the denominator reduction is recognized from the dividend-recognition date rather than treated as a no-resource-change split across every prior period. This engine intentionally rejects that combined-transaction analysis by scope; an upstream accounting control must classify it before invocation.

This package turns that rule into a reproducible, event-aware restatement engine with exact rational arithmetic.

## Problem and financial relevance

Imagine FY2025 earnings of USD 8 million and 2 million weighted-average shares:

\[
\text{EPS}=8{,}000{,}000/2{,}000{,}000=4.00
\]

A 2-for-1 split takes effect in January 2026 before the FY2025 statements are authorized. The economic earnings did not double. The comparable FY2025 denominator becomes 4 million shares and EPS becomes USD 2.00:

\[
8{,}000{,}000/(2{,}000{,}000\times2)=2.00
\]

Without restatement, a chart could show a mechanical 50% “EPS decline” caused only by the change in share units.

## Learning contract

### Audience and prerequisites

This topic is for accounting-system, financial-data, and disclosure-pipeline developers. It assumes Basic EPS, weighted-average shares, corporate-action records, dates, and fractions.

### Learning objectives

After completing this topic, the reader can:

- derive the forward- and reverse-split restatement formulas;
- explain why the earnings numerator remains unchanged;
- handle events after period-end but before authorization;
- compose multiple split factors exactly;
- prevent double application with a declared `basis_date`;
- implement deterministic Python and TypeScript restatement;
- validate factors, dates, basis uniformity, rounding, and finality.

## Definitions and terminology

| Term | Definition |
|---|---|
| Stock/share split | More shares represent the same proportional ownership; factor \(F>1\). |
| Share consolidation/reverse split | Fewer shares represent the same proportional ownership; factor \(0<F<1\). |
| Restatement factor | Exact ratio of post-event shares to pre-event shares. |
| Share basis | Set of split/consolidation events already reflected in a denominator. |
| Basis date | Events effective on or before this date are already reflected in the source row. |
| Authorization date | Cutoff through which qualifying events are included for the presented financial statements. |
| Uniform basis | Every component of one weighted-average denominator is expressed on the same split-adjusted basis. |
| Retrospective adjustment | Re-expressing presented prior-period shares and EPS as though the new share basis applied throughout those periods. |

## Scope and variants

The canonical algorithm restates completed weighted-average ordinary-share denominators and recomputes Basic EPS from an unchanged earnings numerator.

Included:

- forward stock/share splits;
- share consolidations or reverse splits;
- events within a presented period or after period-end through authorization;
- multiple chronological events;
- period-specific basis dates;
- profit, loss, and zero earnings;
- IFRS, US GAAP, and a declared other framework;
- exact rational factors and declared display rounding.

Excluded:

- legal determination that an event is effective;
- building weighted-average shares from transaction segments;
- treasury-share exclusion;
- stock dividends/bonus issues;
- rights-issue bonus elements;
- option, warrant, award, or conversion-price adjustments;
- numerator restatements caused by other accounting changes;
- journal entries, par value, authorized capital, or fractional-share settlement;
- diluted-EPS instrument re-testing.

## Input data contract

Numeric amounts are canonical decimal strings, with at most 30 digits and 12 fractional digits. Split terms are positive integer strings.

### Invocation fields

| Field | Type | Constraints |
|---|---|---|
| `accounting_framework` | enum | `IFRS`, `US_GAAP`, or `OTHER_DECLARED`. |
| `currency` | string | Three uppercase letters. |
| `statements_authorized_for_issue_date` | date | Real `YYYY-MM-DD`; event cutoff. |
| `earnings_scale`, `share_scale` | decimal strings | Positive unit multipliers. |
| `share_decimal_places`, `eps_decimal_places` | integers | 0–12. |
| `rounding_mode` | enum | `half_even` or `half_up`. |
| `restatement_policy` | string | Non-empty standard/policy statement. |
| `event_source_policy` | string | Non-empty provenance/effectiveness policy. |
| `events` | array | May be empty; otherwise strictly date ordered. |
| `periods` | array | Non-empty; unique period IDs. |

### Capital event

| Field | Type | Constraints |
|---|---|---|
| `event_id` | string | Non-empty and unique. |
| `effective_date` | date | Real date no later than authorization. |
| `event_type` | enum | `stock_split` or `share_consolidation`. |
| `post_split_shares` | positive integer string | Ratio numerator. |
| `pre_split_shares` | positive integer string | Ratio denominator. |
| `event_is_effective` | boolean | Must be `true`. |
| `changes_resources` | boolean | Must be `false`; `true` identifies a combined transaction outside this plain unit-change engine. |

The type must match the reduced factor: a split is greater than one; a consolidation is less than one. A 1-for-1 event is rejected.

### Period row

| Field | Type | Unit | Constraints |
|---|---|---|---|
| `period_id` | string | identifier | Non-empty and unique. |
| `period_start`, `period_end` | dates | calendar | Start ≤ end. |
| `basis_date` | date | share-basis cutoff | No later than authorization. |
| `basis_is_uniform` | boolean | control | Must be `true`. |
| `earnings_available_to_ordinary_shareholders` | decimal string | reported earnings units | Signed. |
| `weighted_average_ordinary_shares` | decimal string | reported share units | Strictly positive. |
| `is_final` | boolean | state | Propagates to overall status. |

An event is applied to a row only when `effective_date > basis_date`. Equality means the source row already reflects the event.

## Output contract

Each period returns:

| Field | Meaning |
|---|---|
| `applied_event_ids` | Chronological events applied to the row. |
| `factor_numerator`, `factor_denominator` | Reduced exact cumulative factor. |
| `earnings_available_to_ordinary_shareholders` | Unchanged numerator in base currency units. |
| `pre_restatement_shares` | Exact source denominator in base shares. |
| `restated_shares` | Display-rounded denominator on target basis. |
| `pre_restatement_basic_eps` | EPS calculated on the source basis. |
| `restated_basic_eps` | EPS calculated on the target basis. |
| `share_rounding_adjusted` | Whether displayed shares discarded a remainder. |
| `eps_rounding_adjusted` | Whether displayed restated EPS discarded a remainder. |
| `is_final` | Source finality. |

Overall `status` is `final` only when every period is final.

## Mathematical formulation

For event \(j\):

\[
f_j=\frac{q^{post}_j}{q^{pre}_j}
\]

For period \(i\), whose basis already includes events through \(b_i\):

\[
F_i=\prod_{j:\ t_j>b_i}f_j
\]

Then:

\[
W_i^*=W_iF_i
\]

\[
\text{EPS}_i^*=\frac{E_i}{W_i^*}
=\frac{E_i/W_i}{F_i}
=\frac{\text{EPS}_i}{F_i}
\]

### Invariants

\[
E_i^*=E_i
\]

\[
W_i^*\times \text{EPS}_i^*=E_i
\]

before display rounding.

### Direction

| Event | Factor | Restated shares | Restated EPS |
|---|---:|---:|---:|
| Forward split | \(F>1\) | Increase | Decrease in absolute magnitude |
| Consolidation | \(0<F<1\) | Decrease | Increase in absolute magnitude |

The sign of EPS does not change. A negative loss per share becomes more or less negative in inverse proportion to the factor.

![Forward and reverse split directions, with the earnings numerator held constant](./visuals/static/split-direction-bridge.svg)

The diagram is illustrative: labels and arrows, not color alone, show that the share denominator follows the factor while EPS moves inversely.

## Algorithm steps

1. Validate framework, authorization date, policies, units, and rounding.
2. Validate unique, effective, strictly ordered events through authorization and require each to be classified as a no-resource-change unit event.
3. Reduce each event ratio to an exact fraction and validate its direction.
4. Validate each period and its uniform basis assertion.
5. Select only events after that period’s basis date.
6. Multiply selected factors exactly.
7. Preserve the earnings numerator.
8. Multiply the denominator by the factor.
9. Compute pre- and post-restatement EPS from exact rational values.
10. Round only the returned display fields and report diagnostics.

## Pseudocode

See [`pseudocode/eps-restatement.txt`](./pseudocode/eps-restatement.txt).

## Worked example

FY2025 source values, reported in thousands:

- earnings available: USD 8,000 thousand;
- weighted-average ordinary shares: 2,000 thousand;
- period ends 2025-12-31;
- 2-for-1 split effective 2026-01-15;
- statements authorized 2026-02-20.

The event qualifies even though it occurred after period-end:

\[
F=2/1=2
\]

\[
W^*=2{,}000{,}000\times2=4{,}000{,}000
\]

\[
\text{EPS before}=8{,}000{,}000/2{,}000{,}000=4.0000
\]

\[
\boxed{\text{EPS restated}=8{,}000{,}000/4{,}000{,}000=2.0000}
\]

Independent checks:

- numerator remains USD 8,000,000;
- \(4{,}000{,}000\times2.0000=8{,}000{,}000\);
- \(4.0000/2=2.0000\).

![Illustrative post-period split inside the authorization window](./visuals/static/post-period-restatement-timeline.svg)

The dates and amounts above are synthetic teaching inputs. They demonstrate the authorization-window rule but are not an issuer history.

## Verified historical example: Apple’s 2020 four-for-one split

This documentary comparison separates issuer-reported facts from our calculation. It does **not** claim a provider revision, a change in operating performance, or an investment signal.

### Sourced facts

- Apple’s [2019 Form 10-K](https://www.sec.gov/Archives/edgar/data/320193/000032019319000119/a10-k20199282019.htm) reported 2019 net income of USD 55,256 million, weighted-average basic shares of 4,617,834 thousand, and Basic EPS of USD 11.97.
- Apple [announced a four-for-one split on July 30, 2020](https://www.apple.com/newsroom/2020/07/apple-reports-third-quarter-results/), with an August 24 record date and split-adjusted trading beginning August 31.
- Apple’s [2020 Form 10-K](https://www.sec.gov/Archives/edgar/data/320193/000032019320000096/aapl-20200926.htm) says the split was effected on August 28 and that share and per-share information was retrospectively adjusted. Its 2019 comparative column retains net income of USD 55,256 million but presents weighted-average basic shares of 18,471,336 thousand and Basic EPS of USD 2.99.

| 2019 amount | Originally filed in 2019 | Comparative presented in 2020 | What changed |
|---|---:|---:|---|
| Net income | USD 55,256 million | USD 55,256 million | Nothing in this split restatement |
| Weighted-average basic shares | 4,617,834 thousand | 18,471,336 thousand | Multiplied by four |
| Basic EPS | USD 11.97 | USD 2.99 | Re-expressed on the four-for-one basis |

### Our reproducible calculation

The denominator bridge is exact:

\[
4{,}617{,}834\text{ thousand}\times4
=18{,}471{,}336\text{ thousand}
\]

Recomputing from the unchanged numerator gives:

\[
\frac{55{,}256\text{ million}}
{18{,}471.336\text{ million shares}}
=2.9914\ldots\approx2.99
\]

The difference between the displayed USD 11.97 and USD 2.99 is therefore a share-unit restatement, not evidence that 2019 earnings fell. The two filings prove the issuer presentation; they do not prove when a particular data vendor updated its historical series. A provider-specific claim would require a licensed, timestamped provider observation.

## Visual explanations

```mermaid
flowchart LR
  A["Validated period row"] --> B["Read uniform source basis date"]
  E["Effective ordered events through authorization"] --> C["Select events after basis date"]
  B --> C
  C --> D["Multiply exact factors"]
  D --> F["Restated shares = source shares × factor"]
  A --> G["Preserve earnings numerator"]
  F --> H["Restated EPS = earnings ÷ restated shares"]
  G --> H
  H --> I["Round display fields and emit diagnostics"]
```

```mermaid
sequenceDiagram
  participant P as "FY2025 ends"
  participant S as "2-for-1 split"
  participant A as "Statements authorized"
  P->>S: "2025-12-31"
  S->>A: "Effective 2026-01-15"
  A-->>P: "Present FY2025 on the new share basis"
```

Static and interactive assets:

- [`visuals/static/split-direction-bridge.svg`](./visuals/static/split-direction-bridge.svg) — forward versus reverse direction.
- [`visuals/static/post-period-restatement-timeline.svg`](./visuals/static/post-period-restatement-timeline.svg) — period-end to authorization window.
- [`visuals/animated/eps-restatement-lab.html`](./visuals/animated/eps-restatement-lab.html) — step-through factor composition and basis filtering.

## Implementation guide

The Python and TypeScript implementations represent every amount as a reduced rational number backed by arbitrary-precision integers. This handles factors such as 3-for-2 followed by 1-for-4 as exactly \(3/8\).

Neither implementation rounds the factor or denominator before calculating EPS.

```python
from eps_restatement import restate_eps_for_capital_events
result = restate_eps_for_capital_events(payload)
```

```ts
import {restateEpsForCapitalEvents} from "./epsRestatement.ts";
const result = restateEpsForCapitalEvents(payload);
```

For \(P\) periods and \(J\) events, runtime is \(O(PJ)\), with bounded contract input sizes and arbitrary-precision arithmetic.

## Testing and validation

Shared fixtures cover:

- a 2-for-1 split after period-end but before authorization;
- a 1-for-5 consolidation with negative EPS;
- a 3-for-2 split followed by a 1-for-4 consolidation;
- different basis dates selecting different event subsets;
- no qualifying events;
- half-even and half-up display rounding;
- the Apple 2019 filing comparison as a separately labeled public-filing documentary regression;
- malformed dates, scales, ratios, types, order, identities, basis, and denominators;
- input immutability and Python/TypeScript parity.

## Edge cases

| Case | Expected behavior |
|---|---|
| Event date equals basis date | Do not apply; already reflected. |
| Event after authorization | Reject from this invocation. |
| Empty event list | Factor \(1/1\); no change. |
| Multiple events | Multiply exact reduced factors chronologically. |
| Forward then reverse events cancel | Cumulative factor may reduce to \(1/1\). |
| Negative earnings | EPS remains negative; magnitude changes inversely. |
| Zero earnings | Both pre- and post-restatement EPS are zero. |
| Fractional restated denominator | Keep exact internally; round only output. |
| Mixed-basis denominator | Reject through `basis_is_uniform=false`. |
| 1-for-1 event | Reject; it is neither a split nor consolidation. |
| `changes_resources=true` | Reject; perform transaction-specific accounting analysis instead. |

## Failure modes and limitations

- Applying a factor twice is possible when source basis metadata is wrong.
- A mixed pre/post-split weighted-average denominator cannot be corrected by multiplying the whole row; rebuild it on one basis first.
- The engine does not determine whether a board action is legally effective.
- Under IFRS, a consolidation combined with a special dividend or another resource-changing transaction may fall under IAS 33.29 rather than the plain-consolidation transformation implemented here.
- Display-rounded EPS may not multiply back exactly to earnings; use exact internal values for reconciliation.
- Restating Basic EPS does not complete diluted EPS. Instrument quantities, prices, and antidilution conclusions may also require review.
- The algorithm addresses comparability, not economic performance or investment attractiveness.

## Real-world use cases

- comparative financial-statement restatement;
- filing and XBRL preparation controls;
- issuer-filing and historical-data normalization, subject to source and provider basis metadata;
- EPS chart continuity after capital actions;
- audit trails across multiple corporate-action events;
- regression tests for financial reporting systems.

## Related catalog topics

- `D46-F01-A03` — constructs weighted-average ordinary shares.
- `D46-F01-A04` — excludes treasury shares.
- `D46-F01-A06` — handles bonus-issue EPS restatement.
- `D46-F01-A07` — handles rights-issue bonus factors.
- `D46-F01-A08` — computes Basic EPS from the completed numerator and denominator.
- `D46-F02` — handles diluted EPS and instrument-specific adjustments.

## References

See [REFERENCES.md](./REFERENCES.md).
