Corporate Actions & Lifecycle Events
How the backtester handles splits, bonuses, mergers, delistings and other corporate events that affect your positions.
Every day we run a fresh pipeline that rebuilds clean, CA-adjusted price data from scratch. Here is exactly what happens in order:
Example: 2:1 split on 1 May → every Close before 1 May is divided by 2. On 30 April the price was ₹100, after adjustment it shows ₹50. On 1 May it opens at ~₹50. No jump, no gap.
(isin, ex_date, action_type). The same adjustment can never be applied twice. If the pipeline runs again, it skips already-applied events — prices are never double-adjusted.
Every corporate action is verified across multiple independent feeds before its ratio is applied to the price series.
| Layer | What it provides | Used for |
|---|---|---|
| Primary feed | Official CA announcements with ex-dates | Event type and ex-date |
| Secondary feed | Machine-readable ratio confirmation | Fills any missing ratio from primary |
| Manual review | Team-verified ratio via Data Control Center | Final fallback when automated feeds disagree |
2.0 for a 1:1 bonus), others use bonus-shares-per-existing-share (e.g. 1.0). We normalise every incoming ratio to the same convention before storing so the price-adjustment formula is always consistent: price_factor = 1 / (1 + ratio).
Not every corporate action can be auto-processed. Complex events and missing ratios go into a review queue where our team fills in the missing information.
• Merger — needs new ISIN + conversion ratio
• Demerger — needs child ISIN + allocation ratio
• Delisting — needs confirmation and exit handling
• Symbol / ISIN change — needs new symbol/ISIN
• Bonus with confirmed ratio ✓
• Face-value split with ratio ✓
These are applied to price history automatically on the next pipeline run.
1. The correction is stored immediately.
2. On the next pipeline run, the correction is applied to prices before the CA adjustment step runs — so the price history is correctly adjusted.
3. The lifecycle event (used by the backtester) is updated with the correct ratio at the same time.
4. For structural events (mergers, delistings), the reviewed event is written to the live Data layer immediately — the backtester can use it right away without waiting for the next pipeline run.
Your strategies never read from work-in-progress data. All pipeline work happens in a staging area. Only after everything is verified does the data go live.
Every day, when a new corporate action event arrives (split, bonus, merger etc.), our data pipeline retroactively adjusts all historical prices for that stock in the database. This means by the time you run a new backtest, every price in the history already reflects all past corporate actions — the prices are "clean".
₹100 before a 2:1 split on 1 May.Before pipeline runs: history shows ₹100 on 30 April.
After pipeline runs: history is retroactively changed to
₹50 on 30 April.On split day (1 May), the price in the DB is still
~₹50 — no sudden drop.
The entire history has been divided by 2.
This retroactive adjustment is done so that new strategies never see artificial price jumps or drops at corporate action dates. The price series is continuous.
A split increases the number of shares and proportionally reduces the price. A 2:1 split means every 1 share becomes 2 shares, price halves.
100 shares at ₹50 (adjusted price, pre-split history already halved by pipeline).Split happens. Adjusted price stays at
₹50 — no change.Position stays
100 shares × ₹50 = ₹5,000. No adjustment needed. ✓
100 shares at ₹100 (real unadjusted price before split).Split happens. Pipeline halves historical prices. Now DB shows
₹50.Without adjustment:
100 shares × ₹50 = ₹5,000 — half the real value. Wrong!Backtester doubles the share count:
200 shares × ₹50 = ₹10,000. Correct. ✓
A bonus issue gives existing shareholders extra shares for free. A 1:1 bonus means for every share you hold, you get 1 more — doubling your share count. The same logic applies as a split: prices are retroactively adjusted, new strategies don't need position correction.
₹5,000. No adjustment done.Resumed strategy: Had 100 shares at real price ₹100. After bonus, price drops to ~₹50. Backtester doubles to
200 shares × ₹50 = ₹10,000. Correct.
These events change what instrument you hold, not just the price or quantity. No price adjustment in the database can encode these — so the backtester must handle them regardless of whether it's a new or resumed strategy.
The stock is removed from the exchange. You can no longer trade it. The backtester force-exits your position at the last available price and credits the cash back to your portfolio.
200 shares of XYZ. XYZ gets delisted on 15 June.Backtester sells all 200 shares at the last available open/close price and adds the proceeds to your cash. Position is removed from the portfolio.
The old instrument ceases to exist and is replaced by a new one, with a given conversion ratio. The backtester converts your old position into the new instrument.
100 shares of ABC. ABC merges into XYZ at a ratio of 0.5 (every 2 ABC shares become 1 XYZ share).Backtester removes the ABC position and opens
50 shares of XYZ.
A business unit is spun off into a new listed company. Shareholders receive shares of the new (child) company in addition to keeping their original shares.
100 shares of ABC. ABC demerges its retail division into ABCRETAIL at a ratio of 1 new share per 2 original shares.Backtester keeps your 100 ABC shares and adds
50 shares of ABCRETAIL to your position.
The key difference is what price series the strategy was originally run on.
Split/bonus events → skip position adjustment (price is already corrected).
Structural events (delisting, merger) → still apply.
Split/bonus events → apply position adjustment (price has been halved, need to double shares).
Structural events → still apply.
Each trading day in the backtest loop runs in this exact order:
| Event Type | What it does to position | New Strategy | Resumed Strategy |
|---|---|---|---|
| Split / Face Value Split | Multiplies share count by ratio | Skipped | Applied |
| Bonus Issue | Multiplies share count by (1 + ratio) | Skipped | Applied |
| Delisting | Force-exits position at last price, cash credited | Applied | Applied |
| Merger / Amalgamation | Converts old position to new instrument at ratio | Applied | Applied |
| Symbol / ISIN Change | Renames instrument in position book | Applied | Applied |
| Demerger | Adds child instrument position at ratio | Applied | Applied |
Every lifecycle adjustment is recorded in the database once it is applied to a strategy.
If the strategy is paused and resumed later, the same event will not fire a second time —
preventing any double-adjustment of your position size.
Likewise, in the data pipeline, every CA price adjustment is tracked with an idempotency key.
The same price adjustment is never applied twice — even if the pipeline runs multiple times,
prices are always adjusted exactly once per corporate action.