Paquete NSEpy para descargar 15 años de datos de Nifty Options

Contenidos

Descarguemos los datos para un contrato de opción única para que tengamos una idea de qué entradas se necesitan

# lets try to download for a single option first; manually specify dates
sample_opt1 = get_history(symbol="NIFTY",
                        start = date(2004,11,1), end = date(2005,1,27),
                        index = True,
                        option_type="PE",
                        strike_price = 2000,
                        expiry_date = date(2005,1,27))
print(sample_opt1.shape)
sample_opt1.head(n=3)
Descargar la muestra de datos de Nifty Options sata NSEpy

Datos de muestra para una sola opción

Para cada contrato de alternativas, debemos ingresar 5 variables: las fechas de inicio y finalización, el tipo de opción, el precio de ejercicio (contrato) y su fecha de vencimiento. El sitio de NSE nos posibilita descargar solo datos de alternativas para 1 contrato al mismo tiempo. Vea la captura de pantalla a continuación.

Dado que nuestro objetivo es observar el impacto de los eventos del cisne negro, necesitamos profundizar en las alternativas de dinero para la estrategia. Esto significa que para cada mes necesitamos más de 20 precios de alternativas durante 90 meses (15 años). Necesitamos hacer un bucle, caso contrario nos volvemos locos 🙂

Seleccionar la mejor opción entre las alternativas

Para cada precio de ejercicio, tenemos dos tipos de alternativas. Recuerde que una opción es un contrato que nos posibilita comprar el post subyacente (NSE Nifty para nosotros) a un precio previamente acordado en una fecha futura, independientemente del precio de mercado en la fecha de vencimiento. Las alternativas de compra son un derecho a comprar el subyacente y se usan cuando el precio de mercado aumenta, mientras que las alternativas de venta son el derecho a comercializar y se usan para protegerse cuando el mercado cae.

El NSE tiene opciones semanales, mensuales y anuales listado en su sitio web para precios de ejercicio que estén suficientemente por encima y por debajo de los niveles actuales del mercado (además conocido como precio de opción al precio del dinero). Vea la captura de pantalla del sitio de NSE a continuación

Precios de opciones NSE por vencimiento NSEpy

Precios de alternativas NSE por vencimiento

De todas estas opciones, las alternativas mensuales son las más líquidas para el mes actual y el próximo. La liquidez cambia al mes siguiente a medida que el mes actual se acerca a su vencimiento. Las alternativas semanales se iniciaron hace unos años, pero carecen de liquidez suficiente más allá de la semana actual y la próxima.En resumen, necesitamos descargar los datos de las alternativas mensuales con una fecha de inicio 3 meses antes del vencimiento de los precios de ejercicio ~ 1000 puntos por encima y por debajo los precios más altos y más bajos del mes durante 90 meses.

Clasificando fechas

Las alternativas mensuales se liquidan el último jueves de cada mes. La fecha actual se establece como un “objeto. Usamos el valor relativo de la biblioteca dateutils para obtener la fecha de inicio de la descarga retrocediendo 2 meses (ver meses = -2)

# current date - 3 months prior to the 1st option contract expiry
current_date = date(2005, 1,1); print(current_date); print(type(current_date))
type(current_date)
Ordenar fechas descargar datos de opciones ingeniosas NSEpy
# price download start date
start_date = current_date + relativedelta(months = -2); print(start_date); print(type(start_date))
start_month = current_date.month; print('Start Month:', start_month)
start_yr = start_date.year; print('Start Year: ', start_yr)
Datos del año de inicio de NSEpy

Las alternativas de NSE caducan el último jueves del mes para las alternativas diarias y todos los jueves para las alternativas semanales. Durante la última semana del mes, la opción mensual se duplica como la opción semanal. Usamos la función `get_expiry` de la biblioteca NSEPy para obtener la lista de datos de todos los jueves del mes y ponerla dentro de una función max para obtener la fecha del último jueves o el vencimiento mensual.

# get expiry date
end_month = current_date.month; print('End Month:', end_month)
end_yr = current_date.year; print('End Year: ', end_yr)

# Use the get expiry function to get a list of expiry dates - sample below
# get_expiry_date returns a list of weekly expiries; use max to get the month end expiry date

expiry_date = max(get_expiry_date(year = end_yr, month = end_month))
print('Expiry_date:', expiry_date, 'Type: ', type(expiry_date))
type(expiry_date)
descargar caducidad de datos de opciones ingeniosas

Vamos a bucle

Con un control claro de las fechas de inicio y finalización, procedemos a incrustarlas en un ciclo para permitirnos llamar a la función `get_expiry` para cada mes durante 15 años. Usaremos bucles for anidados para esto.

Para identificar el rango de precios de ejercicio de las alternativas, obtenemos el valor de cierre de Nifty para cada mes; Defina un rango de precios de ejercicio que estén 1000 puntos por encima del precio más alto del mes y 1000 puntos por debajo del cierre más bajo de ese mes. Para cada opción, obtenemos precios diarios que son 3 meses antes de la fecha de vencimiento.

Antes de codificar, hagamos un resumen y entendamos qué es exactamente lo que queremos recorrer. Queremos datos de alternativas mensuales durante 15 años, dicho de otra forma, 180 meses. Para cada mes, suponga que el rango promedio entre los valores altos y bajos es de 300 puntos. Con más de 1000 puntos por encima del punto alto y 1000 puntos por debajo del punto de opción, tenemos 23 precios de ejercicio de alternativas en cada mes y 2 tipos de alternativas: Puts y Calls; lo que nos lleva a 46 opciones discretas por mes. 46 opciones multiplicadas por 180 meses nos da 8280 precios de ejercicio.

Los bucles anidados se ejecutan de la próxima manera:

Para cada año en el rango → Para cada mes del año → Para cada huelga

# establece and month year range to loop over
month_list = np.arange(1, 13, step = 1); print(month_list)
# break the year list into 2 parts - 2005 to 2012 and 2013 to 2020
yr_list = np.arange(2005, 2012, step = 1 ); print(yr_list)
# create empty dataframe to store results
nifty_data = pd.DataFrame() # to use in the loop
option_data = pd.DataFrame() # to store output
counter = 0
# break the loop into 2 parts to avoid querying errors
for yr in yr_list:
    # loop through all the months and years
    print('Year: ', yr)
    for mnth in month_list:
        current_dt = date(yr, mnth, 1)
        start_dt = current_dt + relativedelta(months = -2)
        end_dt = max(get_expiry_date(year = yr, month = mnth))
        
        # print('current: ', current_dt)
        # print('start: ', start_dt)
        # print('end: ', end_dt)
        
        # get nifty futures data
        nifty_fut = get_history(symbol="NIFTY",
                               start = start_dt, end = end_dt,
                               index = True,
                               expiry_date = end_dt)
        nifty_data = nifty_data.append(nifty_fut)
        
        # calculate high and low values for each month; round off to get strike prices
        high = nifty_fut['Close'].max()
        high = int(round(high/100)*100) + 1000# ; print('High:', high)
        
        low = nifty_fut['Close'].min()
        low = int(round(low/100)*100) + 1000# ; print('Low :', low)
        
        for strike in range(low, high, 100): # start, stop, step
            """
            get daily closing nifty index option prices for 3 months 
            over the entire range 
            """
            #time.sleep(random.randint(10,25)) # pause for random interval so as to not overwhelm the site
            nifty_opt = get_history(symbol="NIFTY",
                                   start = start_dt, end = end_dt,
                                   index = True, option_type="PE",
                                   strike_price = strike,
                                   expiry_date = end_dt)
            
            option_data = option_data.append(nifty_opt)
            
            #time.sleep(random.randint(20,50)) # pause for random interval so as to not overwhelm the site
            nifty_opt = get_history(symbol="NIFTY",
                                   start = start_dt, end = end_dt,
                                   index = True, option_type="CE",
                                   strike_price = strike,
                                   expiry_date = end_dt)
            
            option_data = option_data.append(nifty_opt)
            
        counter+=1
        print('Months: ', counter)

¡Y voilá! Tenemos 15 años de datos de alternativas para una gama de precios de ejercicio que se pueden almacenar en csv; verifiquemos antes de almacenar

# visually verify
print(option_data.shape)
option_data.tail()
producción

Todo el código anterior está en esto Página de GitHub.

Conéctate conmigo en LinkedIn, Gorjeo, o Medio para mantenerse actualizado. ¡Eso es todo amigos!

Nota: Todo el contenido es para fines de investigación y no para recomendaciones de inversión. Te sugiero que no intentes lo mismo sin consultar a un asesor financiero registrado y solo entonces tomes decisiones de inversión.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.