Skip to main content

Chapter 7 - Futures

01 - OVERVIEW

Futures are exchange traded contracts that obligate two parties to transact a specified asset at a predetermined price on a defined expiry date (a.k.a delivery date). They are standardised in terms of contract size, settlement method, and delivery date, and are centrally cleared - eliminating the bilateral counterparty risk.

Futures markets span stock indices, fixed income, foreign exchange, interest rate and commodities etc. Major futures contracts have a quarterly expiry cycle although non-quarterly expiry also exists.


02 - INDIVIDUAL FUTURES CONTRACTS

Futures can be explored both LSEG Workspace & Programmatically. Before we explore we need to get familiar with the instrument codes. For Individual futures contracts, the codes incorporate indicators that tell you what the delivery month and year are. Once you know the root code, you can easily construct your own futures contract codes.

Format:

<rootcode><monthcode><yearcode>

Example: FEIZ4 where,

  • FEI = Root Code for the three-month Euribor
  • Z = December
  • 4 = 2024

Delivery Month Codes for Futures

MonthCodeMonthCode
JanuaryFJulyN
FebruaryGAugustQ
MarchHSeptemberU
AprilJOctoberV
MayKNovemberX
JuneMDecemberZ

You can remember the delivery codes using the phrase:

Phrase to remember: Focus on Growth, Help the Journey, Keep Moving, Navigate Quality, Uphold Value, and eXcel with Zeal.

Delivery Years for Futures

Two-digit year codes are going to be the standard for futures contracts after January 2024 and beyond. The change was implemented to support contracts expiring more than 10 years in the future.

Exceptions: You may still see some RICs with single digit year codes based on certain exchanges or product type conventions and if the contracts expire more than 10 years in the future, the code is then a two digit number. Example: FEIZ6 has an expiry of December 2026 while FEIZ31 has a expiry of December 2031.

Note: The earlier FEIZ4 example uses a single-digit year code because single-digit codes are still seen on legacy and shorter-dated contracts.

RIC Rules App: The RIC Rules app on LSEG Workspace can be used for details on all type of RIC formats.


03 - CONTINUATION RICS

The most convenient way to display futures contracts is by using continuation RICs. Since every futures contract has an expiry/delivery date, it ceases to exist after its expiry and the RIC changes every time. A continuation RIC will always display the details of the present contract and will roll over to the next one automatically thus eliminating the need to change the month and year code in a display.

Terms to understand:

  • Front month = Refers to the nearest active expiry contract. The one closest to today's date that is still actively trading.
  • Back month = All contracts with expiry dates beyond the front month.

Types of continuation RICs by Rollover Method:

In every format below, <position> is 1 for the front contract, 2 for the second front, and so on. The lowercase c is mandatory — continuation RICs are case-sensitive.

#Rollover methodFormatExampleNotes
3.1Nearest expiry<root>c<position>FEIc1Rolls to the nearest active expiry contract.
3.2Quarterly months only (serial)<root>cm<position>FEIcm1For short interest rate futures that also settle in odd months — displays main quarterly months only.
3.3Highest volume<root>cv<position>FEIcv1Rolls to the contract with the highest volume.
3.4Highest open interest<root>coi<position>FEIcoi1Rolls to the contract with the highest Open Interest change.
3.5Highest volume + OI combined<root>cvoi<position>FEIcvoi1Rolls based on the combined volume + Open Interest change leader.
3.6Lead month only<root>c<position>tFEIc1tTracks only the lead (front) month contract — unlike c1 which tracks all monthly contracts.

Note: FEI in the examples is the root code for the three-month Euribor.


04 - FUTURES CHAINS

Futures chains allow you to see all the available contracts for a futures in one display as a list. Any RIC starting with 0# is a chain (ideally) A chain displays the individual futures contract with all contract months.

Example:

0#FEI:

Accessing the Data:

  • On Workspace: Type the chain RIC of a futures contract in the search bar and press enter to open the overview app for the respective instrument. (or) Press F4 on Workspace to launch the Quote app. Type the chain RIC code to view the chain instantly.

    Chain overview app

    Chain quote app

  • Programmatically:

You can access the chain constituents using the following methods:

Method 1:

from lseg.data.discovery import Chain
import lseg.data as ld
ld.open_session()
chain_constituents = Chain('0#FEI:')
display(chain_constituents.constituents)
ld.close_session()
    ['FEIM6',
'FEIN6',
'FEIQ6',
'FEIU6',
'FEIV6',
'FEIX6',
'FEIZ6',
'FEIH7',
'FEIM7',
'FEIU7',
'FEIZ7',
'FEIH8',
'FEIM8',
'FEIU8',
'FEIZ8',
'FEIH9',
'FEIM9',
'FEIU9',
'FEIZ9',
'FEIH0',
'FEIM0',
'FEIU0',
'FEIZ0',
'FEIH31',
'FEIM31',
'FEIU31',
'FEIZ31',
'FEIH32']

Method 2:

Note: This may not work for all type of chains which are not of the standard format.

import lseg.data as ld
ld.open_session()
chain_constituents = ld.get_data(
universe=['0#FEI:'],
fields=['DSPLY_NAME']
)
display(chain_constituents)
ld.close_session()
InstrumentDSPLY_NAME
0FEIM6EURIBOR 3M JUN6
1FEIN6EURIBOR 3M JUL6
2FEIQ6EURIBOR 3M AUG6
3FEIU6EURIBOR 3M SEP6
4FEIV6EURIBOR 3M OCT6
5FEIX6EURIBOR 3M NOV6
6FEIZ6EURIBOR 3M DEC6
7FEIH7EURIBOR 3M MAR7
8FEIM7EURIBOR 3M JUN7
9FEIU7EURIBOR 3M SEP7
10FEIZ7EURIBOR 3M DEC7
11FEIH8EURIBOR 3M MAR8
12FEIM8EURIBOR 3M JUN8
13FEIU8EURIBOR 3M SEP8
14FEIZ8EURIBOR 3M DEC8
15FEIH9EURIBOR 3M MAR9
16FEIM9EURIBOR 3M JUN9
17FEIU9EURIBOR 3M SEP9
18FEIZ9EURIBOR 3M DEC9
19FEIH0EURIBOR 3M MAR0
20FEIM0EURIBOR 3M JUN0
21FEIU0EURIBOR 3M SEP0
22FEIZ0EURIBOR 3M DEC0
23FEIH31EURIBOR 3M MAR1
24FEIM31EURIBOR 3M JUN1
25FEIU31EURIBOR 3M SEP1
26FEIZ31EURIBOR 3M DEC1
27FEIH32EURIBOR 3M MAR2

05 - DELAYED FUTURES DATA

Certain Futures quotes are fee-liable and if you do not have access to the real-time data, you can access the delayed data (delayed by around 15 min in general) for free. You can view delayed full quotes on futures by adding a forward slash (/) in front of the RIC, for example: /FEIZ4 This is only available for contacts for specific months and expiry dates.

Note: Continuation RICs will not provide delayed data.

CODE TO BE ADDED. Need to explore the working code.


06 - EXPIRED FUTURES

Futures are contracts which ceases to exist after the expiry date. You can still view the expired historical contracts by varying the format of the RIC and it is not straight forward as seen earlier.

Format:

<root code><Month Code><Year Code><^><Decade Code>

Example:

FEIZ6^1 where,

  • FEI = Root Code for the three-month Euribor
  • Z = December
  • 6 = year digit (last digit of the year)
  • ^ = caret to indicate an expired futures contract
  • 1 = decade code. The decade code identifies which decade the contract belongs to. ^1 represents the 2010s, so FEIZ6^1 is December 2016. ^0 would represent the 2000s, so FEIZ6^0 would be December 2006.
import lseg.data as ld
ld.open_session()

expired_futures = ld.get_history(
universe=['FEIZ6^1'],
fields=['TRDPRC_1', 'HIGH_1', 'LOW_1', 'BID', 'ASK'] # if you skip the fields parameter, all the fields available will be displayed.
)
display(expired_futures)
ld.close_session()
FEIZ6^1TRDPRC_1HIGH_1LOW_1BIDASK
Date
2016-11-22100.305100.31100.305100.305100.31
2016-11-23100.31100.31100.305100.305100.31
2016-11-24100.305100.315100.305100.305100.31
2016-11-25100.31100.31100.305100.305100.31
2016-11-28100.31100.315100.305100.305100.31
2016-11-29100.31100.315100.305100.305100.315
2016-11-30100.31100.315100.305100.305100.31
2016-12-01100.31100.315100.305100.31100.315
2016-12-02100.31100.315100.305100.305100.315
2016-12-05100.31100.315100.305100.31100.315
2016-12-06100.31100.315100.31100.31100.315
2016-12-07100.315100.315100.31100.31100.315
2016-12-08100.32100.32100.31100.315100.32
2016-12-09100.32100.32100.315100.315100.32
2016-12-12100.315100.32100.315100.315100.32
2016-12-13100.32100.32100.315100.315100.32
2016-12-14100.315100.32100.31100.315100.32
2016-12-15100.315100.32100.31100.315100.32
2016-12-16100.31100.32100.31100.31100.315
2016-12-19100.315100.315100.31100.31100.315

07 - TOOLS FOR FINDING DATA

Once you have identified the RIC for a Futures Contract, use the Search Bar on LSEG Workspace to type the RIC and select it from the smart results. This is quite straightforward and the classic approach.

Example:

Searching for FEIZ6 or 0#FEI:

Search FEIZ6

Search chain

Now, either you can choose the option from the results or switch to the apps section and choose the one you would like to.

Search apps tab

Advanced Search:

If you do not know the RICs and want the list of all futures which you can drill down by asset type, exchange etc., the Advanced Search app can help. Once on the Advanced Search App, start by defining the Universe from the Universe Builder section. Example: Equity & Index Derivatives > Futures. You can drill down by using applying filters from the filters section usually on the left. Example: Exchange = LSEG.

Advanced Search

You can also search programmatically. For the query, you can use the Export Query option on the Advanced Search app and feed into the below code.

Note: The select parameter would have many fields but you can choose the ones you need to be displayed.

import lseg.data as ld
from lseg.data.content import search
ld.open_session()
ld.discovery.search(
view=ld.discovery.Views.EQUITY_QUOTES,
top=10, # you can control the output. Optional
filter="(AssetState eq 'AC' and SearchAllCategoryv2 eq 'Futures' and (ExchangeName xeq 'LSEG'))",
select="AssetState,RIC,ExchangeName,ExpiryDate"
)
AssetStateRICExchangeNameExpiryDate
0AC0#SPXATM:LSEGNaT
1ACSPCXATM9M.OLSEG2027-01-06
2ACTOTLATM30D.KLSEG2026-07-15
3ACVNMATM30DLSEG2026-07-15
4ACMSOSATM30D.KLSEG2026-07-13
5ACXOVRATM30D.OLSEG2026-07-15
6ACCATATM30DLSEG2026-07-13
7ACNVDSATM30D.OLSEG2026-07-15
8ACVISATM30DLSEG2026-07-15
9ACTBFATM30DLSEG2026-07-15

Method 02 - APPS

These are tools which are useful for viewing a group of futures contracts by various categories.

AppsDescriptionWhy Start Here
INFOVWorld Index Futures - Global Equity Index Futures basketIdeal for a global view with various filters to drill down to the required result
BDFCBond Futures - Monitor and analyse bond futures basketProvides a broad overview of Bond Futures in one place with various filters to drill down
Commodity Futures AsiaCommodity Futures for the Asian Time ZoneIdeal for Asian Commodity Futures covering all commodities like Oil, Metals, etc
Commodity Future EuropeCommodity Futures for the European Time ZoneIdeal for European Commodity Futures covering all commodities like Oil, Metals, etc
Commodity Futures AmericasCommodity Futures for the American Time ZoneIdeal for American Commodity Futures covering all commodities like Oil, Metals, etc
Press F4 to open Quote appLive pricing for one or more futuresProvides real time pricing feeds for individual or chain RICs. (Note: Not ideal for expired contracts)

Method 03 - API

The same data can be accessed programmatically within Workspace using the CODEBK app (Codebook) or onto your local machine app in your preferred language either in Python, .Net or TypeScript. You can refer the developers.lseg.com for complete documentation, examples and code samples.

Getting the latest info:

import lseg.data as ld
ld.open_session()

latest_futures_det = ld.get_data(
universe=['FEIZ6'],
fields=['DSPLY_NAME', 'CONTR_MNTH', 'TRDPRC_1', 'BID', 'ASK', 'HIGH_1', 'LOW_1', 'OPINT_1', 'ACVOL_1'], # if you skip the fields parameter, all the fields available will be displayed.
header_type=ld.HeaderType.NAME # optional
)
display(latest_futures_det)
ld.close_session()
InstrumentDSPLY_NAMECONTR_MNTHTRDPRC_1BIDASKHIGH_1LOW_1OPINT_1ACVOL_1
0FEIZ6EURIBOR 3M DEC6DEC697.36597.3697.36597.3997.355874050266020

The function is smart enough to expand a chain and display data for all its constituents too:

import lseg.data as ld
ld.open_session()

latest_futures_det = ld.get_data(
universe=['0#FEI:'],
fields=['DSPLY_NAME', 'CONTR_MNTH', 'TRDPRC_1', 'BID', 'ASK', 'HIGH_1', 'LOW_1', 'OPINT_1', 'ACVOL_1'], # if you skip the fields parameter, all the fields available will be displayed.
header_type=ld.HeaderType.NAME # optional
)
display(latest_futures_det)
ld.close_session()

c:\Users\ukhandel2\OneDrive - London Stock Exchange Group\Work\Learnings\Python\Virtual Environments.learning_adc\Lib\site-packages\lseg\data_tools_dataframe.py:177:FutureWarning: Downcasting object dtype arrays on .fillna, .ffill, .bfill is deprecated and will change in a future version. Call result.infer_objects(copy=False) instead. To opt-in to the future behavior, set pd.set_option('future.no_silent_downcasting', True)

InstrumentDSPLY_NAMECONTR_MNTHTRDPRC_1BIDASKHIGH_1LOW_1OPINT_1ACVOL_1
0FEIM6EURIBOR 3M JUN6JUN697.64597.6497.64597.6597.63570150856032
1FEIN6EURIBOR 3M JUL6JUL697.60597.697.60597.61597.68257723659
2FEIQ6EURIBOR 3M AUG6AUG697.5297.5297.52597.5497.52298244936
3FEIU6EURIBOR 3M SEP6SEP697.4697.45597.4697.48597.455631859277605
4FEIV6EURIBOR 3M OCT6OCT697.42597.41597.42597.4497.41547171400
5FEIX6EURIBOR 3M NOV6NOV697.38597.38597.3997.4197.385740181
6FEIZ6EURIBOR 3M DEC6DEC697.36597.3697.36597.3997.355874050266035
7FEIH7EURIBOR 3M MAR7MAR797.3397.32597.3397.3597.315461211189173
8FEIM7EURIBOR 3M JUN7JUN797.33597.3397.33597.3797.325450156139090
9FEIU7EURIBOR 3M SEP7SEP797.36597.35597.36597.3997.35359284143611
10FEIZ7EURIBOR 3M DEC7DEC797.497.39597.497.4397.39432802125480
11FEIH8EURIBOR 3M MAR8MAR897.4297.41597.4297.44597.405339025125229
12FEIM8EURIBOR 3M JUN8JUN897.41597.4197.41597.43597.405230927114847
13FEIU8EURIBOR 3M SEP8SEP897.497.39597.497.41597.3920145587865
14FEIZ8EURIBOR 3M DEC8DEC897.37597.3797.37597.3997.36521640681245
15FEIH9EURIBOR 3M MAR9MAR997.35597.3597.35597.36597.34516568140942
16FEIM9EURIBOR 3M JUN9JUN997.3397.32597.3397.3497.328791742405
17FEIU9EURIBOR 3M SEP9SEP997.3197.30597.3197.31597.36083919646
18FEIZ9EURIBOR 3M DEC9DEC997.2897.27597.2897.2997.274543820592
19FEIH0EURIBOR 3M MAR0MAR097.25597.2597.25597.26597.2453701014223
20FEIM0EURIBOR 3M JUN0JUN097.2297.21597.2297.23597.2153173311323
21FEIU0EURIBOR 3M SEP0SEP097.1997.18597.1997.297.185287285911
22FEIZ0EURIBOR 3M DEC0DEC097.1697.15597.1697.1797.15235433698
23FEIH31EURIBOR 3M MAR1MAR197.1397.1297.1397.1497.12111752911
24FEIM31EURIBOR 3M JUN1JUN197.09597.0997.09597.10597.08525542335
25FEIU31EURIBOR 3M SEP1SEP1<NA>97.0597.06<NA><NA>588<NA>
26FEIZ31EURIBOR 3M DEC1DEC1<NA>97.01597.03<NA><NA>30<NA>
27FEIH32EURIBOR 3M MAR2MAR2<NA>96.97597.005<NA><NA><NA><NA>

Accessing the history:

import lseg.data as ld
ld.open_session()

latest_futures_det = ld.get_history(
universe=['FEIZ6'],
fields=['TRDPRC_1', 'BID', 'ASK', 'HIGH_1', 'LOW_1', 'OPINT_1'], # if you skip the fields parameter, all the fields available will be displayed.
interval='1D', # optional
start='YYYY-MM-DD', # optional
end='YYYY-MM-DD' # optional
)
display(latest_futures_det)
ld.close_session()

HELP App:

On Workspace, if you are stuck and need any documentation, steps or any kind of support, you can check in the HELP app. Just search for HELP to navigate.