Chiudiamo la serie di 3 Articoli sulla codifica e backtest di Strategie con le Opzioni su OptionLAB, con qualcosa di più sofisticato. Strategia opzioni
Per l’esame di questa strategia andiamo ad utilizzare TradeStation per descrivere l’idea che abbiamo in mente, in quanto ci fornisce il maggior grado di libertà nell’ideazione di strategie classiche da traslare poi nel mondo delle opzioni attraverso l’OptionLAB. Sarà anche l’occasione per conoscere più da vicino questa piattaforma che abbiamo utilizzato anche per la realizzazione dell’analisi delle precedenti strategie.
Ciò è possibile grazie a un’interfaccia di comunicazione che OptionLAB (OE) è in grado di instaurare con TradeStation (TS). Questa interfaccia si compone in questa maniera:
futures SP500trading opzioni
F7) Integrazione fra TradeStation e OptionLAB
Affrontiamo i passaggi riassunti in questo diagramma di flusso uno alla volta.
Anzi tutto bisogna avere una strategia tradizionale concepita per TradeStation. Nel caso preso in esame durante il webinar la strategia era una semplice applicazione mean-reverting sul futures dello Standard and Poor’s 500 elaborata sulle fasi di iper comprato e ipervenduto definite secondo l’indicatore RSI calcolato a 2 periodi. Vediamola:
strategie opzioni
trading opzioni
F8) La Strategia in Easy Language per TradeStation
Si vede subito come questo sistema vada a comprare nelle fasi di iper venduto e vendere nelle fasi di iper comprato. Il backtest di questa strategia restituisce questa equity line:
futures sp500trading system opzioni
F9) Equity line della Strategia in TradeStation (2006-2017)
strategie opzionitrading opzioni
F10) Metriche della Strategia in TradeStation (2006-2017)
Soffermiamoci ora a capire come poter codificare e testare questa stessa strategia utilizzando le opzioni invece del future sottostante. Quando abbiamo a che fare con le opzioni, infatti, le possibilità di poter operare su una indicazione rialzista o ribassista sono più di una. Una posizione ribassista, con il futures, può solo essere implementata con una vendita short, e una rialzista con l’apertura di una posizione long. Nelle opzioni una posizione rialzista può essere assunta attraverso l’acquisto di una call, la vendita di una put, o numerose possibili combinazioni di opzioni call e put. Anche stabilita la combinazione Call-Put e Buy-Sell, la selezione stessa dei contratti da negoziare (scadenza e strike) amplifica lo spazio in cui ci muoviamo di diversi ordini di grandezza. Ogni implementazione avrà il suo profilo rischio-rendimento, i suoi vantaggi e svantaggi, e la ricerca si fa dunque più profonda (e con essa la necessità di poter effettuare con precisione dei backtest per individuare la strategia più efficace per seguire questo trading system).
Abbiamo scelto di mostrare 3 diverse implementazioni di questa strategia impiegando opzioni, ma prima di prenderle in esame una alla volta, vediamo come poter effettuare backtest di strategie con le opzioni partendo dai segnali di un trading system sul contratto future sottostante.
La prima cosa da fare è dire a TradeStation dove andare a collocare il file di comunicazione con OptionLAB (la prima cosa da fare è stabilire quale directory utilizzare e poi assegnarla a una variabile nella strategia in easy language). La directory da utilizzare può essere una qualsiasi, ma si suggerisce di scegliere quella di default, in modo che successivamente l’OptionLAB sappia in automatico dove andare a cercare il file. Per copiare la directory di default è sufficiente andare nell’interfaccia principale dell’OE e cliccare Info -> Get Useful Directories -> TS Signal, come mostrato in figura:
futures sp500
trading system opzioni
F11) Integrazione fra TradeStation e OptionLAB
A questo punto una finestra vi chiederà il nome da dare al file per la prossima implementazione, questo vi permette di non sovrascrivere ogni volta lo stesso file, e di usarne anzi di diversi per le varie strategie. Una volta scelto il nome e premuto OK si aprirà una nuova finestra con il percorso completo del file che TS dovrà utilizzare per passare gli input di acquisto e vendita a OE.
strategie opzioni
trading opzioni
F12) Integrazione fra TradeStation e OptionLAB
Non dovete fare altro che copiare il percorso e andare nell’ambiente di sviluppo di Easy Language. Create una variabile e assegnatele la directory appena copiata. Le funzioni di acquisto e vendita delle opzioni altro non fanno che scrivere sul file in questione e non hanno bisogno quindi di restituire alcun valore. Tuttavia Easy Language costringe le funzioni a restituire un valore anche se non devono farlo, ed è per questo motivo che tutte le funzioni di integrazione restituiscono uno 0 (inutile), che andrà semplicemente ignorato. Per questo va creata una variabile “cestino” in cui ogni volta andare a depositare questo valore, noi l’abbiamo chiamata Bin. Dopo aver creato le variabili di nostra utilità, andrà sempre chiamata, come prima cosa, la funzione di reset e aggiornamento del file di comunicazione. La funzione si chiama ResetFile, e deve essere sempre posta in cima a qualsiasi codice che miri a integrare TS con OE.
In poche parole un codice EasyLanguage per strategie in opzioni dovrà sempre iniziare con queste due righe:
futures sp500
trading system opzioni
F13) Integrazione fra TradeStation e OptionLAB
Il gioco è fatto, ora la comunicazione tra TradeStation e OptionLAB potrà avvenire correttamente, non ci resta che codificare la nostra rielaborazione in opzioni di questa strategia sullo Standard and Poor’s 500 Future.
Ed ecco come abbiamo implementato le 3 diverse Strategia con le Opzioni per poter seguire questi segnali generati dal Trading System sul Future.
Come detto abbiamo utilizzato tre diversi approcci nella traslazione da futures a opzioni, vediamoli uno alla volta.
a. Nella prima delle tre abbiamo fatto si che le posizioni long fossero assunte attraverso l’acquisto di opzioni call ATM, e le posizioni short attraverso l’acquisto di opzioni put ATM.
Per far si che TS dica a OE (nel proseguo abbreviamo così i nomi delle due piattaforme) di comprare opzioni è sufficiente utilizzare le funzioni BuyCall e BuyPut. Per indicare a OE cosa fare, queste due funzioni hanno bisogno di alcuni parametri: lo strike dell’opzione, la scadenza, il numero di contratti da negoziare, il gruppo a cui assegnare l’opzione, il nome da dare all’ingresso e il percorso del file su cui andare a scrivere i segnali per OE.
Lo strike viene elaborato attraverso la stessa funzione che utilizzeremmo in OE: GetStrike, che si comporta esattamente come in Option Language. In modalità “Nearest” dice all’OE di andare a cercare nella chain lo strike disponibile più vicino a un certo prezzo, in modalità “Delta” dice all’OE di andare a prendere quello strike la cui opzione ha un delta più prossimo a un certo valore, e in modalità “Moneyness” fa si che l’OE prenda lo strike la cui moneyness è più vicina a quella da noi indicata.
Volendo negoziare opzioni ATM abbiamo due possibilità: utilizzare lo strike più vicino (“Nearest”) alla chiusura, o quello con una “Moneyness” più vicina a 0. Queste due formulazioni sono equivalenti e restituirebbero il medesimo strike. Abbiamo deciso di utilizzare la formulazione “Nearest”.
La selezione della scadenza da negoziare funziona in modo analogo, attraverso la funzione GetMaturity. In questo caso noi vogliamo negoziare la prima scadenza disponibile, il che vuol dire che vogliamo selezionarla sulla base della sua posizione, che vogliamo essere la prima. Per questo motivo abbiamo utilizzato GetMaturity in modalità “ByPos” (by position) indicando 0, ovvero la prima scadenza disponibile. L’altra modalità, che però oggi non abbiamo impiegato, è quella di prevedere un minimo di giorni di vita residua, la modalità “MinDays”.
Indichiamo ora di negoziare 1 solo contratto, di considerare il trade come singolo e non assegnarlo ad alcun gruppo (-1), e abbiamo dato all’entry il nome “RSI LCall Entry”.
Poiché le posizioni saranno gestite dal backtester in OE, e non da quello in TS (che scrive solo su un file quando entrare e quando uscire), il nome dell’Entry acquista una discreta rilevanza. TS, infatti, non sa quando siamo in posizione e quando no, quindi ogni volta che le condizioni sono verificate andrà a scrivere sul file di entrare a mercato, anche nel caso in cui non fossimo ancora usciti dal trade precedente, poiché non ha modo di sapere che in fase di backtest su opzioni saremmo ancora dentro.
Noi però possiamo dire all’OE, quando andremo a testare questa strategia sulle opzioni, di ignorare i segnali di TS qualora il nome dell’Entry fosse uguale a quella di un trade correntemente aperto.
Infine abbiamo detto alla funzione che il file in cui scrivere tutte queste informazione è quello al percorso contenuto nella variabile MyDirectory.
Questo è il risultato, e più o meno, le funzioni BuyCall, BuyPut, SellCall, e SellPut avranno sempre questo formato:
strategie opzioni
trading opzioni
F14) La codifica in Easy Language dell’Acquisto/Vendita di Opzioni
Nella scrittura dei vari parametri della funzione BuyCall sono andato a capo per dare al codice una struttura suddivisa in Strike/Maturity/Contratti,Gruppo,Etichetta/Directory. A mio avviso rende le cose più chiare e facili da gestire, manterremo quindi questo formato per tutto il corso di questo articolo.
Prossimo passo è codificare la condizione di uscita dal lato rialzista. Per farlo utilizziamo la funzione Exit, che permette di chiudere un trade. Se il trade non venisse chiuso dalla funzione Exit verrebbe comunque chiuso autonomamente da Option Explorer una volta giunto a scadenza.
La funzione Exit prende 4 parametri, il numero del gruppo da cui uscire, il nome dell’entry da cui uscire, il nome da dare all’uscita e la solita directory.
I primi due parametri discriminano il modo in cui la funzione Exit si comporta, infatti essa è utilizzabile in 4 modi sulla base di che valori passiamo come numero del gruppo e nome dell’entry da cui uscire:
1. chiusura di tutti i trade aperti indiscriminatamente: non passiamo né un numero di gruppo né un nome entry: -1,
2. chiusura di tutti i trade appartenenti a un determinato gruppo: passiamo un numero di gruppo ma non un nome entry: GroupN,
3. chiusura di tutti i trade con un determinato nome entry: non passiamo un numero di gruppo, ma passiamo un nome entry: -1, Nome Entry
4. chiusura di tutti i trade, all’interno di un gruppo, con un certo nome entry: passiamo sia un numero di gruppo che un nome entry: GroupN, Nome Entry
Nel nostro caso l’unica informazione che abbiamo sul trade da chiudere è il suo nome entry, che abbiamo stabilito essere “RSI LCall Entry”. Quindi non passeremo alcun numero di gruppo, e passeremo invece “RSI LCall Entry” come nome entry.
Assegneremo poi “Exit Call” come nome dell’uscita in modo da distinguerla da “Maturity” nell’Option Explorer quando faremo il backtest. Passiamo poi MyDirectory. Questo è il risultato:
trading system opzioni
strategie opzioni
F15) La codifica in Easy Language dell’Acquisto/Vendita di Opzioni
In questo modo abbiamo concluso la costruzione del lato rialzista della strategia in opzioni. La componente ribassista verrà strutturata, in maniera analoga.
Ecco dunque il codice completo:
trading opzioni
futures sp500
F16) La codifica completa
Nel riquadro blu vediamo ingresso e uscita dal lato rialzista, mentre nel riquadro rosso ingresso e uscita del lato ribassista. La strategia è pronta, vediamo ora come effettuare il backtest.
La prima cosa da fare è lanciarla su Trade Station. Non vedrete generarsi alcun trade (è normale), ma se andate alla directory specificata nel codice vedrete ora un nuovo file. Aprendolo vi si presenterà tutta una serie di direttive, oltre all’equity giornaliera della strategia sul futures nel caso ne fosse prevista una, non è il nostro caso. Qui di seguito è un esempio:
trading system opzioni
strategie opzioni
F17) Il file di comunicazione fra TradeStation e OptionLAB
In questo foglio sono contenuti tutti i segnali che TS ha generato, e che l’OE dovrà andare a leggere ed eseguire sulle opzioni. Impiegheremo quindi una strategia codificata in OE che, per ogni giorno del backtest, dovrà andare a leggere nel file se esistono segnali da eseguire in quella giornata. Basterà quindi richiamare, in ogni barra, la funzione TSInputExecute(), e il gioco è fatto. Andiamo quindi nell’editor di Option Language in OE e creiamo una nuova strategia, chiamiamola TS Input Execution, a indicare che è in grado di replicare qualsiasi segnale ricevuto da Trade Station. La strategia sarà composta di due sole righe, le seguenti:
F18) Come fare leggere a OE il file con le operazioni esportare da TS
Compiliamo, e andiamo nel System Launcher per eseguire il backtest.
trading opzioni
futures sp500
F18) Il lancio del Backtest in OptionLAB
Anzi tutto selezioniamo la strategia appena creata (TS Input Execution). Come accennato precedentemente dobbiamo dire all’OE di ignorare un segnale qualora un trade con lo stesso nome sia già aperto. Per fare ciò eliminiamo il check dal campo “Allow Multiple Entries with Same Name”, come mostrato nel riquadro verde. Clicchiamo poi sul pulsante “Select TS Input File” per indicare all’Option Explorer qual è il file su cui sono contenuti i segnali che vogliamo eseguire in questo backtest (riquadro rosso).
Chiaramente andrà scelto il file appena generato. La casella Import Underlying Equity ci permette di importare dal file appena selezionato anche l’equity dei trade sul sottostante nel caso in cui la strategia ne prevedesse; non è però il nostro caso quindi ignoreremo questa impostazione. Selezioniamo simbolo e date del test e clicchiamo Launch. Un Performance Report viene generato, e possiamo quindi vedere come la nostra strategia tradizionale avrebbe operato se invece che utilizzare il futures avessimo utilizzato questa semplice strategia di acquisto di opzioni.
trading system opzioni strategie opzioni
F19) Acquisto di Opzioni ATM a sinistra e operatività con il Future a destra (2006-2017)
Vediamo che c’è parecchio margine di miglioramento (ma non dovrebbe essere una sorpresa vedere come l’acquisto di opzioni non produca risultati così interessanti), ma come abbiamo detto prima ora ci muoviamo in uno spazio enorme e possiamo fare tanto per migliorare questa equity. Prima di passare a una strategia che effettivamente va a migliorare queste performance mostriamo come scegliere lo strike a partire dalla deviazione standard, questo sarà il nostro secondo protocollo.
b. Nel secondo protocollo facciamo in modo che le posizioni long siano assunte attraverso l’acquisto di opzioni call ITM a una deviazione standard di distanza, e le posizioni short attraverso l’acquisto di opzioni put ITM sempre a una deviazione standard di distanza.
Questa volta, essendo che vogliamo indicare una moneyness come riferimento per la selezione degli strike, la funzione GetStrike sarà leggermente differente. Verrà infatti utilizzata in modalità “Moneyness” invece che in modalità “Nearest” come fatto precedentemente.
Il resto del codice resta invariato, vediamo dunque il risultato finale con le modifiche riquadrate di rosso:
trading opzioni
trading opzioni
F20) La codifica completaVediamo come sia per il lato rialzista che per il lato ribassista andiamo a scegliere uno strike con una Moneyness positiva (ITM) di una deviazione standard a 20 barre.
Ora proseguiamo, e vediamo come elaborare gli strike attraverso la terza modalità disponibile, quella del delta, e come migliorare il sistema originale attraverso una più complessa implementazione della strategia nelle opzioni.
c. Nel terzo protocollo assumeremo le posizioni rialziste attraverso la vendita a nudo di una opzione put a delta 50, e le posizioni ribassiste attraverso un bear credit spread (vendo call ATM, compro call delta 10).
Nella codifica di questo protocollo faremo utilizzo della funzione GetStrike in modalità delta. Per richiamare GetStrike in questa modalità, come ormai sarà chiaro, è sufficiente fare quanto segue:
In questo caso viene richiamato lo strike la cui opzione ha il delta più prossimo a 50. Inoltre utilizzeremo le funzioni di vendita a nudo, ovvero SellCall e SellPut. Il loro funzionamento è del tutto analogo a quello delle funzioni Buy. Vediamo il codice e commentiamolo:
futures sp500
trading system opzioni
F21) La codifica completa
Nella parte rossa vediamo come viene assunta una posizione rialzista, si noterà che a livello di codifica è simile al caso precedente. La differenza sta nel fatto che la funzione richiamata è SellPut (freccia rossa), in quanto vogliamo vendere a nudo una put. La funzione GetStrike, poi, è utilizzata in modalità “Delta”, che abbiamo già discusso, per reperire lo strike dell’opzione con delta più prossimo a 50. Cambiamo, infine, il nome dell’entry per coerenza, e aggiustiamo in maniera concorde la funzione Exit.
Nella parte blu, invece, vediamo come assumere una posizione ribassista attraverso un bear credit spread (frecce blu). Il credit spread lo componiamo vendendo una call ATM (utilizzando la funzione SellCall, e la funzione GetStrike in modalità “Nearest” indicando la chiusura corrente), e comprando una Call a delta 10 (utilizzando la funzione BuyCall, e la funzione GetStrike in modalità “Delta” indicando un valore di 0.1)
Una differenza importante, in questo caso, è che noi vogliamo che questi due trade vengano trattati come un’unica operazione combinata. A questo scopo, ormai dovremmo esserne pratici, utilizziamo i gruppi. Adoperando la solita sintassi GroupN = GrouN + 1 appena identificate le condizioni di ingresso garantiamo che il numero del gruppo sia sempre diverso. Andrà poi assegnato a entrambi i trade al posto del -1 (riquadri piccoli verdi).
Attribuiamo a entrambi i trade del credit spread un nome ciascuno, ciò ci permette di chiuderli invocando due volte la funzione Exit ivi indicando i nomi opportunamente. All’uscita diamo infine il nome di “Exit Credit Spread”. Lanciamo il backtest, e osserviamone il risultato:
strategie opzioni
trading opzioni
F22) L’Equity della strategia che prevede la Vendita di Put per i segnali rialzisti e un Call Credit Spread per quelli ribassisti.
futures sp500
trading system opzioni
F23) L’Equity della strategia che prevede la Vendita di Put per i segnali rialzisti e un Call Credit Spread per quelli ribassisti confrontata con quella dell’operatività sul Future.
L’equity è interessante e per certi versi anche migliore rispetto a quella sul future. Il rapporto NetProfit/MaxDD si incrementa infatti di più di un punto (da 6.5 a 7.0), mentre il Percent Profitable aumenta di addirittura da 72% a 82%. Si riducono i requisiti di marginazione e l’esposizione diventa frazionale rispetto a quella più impegnativa del contratto Future.
Non abbiamo voluto lavorare ulteriormente nello sviluppo della strategia sul Future (inserendo, ad esempio, Stop e Target) per non complicare ulteriormente la codifica, ma si suggerisce di procedere in questa direzione prima di iniziare a seguire un qualunque trading system.
Osserviamo la Trade List, e vediamo se la strategia si comporta come desiderato:
strategie opzioni
trading opzioni
F24) Trade List in option Explorer
In questa porzione della Trade List possiamo vedere tutte le casistiche, e accertare che tutto funziona opportunamente: il Credit Spread ribassista a cui viene assegnato il gruppo 47 che viene chiuso poi dalla funzione Exit, come si evince dall’Exit Name (riquadro giallo); un Credit Spread che, invece, non viene chiuso in maniera attiva e giunge a scadenza (gruppo 50, riquadro rosso), una short put rialzista chiusa dalla funzione Exit, da notare che non gli viene assegnato alcun gruppo (riquadro verde), e una short put chiusa a scadenza (riquadro blu).
La piattaforma che è stata utilizzata per effettuare queste analisi è OptionLAB. Se vuoi approfondire su quali mercati puoi lavorare, e altri dettagli sul funzionamento, come poterla acquistare o noleggiar, puoi visitare la pagina indicata sopra.
Se vuoi approfondire questo tipo di operatività, con particolare attenzione alla difesa meccanica effettuata con il Future sottostante o all’impiego di specifici trading system per controllare il rischio di strategie di questo tipo, allora puoi fare riferimento a questi due corsi (in partenza alla fine di Novembre):
1) Opzioni+Futures: Short Strangle con Difesa Meccanica
2) Short Strangle Advanced (Opzioni+Trading Systems)
Trovi un video dove puoi rivedere rivedere tutti questi passaggi e dove abbiamo messo in pratica quanto mostrato in questo articolo, nella sezione dedicata a OptionLAB.
futures sp500
trading system opzioni
⚠️ Appuntamento alla prossima edizione del corso Short Strangle Advanced
Buon trading! easy language trading
cco altri articoli che potrebbero interessarti:
QTLab dice
Se hai qualche domanda, postala qui di seguito, oppure scrivici una e-mail a [email protected]
Puoi anche prenotare una chiamata con qualcuno di noi, cliccando qui e scegliendo giorno e ora: https://calendly.com/qtlab/60-min?month=2023-05
Qui invece trovi tante Risorse Gratuite dove puoi approfondire meglio qualcuno degli argomenti di questo articolo: https://www.qtlab.it/p/corsi-gratis