Sectoral equity index volatility #

This category group includes measures of realized return volatility for local-currency cash equity indices in developed markets and a few selected emerging countries.

The data is sourced from from the J.P. Morgan SIFT database. JP Morgan Strategic Indices Fundamental Toolkit (SIFT) is a DataQuery dataset consisting of pricing and fundamental data for 20,000+ indices, including JPM North America All-Cap Index, JPM Swedish Small-Cap Real Estate Index, JPM UK Housebuilder Index, and so forth. Based on global stocks since 1986 and North American stocks from the early 1960s, the product is categorized by region/country, market size segment and sector/industry group, as well as different factors including the overall market. The end result is a range of available indices based on a combination of these categorizations, such as Momentum within North American Technology, Value within European Utilities and more. For more information or to request a demo, please contact Data_Analytics_Sales@jpmorgan.com

Sectoral equity index return volatility #

Ticker : EQCALLRxEASD_NSA / EQCCODRxEASD_NSA / EQCCOSRxEASD_NSA / EQCCSRRxEASD_NSA / EQCENRRxEASD_NSA / EQCFINRxEASD_NSA / EQCHLCRxEASD_NSA / EQCINDRxEASD_NSA / EQCITERxEASD_NSA / EQCMATRxEASD_NSA / EQCRELRxEASD_NSA / EQCUTLRxEASD_NSA

Label : Estimated annualized standard deviation of equity index return: all sectors / consumer discretionary / consumer staples / communication services / energy / financials / healthcare / industrials / information technology / materials / real estate / utilities.

Definition : Annualized standard deviation of equity index return, % of notional, based on exponential moving average of daily returns: all sectors / consumer discretionary / consumer staples / communication services / energy / financials / healthcare / industrials / information technology / materials / real estate / utilities.

Notes :

  • The standard deviation is calculated based on an exponential moving average of daily index returns, with a half-life of 11 active trading days.

  • The daily return is simply the % change in the index price.

  • See Appendix 1 for the list of equity indices used for each currency area.

Sectoral equity index excess return volatility #

Ticker : EQCALLXRxEASD_NSA / EQCCODXRxEASD_NSA / EQCCOSXRxEASD_NSA / EQCCSRXRxEASD_NSA / EQCENRXRxEASD_NSA / EQCFINXRxEASD_NSA / EQCHLCXRxEASD_NSA / EQCINDXRxEASD_NSA / EQCITEXRxEASD_NSA / EQCMATXRxEASD_NSA / EQCRELXRxEASD_NSA / EQCUTLXRxEASD_NSA

Label : Estimated annualized standard deviation of equity excess return: all sectors / consumer discretionary / consumer staples / communication services / energy / financials / healthcare / industrials / information technology / materials / real estate / utilities.

Definition : Annualized standard deviation of equity index return in excess of daily interest rate, % of notional, based on exponential moving average of daily returns: all sectors / consumer discretionary / consumer staples / communication services / energy / financials / healthcare / industrials / information technology / materials / real estate / utilities.

Notes :

  • The standard deviation is calculated based on an exponential moving average of daily index returns, with a half-life of 11 active trading days.

  • The daily return is simply the % change in the index price.

  • See Appendix 1 for the list of equity indices used for each currency area.

Leverage ratio of vol-targeted sectoral equity index position #

Ticker : EQCALLRxLEV10_NSA / EQCCODRxLEV10_NSA / EQCCOSRxLEV10_NSA / EQCCSRRxLEV10_NSA / EQCENRRxLEV10_NSA / EQCFINRxLEV10_NSA / EQCHLCRxLEV10_NSA / EQCINDRxLEV10_NSA / EQCITERxLEV10_NSA / EQCMATRxLEV10_NSA / EQCRELRxLEV10_NSA / EQCUTLRxLEV10_NSA

Label : Leverage ratio of equity index position for 10% annualized vol target: all sectors / consumer discretionary / consumer staples / communication services / energy / financials / healthcare / industrials / information technology / materials / real estate / utilities.

Definition : Equity index leverage for a 10% annualized vol target, as a ratio of contract notional relative to risk capital on which the return is calculated: all sectors / consumer discretionary / consumer staples / communication services / energy / financials / healthcare / industrials / information technology / materials / real estate / utilities.

Notes :

  • This serves as the leverage ratio for a 10% annualized vol target and is inversely proportional to the estimated annualized standard deviation of the return on a USD1 notional position. The leverage can viewed as indicative for positioning and endogenous market risk.

Leverage ratio of excess vol-targeted sectoral equity index position #

Ticker : EQCALLXRxLEV10_NSA / EQCCODXRxLEV10_NSA / EQCCOSXRxLEV10_NSA / EQCCSRXRxLEV10_NSA / EQCENRXRxLEV10_NSA / EQCFINXRxLEV10_NSA / EQCHLCXRxLEV10_NSA / EQCINDXRxLEV10_NSA / EQCITEXRxLEV10_NSA / EQCMATXRxLEV10_NSA / EQCRELXRxLEV10_NSA / EQCUTLXRxLEV10_NSA

Label : Leverage ratio of equity index position for 10% annualized excess return vol target: all sectors / consumer discretionary / consumer staples / communication services / energy / financials / healthcare / industrials / information technology / materials / real estate / utilities.

Definition : Equity index leverage for a 10% annualized excess return vol target, as a ratio of contract notional relative to risk capital on which the return is calculated: all sectors / consumer discretionary / consumer staples / communication services / energy / financials / healthcare / industrials / information technology / materials / real estate / utilities.

Notes :

  • This serves as the leverage ratio for a 10% annualized vol target and is inversely proportional to the estimated annualized standard deviation of the return on a USD1 notional position. The leverage can viewed as indicative for positioning and endogenous market risk.

Imports #

Only the standard Python data science packages and the specialized macrosynergy package are needed.

import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import math
import copy

import json
import yaml

import macrosynergy.management as msm
import macrosynergy.panel as msp
import macrosynergy.signal as mss
import macrosynergy.pnl as msn
import macrosynergy.visuals as msv

from macrosynergy.download import JPMaQSDownload

from timeit import default_timer as timer
from datetime import timedelta, date, datetime

import warnings

warnings.simplefilter("ignore")

The JPMaQS indicators we consider are downloaded using the J.P. Morgan Dataquery API interface within the macrosynergy package. This is done by specifying ticker strings , formed by appending an indicator category code <category> to a currency area code <cross_section> . These constitute the main part of a full quantamental indicator ticker, taking the form DB(JPMAQS,<cross_section>_<category>,<info>) , where <info> denotes the time series of information for the given cross-section and category. The following types of information are available:

  • value giving the latest available values for the indicator

  • eop_lag referring to days elapsed since the end of the observation period

  • mop_lag referring to the number of days elapsed since the mean observation period

  • grade denoting a grade of the observation, giving a metric of real time information quality.

After instantiating the JPMaQSDownload class within the macrosynergy.download module, one can use the download(tickers,start_date,metrics) method to easily download the necessary data, where tickers is an array of ticker strings, start_date is the first collection date to be considered and metrics is an array comprising the times series information to be downloaded.

# Cross-sections of interest
cids_dmeq = ['AUD', 'CAD', 'CHF', 'EUR', 'GBP', 'HKD', 'ILS', 'JPY', 'NOK', 'NZD', 'SEK', 'SGD', 'USD']
cids_eueq = ["DEM", "ESP", "FRF", "ITL", "NLG"]
cids_aseq = []
cids_eeeq = []
cids_laeq = []

cids = sorted(cids_dmeq + cids_eueq + cids_aseq + cids_eeeq + cids_laeq)
sector_cids = sorted(cids_dmeq + cids_eueq)
sector_labels = {
    "ALL": "All sectors", 
    "COD": "Cons. discretionary",
    "COS": "Cons. staples",
    "CSR": "Communication services",
    "ENR": "Energy",
    "FIN": "Financials",
    "HLC": "Healthcare",
    "IND": "Industrials",
    "ITE": "Information tech",
    "MAT": "Materials",
    "REL": "Real estate",
    "UTL": "Utilities",
}
simple_return_leverage = [f'EQC{sector}RxLEV10_NSA' for sector in sector_labels.keys()]
simple_return_volatility = [f'EQC{sector}RxEASD_NSA' for sector in sector_labels.keys()]
excess_return_leverage = [f'EQC{sector}XRxLEV10_NSA' for sector in sector_labels.keys()]
excess_return_volatility = [f'EQC{sector}XRxEASD_NSA' for sector in sector_labels.keys()]
returns = [f'EQC{sector}R_NSA' for sector in sector_labels.keys()]
vt_returns = [f'EQC{sector}R_VT10' for sector in sector_labels.keys()]
untradable = [f'EQC{sector}UNTRADABLE_NSA' for sector in sector_labels.keys()]

main = simple_return_leverage + simple_return_volatility + excess_return_leverage + excess_return_volatility
econ = []
mark = returns + vt_returns + untradable

xcats = main + econ + mark
# Download series from J.P. Morgan DataQuery by tickers

start_date = "1990-01-01"
tickers = [cid + "_" + xcat for cid in cids for xcat in xcats]
print(f"Maximum number of tickers is {len(tickers)}")

# Retrieve credentials

client_id: str = os.getenv("DQ_CLIENT_ID")
client_secret: str = os.getenv("DQ_CLIENT_SECRET")

# Download from DataQuery

with JPMaQSDownload(client_id=client_id, client_secret=client_secret) as downloader:
    start = timer()
    assert downloader.check_connection()
    df = downloader.download(
        tickers=tickers,
        start_date=start_date,
        metrics=["value", "eop_lag", "mop_lag", "grading"],
        suppress_warning=True,
        show_progress=True,
    )
    end = timer()

dfd = df

print("Download time from DQ: " + str(timedelta(seconds=end - start)))
Maximum number of tickers is 1512
Downloading data from JPMaQS.
Timestamp UTC:  2024-03-14 17:13:32
Connection successful!
Requesting data: 100%|██████████| 303/303 [01:11<00:00,  4.26it/s]
Downloading data: 100%|██████████| 303/303 [01:36<00:00,  3.14it/s]  
Some expressions are missing from the downloaded data. Check logger output for complete list.
28 out of 6048 expressions are missing. To download the catalogue of all available expressions and filter the unavailable expressions, set `get_catalogue=True` in the call to `JPMaQSDownload.download()`.
Some dates are missing from the downloaded data. 
3 out of 8926 dates are missing.
Download time from DQ: 0:03:19.581975
# Replacing returns (due to no-constituents indices) with NaNs (flag=1 values are set to NaNs)

# support column for the category match
dfd['sector'] = dfd['xcat'].str[0:6]

# finding untradable category
untradable_df = dfd.loc[dfd['xcat'].str.endswith('UNTRADABLE_NSA'), :]

# excluding it from the target dataset
dfd = dfd.loc[
    (~dfd['xcat'].str.endswith('UNTRADABLE_NSA'))
]
# merging the two
dfd = dfd.merge(
    untradable_df.loc[:, ['real_date', 'cid', 'sector', 'value']].rename(columns={'value': 'untrad'}), 
    on=['real_date', 'cid', 'sector'], 
    how='left'
)

# finding where indices have no constituents
mask = (dfd['untrad'] == 1)
dfd.loc[mask, 'value'] = np.NaN

# cleaning
dfd = dfd.drop(columns=['untrad', 'sector'])
main = list(set(main) - set(untradable))

Availability #

cids_exp = sector_cids  # cids expected in category panels
xcatx = [xc for xc in main if "xEASD_NSA" in xc]
msm.missing_in_df(dfd, xcats=xcatx, cids=cids_exp)
Missing xcats across df:  []
Missing cids for EQCALLRxEASD_NSA:  []
Missing cids for EQCALLXRxEASD_NSA:  []
Missing cids for EQCCODRxEASD_NSA:  []
Missing cids for EQCCODXRxEASD_NSA:  []
Missing cids for EQCCOSRxEASD_NSA:  []
Missing cids for EQCCOSXRxEASD_NSA:  []
Missing cids for EQCCSRRxEASD_NSA:  []
Missing cids for EQCCSRXRxEASD_NSA:  []
Missing cids for EQCENRRxEASD_NSA:  ['CHF']
Missing cids for EQCENRXRxEASD_NSA:  ['CHF']
Missing cids for EQCFINRxEASD_NSA:  []
Missing cids for EQCFINXRxEASD_NSA:  []
Missing cids for EQCHLCRxEASD_NSA:  []
Missing cids for EQCHLCXRxEASD_NSA:  []
Missing cids for EQCINDRxEASD_NSA:  []
Missing cids for EQCINDXRxEASD_NSA:  []
Missing cids for EQCITERxEASD_NSA:  []
Missing cids for EQCITEXRxEASD_NSA:  []
Missing cids for EQCMATRxEASD_NSA:  []
Missing cids for EQCMATXRxEASD_NSA:  []
Missing cids for EQCRELRxEASD_NSA:  []
Missing cids for EQCRELXRxEASD_NSA:  []
Missing cids for EQCUTLRxEASD_NSA:  []
Missing cids for EQCUTLXRxEASD_NSA:  []

Volatility data for many countries and sectors are avaialble back to 1990. Data based on excess returns have shorter history.

There are few exceptions: Switzerland does not have any listed company in the energy sector and neither did the Netherlands in the utilities sector. In early periods, some industries in Hong Kong, Israel, New Zealand, and Singapore have zero or not enough constituents, so the series start later on.

The availability of excess returns, and hence excess returns’ volatility, is sometimes constrained by availability of appropriate short-term funding nominal interest rates.

For the explanation of index construction and universe selection, please view Appendix 1 . For the explanation of geographical and sectoral composition, please refer to Appendix 2 and Appendix 3 .

xcatx = [xc for xc in main if "xEASD_NSA" in xc and "XRxEASD_NSA" not in xc]
cidx = cids_exp

plot = msm.check_availability(
    dfd,
    xcats=xcatx,
    cids=cidx,
    start_years=True,
    start_size=(16, 4),
    missing_recent=False,
)

print("Last updated:", date.today())
https://macrosynergy.com/notebooks.build/themes/shock-and-risk-measures/_images/e2b686a7d5c0dba993b362601dc15a80554e65c503ee79c22c409b1fa0be417a.png
Last updated: 2024-03-14
xcatx = [xc for xc in main if "xLEV10_NSA" in xc and "XRxLEV10_NSA" not in xc]
cidx = cids_exp

plot = msm.check_availability(
    dfd,
    xcats=xcatx,
    cids=cidx,
    start_years=True,
    start_size=(16, 4),
    missing_recent=False,
)

print("Last updated:", date.today())
https://macrosynergy.com/notebooks.build/themes/shock-and-risk-measures/_images/08d42648ae2a7eb4d2fe62d6e50552159cd1241bc1831b8cf007d71e7f0c9d87.png
Last updated: 2024-03-14

History #

Historically, sectoral equity return volatility has averaged between 12% and 20% (annualized) across the major markets, with 7-10%-points standard deviations since 1990.

xcatx = ["EQCALLRxEASD_NSA"]
cidx = cids_exp

msp.view_ranges(
    dfd,
    xcats=xcatx,
    cids=cidx,
    sort_cids_by="mean",
    start=start_date,
    kind="bar",
    title="Cash equity index return volatility (and standard deviations), all sectors, since 1990, %ar",
    xcat_labels=None,
    size=(16, 8),
)
https://macrosynergy.com/notebooks.build/themes/shock-and-risk-measures/_images/82e35c667a096dbae0a9490909e9f19496d2a56972b8600c0886e6fc88e13c30.png

Equity return volatility has naturally been upward skewed with extreme periods of over 80% annualized standard deviation for the all-sectors indices.

xcatx = ["EQCALLRxEASD_NSA"]
cidx = cids_exp
start_date = "1990-01-01"

msp.view_timelines(
    dfd,
    xcats=xcatx,
    cids=cidx,
    start=start_date,
    title="Cash equity index return volatility, all sectors, %ar",
    title_fontsize=27,
    cumsum=False,
    ncol=4,
    same_y=True,
    size=(12, 7),
    aspect=1.7,
    all_xticks=True,
)
https://macrosynergy.com/notebooks.build/themes/shock-and-risk-measures/_images/6a5e2922d83e2bb70abee4b14950abebd82f487af7832bd4ec5b38ea25c84d9d.png

Equity volatility is predominantly a global phenomenon. All-sector index return volatility has been highly positively correlated across countries.

xcatx = "EQCALLRxEASD_NSA"
cidx = cids_exp

msp.correl_matrix(
    dfd,
    xcats=xcatx,
    cids=cidx,
    title=None,
)
https://macrosynergy.com/notebooks.build/themes/shock-and-risk-measures/_images/4c4ce71ca9619d88fc793ee94bf01e95bd9a63a770142cfe715123bf6fa9f173.png

With the country-sector data set one can also calculate global sector volatility metrics as averages across all countries.

# Creating a global aggregate volatility score for each sector

xcatx = simple_return_volatility
target_cids = cids_exp

global_volatilities = []
dfa = pd.DataFrame(columns=list(dfd.columns))
for xc in xcatx:
    cidx = copy.deepcopy(
        list(
            set(dfd.loc[dfd['xcat'] == xc, 'cid'].unique()).intersection(target_cids)
        )
    )
    sector_cid = xc[3:6]
    global_sector_cat = xc.replace(sector_cid, "GLB")
    
    # equal weighting the volatility of sector X across all countries in the set
    dfaa = msp.linear_composite(
        df=dfd,
        xcats=xc,
        cids=cidx,
        weights=None,
        new_cid=sector_cid,
        complete_cids=False,
        complete_xcats=False,
    )
    dfaa['xcat'] = global_sector_cat
    
    dfa = msm.update_df(dfa, dfaa)
    global_volatilities.extend([global_sector_cat])

global_volatilities = list(set(global_volatilities))
dfd = msm.update_df(dfd, dfa)

The most volatile equity sectors since 1990 have been technology and energy, while the least volatile have been utilities and consumer staples.

xcatx = ['EQCGLBRxEASD_NSA']
cidx = list(sector_labels.keys())
start_date = "1990-01-01"

msp.view_ranges(
    dfd,
    xcats=xcatx,
    cids=cidx,
    sort_cids_by="mean",
    start=start_date,
    kind="bar",
    title=None,
    xcat_labels=None,
    size=(16, 8),
)
https://macrosynergy.com/notebooks.build/themes/shock-and-risk-measures/_images/94c085d996ee2fef9918679bba78862aae60c9319064cdfd1eccf3678a677de9.png
xcatx = ['EQCGLBRxEASD_NSA']
cidx = list(sector_labels.keys())

msp.view_timelines(
    dfd,
    xcats=xcatx,
    cids=cidx,
    start=start_date,
    title="Cash equity index return volatility, global averages of sectors, %ar",
    title_fontsize=27,
    cumsum=False,
    ncol=4,
    same_y=True,
    size=(12, 7),
    aspect=1.7,
    all_xticks=True,
    xcat_grid=False,
    xcat_labels=["Simple return vol"],
)
https://macrosynergy.com/notebooks.build/themes/shock-and-risk-measures/_images/71b6776b38301c5870d9a41aacedc95090c4209a0df286ac9f7bdbdec4f4bcbf.png

Importance #

Empirical Clues #

There has mostly been a positive relation between history sectoral index volatility and subsequent returns at weekly, monthly and quarterly frequencies. However, these relations have not been statistically signficant for a panel of broad all-sector indices in accordance according to the macrosynergy panel test .

xcatx = ['EQCALLRxEASD_NSA', 'EQCALLR_NSA']
cidx = cids_dmeq

cr = msp.CategoryRelations(
    dfd,
    xcats=xcatx,
    cids=cidx,
    freq="Q",
    lag=1,
    xcat_aggs=["last", "sum"],
    start="1990-01-01",
)
cr.reg_scatter(
    title="Equity cash index volatility and subsequent quarterly returns, panel of all countries since 1990",
    labels=False,
    coef_box="upper right",
    xlab="Historic equity cash index return volatility (11-day half-life, end of quarter)",
    ylab="Equity cash index return (next quarter)",
    prob_est="map"
)
https://macrosynergy.com/notebooks.build/themes/shock-and-risk-measures/_images/ded59ab77bd6aa69537dd7f225c733c2e751327c2a347a8207c4cae251db84a5.png
xcatx = ['EQCALLRxEASD_NSA', 'EQCALLR_NSA']
cidx = cids_dmeq

cr = msp.CategoryRelations(
    dfd,
    xcats=xcatx,
    cids=cidx,
    freq="W",
    lag=1,
    xcat_aggs=["last", "sum"],
    start="1990-01-01",
)
cr.reg_scatter(
    title="Equity cash index volatility and subsequent weekly returns, panel of all countries since 1990",
    labels=False,
    coef_box="upper right",
    xlab="Historic equity cash index return volatility (11-day half-life, end of quarter)",
    ylab="Equity cash index return (next quarter)",
    prob_est="map"
)
https://macrosynergy.com/notebooks.build/themes/shock-and-risk-measures/_images/404464bb6555aa02b46de798bf3701a1d532edfa593e9b4bbdf74bd174434f1b.png
# Creating a global average for sectoral index returns

xcatx = returns + vt_returns
target_cids = cids_dmeq

global_returns = []
dfa = pd.DataFrame(columns=list(dfd.columns))
for xc in xcatx:
    cidx = copy.deepcopy(
        list(
            set(dfd.loc[dfd['xcat'] == xc, 'cid'].unique()).intersection(target_cids)
        )
    )
    sector_cid = xc[3:6]
    global_sector_cat = xc.replace(sector_cid, "GLB")
    
    # equal weighting the volatility of sector X across all countries in the set
    dfaa = msp.linear_composite(
        df=dfd,
        xcats=xc,
        cids=cidx,
        weights=None,
        new_cid=sector_cid,
        complete_cids=False,
        complete_xcats=False,
    )
    dfaa['xcat'] = global_sector_cat
    
    dfa = msm.update_df(dfa, dfaa)
    global_returns.extend([global_sector_cat])

global_returns = list(set(global_returns))
dfd = msm.update_df(dfd, dfa)

Additionally, we can observe a positive correlation of decent significance between sectoral indices’ global average volatility and subsequent returns.

xcatx = ["EQCGLBRxEASD_NSA", "EQCGLBR_NSA"]
cidx = ["ALL"]

cr = msp.CategoryRelations(
    dfd,
    xcats=xcatx,
    cids=cidx,
    freq="W",
    lag=1,
    xcat_aggs=["last", "sum"],
    start = start_date,
)
cr.reg_scatter(
    title="Equity cash index volatility and subsequent weekly returns, gloabl average since 1990",
    labels=False,
    coef_box="upper right",
    xlab=None,
    ylab=None,
    prob_est="map"
)
https://macrosynergy.com/notebooks.build/themes/shock-and-risk-measures/_images/0bac02f8fbf540ef37926e976be31e824b68dc00fdf5cfab9bc6e2eb6b5edadb.png

Behind the weakly positive relation between index volatility and returns lie signficant sectoral disparities. The volatility-return relationships have been positive and significant (at weekly frequency) for consumer goods, communication services, energy, healthcare, materials, and ultilities. The relationship has been negative, yet not significant, for technology and real estate.

sectors = list(sector_labels.keys())
start_date = "1990-01-01"

global_sector_dict = {}
for sector in sectors:
    xcatx = ["EQCGLBRxEASD_NSA", "EQCGLBR_NSA"]
    global_sector_cr = msp.CategoryRelations(
        dfd,
        xcats=xcatx,
        cids=[sector],
        freq="W",
        lag=1,
        xcat_aggs=["last", "sum"],
        start=start_date,
    )
    global_sector_dict[sector] = global_sector_cr

global_sector_dict_regscat = msv.multiple_reg_scatter(
    cat_rels=list(global_sector_dict.values()),
    ncol=3,
    nrow=4,
    figsize=(20, 15),
    title="Global sectoral indices volatility and subsequent returns.",
    title_xadj=0.5,
    title_yadj=0.99,
    title_fontsize=20,
    xlab="Volatility, annualised",
    ylab="Simple return, next week %",
    fit_reg=True,
    reg_ci=95,
    reg_order=1,
    reg_robust=False,
    coef_box="upper right",
    prob_est="map",
    separator=None,
    single_chart=True,
    subplot_titles=[sector_labels[sector] for sector in sectors]
)
https://macrosynergy.com/notebooks.build/themes/shock-and-risk-measures/_images/3e965dc898138a891c1247a0693819603c5f1ae4a0709b6e293548754fd202b3.png

Appendices #

Appendix 1: Sectoral equity index construction #

The index is formed using stocks that are part of the universe in each region-sector at that point in time.

The universe selection happens on the basis of the the ranking of a company’s average market cap, measured in USD, over the last three months per the selection date of the universe. This universe is updated each month.

The index too is re-calculated on a monthly frequency, at the end of each month based on data known at or before the month end (the index selection date). The constituents are weighted by (current) market cap when the index is formed, and then the weights are allowed to float freely based on market movements between each rebalancing date.

Index positions are initiated on the first weekday occurring 4 calendars days after the index selection date and updated (i.e. performance and related data metrics) each weekday regardless of the date being a traded date for any/all of the issues in each index (the index calculation day).

Developed markets indices are formed using all stocks within the selected universe (more below in Appendix 2 ), regardless of the capitalisation.

On the other side, emerging market country indices have been limited to Large & Mid Caps only, which is reflected in the size of the corresponding macro-regions.

Appendix 2: Sectoral equity index specification #

The geographical specification is two-tiered.

First the global set of stocks is split into six macro-regions, three for developed markets and three for emerging ones.

  • Developed markets:

    • Americas: The largest 2250 issues of stocks with the issue country classification (the country) equal to either of (USA, CAN) and where the traded currency (the currency) being equal to either of (USD, CAD)

    • EMEA: The largest 1500 issues of stocks where the country is equal to either of (NLD, CHE, SWE, NOR, DEU, FIN, AUT, DNK, GBR, FRA, ESP, BEL, IRL, LUX, ITA, PRT, ISR) and where the currency equals either of (NLG, CHF, SEK, NOK, DEM, FIM, ATS, DKK, GBP, FRF, ESP, BEF, IEP, LUF, ITL, PTE, EUR, ILS)

    • Asia Pacific: The largest 1500 issues of stocks where the country is equal to either of (AUS, NZL, SGP, HKG, JPN) and where the currency is equal to either of (AUD, NZD, SGD, HKD, JPY)

  • Emerging markets:

    • Americas: The largest 100 issues of stocks where the country is equal to either of (ARG, BRA, CHL, COL, MEX, PER)

    • EMEA: The largest 150 issues of stocks where the country is equal to either of (CZE, EGY, GRC, HUN, POL, QAT, SAU, ZAF, TUR, ARE, RUS)

    • Asia pacific: The largest 1000 issues of stocks where the country is equal to either of (CHN, IND, IDN, KOR, MYS, PAK, PHL, TWN, THA)

Then the single country indices are formed based on the subset of constituents available in the parent region:

  • AUD: The subset of the DM Asia pacific eligible universe where the country equals AUS and the currency equals AUD

  • BRL: The subset of the EM Americas eligible universe where the country equals BRA

  • CAD: The subset of the DM Americas eligible universe where the country equals CAN and the currency equals CAD

  • CHF: The subset of the DM EMEA eligible universe where the country equals CHE and the currency equals CHF

  • CLP: The subset of the EM Americas eligible universe where the country equals CHL

  • CNY: The subset of the EM Asia pacific eligible universe where the country equals CHN and the currency equals CNY

  • COP: The subset of the EM Americas eligible universe where the country equals COL

  • CZK: The subset of the EM EMEA eligible universe where the country equals CZE

  • DEM: The subset of the DM EMEA eligible universe where the country equals DEU and the currency equals either of (EUR, DEM)

  • EUR: The subset of the DM EMEA eligible universe where the country equals either of (NLD, DEU, FIN, AUT, FRA, ESP, BEL, IRL, LUX, ITA, PRT) and where the currency equals either of (NLG, DEM, FIM, ATS, FRF, ESP, BEF, IEP, LUF, ITL, PTE, EUR)

  • ESP: The subset of the DM EMEA eligible universe where the country equals ESP and the currency equals either of (EUR, ESP)

  • FRF: The subset of the DM EMEA eligible universe where the country equals FRA and the currency equals either of (EUR, FRF)

  • GBP: The subset of the DM EMEA eligible universe where the country equals GBR and the currency equals GBP

  • HUF: The subset of the EM EMEA eligible universe where the country equals HUN

  • HKD: The subset of the DM sia pacific eligible universe where the country equals HKG and the currency equals HKD

  • IDR: The subset of the EM Asia pacific eligible universe where the country equals IDN

  • INR: The subset of the EM Asia pacific eligible universe where the country equals IND

  • ITL: The subset of the DM EMEA eligible universe where the country equals ITA and where the currency equals either of (EUR, ITL)

  • ILS: The subset of the DM EMEA eligible universe where the country equals ISR and where the currency equals ILS

  • JPY: The subset of the DM sia pacific eligible universe where the country equals JPN and the currency equals JPY

  • KRW: The subset of the EM Asia pacific eligible universe where the country equals KOR

  • MXN: The subset of the EM Americas eligible universe where the country equals MEX

  • MYR: The subset of the EM Asia pacific eligible universe where the country equals MYS

  • NLG: The subset of the DM EMEA eligible universe where the country equals NLD and the currency equals either of (EUR, NLG)

  • NOK: The subset of the DM EMEA eligible universe where the country equals NOR and the currency equals NOK

  • NZD: The subset of the DM Asia pacific eligible universe where the country equals NZL and the currency equals NZD

  • PLN: The subset of the EM EMEA eligible universe where the country equals POL

  • PEN: The subset of the EM Americas eligible universe where the country equals PER

  • PHP: The subset of the EM Asia pacific eligible universe where the country equals PHL

  • SGD: The subset of the DM sia pacific eligible universe where the country equals SGP and the currency equals SGD

  • RUB: The subset of the EM EMEA eligible universe where the country equals RUS

  • THB: The subset of the EM Asia pacific eligible universe where the country equals THA

  • TRY: The subset of the EM EMEA eligible universe where the country equals TUR

  • SEK: The subset of the DM EMEA eligible universe where the country equals SWE and the currency equals SEK

  • TWD: The subset of the EM Asia pacific eligible universe where the country equals TWN

  • USD: The subset of the DM Americas eligible universe where the country equals USA and the currency equals USD

  • ZAR: The subset of the EM EMEA eligible universe where the country equals ZAF

The country codes refer to the ISO 3166-1 alpha-3 country code.

See Appendix 4 for the list of currency symbols used to represent each cross-section.

Appendix 3: Equity sector specification #

The sector specification is part of the category definition. Stocks have been split into groups on the basis of their GICS classification:

  • ALL: All GICS sectors

  • COD: GICS Automobiles & Components, Consumer Durables & Apparel, Consumer Services and Retailing industry groups

  • COS: GICS Food & Staples Retailing, Food, Beverage & Tobacco and Household & Personal Products industry groups

  • CSR: GICS Telecommunication Services, and Media & Entertainment industry groups

  • ENR: GICS Energy sector

  • FIN: GICS Banks, Diversified Financials and Insurance industry groups

  • HLC: GICS Health Care Equipment & Services and Pharmaceuticals, Biotechnology & Life Sciences industry groups

  • IND: GICS Capital Goods, Commercial & Professional Services and Transportation industry groups

  • ITE: GICS Software & Services, Technology Hardware & Equipment and Semiconductors & Semiconductor Equipment industry groups

  • MAT: GICS Materials Sector

  • REL: GICS Real Estate Industry Group

  • UTL: GICS Utilities industry group

GICS sector-specific indices are available only to DM countries.

Appendix 4: Currency symbols #

The word ‘cross-section’ refers to currencies, currency areas or economic areas. In alphabetical order, these are AUD (Australian dollar), BRL (Brazilian real), CAD (Canadian dollar), CHF (Swiss franc), CLP (Chilean peso), CNY (Chinese yuan renminbi), COP (Colombian peso), CZK (Czech Republic koruna), DEM (German mark), ESP (Spanish peseta), EUR (Euro), FRF (French franc), GBP (British pound), HKD (Hong Kong dollar), HUF (Hungarian forint), IDR (Indonesian rupiah), ITL (Italian lira), JPY (Japanese yen), KRW (Korean won), MXN (Mexican peso), MYR (Malaysian ringgit), NLG (Dutch guilder), NOK (Norwegian krone), NZD (New Zealand dollar), PEN (Peruvian sol), PHP (Phillipine peso), PLN (Polish zloty), RON (Romanian leu), RUB (Russian ruble), SEK (Swedish krona), SGD (Singaporean dollar), THB (Thai baht), TRY (Turkish lira), TWD (Taiwanese dollar), USD (U.S. dollar), ZAR (South African rand).