Markets: A Rigorous Course

1.10 Corporate actions and adjusted prices

Core about 15 min

Motivation

Raw price series jump on ex-dates for reasons unrelated to returns. A 1:1 bonus halves the price; a naive backtest records a 50% loss. Every data vendor's "adjusted close" applies a specific convention, and you need to know which return it measures.

1.10.1Types of corporate action#

Definitions

  • Split (sub-division): face value is reduced and the share count multiplied. A ₹10 → ₹2 split gives 5 shares for 1.
  • Bonus issue a:ba{:}b: aa new fully paid shares for every bb held, capitalised from reserves. No cash changes hands.
  • Cash dividend dd per share, paid to holders on the record date. Since 1 Apr 2020 dividends are taxed in the investor's hands at slab rates; the company withholds TDS above a threshold.
  • Rights issue n:Nn{:}N: holders may subscribe to nn new shares for every NN held at a subscription price XX below market.
  • Cum and ex: a share trades cum-benefit up to the last day before the ex-date, and ex-benefit from the ex-date. Let PcP_c be the last cum close.

1.10.2Theoretical ex-prices#

Proposition 1.5theoretical ex-prices and the adjusted series

Assume the firm's equity value is unchanged by the action except for cash paid out or raised, and that markets price the shares at that value.

(a) Split 1→k1 \to k: Px=Pc/kP_x = P_c/k. Bonus a:ba{:}b: Px=Pc b/(a+b)P_x = P_c\, b/(a+b). Dividend dd: Px=Pc−dP_x = P_c - d. Rights n:Nn{:}N at XX (the theoretical ex-rights price, TERP):

Px=NPc+nXN+n.(1.10)P_x = \frac{N P_c + n X}{N + n}. \tag{1.10}

(b) Define the adjustment factor F=Px/PcF = P_x/P_c and the back-adjusted series P~t=F Pt\tilde P_t = F\, P_t for tt before the ex-date and P~t=Pt\tilde P_t = P_t on and after it (factors compound across several actions). For splits, bonuses and rights, the adjusted return on the ex-date equals the economic return of a holder (who takes up the rights). For a dividend with F=(Pc−d)/PcF = (P_c - d)/P_c,

P~xP~c−1=PxobsPc−d−1,(1.11)\frac{\tilde P_x}{\tilde P_c} - 1 = \frac{P_x^{\text{obs}}}{P_c - d} - 1, \tag{1.11}

which is the return of a holder who reinvests the dividend in the stock at the theoretical ex-price Pc−dP_c - d. It differs from the simple total return (Pxobs+d)/Pc−1(P_x^{\text{obs}} + d)/P_c - 1 by a second-order term.

Proof

(a) Value conservation. A split or bonus changes the share count from N0N_0 to N0kN_0 k or N0(a+b)/bN_0(a+b)/b without changing firm value V=N0PcV = N_0 P_c, so Px=V/(new count)P_x = V/(\text{new count}). A dividend removes dN0d N_0 of cash from the firm, so VV falls to N0(Pc−d)N_0(P_c - d). For rights: a holder of NN shares worth NPcNP_c pays nXnX and ends with N+nN+n shares; value conservation gives (N+n)Px=NPc+nX(N+n)P_x = NP_c + nX.

(b) For a split or bonus with observed ex-day close PxobsP_x^{\text{obs}}, the adjusted return is Pxobs/(FPc)=Pxobs k/PcP_x^{\text{obs}}/(F P_c) = P_x^{\text{obs}}\,k/P_c; the holder's wealth went from PcP_c (one share) to kPxobsk P_x^{\text{obs}}, the same ratio. For rights, the holder with one share and n/Nn/N rights pays (n/N)X(n/N)X and holds (N+n)/N(N+n)/N shares. The economic return on capital Pc+(n/N)XP_c + (n/N)X is (N+n)Pxobs/NPc+nX/N−1=PxobsTERP−1=PxobsFPc−1\frac{(N+n)P_x^{\text{obs}}/N}{P_c + nX/N} - 1 = \frac{P_x^{\text{obs}}}{\text{TERP}} - 1 = \frac{P_x^{\text{obs}}}{F P_c} - 1. For a dividend, FPc=Pc−dF P_c = P_c - d gives (1.11). A holder who receives dd and buys d/(Pc−d)d/(P_c - d) more shares at Pc−dP_c - d holds Pc/(Pc−d)P_c/(P_c - d) shares worth PcPxobs/(Pc−d)P_c P_x^{\text{obs}}/(P_c - d), a return of Pxobs/(Pc−d)−1P_x^{\text{obs}}/(P_c - d) - 1. Write Pxobs=(Pc−d)(1+x)P_x^{\text{obs}} = (P_c - d)(1+x). Then (1.11) equals xx and the simple total return equals (Pc−d)(1+x)+dPc−1=x(1−d/Pc)\frac{(P_c - d)(1+x) + d}{P_c} - 1 = x(1 - d/P_c); the difference xd/Pcx d/P_c is a product of two small numbers.∎

The multiplicative dividend factor in vendor data is therefore

Fdiv=Pc−dPc=1−dPc.(1.12)F_{\text{div}} = \frac{P_c - d}{P_c} = 1 - \frac{d}{P_c}. \tag{1.12}

1.10.3Adjusting a price series#

Worked example

A stock closes at ₹1,000 and then at ₹1,010, its last cum-bonus close. A 1:1 bonus goes ex; the stock closes at ₹505, then ₹510. A ₹5 dividend then goes ex; the stock closes at ₹500, then ₹507. Factors: bonus F1=1/2F_1 = 1/2; dividend F2=(510−5)/510=0.990196F_2 = (510 - 5)/510 = 0.990196. The first close (₹1,000) becomes 1,000×0.5×0.990196=₹495.101{,}000 \times 0.5 \times 0.990196 = \text{₹}495.10. The adjusted return on the bonus ex-date is 505/505−1=0505/505 - 1 = 0; on the dividend ex-date it is 500/505−1=−0.99%500/505 - 1 = -0.99\%; the raw series shows −50.0% and −1.96%. This is test_adjusted_series_small_example.

Code Exercise m01_mechanics (in the app: Exercises → m01_mechanics) implements split_factor, bonus_factor, dividend_factor and adjusted_prices. One test plants a split and a dividend in a synthetic 300-day path from toolkit.data.synthetic_prices and checks that your adjusted returns equal the wealth returns of a holder who reinvests at Pc−dP_c - d, exactly as Proposition 1.5(b) states.

Practitioner notes

  • Vendor "adjusted close" series (Yahoo Finance's "Adj Close", for example) apply split and dividend factors of this multiplicative form. Raw NSE bhavcopy prices are unadjusted. Never mix the two in one backtest.
  • Adjusted prices before old dividends are not prices that ever traded. Levels such as "52-week high" or round-number support computed on an adjusted series refer to prices nobody saw. Compute level-based signals on raw prices and return-based signals on adjusted prices.
  • F&O contracts are adjusted too. On a corporate action that is not an ordinary dividend, NSE adjusts strike prices and lot sizes of stock futures and options by the same kind of factor so that positions keep their value. Dividends at or above 2% of the stock's market value also trigger an adjustment (SEBI circular SEBI/HO/MRD2/MRD2_DCAP/P/CIR/2022/90 of 28 Jun 2022, effective 29 Jun 2022); smaller ordinary dividends do not, which is why they enter option pricing as a carry term (M07, M08).

Create a free account

Reading is open to everyone. An account keeps your progress, answers, notes and code drafts, and gives you the study plan, the journals and the simulator. Running code needs an account approved for it.