# 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)
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
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 medidaLa "medida" es un concepto fundamental en diversas disciplinas, que se refiere al proceso de cuantificar características o magnitudes de objetos, fenómenos o situaciones. En matemáticas, se utiliza para determinar longitudes, áreas y volúmenes, mientras que en ciencias sociales puede referirse a la evaluación de variables cualitativas y cuantitativas. La precisión en la medición es crucial para obtener resultados confiables y válidos en cualquier investigación o aplicación práctica.... 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)
# 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)
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)
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()
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.