DOI: 10.6084/m9.figshare.30217915.v1
title: <b>Historical Nifty 50 Constituent Weights (Rolling 20-Year Window)</b>

description: <b>SUMMARY & CONTEXT</b>This dataset aims to provide a comprehensive, rolling 20-year history of the constituent stocks and their corresponding weights in India's Nifty 50 index. The data begins on January 31, 2008, and is actively maintained with monthly updates. After hitting the 20-year mark, as new monthly data is added, the oldest month's data will be removed to maintain a consistent 20-year window. This dataset was developed as a foundational feature for a graph-based model analyzing the market structure of the Indian stock market. Unlike typical snapshots that only show the current 50 stocks, this dataset is a survivorship bias-free compilation that includes all stocks that have been part of the Nifty 50 index during this period. The data has been meticulously cleaned and adjusted for corporate actions, making it a robust feature set for financial analysis and quantitative modeling.<b>DATA SOURCE & FREQUENCY</b>Primary Source: All raw data is sourced from the official historical data reports published by Nifty Indices (niftyindices.com), ensuring the highest level of accuracy.Data Frequency: The data is recorded on a monthly and event-driven basis. It includes end-of-month (EOM) weights but also captures intra-month data points for any date on which the Nifty 50 index was reshuffled or rebalanced. For periods between these data points, the weights can be considered static.<b>METHODOLOGY & DATA INTEGRITY</b>The dataset was constructed based on official Nifty 50 rebalancing announcements. It relies on the observed assumption that on most reshuffles, the weights of stocks that aren’t being reshuffled stay almost the same before and after the change. Significant effort was made to handle exceptions and complex corporate actions:Corporate Actions: Adjustments were systematically made for major events like the HDFC and HDFCBANK merger, demergers (Reliance/JIOFIN, ITC/ITCHOTELS), and dual listings (Tata Motors/TMOTDVR).Rebalancing Extrapolation: In cases where EOM weights did not align with beginning-of-month (BOM) realities post-reshuffle, a logarithmic-linear extrapolation method was used to estimate the weights of incoming/outgoing stocks.2013 Rebalancing Exception: For the second half rebalancing of 2013, due to significant discrepancies, all 50 stocks' weights were recalculated using the extrapolation method instead of carrying over previous values.Weight Normalization: On any given date, the sum of all 50 constituent weights is normalized to equal 100%. The weights are provided with a precision of up to 5 decimal places, and the sum for all observations is validated to a strict tolerance of 1e-6.<b>TICKER & NAMING CONVENTIONS</b>For consistency across the time series, several historical stock tickers have been mapped to their modern or unified equivalents:INFOSYSTCH -&gt; INFYHEROHONDA -&gt; HEROMOTOCOBAJAJ-AUTO -&gt; BAJAUTOSSTL -&gt; VEDLREL -&gt; RELINFRAZOMATO -&gt; ETERNAL<b>CONTENTS & FILE STRUCTURE</b>This dataset is distributed as a collection of files. The primary data is contained in weights.csv, with several supplementary files provided for context, validation, and analysis.weights.csv: The main data file.Layout: This file is in a standard CSV format. The first row contains the headers, with DATE in the first column and stock tickers in the subsequent columns. Each row corresponds to a specific date.Values: The cells contain the stock's weight (as a percentage) in the Nifty 50 index on a given date. A value of 0 indicates the stock was not an index constituent at that time.sectors.csv: A helper file that maps each stock ticker to its corresponding industry sector.summary.csv: A simple summary file containing the first and last observed dates for each stock, along with a count of its non-zero weight observations.validate.py: A Python script to check weights.csv for data integrity issues (e.g., ensuring daily weights sum to 100).validation_report.txt: The output report generated by validate.py, showing the results of the latest data validation checks.analysis.ipynb: A Jupyter Notebook providing sample analyses that can be performed using this dataset, such as visualizing sector rotation and calculating HHI score over time.README.md: This file, containing the complete documentation for the dataset.CHANGELOG.md: A file for tracking all updates and changes made to the dataset over time.LICENSE.txt: The full legal text of the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International license, which is applicable to this dataset.<b>POTENTIAL USE CASES</b>Analyzing historical sector rotation and weight concentration in the Indian market.Building features for quantitative models that aim to predict market movements.Backtesting investment strategies benchmarked against the Nifty 50.<b>ACKNOWLEDGEMENTS & CITATION</b>This dataset was created by Sukrit Bera. If you use this dataset in your research, please cite it as follows:Bera, S. (2025). Historical Nifty 50 Constituent Weights (Rolling 20-Year Window) [Data set]. Kaggle. https://www.kaggle.com/link-to-my-dataset<b>LICENSING</b>This dataset is made available under the <b>Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)</b> license. The license selected in the metadata dropdown (CC BY 4.0) is the closest available option on this platform. The full terms of the applicable CC BY-NC-SA 4.0 license is available <b>HERE</b>, as well as in the uploaded <b>LICENSE.txt</b> file in the dataset. The CC BY-NC-SA 4.0 license <b>DOES NOT</b> permit commercial use. This dataset is <b>FREE</b> for academic and non-commercial research with attribution. If you wish to use this dataset for commercial purposes, please contact Sukrit Bera at sukritb2005@gmail.com.<b>DATA DICTIONARY</b>Column Name: DATEData Type: DateDescription: The date of the weight recording. This is the first column.<br>Column Name: [Stock Ticker]Data Type: floatDescription: The percentage weight of the stock (e.g., 'RELIANCE', 'TCS') in the Nifty 50 index. A value of 0 indicates it was not an index constituent on that date.