- Conceptual Foundations of Historical Price Series
- Why Adjustment Is Mandatory for Index Constituents
- Constituent-Level Perspective vs Index-Level Data
- Early Engineering Decisions That Shape All Downstream Analysis
- Engineering Adjusted Historical Series for Index Constituents
- Corporate Actions as Structural Price Events
- Analytical, Backtesting, and Trading Impact of Adjusted vs Non-Adjusted Series
- Supporting Infrastructure for Adjusted and Non-Adjusted Index Constituent Data
- Python Libraries for This Domain
- Data Sourcing Methodologies
- Database Structure and Storage Design
- Short-, Medium-, and Long-Term Trading Impact Summary
- Unified Perspective on Adjusted vs Non-Adjusted Series
- Conclusion and Call to Action
Historical price series form the analytical backbone of every quantitative model, trading strategy, and index-replication framework in Indian equity markets. For index constituents, however, prices are not merely observed values; they are engineered artifacts shaped by corporate actions, regulatory rules, and data vendor methodologies. Understanding the distinction between adjusted and non-adjusted historical series is therefore foundational, not optional.
This article examines how constituent-level price histories are constructed, stored, and consumed within index datasets, with a strict focus on data engineering and analytical usage. Index methodology rules such as divisor maintenance are intentionally excluded and treated as a separate pillar.
Conceptual Foundations of Historical Price Series
Non-Adjusted Price Series
A non-adjusted price series records the raw prices at which securities traded on the exchange. These prices reflect actual market transactions and match what traders see on their terminals on any given day. No retrospective modification is applied, even when corporate actions occur.
For index constituents, non-adjusted prices preserve execution reality but fail to maintain economic continuity across time when structural events such as splits, bonuses, or rights issues occur.
Adjusted Price Series
An adjusted price series restates historical prices to neutralize the mechanical impact of corporate actions. The goal is to preserve economic comparability, ensuring that price changes reflect true gains or losses rather than accounting effects.
Within index datasets, adjusted series are used to compute returns, correlations, factor exposures, and attribution metrics that would otherwise be distorted.
Why Adjustment Is Mandatory for Index Constituents
Economic Continuity
Index constituents undergo frequent structural changes. Without adjustment, a stock split or bonus issue introduces artificial price gaps that appear as losses, even though investor wealth remains unchanged. Adjusted series remove these discontinuities.
Cross-Sectional Comparability
Indices aggregate multiple securities. If one constituent experiences a corporate action while others do not, unadjusted data introduces asymmetric volatility, breaking comparability across constituents.
Primary Quantitative Building Block: Returns
Simple Returns
Returns are the fundamental metric derived from price series. Their correctness depends entirely on whether prices are adjusted consistently.
Formal Mathematical Definition of Simple Return
Python Implementation of Simple Returns
import pandas as pd prices = df["close"] returns = prices.pct_change()
Fetch → Store → Measure Workflow
Fetch: Daily closing prices for each index constituent.
Store: Raw prices in a time-indexed structure without modification.
Measure: Compute returns; observe discontinuities around corporate action dates.
Trading Horizon Impact
Short-term traders prefer non-adjusted prices because execution occurs at real prices. Medium- and long-term analysis using non-adjusted returns leads to false drawdowns and distorted performance metrics.
Logarithmic Returns
Log returns are preferred in quantitative finance due to their time-additive property and improved statistical behavior.
Formal Mathematical Definition of Log Return
Python Implementation of Log Returns
import numpy as np log_returns = np.log(prices / prices.shift(1))
Fetch → Store → Measure Workflow
Fetch: Adjusted or non-adjusted closing prices depending on horizon.
Store: Persist prices with metadata indicating adjustment status.
Measure: Use log returns for volatility modeling and factor analysis.
Trading Horizon Impact
Log returns computed on unadjusted series exaggerate volatility around corporate actions. Adjusted prices produce smoother, more stationary return distributions essential for medium- and long-term models.
Constituent-Level Perspective vs Index-Level Data
Why Stock-Level Adjustment Comes First
Indices are constructed from constituent returns, not raw prices. Any error at the stock level propagates upward into index analytics, factor models, and performance attribution.
Data Consistency Requirement
Within an index dataset, all constituents must share a consistent adjustment methodology. Mixing adjusted and non-adjusted series inside the same analytical universe introduces hidden biases that cannot be diversified away.
Early Engineering Decisions That Shape All Downstream Analysis
Choosing whether to store adjusted prices, non-adjusted prices, or both is a structural database decision. Professional-grade systems always retain both, with explicit versioning and metadata to prevent accidental misuse.
Fetch → Store → Measure Workflow
Fetch: Exchange prices and corporate action events independently.
Store: Maintain parallel series with clear adjustment flags.
Measure: Select series based on analytical intent and trading horizon.
Trading Horizon Impact
Short-term models reference raw prices; portfolio analytics and index replication rely exclusively on adjusted histories. Misalignment at this stage compromises every subsequent calculation.
Adjusted and non-adjusted historical series are not interchangeable views of the same data. They serve different analytical purposes, and for index constituents, the adjusted series is the only representation that preserves economic truth across time.
Engineering Adjusted Historical Series for Index Constituents
Adjusted price series do not emerge automatically from exchanges; they are engineered through deterministic algorithms that translate corporate actions into backward-applied adjustment factors. For index constituents, this engineering layer is critical because even small inconsistencies compound across time, constituents, and portfolios.
Corporate Actions as Structural Price Events
Classification of Corporate Actions
Corporate actions affecting historical price series can be broadly classified into quantity-altering and value-altering events. Each category requires a distinct adjustment logic to preserve economic equivalence across time.
Quantity-Altering Actions
These actions change the number of outstanding shares without injecting or extracting value from the firm.
- Stock splits
- Reverse splits
- Bonus issues
Value-Altering Actions
These actions introduce or remove capital and therefore require price-weighted adjustments.
- Rights issues
- Special dividends (above index thresholds)
Stock Split Adjustment Logic
Conceptual Rationale
A stock split increases the number of shares while proportionally reducing the per-share price. Investor wealth remains unchanged, but the quoted price changes mechanically.
Formal Mathematical Definition of Split Adjustment Factor
Where:
- m represents old shares
- n represents new shares
Python Implementation of Split Adjustment
split_ratio_old = 1 split_ratio_new = 2 adjustment_factor = split_ratio_old / split_ratio_new df["adj_close"] = df["close"] * adjustment_factor
Fetch → Store → Measure Workflow
Fetch: Split ratio and ex-date from corporate action circulars.
Store: Persist split metadata separately from prices.
Measure: Apply backward adjustment to all prices prior to ex-date.
Trading Horizon Impact
Short-term traders ignore historical splits, while medium- and long-term models must neutralize their impact to avoid artificial volatility spikes.
Bonus Issue Adjustment Logic
Conceptual Rationale
A bonus issue increases the share count without altering firm value. Like splits, bonus issues require proportional backward adjustment.
Formal Mathematical Definition of Bonus Adjustment Factor
Where:
- a = existing shares
- b = bonus shares issued
Python Implementation of Bonus Adjustment
existing_shares = 1 bonus_shares = 1 adjustment_factor = existing_shares / (existing_shares + bonus_shares) df["adj_close"] = df["close"] * adjustment_factor
Fetch → Store → Measure Workflow
Fetch: Bonus ratio and ex-date.
Store: Normalize ratios into numeric factors.
Measure: Backward-adjust historical prices.
Trading Horizon Impact
Bonus issues create sharp artificial price drops in raw data, misleading medium-term volatility and drawdown analysis if left unadjusted.
Rights Issue Adjustment Logic
Why Rights Issues Are Different
Rights issues inject capital at a discounted price, changing firm value per share. Adjustments must therefore be price-weighted.
Formal Mathematical Definition of Theoretical Ex-Rights Price
Formal Mathematical Definition of Rights Adjustment Factor
Python Implementation of Rights Adjustment
Pc = 100.0 R = 60.0 k = 0.25 terp = (Pc + k * R) / (1 + k) adjustment_factor = terp / Pc df["adj_close"] = df["close"] * adjustment_factor
Fetch → Store → Measure Workflow
Fetch: Rights ratio, issue price, and ex-date.
Store: Persist TERP inputs explicitly.
Measure: Apply backward factor consistently across all pre-event prices.
Trading Horizon Impact
Ignoring rights adjustments creates false drawdowns that distort medium-term swing strategies and long-term return attribution.
Cumulative Adjustment Factor Construction
Chaining Multiple Corporate Actions
Index constituents may experience multiple corporate actions across their lifespan. Adjustment factors must therefore be compounded multiplicatively.
Formal Mathematical Definition of Cumulative Adjustment Factor
Python Implementation of Cumulative Factors
df = df.sort_values("date", ascending=False)
df["cum_adj_factor"] = df["adj_factor"].cumprod()
df["adj_close"] = df["close"] * df["cum_adj_factor"]
Fetch → Store → Measure Workflow
Fetch: All historical corporate actions.
Store: One factor per event, versioned.
Measure: Validate continuity across every ex-date.
Trading Horizon Impact
Cumulative adjustment accuracy determines the integrity of long-horizon backtests and index replication models.
Validation of Adjusted Series
Return Continuity Validation
Correctly adjusted series exhibit smooth return behavior across corporate action boundaries.
Formal Mathematical Definition of Event-Day Return Check
Python Validation Snippet
event_returns = returns.loc[corp_action_dates] assert event_returns.abs().max() < 0.2
Adjusted historical series are engineered constructs. Precision in factor calculation, ex-date alignment, and cumulative chaining determines whether index analytics reflect economic reality or embedded error.
Analytical, Backtesting, and Trading Impact of Adjusted vs Non-Adjusted Series
Once adjusted and non-adjusted historical series are engineered and stored, their true importance emerges during analysis, backtesting, and live trading. At this stage, the choice of series directly influences returns, volatility, drawdowns, factor exposures, and index replication accuracy. For index constituents, misuse of price adjustments introduces systematic bias rather than random noise.
Return Measurement Distortions
False Returns Around Corporate Actions
Non-adjusted prices mechanically drop on ex-dates for splits, bonuses, and rights issues. When returns are computed directly from such prices, the resulting values represent accounting effects rather than economic outcomes.
Formal Mathematical Definition of Measured Return Error
Python Illustration of Return Distortion
raw_returns = raw_prices.pct_change() adj_returns = adj_prices.pct_change() error = raw_returns - adj_returns
Fetch → Store → Measure Workflow
Fetch: Raw and adjusted closing prices.
Store: Parallel return series with explicit labels.
Measure: Quantify deviation around ex-dates.
Trading Horizon Impact
Short-term traders tolerate raw return distortions because execution prices matter. Medium- and long-term strategies accumulate these errors, leading to materially incorrect performance attribution.
Impact on Volatility Estimation
Artificial Volatility Inflation
Corporate action gaps appear as extreme returns in non-adjusted data, inflating variance and volatility estimates.
Formal Mathematical Definition of Volatility
Python Volatility Computation
volatility = adj_returns.std() * (252 ** 0.5)
Fetch → Store → Measure Workflow
Fetch: Adjusted return series.
Store: Rolling volatility metrics.
Measure: Compare volatility stability across action boundaries.
Trading Horizon Impact
Inflated volatility from raw prices leads to excessive risk scaling, smaller position sizes, and suboptimal capital deployment in medium-term strategies.
Drawdown and Risk Metrics
Maximum Drawdown Misrepresentation
Unadjusted series exaggerate drawdowns by treating corporate action price resets as losses.
Formal Mathematical Definition of Maximum Drawdown
Python Drawdown Calculation
cum_max = adj_prices.cummax() drawdown = (cum_max - adj_prices) / cum_max max_drawdown = drawdown.max()
Fetch → Store → Measure Workflow
Fetch: Adjusted price series.
Store: Cumulative peak tracking.
Measure: Identify true economic drawdowns.
Trading Horizon Impact
Long-term investors relying on unadjusted drawdowns underestimate strategy robustness and may abandon profitable systems prematurely.
Factor Modeling and Cross-Sectional Analysis
Impact on Factor Signals
Momentum, value, and volatility factors are computed using historical prices. Unadjusted series introduce structural breaks that contaminate factor signals.
Formal Mathematical Definition of Momentum
Python Momentum Computation
k = 252 momentum = adj_prices / adj_prices.shift(k) - 1
Fetch → Store → Measure Workflow
Fetch: Adjusted constituent prices.
Store: Factor-ready datasets.
Measure: Rank stocks consistently across the universe.
Trading Horizon Impact
Medium- and long-horizon factor portfolios fail catastrophically if even a subset of constituents use non-adjusted histories.
Index Replication and Tracking Error
Constituent-Level Consistency
Index replication strategies depend on matching constituent returns exactly. Any mismatch in adjustment logic between index data and constituent data introduces persistent tracking error.
Formal Mathematical Definition of Tracking Error
Python Tracking Error Calculation
tracking_error = (portfolio_returns - index_returns).std() * (252 ** 0.5)
Fetch → Store → Measure Workflow
Fetch: Index-level and constituent-level adjusted returns.
Store: Version-aligned datasets.
Measure: Monitor tracking error stability.
Trading Horizon Impact
Index arbitrage and ETF strategies experience persistent underperformance if adjustment methodologies diverge.
Adjusted versus non-adjusted price series is not a cosmetic choice. It directly governs return accuracy, risk estimation, factor validity, and index replication. Errors at this stage invalidate otherwise sophisticated quantitative models.
Supporting Infrastructure for Adjusted and Non-Adjusted Index Constituent Data
The final layer of a professional-grade system for handling adjusted and non-adjusted historical series lies in its supporting infrastructure. This includes libraries, data sourcing methodologies, database design, validation algorithms, and event-driven monitoring. For index constituents, this infrastructure determines whether analytical outputs are reproducible, auditable, and institutionally credible.
Advanced Quantitative Metrics Dependent on Adjusted Series
Compound Annual Growth Rate
CAGR is meaningful only when computed on fully adjusted price series, as it measures true economic growth over multi-year horizons.
Formal Mathematical Definition of CAGR
Python Implementation of CAGR
years = (prices.index[-1] - prices.index[0]).days / 365.25 cagr = (adj_prices.iloc[-1] / adj_prices.iloc[0]) ** (1 / years) - 1
Fetch → Store → Measure Workflow
Fetch: Fully adjusted historical prices.
Store: Long-horizon series with no structural breaks.
Measure: Compute growth rates for benchmarking and attribution.
Trading Horizon Impact
CAGR is irrelevant for short-term trading but foundational for long-term investing, index evaluation, and capital allocation decisions.
Rolling Beta to Index
Beta estimation relies on stable return relationships between constituents and the index.
Formal Mathematical Definition of Beta
Python Implementation of Rolling Beta
window = 252 cov = adj_returns.rolling(window).cov(index_returns) var = index_returns.rolling(window).var() beta = cov / var
Fetch → Store → Measure Workflow
Fetch: Adjusted constituent and index returns.
Store: Rolling covariance matrices.
Measure: Track systematic risk evolution.
Trading Horizon Impact
Beta stability matters primarily for medium- and long-term portfolio construction and risk budgeting.
Python Libraries for This Domain
Core Numerical and Data Libraries
- pandas: time-series alignment, corporate action adjustment, rolling metrics, group-by operations for constituents.
- numpy: vectorized numerical computation, log returns, matrix operations.
Statistical and Modeling Libraries
- statsmodels: regression-based beta estimation, residual diagnostics.
- scipy: statistical distributions, hypothesis testing on returns.
Visualization and Diagnostics
- matplotlib: return distributions, drawdown curves, volatility regimes.
Backtesting and Strategy Frameworks
- vectorized backtest engines: portfolio simulations using adjusted returns.
Data Sourcing Methodologies
Primary Exchange Data
- Daily bhavcopies for prices and volumes
- Corporate action circulars with ex-dates and ratios
Derived and Normalized Data
- Action-normalized adjustment factor feeds
- Index-consistent adjusted constituent series
Event and News Triggers
- Board approvals of corporate actions
- Regulatory filings announcing capital changes
- Exchange notices confirming ex-dates
Database Structure and Storage Design
Price Storage Layer
- Raw price table (non-adjusted)
- Adjusted price table (versioned)
- Date-indexed primary keys
Corporate Action Layer
- Action type
- Effective ex-date
- Numeric adjustment factor
- Source and timestamp metadata
Derived Metrics Layer
- Returns (simple and log)
- Volatility metrics
- Drawdowns and rolling risk statistics
System-Level Validation Algorithms
Return Continuity Check
Formal Mathematical Definition of Continuity Threshold
Python Continuity Assertion
threshold = 0.3 assert adj_returns.abs().max() < threshold
Cumulative Factor Sanity Check
Formal Mathematical Definition of Factor Consistency
Python Validation Snippet
assert abs(
df["close"].iloc[0] * df["cum_adj_factor"].iloc[0]
- df["adj_close"].iloc[0]
) < 1e-6
Short-, Medium-, and Long-Term Trading Impact Summary
In the short term, non-adjusted prices dominate execution realism. In the medium term, adjusted prices stabilize risk and signal generation. In the long term, adjusted series are the only valid foundation for performance measurement, index replication, and capital allocation.
Unified Perspective on Adjusted vs Non-Adjusted Series
Adjusted historical series are not merely convenience data; they are carefully engineered representations of economic reality. For index constituents, they ensure that aggregation, comparison, and attribution remain mathematically valid across time.
Conclusion and Call to Action
For institutions and developers building serious Indian equity analytics, mastering adjusted versus non-adjusted constituent data is non-negotiable. Platforms like TheUniBit specialize in delivering structured, adjustment-aware datasets that align engineering rigor with market reality, enabling teams to focus on insight rather than data repair.
