# proviamo prima a scaricare per una singola opzione; specificare manualmente le date sample_opt1 = get_history(simbolo="NIFTY", inizio = data(2004,11,1), fine = data(2005,1,27), indice = Vero, option_type="SU", strike_price = 2000, data_scadenza = data(2005,1,27))
Stampa(sample_opt1.shape) sample_opt1.head(n=3)
Per ogni contratto alternativo, dobbiamo entrare 5 variabili: le date di inizio e fine, il tipo di opzione, il prezzo di esercizio (contrarre) e la sua data di scadenza. Il sito NSE ci permette di scaricare solo dati da alternative a 1 contratto allo stesso tempo. Guarda lo screenshot qui sotto.
Poiché il nostro obiettivo è osservare l'impatto degli eventi del cigno nero, dobbiamo approfondire le alternative monetarie per la strategia. Ciò significa che per ogni mese abbiamo bisogno di più di 20 prezzi alternativi durante 90 mesi (15 anni). Dobbiamo fare un giro, altrimenti diventiamo matti 🙂
Seleziona l'opzione migliore tra le alternative
Per ogni prezzo di esercizio, abbiamo due tipi di alternative. Ricorda che un'opzione è un contratto che ci consente di acquistare il post sottostante (NSE Nifty per noi) a un prezzo precedentemente concordato in una data futura, indipendentemente dal prezzo di mercato alla data di scadenza. Le alternative di acquisto sono un diritto di acquistare il sottostante e vengono utilizzate quando il prezzo di mercato aumenta, mentre le alternative di vendita sono il diritto al commercio e servono per proteggersi quando il mercato scende.
La NSE ha opzioni settimanali, mensile e annuale elencato sul tuo sito web per prezzi di esercizio sufficientemente al di sopra e al di sotto degli attuali livelli di mercato (noto anche come il prezzo dell'opzione al prezzo del denaro). Guarda lo screenshot del sito NSE qui sotto
Di tutte queste opzioni, le alternative mensili sono le più liquide per il mese in corso e per il prossimo. La liquidez cambia al mes siguiente a misuraIl "misura" È un concetto fondamentale in diverse discipline, che si riferisce al processo di quantificazione delle caratteristiche o delle grandezze degli oggetti, fenomeni o situazioni. In matematica, Utilizzato per determinare le lunghezze, Aree e volumi, mentre nelle scienze sociali può riferirsi alla valutazione di variabili qualitative e quantitative. L'accuratezza della misurazione è fondamentale per ottenere risultati affidabili e validi in qualsiasi ricerca o applicazione pratica.... que el mes actual se acerca a su vencimiento. Le alternative settimanali sono iniziate qualche anno fa, ma mancano di liquidità sufficiente oltre la settimana in corso e la prossima., dobbiamo scaricare i dati delle alternative mensili con una data di inizio 3 mesi prima della scadenza dei prezzi di esercizio ~ 1000 punti sopra e sotto i prezzi più alti e più bassi del mese durante 90 mesi.
Date di ordinamento
Le alternative mensili vengono stabilite l'ultimo giovedì di ogni mese. La data corrente è impostata come un "oggetto. Usiamo il valore relativo della libreria dateutils per ottenere la data di inizio del download tornando indietro 2 mesi (vedi mesi = -2)
# data odierna - 3 mesi prima della scadenza del 1° contratto di opzione data_corrente = data(2005, 1,1); Stampa(data odierna); Stampa(genere(data odierna)) genere(data odierna)
# prezzo data di inizio download data_inizio = data_corrente + relativedelta(mesi = -2); Stampa(data d'inizio); Stampa(genere(data d'inizio)) mese_inizio = data_corrente.mese; Stampa("Mese di inizio":', inizio_mese)
anno_inizio = data_inizio.anno; Stampa("Inizio anno": ', anno_iniziale)
Le alternative NSE scadono l'ultimo giovedì del mese per le alternative giornaliere e ogni giovedì per le alternative settimanali. Durante l'ultima settimana del mese, l'opzione mensile funge anche da opzione settimanale. Usiamo la funzione `get_expiry` dalla libreria NSEPy per ottenere l'elenco dei dati per tutti i giovedì del mese e lo inseriamo in una funzione max per ottenere la data dell'ultimo giovedì o la data di scadenza mensile..
# ottenere la data di scadenza fine_mese = data_corrente.mese; Stampa("Fine mese":', fine_mese) anno_finale = data_corrente.anno; Stampa("Fine anno": ', fine_anno) # Usa la funzione ottieni scadenza per ottenere un elenco di date di scadenza - esempio sotto # get_expiry_date restituisce un elenco di scadenze settimanali; usa max per ottenere la data di scadenza di fine mese data_scadenza = max(ottenere la data di scadenza(anno = anno_fine, mese = fine_mese)) Stampa('Data di scadenza:', data di scadenza, 'Tipo: ', genere(data di scadenza)) genere(data di scadenza)
Facciamo il ciclo
Con un chiaro controllo delle date di inizio e fine, procediamo a incorporarli in un ciclo per consentirci di chiamare la funzione `get_expiry` per ogni mese durante 15 anni. Useremo i cicli for annidati per questo.
Per identificare la fascia di prezzo di esercizio delle alternative, otteniamo il valore di chiusura di Nifty per ogni mese; Definire una gamma di prezzi di esercizio che siano 1000 punti sopra il prezzo più alto del mese e 1000 punti al di sotto della chiusura più bassa di quel mese. Per ogni opzione, otteniamo prezzi giornalieri che sono 3 mesi prima della data di scadenza.
Prima di codificare, facciamo un riassunto e capiamo esattamente cosa vogliamo passare attraverso. Vogliamo dati sulle alternative mensili durante 15 anni, In altre parole, 180 mesi. Per ogni mese, Supponiamo che l'intervallo medio tra valori alti e bassi sia 300 punti. Più di 1000 punti sopra il punto più alto e 1000 punti sotto il punto opzione, avere 23 prezzi di esercizio delle alternative in ogni mese e 2 tipi di alternative: mette e chiama; che ci porta a 46 opzioni discrete al mese. 46 opzioni moltiplicate per 180 mesi ci danno 8280 prezzi di sciopero.
I cicli annidati vengono eseguiti come segue:
Per ogni anno nell'intervallo → Per ogni mese dell'anno → Per ogni sciopero
# etablece e l'intervallo del mese dell'anno su cui eseguire il ciclo lista_mese = np.arange(1, 13, passo = 1); Stampa(mese_lista)
# spezzare l'elenco degli anni in 2 parti - 2005 a 2012 e 2013 a 2020 yr_list = np.arange(2005, 2012, passo = 1 ); Stampa(yr_list)
# creare un dataframe vuoto per memorizzare i risultati nifty_data = pd.DataFrame() # da usare nel ciclo option_data = pd.DataFrame() # per memorizzare l'output contatore = 0
# rompere il ciclo in 2 parti per evitare errori di interrogazione per anni in yr_list: # scorrere tutti i mesi e gli anni Stampa('Anno: ', anni) per mese in mese_lista: dt_corrente = data(anni, mese, 1) start_dt = current_dt + relativedelta(mesi = -2) end_dt = max(ottenere la data di scadenza(anno = anno, mese = mese)) # Stampa('attuale: ', dt_corrente) # Stampa('cominciare: ', start_dt) # Stampa('fine: ', end_dt) # ottieni ottimi dati sui futures nifty_fut = get_history(simbolo="NIFTY", inizio = start_dt, end = end_dt, indice = Vero, scadenza_data = end_dt) nifty_data = nifty_data.append(nifty_fut) # calcolare i valori alti e bassi per ogni mese; arrotondare per ottenere i prezzi di esercizio alto = nifty_fut['Chiudere'].max() alto = int(il giro(alto/100)*100) + 1000# ; Stampa('Alto:', alto) basso = nifty_fut['Chiudere'].min() basso = int(il giro(basso/100)*100) + 1000# ; Stampa('Basso :', basso) per colpire in gamma(basso, alto, 100): # cominciare, fermare, fare un passo """ ottieni i prezzi delle opzioni sull'indice di chiusura giornaliera per 3 mesi su tutta la gamma """ #tempo.dormire(random.randint(10,25)) # mettere in pausa per intervallo casuale in modo da non sopraffare il sito nifty_opt = get_history(simbolo="NIFTY", inizio = start_dt, end = end_dt, indice = Vero, option_type="SU", strike_price = strike, scadenza_data = end_dt) option_data = option_data.append(nifty_opt) #tempo.dormire(random.randint(20,50)) # mettere in pausa per intervallo casuale in modo da non sopraffare il sito nifty_opt = get_history(simbolo="NIFTY", inizio = start_dt, end = end_dt, indice = Vero, option_type="QUESTO", strike_price = strike, scadenza_data = end_dt) option_data = option_data.append(nifty_opt) contatore+=1 Stampa('Mesi: ', contatore)
E voilà! Ho 15 anni di dati alternativi per una gamma di prezzi di esercizio che possono essere archiviati in csv; controlliamo prima di riporre
# verificare visivamente Stampa(option_data.shape) option_data.tail()
Tutto il codice sopra è in questo Pagina GitHub.
Connettiti con me su LinkedIn, Twitter, oh Metà per restare aggiornato. È tutto gente!
Nota: Tutto il contenuto è a scopo di ricerca e non per raccomandazioni di investimento. Ti suggerisco di non provare lo stesso senza consultare un consulente finanziario registrato e solo dopo prendere decisioni di investimento.