Geographical Arbitrage for Liquified Natural Gas (LNG) Exports from the US

Raksina Samasiri
Developer Advocate Developer Advocate
Hengky
Senior Analyst Senior Analyst

In this example we’re using trade flows data retrieved using RDMS (Refinitiv Data Management Solution) to gain insight into LNG supply trends and taking its pricing data from Refinitiv Data Platform Libraries

Content

  • Introduction
  • Hypothesis
  • Getting the data
  • Visualization
  • Conclusion

Introduction

In the LNG market, arbitrage can be defined as a strategy of diverting a physical cargo from one market to another which offers a better return. Price differentials can occur between regional markets due to different pricing structures and imbalances between supply and demand which allows traders to exploit and capitalize on.

In this article, we look at various trade components to determine if the arbitrage window to Asia is open or if it is more profitable to ship cargo from the United States to Asia than to Europe.

The following will be applied as basis for the purpose of this use case
 Load location:                            United States, Sabine Pass
 Discharge location in Asia:      Japan, Osaka
 Discharge location in Europe: United Kingdom, Thames and Netherlands, Rotterdam
— Regional price benchmarks:    NYMEX Henry Hub Natural Gas
                                                         LNG-AS (Reuters Liquefied Natural Gas Asia DES Weekly Assessment)
                                                         TTF (Title Transfer Facility, Netherlands)
                                                         NBP (National Balancing Point, United Kingdom)

In this use case, we utilize two Refinitiv products (Free Trial Available), which are

Prerequisite

You may contact your Refinitiv’s representative to help you to access the products below

  • For RDMS, the credential is required, to generate the API key, follow the instruction in the quickstart guide
  • For RDP libraries,
    — Refinitiv Data Platform (RDP) library installed.
    — Eikon Desktop or Refinitiv workspace is running on your machine when running the notebook application
    — The Access Credential is required to use RDP libraries. For more detail, please check the section ‘Desktop — Eikon or Refinitiv Workspace’ in RDP Quick-start guide.
  • Required Python libraries and their version:
    — refinitiv.dataplatform 1.0.0a10
    — datetime 4.3
    — pandas 1.3.1
    — requests 2.25.1
    — matplotlib.pyplot 3.4.2
  • Jupyter Lab or Jupyter Notebook application is installed and ready to use

Hypothesis

Taking into account the cost of freight, there are times when an arbitrage opportunity exists for a US exporter to shift the volume from Europe to Asia or vice versa.
To confirm the hypothesis, we first compare the cost of purchasing natural gas in the US and shipping it to Europe and Asia vs. regional gas prices in those destinations, and then we look at the flow of LNG from the US to the same destinations.
If the hypothesis is correct, then when there’s a substantial price differential between Europe and Asia, we should see the flow moving into the region where the selling price is higher.

Getting the data

Cost: using RDP libraries — purchasing natural gas in the US and shipping it to Europe and Asia vs. regional gas prices in those destinations

Instrument (RIC) and the parameter used

Note: RICs (Refinitiv Instrument Code) or Instrument is a ticker-like code used by Refinitiv to identify financial instruments and indices. The codes are used for looking up information on various Refinitiv financial information networks (including Eikon Data API and Eikon Desktop)

Icons made by Freepik from www.flaticon.com

 

Margin calculation

To calculate the margin, as mentioned in the introduction, The key variable costs in an arbitrage opportunity can be seen in these three components

  1. Liquefaction  the cost of converting gas into a liquid state and loading it onto a vessel. For U.S. exports from Sabine Pass, buyers generally enter into a sales and purchase agreement (SPA) consisting of a fixed fee per MMBtu of LNG plus a variable fee per MMBtu of LNG equal to approximately 115% of Henry Hub.
  2. Voyage — the cost of transporting the LNG cargo from one terminal to another. The voyage cost of transporting LNG cargoes from one terminal to another is calculated for round trip voyages of 160k TFDE LNG tankers. Voyage days are calculated using sea distances provided by the Refinitiv Freight Analysis team. The vessels stay three days in port per round-trip voyage. Spot charter rates for the Atlantic, Pacific and Middle East regions are provided weekly by Affinity (Shipping) LLP. The price for boil-off is the estimated landed spot price at the cargo destination. Heavy fuel oil (HFO) prices in Rotterdam, Fujairah and Singapore are from ClearLynx, with the proximity to the freight routes deciding which bunkering port is used in the calculations. Fees for canal transits through the Suez- and Panama canals are included when applicable. Suez discounts for US Gulf cargoes are taken into account. The voyage cost is calculated in USD/MMBtu based on the cargo size actually delivered.
  3. Regasification — the cost of reverting LNG into natural gas to be fed into local grid networks. Regasification costs, or the cost of reverting LNG into natural gas, vary at individual terminals in northwest Europe. Hence for simplicity, we adopt a standard 20cents/MMBtu as a proxy. LNG cargoes shipped into Asia are assumed to be traded on Delivered Ex Ship (DES) terms whereby regasification costs are not deducted.

Instruments to be used in the margin calculation

Hence, formulas of margin calculation are

  • Margin, Japan
    [LNG-AS] – [TR-NSSOSA-LNG] – ( [NGc1] * 1.15 )
    * LNG cargoes shipped into Asia are assumed to be traded on Delivered Ex Ship (DES) terms whereby regasification costs are not deducted.
  • Margin, Netherlands
    [TFMBUSMBTMc1] – [TR-NSSRTM-LNG] – ( [NGc1] * 1.15 ) – [Regasification (20cents/MMBt)]
  • Margin, United Kingdom
    [NGLNUSMBTMc1] – [TR-NSSTHP-LNG] – ( [NGc1] * 1.15 ) – [Regasification (20cents/MMBt)]

From formulas above, to get margin differentials between Asia (Japan) and Europe (Netherlands, United Kingdom)

Margin differential, Japan — Netherlands
([LNG-AS] — [TR-NSSOSA-LNG] — [TFMBUSMBTMc1] + [TR-NSSRTM-LNG] + [Regasification (20cents/MMBt)])

Margin differential, Japan — GB
([LNG-AS] — [TR-NSSOSA-LNG] — [NGLNUSMBTMc1] + [TR-NSSTHP-LNG] + [Regasification (20cents/MMBt)])

 

RDP libraries Code example

Note: to read configuration from the file config.ini with the format below

    	
            [RDP]
app_key = YOUR_RDP_APP_KEY
[RDMS]
api = YOUR_RDMS_INSTANCE_URL
app_key = YOUR_RDMS_APP_KEY
    	
            

CONFIGURATION_FILE = "config.ini"

config = configparser.ConfigParser()

config.read(CONFIGURATION_FILE)

 

rdp_app_key = config["RDP"]["app_key"]

rdms_app_key = config["RDMS"]["app_key"]

rdms_url = config["RDMS"]["api"]

Then, retrieving data from RDP libraries and merging them together as a preparation for the next step. Each instrument description can be checked in the section Instrument and the parameter used above

    	
            

rdp.open_desktop_session(rdp_app_key)

 

start = "2019-08-01"

end = dt.datetime.today()

 

# The price of the gas from the pipeline

## NYMEX Henry Hub Natural Gas Electronic Energy Future Continuation 1

df = rdp.get_historical_price_summaries('NGc1',

                                         fields = ['SETTLE'],

                                         interval = rdp.Intervals.WEEKLY,

                                         start=start, end=end)

df.rename(columns={'SETTLE':'NGc1'}, inplace=True)

 

# Price of LNG in Asia

## Liquefied Natural Gas Asia DES Weekly Assessment

df1 = rdp.get_historical_price_summaries(

    "LNG-AS", fields=["MID_PRICE"], interval=rdp.Intervals.WEEKLY, start=start, end=end

)

df1.rename(columns={"MID_PRICE": "LNG-AS"}, inplace=True)

df = df.merge(df1, how="outer", left_index=True, right_index=True)

 

# Price of LNG in Netherlands

## Endex NL Netherlands TTF Natural Gas MMBTU Monthly Continuation 1

df2 = rdp.get_historical_price_summaries(

    "TFMBUSMBTMc1",

    fields=["TRDPRC_1"],

    interval=rdp.Intervals.WEEKLY,

    start=start,

    end=end,

)

df2.rename(columns={"TRDPRC_1": "TFMBUSMBTMc1"}, inplace=True)

df = df.merge(df2, how="outer", left_index=True, right_index=True)

 

# Price of LNG in United Kingdom

## ICE GB (Great Britain) NBP Natural Gas MMBTU Monthly Continuation 1

df3 = rdp.get_historical_price_summaries(

    "NGLNUSMBTMc1",

    fields=["TRDPRC_1"],

    interval=rdp.Intervals.WEEKLY,

    start=start,

    end=end,

)

df3.rename(columns={"TRDPRC_1": "NGLNUSMBTMc1"}, inplace=True)

df = df.merge(df3, how="outer", left_index=True, right_index=True)

 

# Voyage price from US to Japan

## Liquefied Natural Gas from United States Of America (US) Sabine Pass to Japan (JP) Osaka

df4 = rdp.get_historical_price_summaries("TR-NSSOSA-LNG", start=start, end=end)

df4.rename(columns={"TRDPRC_1": "TR-NSSOSA-LNG"}, inplace=True)

df4 = df4.resample("W-FRI").last()

df = df.merge(df4, how="outer", left_index=True, right_index=True)

 

# Voyage price from US to Netherlands

## Liquefied Natural Gas from United States Of America (US) Sabine Pass to Netherlands (NL) Rotterdam

df5 = rdp.get_historical_price_summaries("TR-NSSRTM-LNG", start=start, end=end)

df5.rename(columns={"TRDPRC_1": "TR-NSSRTM-LNG"}, inplace=True)

df5 = df5.resample("W-FRI").last()

df = df.merge(df5, how="outer", left_index=True, right_index=True)

 

# Voyage price from US to United Kingdom

## Liquefied Natural Gas from United States Of America (US) Sabine Pass to United Kingdom (GB) Thames

df6 = rdp.get_historical_price_summaries("TR-NSSTHP-LNG", start=start, end=end)

df6.rename(columns={"TRDPRC_1": "TR-NSSTHP-LNG"}, inplace=True)

df6 = df6.resample("W-FRI").last()

df = df.merge(df6, how="outer", left_index=True, right_index=True)

 

df = df.apply(pd.to_numeric)

df.ffill(inplace=True)

Calculate margins from the formulas mentioned above

    	
            

df['Margin JP-NL'] = df['LNG-AS'] - df['TR-NSSOSA-LNG'] - df['TFMBUSMBTMc1'] + df['TR-NSSRTM-LNG'] + (20 * 0.01) #Regastification

df['Margin JP-GB'] = df['LNG-AS'] - df['TR-NSSOSA-LNG'] - df['NGLNUSMBTMc1'] + df['TR-NSSTHP-LNG'] + (20 * 0.01) #Regastification

 

df['Margin JP'] = df['LNG-AS'] - df['TR-NSSOSA-LNG'] - df['NGc1'] * 1.15

df['Margin NL'] = df['TFMBUSMBTMc1'] - df['TR-NSSRTM-LNG'] - df['NGc1'] * 1.15  - (20 * 0.01) #Regastification

df['Margin GB'] = df['NGLNUSMBTMc1'] - df['TR-NSSTHP-LNG'] - df['NGc1'] * 1.15  - (20 * 0.01) #Regastification

Flow: using RDMS — LNG from the US to the same destinations

  • In the RDMS web application, you can check the Trade Flows data of the LNG vessels and can also put the filter on each field. In the example below, filters for LNG Load country and discharge country are applied
  • Then after clicking ‘View report’, here’s the result

Form the RDMS API call

Calling RDMS API with these filters

    	
            

headers = {"Authorization" : rdms_app_key, "Accept":"text/csv"}

 

filter = "LoadCountry=United States,Virgin Islands (U.S.);Product=Liquefied Natural Gas;DischargeCountry=Japan,Netherlands,United Kingdom"

fields = "DepartureDate,Volume,DischargeCountry"

 

result = requests.get(rdms_url + "/Flows/FlowData/LNG/?Fields="+fields+"&Filter="+filter, headers=headers, verify=True)

 

flows = open("Flows.csv", "w")

flows.write(result.text)

flows.close()

 

df_flows = pd.read_csv("Flows.csv", parse_dates=True, infer_datetime_format=True)

df_flows["Date"] = pd.to_datetime(df_flows["Departure Date"]).dt.date

df_flows["Date"] = pd.to_datetime(

    df_flows["Date"], infer_datetime_format=True

)

df_flows.set_index("Date", inplace=True)

df_flows = df_flows["2019-08-01":]

 

df_flows

Below is the sample of an output dataframe, the volume here is in Cubic Metres

Visualization

As we already have the data we need, now let’s do the visualization. I’m comparing the graphs of volume and margin of each destination, and the margin differential, to show that Asia gets higher profit than Europe. The code for plotting graphs and graphs are below

    	
            

plt.rcParams["figure.figsize"] = (16,20)

fig, (ax1, ax2, ax3) = plt.subplots(3)

 

ax1.set_title('Volume of LNG in the vessel', fontdict={'fontsize': 15, 'fontweight': 'medium'})

df_flows.groupby('Discharge Country').resample('M').sum().unstack(level=0).plot(ax=ax1)

 

df_plot = df[:max(df_flows.index).strftime("%Y-%m-01")]

 

ax2.set_title('Margin of each destination', fontdict={'fontsize': 15, 'fontweight': 'medium'})

df_plot[['Margin JP','Margin NL','Margin GB']].plot(ax=ax2)

 

ax3.set_title('Margin differentials between Asia and Europe'

              , fontdict={'fontsize': 15, 'fontweight': 'medium'})

df_plot[['Margin JP-NL','Margin JP-GB']].plot(ax=ax3)

 

ax1.grid()

ax2.grid()

ax3.grid()

 

plt.show()

Conclusion

Here are the graphs, you could see that the volume of LNG shifted to Japan went down in September and raised in October 2020, this could be because the winter of that year was colder than usual and there’s a shortage of LNG in Southeast Asia (including Japan) too.

This higher demand and lower supply caused the price of LNG in Japan to be raised, there’s also a huge spike in January 2021 due to this reason.

Plus, as the LNG volume to each destination is lower this year (since March) compared to the end of last year, you could see that the margin of each destination is raising as well due to the shortage of supply.

According to our hypothesis “Taking into account the cost of freight, there are times when an arbitrage opportunity exists for a US exporter to shift the volume from Europe to Asia or vice versa.” the result is, since the huge spike in January 2021, which is a substantial price differential between Europe and Asia, we can see the flow moving into the region where the selling price is higher (Japan).

Complete source code for this article can be downloaded from Github

https://github.com/Refinitiv-API-Samples/Article.EikonAPI.Python.LNG.arbitrage

  • Register or Log in to applaud this article
  • Let the author know how much this article helped you
If you require assistance, please contact us here