How to get the option chain for an asset from codebook app?

PaulaNavarroLSEG
edited 6:08AM in Eikon Data APIs

Hi Dev.Teaam ,

May I request for your assistance on this Client's query please? Thank you.

eikon_data_extractor.py (v4)

import datetime as dt
import pandas as pd
import eikon as ek

---------------------------------------------------------------------1. Conexión (usa tu App Key)

ek.set_app_key("")
ek.set_timeout(120)

Si tu sesión de Workspace ya está autenticada, puedes comentar la línea anterior.---------------------------------------------------------------------2. Parámetros

ASSET_RIC = ".SPX"
MATURITY = "2025-07-18"
START_HIST = "2015-01-01"
END_HIST = dt.date.today()
BATCH = 250

---------------------------------------------------------------------3. Utilidad para guardar CSV

def to_csv(df: pd.DataFrame, filename: str) -> None:
df.to_csv(filename, index=False)
print(f"✅ Guardado {filename}")

---------------------------------------------------------------------4. Localizar un chain-RIC que no devuelva error

def find_working_chain(asset_ric: str) -> str:
candidates = [
f"0#{asset_ric}", # 0#.SPX
f"{asset_ric}", # .SPX
f"{asset_ric}w*", # .SPXw*
f"0#{asset_ric}w*", # 0#.SPXw*
f"{asset_ric}.U", # .SPX.U
f"0#{asset_ric}.U", # 0#.SPX.U
]
for ric in candidates:
test_df, err = ek.get_data(ric, ["TR.RIC"])
if err is None and not test_df.empty:
print(f" Usando cadena: {ric}")
return ric
raise RuntimeError(
"Ninguno de los patrones de cadena RIC ha sido reconocido.
"
"Comprueba tu licencia o prueba con otro activo."
)

---------------------------------------------------------------------5. Cadena de opciones + griegas

def fetch_option_chain(asset_ric: str, maturity: str) -> pd.DataFrame:
chain_ric = find_working_chain(asset_ric)
fields = [
"TR.RIC", "TR.OptionExpirationDate", "TR.OptionType",
"TR.OptionStrike", "TR.ImpliedVolatility",
"TR.GreekDelta", "TR.GreekGamma", "TR.GreekVega", "TR.GreekTheta",
"TR.Bid", "TR.Ask", "TR.Volume"
]
df, err = ek.get_data(chain_ric, fields)
if err:
raise RuntimeError(err)

maturity_dt = pd.to_datetime(maturity)
df = df[pd.to_datetime(df["Option Expiration Date"]) == maturity_dt]

if df.empty:
raise RuntimeError(
f"No se encontraron opciones con vencimiento {maturity} "
f"en la cadena {chain_ric}."
)
return df.reset_index(drop=True)

---------------------------------------------------------------------6. Spot del subyacente

def fetch_spot(asset_ric: str) -> pd.DataFrame:
spot_df, err = ek.get_data(asset_ric, ["TRDPRC_1", "BID", "ASK"])
if err:
raise RuntimeError(err)
return spot_df

---------------------------------------------------------------------7. Curva libre de riesgo

def fetch_risk_free(start: str, end: str) -> pd.DataFrame:
rf_df = ek.get_timeseries("USGG3M=RR", start_date=start,
end_date=end, interval="daily")
rf_df = (rf_df.rename(columns={"CLOSE": "rf_rate"})
.reset_index()
.rename(columns={"Date": "date"}))
return rf_df

---------------------------------------------------------------------8. Series históricas

def fetch_histories(asset_ric: str, start: str, end: str):
asset_hist = ek.get_timeseries(asset_ric, start_date=start,
end_date=end, fields="CLOSE",
interval="daily")
vix_hist = ek.get_timeseries(".VIX", start_date=start,
end_date=end, fields="CLOSE",
interval="daily")
asset_hist = (asset_hist.rename(columns={"CLOSE": "close"})
.reset_index()
.rename(columns={"Date": "date"}))
vix_hist = (vix_hist.rename(columns={"CLOSE": "vix"})
.reset_index()
.rename(columns={"Date": "date"}))
return asset_hist, vix_hist

---------------------------------------------------------------------9. Ejecución principal

if name == "main":

9-a Opciones

opt_df = fetch_option_chain(ASSET_RIC, MATURITY)
to_csv(opt_df, f"options_{ASSET_RIC.strip('.')}_{MATURITY}.csv")

9-b Spot

spot_df = fetch_spot(ASSET_RIC)
to_csv(spot_df, f"spot_{ASSET_RIC.strip('.')}.csv")

9-c Curva libre de riesgo

rf_df = fetch_risk_free(START_HIST, END_HIST)
to_csv(rf_df, "risk_free_curve.csv")

9-d Series históricas

asset_hist, vix_hist = fetch_histories(ASSET_RIC, START_HIST, END_HIST)
to_csv(asset_hist, f"history_{ASSET_RIC.strip('.')}.csv")
to_csv(vix_hist, "history_VIX.csv")

Client is using it wirhout API Key

Answers

  • Jirapongse
    Jirapongse ✭✭✭✭✭

    @PaulaNavarroLSEG

    Thank you for reaching out to us.

    Do you mean this chain RIC: 0#SPXW*.U?

    I can use the Search API to find this RIC on Codebook.

    ld.discovery.search(
    view = ld.discovery.Views.EQUITY_QUOTES,
    top = 10,
    filter = "RCSAssetCategoryLeaf eq 'Stock Index Cash Option' and UnderlyingQuoteRIC eq '.SPX' and IsChain eq true"

    )

    The search example is at __Examples__/01. Data Retrieval and Discovery/01.01. LSEG Data Library/Access__Search.ipynb.