Chapter 9 – Commodities and energy markets
Commodities and energy markets – overview chains
Main chains
0#COMMOD– main chain for commodities.0#ENERGY– main chain for energy.
From these chains you can double-click on any of the sections to drill down through chains to the required sector and product without needing to know a code.
Chain description – commodities
| Chain | Description |
|---|---|
0#COMMOD | Main chain for commodities; includes base/precious metals, grains, oilseeds and livestock. |
0#COMMOD/FUT | LSEG commodities futures chain. |
0#COMMOD/CASH | Cash Spot market prices chain. |
0#COMMOD/OPT | LSEG commodity options chain. |
0#COMMOD/STATS | LSEG commodity statistic chain. |
0#COMMOD/SPR | LSEG commodity spread chain. |
0#COMMOD/IDX | LSEG commodity index chain. |
0#COMMOD/MISC | LME commodity miscellaneous chain. |
0#COMMOD/FRT | LSEG freight chain. |
0#COMMOD/COMP | LSEG composite tile chain. |
0#COMMOD/ATM | TRC base metal ATM chain. |
Chain description – energy
| Chain | Description |
|---|---|
0#ENERGY | Main chain for energy; codes for power, gas and oil cash prices, futures and news. |
0#ENERGY/FUT | Energy futures chain. |
0#ENERGY/CASH | Energy cash spot price chain. |
0#ENERGY/OPT | Energy options chain. |
0#ENERGY/STATS | Energy statistics chain. |
0#ENERGY/SPREAD | Energy spread chain. |
0#ENERGY/IDX | Energy index chain. |
0#ENERGY/FRT | Energy freight chain. |
0#ENERGY/COMP | Energy composite tile chain. |
0#ENERGY/ATM | Energy ATM chain. |
0#ENERGY/ROLL | Energy roll options chain. |
0#ENERGY/EQ | Energy equities chain. |
0#ENERGY/STRIP | Energy strips chain. |
0#ENERGY/SWAP | Energy swaps chain. |
0#ENERGY/FST | Energy stock forecasts. |
0#ENERGY=ICAP | ICAP energy chain. |
0#PLATTS | PLATTS commodity chain Coverage. |
0#WEATHER | Weather chain. |
0#SHIPPING | Energy shipping chain. |
0#TR-EN-US | Energy xxx. |
While the chains navigate to logical RICs (standard templates), the apps also point to page displays where multiple items of interest are also available and curated as a holistic view of various markets.
Navigation by chains
- Start at
0#COMMOD(commodities) or0#ENERGY(energy). - Double-click the appropriate chain to drill down (e.g. futures, cash, indices, stocks, spreads).
Navigation by Apps
- Use
COMMODITIESandENERGYapps for a structured index of commodities and energy RICs.


import lseg.data as ld
from lseg.data.discovery import Chain
from lseg.data.content import pricing
import datetime
import time
ld.open_session()
<lseg.data.session.Definition object at 0x1f32a8388c0 {name='workspace'}>
df = ld.get_data('0#COMMOD',['LONGLINK1','LONGLINK2','LONGLINK3','LONGLINK4','LONGLINK5','LONGLINK6','LONGLINK7','LONGLINK8','LONGLINK9','LONGLINK10','LONGLINK11','LONGLINK12','LONGLINK13','LONGLINK14'])
df
| Instrument | LONGLINK1 | LONGLINK2 | LONGLINK3 | LONGLINK4 | LONGLINK5 | LONGLINK6 | LONGLINK7 | LONGLINK8 | LONGLINK9 | LONGLINK10 | LONGLINK11 | LONGLINK12 | LONGLINK13 | LONGLINK14 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0#COMMOD/CASH | 0#APCMA | 0#BASE/CASH | 0#CNGOIC | 0#ETHANOL/CASH | 0#FIBRES/CASH | 0#FREIGHT/CASH | 0#GRAINS/CASH | 0#LIVESTOCK/CASH | 0#MINOR/CASH | 0#OILSEEDS/CASH | 0#PRECIOUS/CASH | 0#SOFTS/CASH | 0#VNM-COMM | 0#MYSTEEL |
| 1 | 0#COMMOD/FUT | 0#BASE/FUT | 0#PRECIOUS/FUT | 0#GRAINS/FUT | 0#OILSEEDS/FUT | 0#SOFTS/FUT | 0#FIBRES/FUT | 0#LIVESTOCK/FUT | 0#FREIGHT/FUT | 0#EXCHANGE/DATES | 0#WEATHER/FUT | 0#IRONORE/FUT | <NA> | <NA> | <NA> |
| 2 | 0#COMMOD/OPT | 0#BASE/OPT | 0#PRECIOUS/OPT | 0#GRAINS/OPT | 0#OILSEEDS/OPT | 0#SOFTS/OPT | 0#FIBRES/OPT | 0#LIVESTOCK/OPT | 0#POTATOES/OPT | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 3 | 0#COMMOD/STATS | 0#AGS-STAT-CN | 0#BASE/STATS | 0#CFTC | 0#CMIE | 0#EXPAGRIFLOWS | 0#FIBRE-CN-EXIM | 0#GRA-EU-STAT | 0#GRAINS/STATS | 0#GRAINS-CN-EXIM | 0#ICE-COT-STX | 0#OILSEEDS/STATS | 0#ONIGC | 0#PRECIOUS/STATS | 0#SOFTS/STATS |
| 4 | 0#COMMOD/SPR | 0#BASE/SPR | 0#PRECIOUS/SPR | 0#GRAINS/SPR | 0#OILSEEDS/SPR | 0#SOFTS/SPR | 0#FIBRES/SPR | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 5 | 0#COMMOD/IDX | 0#FREIGHT/IDX | 0#GRAINS/IDX | 0#FIBRES/IDX | 0#GENCOM/IDX | 0#METALS/IDX | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 6 | 0#COMMOD/MISC | 0#COMMOD/LME | 0#COMMOD/EU | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 7 | 0#COMMOD/FRT | 0#GRAINS/FRT | 0#SUGAR/FRT | 0#COAL/FRT | 0#ORE/FRT | 0#INLAND/FRT | 0#SSY | SHIP/PACKAGE | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 8 | 0#COMMOD/COMP | COCWLD | COFWLD | SUGWLD | SUGGLOBE | GRAINGRAIN | GRAINGRAIN1 | AGUSA | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 9 | 0#COMMOD/ATM | 0#BASE/ATM | 0#PRECIOUS/ATM | 0#GRAINS/ATM | 0#OILSEEDS/ATM | 0#SOFTS/ATM | 0#FIBRES/ATM | 0#LIVESTOCK/ATM | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 10 | 0#COMMOD/ROLL | 0#BASE/ROLL | 0#PRECIOUS/ROLL | 0#GRAINS/ROLL | 0#OILSEEDS/ROLL | 0#SOFTS/ROLL | 0#FIBRES/ROLL | 0#LIVESTOCK/ROLL | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
So for any of these chains we can invoke a chain decoding for each to retrieve a long array of all underlying rics and then filter them to request further data such as price.
ch_1 = df['Instrument'][0]
ch_1
'0#COMMOD/CASH'
list_ch1 = Chain(ch_1)
constituents = list_ch1.constituents
constituents
['0#APCMA',
'0#BASE/CASH',
'0#CNGOIC',
'0#ETHANOL/CASH',
'0#FIBRES/CASH',
'0#FREIGHT/CASH',
'0#GRAINS/CASH',
'0#LIVESTOCK/CASH',
'0#MINOR/CASH',
'0#OILSEEDS/CASH',
'0#PRECIOUS/CASH',
'0#SOFTS/CASH',
'0#VNM-COMM',
'0#MYSTEEL']
So we can see here there are further chains included we could go down the heirarchy to navigate these - but we can also create routine to do this for us. Remember each of these chains may have RICs or contain other chains - which would need to be decoded.
total = len(constituents)
collection = []
inaccessible_chains = []
start_time = time.time()
def expand_chain_tree(constituents, level=0):
global total, collection
if isinstance(constituents, list):
# Iterate through the constituent list...
for idx, constituent in enumerate(constituents, start=1):
# Make sure the constituent node is a nested chain...
if constituent.startswith("0#"):
# Print progress...
if level == 0: print(f"\rProcessing chain {idx} of {total}...", end="", flush=True)
# Recursive call to expand nested chain...
#nested_chain = Chain(constituent)
nested_chain = pricing.chain.Definition(constituent).get_stream()
nested_chain.open(with_updates=False)
nested_chain.close()
if nested_chain.is_chain:
expand_chain_tree(nested_chain.constituents, level+1)
else:
inaccessible_chains.append(constituent)
else:
collection.append(constituent)
if level == 0:
print(f"\nCompleted in {time.time() - start_time:.2f} seconds")
print(f"Found a total of {len(collection)} constituents and {len(inaccessible_chains)} inaccessible chain records")
expand_chain_tree(constituents)
Processing chain 14 of 14... Completed in 639.73 seconds Found a total of 7574 constituents and 213 inaccessible chain records
So we now have a list of constituents in a collection as well as a list of errors or chains we were not able to decode
collection[:5]
['W-CADVDRUE-P1', 'W-CADVDRUE-P2', 'W-CADVDRUE-P3', 'W-CALPC-P1', 'W-CALPC-P3']
inaccessible_chains[:5]
['0#FODDER-CA', '0#DAIRY-CA', '0#ALFALFA-CA', '0#CEP-OC', '0#AOC-OC']
Cash instruments
Commodities and energy RICs cover a wide variety of markets, so the best way to find data on instruments is to use the chains and speed-guides (see above).
RICs for cash instruments can be up to 15 alphanumeric characters long.
Typically they consist of up to three main components, separated by a delimiter:
RICroot Type/Specification/Delivery Location
-
RIC root – mnemonic indicating the physical instrument.
- Usually one to four alphanumeric characters.
- Often the same root as the futures market commodity code (for example,
LHfor live hogs). - In some energy instruments, the specification is used as the RIC root to avoid long codes:
- Example:
BK180-ANT– 180 centistoke bunker fuel.
- Example:
-
Type / specification / delivery – up to eight alphanumeric characters.
- Individual elements are optional but at least one must be present.
- Order of precedence:
- Type.
- Specification.
- Delivery.
Tip: Specification pages are available for many specialist or complex cash prices.
- For commodities select
COMMSPECSApage.- For energy select
ENGSPECApage.
- Location – specifies the location or source of the physical commodity.
- Two-character ISO codes for countries.
- Three-character ISO codes for cities (where applicable).
- Other abbreviations are standard across RICs (for example
Wfor White,DLYfor daily,Dfor day as in “15-day average”).
In addition to ISO region/city codes, the following codes are used:
Commodity codes
| Code | Commodity |
|---|---|
PEP | Pepper |
SUG | Sugar |
CC | Cocoa |
COF | Coffee |
RUB | Rubber |
TEA | Tea |
Example:
PEPis the root code for pepper.
These RIC structures are used for heavily traded cash instruments. Lightly traded instruments may not follow this format.
If in doubt, use the apps (such as COMMODITIES or ENERGY) to drill down to the instrument you need.
Region / city codes (examples)
| Code | Region/city |
|---|---|
CAR | Caribbean |
EURO | European |
BE | Bremen, Germany |
SAN | Santos, Brazil |
PA | Palembang, Sumatra |
LA | Lampung, Sumatra |
TP | T Priok, Indonesia |
SU | Surabaya, Indonesia |
UP | U Pandang, Indonesia |
LATAM | Latin America |
| Code | Region/city |
|---|---|
AMER | North, South & Central America |
AFR | Africa |
INDO | Indonesia |
PO | Pontianak, Indonesia |
NIN | North India |
SIN | South India |
NE | Nuwa Eliya, Sri Lanka |
SUM | Sumatra |
JAV | Java |
GUW | Guwahati, India |
Cash commodities chains
Chains provide a way of navigating directly from a high level down to specific detail.
- You don’t need to know a RIC or any other code because there is a simple description at each stage.
Example – London cash price for coffee:
- Type
0#COMMODfor the main commodities chain. - Double-click
0#COMMOD/CASH. - In
0#COMMOD/CASH, double-click chains to drill further down until you reach the required instrument.
Typical navigation:
0#COMMOD– main commodities chain.0#COMMOD/CASH– commodities physicals.0#SOFTS/CASH– softs physicals.0#EUCOFFEE/CASH– European coffee.0#EUCOFFEE-LDN– coffee London.
This presents a list of quotes – double-click the desired description to see the quote displayed in standard format.
RICs for commodity chains
Chain RICs usually have two parts:
- Commodity code.
- Source / type indicator.
Note:
- The commodity code for cash chains is not always the same as the root code for the full quote.
- Example: root code for sugar is
SUG, but the cash chain code is0#SUGAR.
The best way to find out is to use the Commodity App.
General structure:
CommodityCode-RegionOrMarketCode
Examples to type into the Workspace Launcher bar:
COF-ARABICA– global Arabica coffee.SUGAR– Agriculture Sugar App.
Energy cash price chains
Energy cash chains work in the same way as commodities.
- Start at
0#ENERGY.
Example – spot price for jet fuel at New York Harbor:
0#ENERGY– main energy chain.0#ENERGY/CASH– energy physicals.0#PRODUCTS/CASH– products cash.0#P-NYH– US products New York Harbor.
This displays a list of quotes – double-click on JET FUEL NYH Prompt.
RICs for energy cash chains
Example regional code structure:
0#P-HKG– cash oil product in Hong Kong.
You can view lists of available root codes via chains:
0#C-A– crudes, Asia.0#P-A– products, Asia.0#C-E– crudes, Europe.0#P-E– products, Europe.0#C-N– crudes, North America.0#P-N– products, North America.
df1 = ld.get_data('0#ENERGY',['LONGLINK1','LONGLINK2','LONGLINK3','LONGLINK4','LONGLINK5','LONGLINK6','LONGLINK7','LONGLINK8','LONGLINK9','LONGLINK10','LONGLINK11','LONGLINK12','LONGLINK13','LONGLINK14'])
df1
| Instrument | LONGLINK1 | LONGLINK2 | LONGLINK3 | LONGLINK4 | LONGLINK5 | LONGLINK6 | LONGLINK7 | LONGLINK8 | LONGLINK9 | LONGLINK10 | LONGLINK11 | LONGLINK12 | LONGLINK13 | LONGLINK14 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0#ENERGY/CASH | 0#CRUDE/CASH | 0#PRODUCTS/CASH | 0#ELECTRIC/CASH | 0#EMISSIONS/CASH | 0#NATGAS/CASH | 0#COAL/CASH | 0#WEATHER/CASH | 0#RENEWABLE | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 1 | 0#ENERGY/FUT | 0#CRUDE/FUT | 0#PRODUCTS/FUT | 0#ELECTRIC/FUT | 0#EMISSIONS/FUT | 0#NATGAS/FUT | 0#COAL/FUT | 0#WEATHER/FUT | 0#EXCHANGE/DATES | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 2 | 0#ENERGY/OPT | 0#CRUDE/OPT | 0#COAL/OPT | 0#PRODUCTS/OPT | 0#ELECTRIC/OPT | 0#EMISSIONS/OPT | 0#NATGAS/OPT | 0#WEATHER/OPT | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 3 | 0#ENERGY/STATS | 0#CRUDE/STATS | 0#PRODUCTS/STATS | 0#ELECTRIC/STATS | 0#NATGAS/STATS | 0#COAL/STATS | 0#OILARB-STATS | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 4 | 0#ENERGY/SPREAD | 0#CRUDE/SPREAD | 0#PRODUCTS/SPREAD | 0#ELECTRIC/SPREAD | 0#EMISSION/SPREAD | 0#NATGAS/SPREAD | 0#COAL/SPREAD | 0#WEATHER/SPREAD | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 5 | 0#ENERGY/IDX | 0#CRUDE/IDX | 0#PRODUCTS/IDX | 0#ELECTRIC/IDX | 0#EMISSIONS/IDX | 0#NATGAS/IDX | 0#COAL/IDX | 0#WEATHER/IDX | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 6 | 0#ENERGY/FRT | 0#DIRTY/FRT | 0#CLEAN/FRT | 0#BARGE/FRT | 0#DRY/FRT | 0#ARB/FRT | 0#FFA | SHIP/PACKAGE | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 7 | 0#ENERGY/COMP | CRDWLD | CRUDESWAP/EU | CRUDESWAP/US | CRUDESWAP/WLD | GSLWLD | IPEOIL | NEWOILOIL | NGSWAP/EU | NGSWAP/US | NYMAXS | NYMNRGFUT/VOI | NYMOIL | OILARB | OILOIL |
| 8 | 0#ENERGY/ATM | 0#CRUDE/ATM | 0#PRODUCTS/ATM | 0#ELECTRIC/ATM | 0#NATGAS/ATM | 0#WEATHER/ATM | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 9 | 0#ENERGY/ROLL | 0#CRUDE/ROLL | 0#PRODUCTS/ROLL | 0#NATGAS/ROLL | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 10 | 0#ENERGY/EQ | 0#ENGTOP | 0#ENGEQN | 0#ENGEQE | 0#ENGEQA | 0#ENGALL | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 11 | 0#ENERGY/STRIP | 0#CRUDE/STRIPS | 0#PRODUCT/STRIPS | 0#ELECTRIC/STRIPS | 0#EMISSION/STRIP | 0#NATGAS/STRIPS | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 12 | 0#ENERGY/SWAP | 0#CRUDE/SWAP | 0#PRODUCTS/SWAP | 0#ELECTRIC/SWAPS | 0#NATGAS/SWAPS | 0#COAL/SWAPS | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 13 | 0#ENERGY/FST | 0#ENSTX-FST | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 14 | 0#ICAP | 0#ENERGY=ICAP | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 15 | 0#PLATTS | 0#COAL=PLT | 0#ELEC=PLT | 0#METALS=PLT | 0#NATGAS=PLT | 0#OIL-BUNK=PLT | 0#OIL-CRUDE=PLT | 0#OIL-INTDAY=PLT | 0#OIL-NETBK=PLT | 0#OIL-PROD=PLT | 0#OIL-YIELD=PLT | 0#OIL-INDEX=PLT | 0#FWD-CURVE=PLT | 0#BIOFUELS=PLT | 0#PETCHEMS=PLT |
| 16 | 0#WEATHER | 0#WEATHER/CASH | 0#WEATHER/FUT | 0#WEATHER/OPT | 0#WEATHER/ATM | 0#WEATHER/SPREAD | 0#WEATHER/STAT | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 17 | 0#SHIPPING | 0#SHIPPING/CASH | 0#SHIPPING/FUT | 0#SHIPPING/INDEX | 0#SHIPPING/SWAPS | 0#SHIPPING/STATS | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 18 | 0#TR-EN-US | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
ch_2 = df1['Instrument'][0]
ch_2
'0#ENERGY/CASH'
list_ch2 = Chain(ch_2)
constituents_1 = list_ch2.constituents
constituents_1
['0#CRUDE/CASH',
'0#PRODUCTS/CASH',
'0#ELECTRIC/CASH',
'0#EMISSIONS/CASH',
'0#NATGAS/CASH',
'0#COAL/CASH',
'0#WEATHER/CASH',
'0#RENEWABLE']
expand_chain_tree(constituents_1)
Processing chain 8 of 14...
Completed in 1374.88 seconds
Found a total of 42240 constituents and 302 inaccessible chain records
Location codes for energy contracts (examples)
| Code | Location |
|---|---|
A | Asia |
AFR | Africa |
AG | Arabian Gulf |
ARA | Amsterdam–Rotterdam–Antwerp |
BKK | Bangkok |
CA | Canada |
E | Europe |
G3 | Group 3 |
HKG | Hong Kong |
IN | Inland Rhine Market |
KOR | South Korea |
LA | Los Angeles |
MC | US Mid-continent |
| Code | Location |
|---|---|
MED | Mediterranean |
N | US |
NVA | Norfolk, Virginia |
NWE | North West Europe |
NYH | New York Harbor |
PNW | Pacific Northwest |
SF | San Francisco |
SIN | Singapore |
TWN | Taiwan Kaohsiung |
TYO | Tokyo (Tokyo–Yokohama–Osaka) |
USG | US Gulf |
WC | US West Coast |
Type code structure
Examples to type into the Workspace Launcher bar:
BRT-– cash Brent oil (BRTis the type code).
These RIC structures are used for heavily traded cash instruments. Lightly traded instruments may not follow this format.
If in doubt, use the Apps (such as COMMODS or ENERGY) to drill down to the instrument you need.
More examples
To illustrate structure and diversity, commodities and energy markets can be grouped into sub-sectors:
Metals
METALS– main metals App (base, precious and minor).LME/INDEX– London Metal Exchange index page.0#BASE– base metals chain.0#MINOR– minor metals chain.0#PREC– precious metals chain.AGRI- main agriculture App
'Grains'
GRAINS– grain app.0#WHEAT-HARD-US– US hard wheat chain.
Oilseeds / Meals / Feeds
OILMEALFEED– Oilseeds/Meals/Feeds app.0#CNUT-AFR– France coconut.
Softs
SOFTS– Soft commodities app.SUGAR– Sugar guide.0#SUGAR– Sugar chain.COFFEE– Coffee guide.0#COFFEE– Coffee chain.COCOA– Cocoa guide.0#COCOA– Cocoa chain.COTTON– Cotton guide.0#COTTON– Cotton chain.RUBBER– Rubber guide.0#RUBBER/CASH– Rubber Cash chain.TEA– Tea guide.0#TEA/CASH– Tea Cash chain.0#ASTEA-DHA– Dhaka weekly tea auction prices.
Livestock / Meat / Seafood
LIVESTOCK– Livestock AppHOGS– Hogs main menu.
Energy
ENERGY– Energy app.ETRANSITION– Energy Transition.
Oil
OIL– general oil overview.OILOIL– IPE/NYMEX futures composite display.
Gas
0#TRGBPc– United Kingdom natural gas.
Power
POWER– Main Power App.POWNORD– Nordpool information and index pages (EL/NORDIC).NAPOWER/PRICES1– North American power index page.
Coal
FSAPI2GBMc1– United Kingdom Coal
Carbon
CARBON– Carbon App
Metals Production Database (MPD)
The Metals Production Database (MPD) provides historical and projected figures for all known base-metal operations worldwide.
- Simple web interface enables you to drill down quickly from a world view to a specific mine, refinery, smelter, etc.
To view the home page:
http://mpd.session.rservices.com
Field names for quote lists
If you want to set up a quote list in Excel, these are the most commonly used fields for commodities and energy.
| Field | Data Item Name | FID number | Workspace Data Item Code |
|---|---|---|---|
| Product name | DISPLAY NAME | 3 | DSPLY_NAME |
| Bid | BID | 22 | BID |
| Offer | ASK | 25 | ASK |
| Today’s high | TODAY’S HIGH | 12 | HIGH_1 |
| Today’s low | TODAY’S LOW | 13 | LOW_1 |
| Volume | VOL ACCUMULATED | 21 | ACVOL_1 |
In brief: commodities and energy markets
- There are many different types of code in these markets.
- One way to check how RICs are constructed for a particular sector is to use the examples above.
For cash instruments, the structure is normally:
RICroot Type/Specification/Delivery Location
Example:
WHEAT-HARD-US– US hard wheat chain.
The best way of finding RICs is via:
- Speed-guides: start at
COMMODorENERGY. - Chains: start at
COMMODorENERGY.
Futures and options in commodities and energy follow the generic futures and options structure described in the corresponding chapters.
LSEG Commodity Poll Chain ['0#COMMODPOLL']
LSEG provides detailed polls on commodities - for Oil, Metals, Natural Gas, CCIM,
df1 = ld.get_data('0#COMMODPOLL',['LONGLINK1','LONGLINK2','LONGLINK3','LONGLINK4','LONGLINK5','LONGLINK6','LONGLINK7','LONGLINK8','LONGLINK9','LONGLINK10','LONGLINK11','LONGLINK12','LONGLINK13','LONGLINK14'])
df1
| Instrument | LONGLINK1 | LONGLINK2 | LONGLINK3 | LONGLINK4 | LONGLINK5 | LONGLINK6 | LONGLINK7 | LONGLINK8 | LONGLINK9 | LONGLINK10 | LONGLINK11 | LONGLINK12 | LONGLINK13 | LONGLINK14 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0#OILPOLL | 0#LCOPOLL: | 0#LCOPOLLc | 0#CLPOLL: | 0#CLPOLLc | 0#LCOPOLLCTB: | 0#CLPOLLCTB: | OILPOLL/INFO | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 1 | 0#METALPOLL | 0#BASEMETALPOLL | 0#PRECMETALPOLL | METALPOLL/INFO | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 2 | 0#NATGASPOLL | 0#HENRYHUBPOLL | NATGASPOLL/INFO | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 3 | 0#CCIMPOLL | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
| 4 | COMMODPOLL/INFO | COMMODPOLL01 | COMMODPOLL02 | COMMODPOLL03 | COMMODPOLL04 | COMMODPOLL05 | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
Again we can simply decode any or all the chains we are interest in using the function we created previously.
ch_2 = df1['Instrument'][0]
ch_2
'0#OILPOLL'
list_ch2 = Chain(ch_2)
constituents = list_ch2.constituents
constituents
['0#LCOPOLL:', '0#LCOPOLLc', '0#CLPOLL:', '0#CLPOLLc', '0#LCOPOLLCTB:', '0#CLPOLLCTB:', 'OILPOLL/INFO']
expand_chain_tree(constituents)
Processing chain 6 of 14... Completed in 1408.42 seconds Found a total of 43645 constituents and 304 inaccessible chain records
collection[:5]
['W-CADVDRUE-P1', 'W-CADVDRUE-P2', 'W-CADVDRUE-P3', 'W-CALPC-P1', 'W-CALPC-P3']
inaccessible_chains[:5]
['0#FODDER-CA', '0#DAIRY-CA', '0#ALFALFA-CA', '0#CEP-OC', '0#AOC-OC']
LSEG Commodity Volume and Open Interest Main Chain
We provide volume and open interest chain for a range of LME and EU instruments:
df5 = ld.get_data(['0#COMMOD/MISC'],['LONGLINK1','LONGLINK2','LONGLINK3','LONGLINK4','LONGLINK5','LONGLINK6','LONGLINK7','LONGLINK8','LONGLINK9','LONGLINK10','LONGLINK11','LONGLINK12','LONGLINK13','LONGLINK14'])
df5
| Instrument | LONGLINK1 | LONGLINK2 | LONGLINK3 | LONGLINK4 | LONGLINK5 | LONGLINK6 | LONGLINK7 | LONGLINK8 | LONGLINK9 | LONGLINK10 | LONGLINK11 | LONGLINK12 | LONGLINK13 | LONGLINK14 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0#COMMOD/LME | 0#NICKEL/LME | 0#ALUMINIUM/LME | 0#ALLOY/LME | 0#COPPER/LME | 0#LEAD/LME | 0#TIN/LME | 0#ZINC/LME | 0#FX/LME | 0#MISC/LME | <NA> | <NA> | <NA> | <NA> | <NA> |
| 1 | 0#COMMOD/EU | 0#COMMOD/TAX | 0#COMMOD/REF | 0#COMMOD/COR | 0#COMMOD/CRY | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
Import Tariffs Chain
Formulae

Where r(av) is the ad valorem rate and s is the specific duty per metric tonne.
We also compute the preferential duty (applicable under a qualifying trade agreement) and the duty saving it generates.
ch_3='0#COMMOD/TAX'
list_ch3 = Chain(ch_3)
constituents = list_ch3.constituents
constituents
['IM-DURM-P1',
'IM-DURM-P2',
'IM-COMWHI-P1',
'IM-COMWHI-P2',
'IM-COMWMED-P1',
'IM-COMWMED-P2',
'IM-COMWLOW-P1',
'IM-COMWLOW-P2',
'IM-BAR-P1',
'IM-BAR-P2',
'IM-MAZ-P1',
'IM-MAZ-P2',
'IM-SORG-P1',
'IM-SORG-P2',
'IM-RYE-P1',
'IM-RYE-P2']
expand_chain_tree(constituents)
Completed in 1410.14 seconds
Found a total of 43661 constituents and 304 inaccessible chain records
collection[:5]
['W-CADVDRUE-P1', 'W-CADVDRUE-P2', 'W-CADVDRUE-P3', 'W-CALPC-P1', 'W-CALPC-P3']
inaccessible_chains[:5]
['0#FODDER-CA', '0#DAIRY-CA', '0#ALFALFA-CA', '0#CEP-OC', '0#AOC-OC']
Commods Refunds
A duty refund (also called duty drawback) arises when goods on which duty was paid are subsequently:
- Returned to the exporter / re-exported
- Re-valued — e.g. the declared customs value was later corrected downward
Refund formulae

The refundable amount cannot exceed the original duty paid.
ch_4='0#COMMOD/REF'
list_ch4 = Chain(ch_4)
constituents = list_ch4.constituents
constituents
['W-EUREF-MAIN', 'BLY-EUREF-MAIN']
expand_chain_tree(constituents)
Completed in 1410.40 seconds
Found a total of 43663 constituents and 304 inaccessible chain records
collection[:5]
['W-CADVDRUE-P1', 'W-CADVDRUE-P2', 'W-CADVDRUE-P3', 'W-CALPC-P1', 'W-CALPC-P3']
inaccessible_chains[:5]
['0#FODDER-CA', '0#DAIRY-CA', '0#ALFALFA-CA', '0#CEP-OC', '0#AOC-OC']
Correctives
Correctives arise when a previously submitted customs declaration contained an error and must be amended. Common corrective scenarios:
| Corrective type | Trigger | Effect |
|---|---|---|
| Under-declaration | Customs value was stated too low | Additional duty owed |
| Over-declaration | Customs value was stated too high | Duty credit / refund |
| Classification error | Wrong commodity code used (different rate) | Duty difference (positive or negative) |
| Rate correction | Wrong tariff rate applied | Duty difference |
Corrective formula
A positive corrective means additional duty is owed; a negative corrective means a credit is due.
ch_5='0#COMMOD/COR'
list_ch5 = Chain(ch_5)
constituents = list_ch5.constituents
constituents
['DUR-EUCORR-P1',
'DUR-EUCORR-P2',
'DUR-EUCORR-P3',
'DUR-EUCORR-P4',
'DUR-EUCORR-P5',
'DUR-EUCORR-P6',
'DUR-EUCORR-P7',
'SRW-EUCORR-P1',
'SRW-EUCORR-P2',
'SRW-EUCORR-P3',
'SRW-EUCORR-P4',
'SRW-EUCORR-P5',
'SRW-EUCORR-P6',
'SRW-EUCORR-P7',
'SRW-EUACP-P1',
'SRW-EUACP-P2',
'SRW-EUACP-P3',
'SRW-EUACP-P4',
'SRW-EUACP-P5',
'SRW-EUACP-P6',
'SRW-EUACP-P7',
'FBL-EUC600-P1',
'FBL-EUC600-P2',
'FBL-EUC600-P3',
'FBL-EUC600-P4',
'FBL-EUC600-P5',
'FBL-EUC600-P6',
'FBL-EUC600-P7',
'FBL-EUC900-P1',
'FBL-EUC900-P2',
'FBL-EUC900-P3',
'FBL-EUC900-P4',
'FBL-EUC900-P5',
'FBL-EUC900-P6',
'FBL-EUC900-P7',
'FBL-EUC1100-P1',
'FBL-EUC1100-P2',
'FBL-EUC1100-P3',
'FBL-EUC1100-P4',
'FBL-EUC1100-P5',
'FBL-EUC1100-P6',
'FBL-EUC1100-P7',
'FBL-EUC1650-P1',
'FBL-EUC1650-P2',
'FBL-EUC1650-P3',
'FBL-EUC1650-P4',
'FBL-EUC1650-P5',
'FBL-EUC1650-P6',
'FBL-EUC1650-P7',
'FBL-EUC1900-P1',
'FBL-EUC1900-P2',
'FBL-EUC1900-P3',
'FBL-EUC1900-P4',
'FBL-EUC1900-P5',
'FBL-EUC1900-P6',
'FBL-EUC1900-P7',
'BLY-EUCORR-P1',
'BLY-EUCORR-P2',
'BLY-EUCORR-P3',
'BLY-EUCORR-P4',
'BLY-EUCORR-P5',
'BLY-EUCORR-P6',
'BLY-EUCORR-P7',
'RYE-EUCORR-P1',
'RYE-EUCORR-P2',
'RYE-EUCORR-P3',
'RYE-EUCORR-P4',
'RYE-EUCORR-P5',
'RYE-EUCORR-P6',
'RYE-EUCORR-P7',
'OAT-EUCORR-P1',
'OAT-EUCORR-P2',
'OAT-EUCORR-P3',
'OAT-EUCORR-P4',
'OAT-EUCORR-P5',
'OAT-EUCORR-P6',
'OAT-EUCORR-P7',
'MAZ-EUCORR-P1',
'MAZ-EUCORR-P2',
'MAZ-EUCORR-P3',
'MAZ-EUCORR-P4',
'MAZ-EUCORR-P5',
'MAZ-EUCORR-P6',
'MAZ-EUCORR-P7']
expand_chain_tree(constituents)
Completed in 1527.58 seconds
Found a total of 43831 constituents and 304 inaccessible chain records
collection[:5]
['W-CADVDRUE-P1', 'W-CADVDRUE-P2', 'W-CADVDRUE-P3', 'W-CALPC-P1', 'W-CALPC-P3']
inaccessible_chains[:5]
['0#FODDER-CA', '0#DAIRY-CA', '0#ALFALFA-CA', '0#CEP-OC', '0#AOC-OC']

We can discover realtime fields:
ch_6='0#OILPOLL'
list_ch6 = Chain(ch_6)
constituents = list_ch6.constituents
expand_chain_tree(constituents)
Processing chain 6 of 14...
Completed in 1561.71 seconds
Found a total of 45236 constituents and 306 inaccessible chain records
collection[:5]
['W-CADVDRUE-P1', 'W-CADVDRUE-P2', 'W-CADVDRUE-P3', 'W-CALPC-P1', 'W-CALPC-P3']
inaccessible_chains[:5]
['0#FODDER-CA', '0#DAIRY-CA', '0#ALFALFA-CA', '0#CEP-OC', '0#AOC-OC']
ld.get_data('LCOPOLLQM6','TR.Description')
| Instrument | Instrument Description | |
|---|---|---|
| 0 | LCOPOLLQM6 | Brent Quarterly Forecast Jun 2026 |
ld.get_history('LCOPOLLQM6')
| LCOPOLLQM6 | STD_DEV | FCAST_HIGH | FCAST_LOW | FCAST_MODE | FCAST_MEDN | RTR_POLL | FCAST_MEAN | FCAST_NUM |
|---|---|---|---|---|---|---|---|---|
| Date | ||||||||
| 2025-06-30 | 5.48 | 75.0 | 55.0 | 65 | 65.0 | 64.54 | 64.54 | 34 |
| 2025-07-31 | 5.24 | 73.81 | 54.25 | 60 | 63.0 | 62.98 | 62.98 | 32 |
| 2025-08-29 | 5.06 | 70.0 | 54.25 | 60 | 60.0 | 62.19 | 62.19 | 27 |
| 2025-09-30 | 4.1 | 70.0 | 55.0 | 65 | 63.54 | 62.89 | 62.89 | 28 |
| 2025-10-31 | 4.31 | 70.0 | 55.0 | 65 | 63.0 | 62.19 | 62.19 | 32 |
| 2025-11-28 | 3.85 | 70.0 | 54.0 | 65 | 63.0 | 61.85 | 61.85 | 31 |
| 2025-12-31 | 3.75 | 66.65 | 52.0 | 63 | 61.0 | 60.45 | 60.45 | 31 |
| 2026-01-30 | 3.51 | 70.75 | 55.0 | 62 | 62.0 | 61.53 | 61.53 | 30 |
| 2026-02-27 | 3.91 | 70.75 | 55.0 | 65 | 63.75 | 63.63 | 63.63 | 34 |
| 2026-03-31 | 15.48 | 125.0 | 59.0 | 100 | 97.54 | 95.33 | 95.33 | 36 |
| 2026-04-30 | 12.19 | 125.0 | 59.0 | 100 | 100.0 | 99.95 | 99.95 | 32 |
| 2026-05-29 | 9.81 | 117.25 | 78.4 | 100 | 103.0 | 102.66 | 102.66 | 28 |
ld.close_session()