Ho cercato di fare il più possibile da solo, ma sono arrivato ad un punto morto con il codice e questione seguente.
Premessa: non sto ponendo alcuna attenzione sulla fattibilità della strategia (se fate caso i dati sono anche di scarsa qualità), nè accortezze da prendere in caso di una sua implementazione pratica. Il tutto è finto, ma mi serve solo per prendere mano con R.
L'idea è di testare una strategia banale (in questo caso con le Bollinger Bands) ed ottenere determinati output per valutarne la bontà. Output che purtroppo non c'erano su PerformanceAnalytics (pensato più per dati non intraday?) e comunque volevo valutare in ticks/dollari piuttosto che rendimenti. I dati non sono nulla di segreto, quindi eventualmente li allego in formato .csv.
La strategia prevede semplicemente long quando si è sotto la deviazione standard inferiore, short quando si è sopra la deviazione standard superiore e flat ogni qualvolta si tocca la media mobile e si rimane entro le deviazioni standard.
Ci sono alcune funzioni (mlag, iif, compute.drawdown.ticks) che son prese da qui:
Systematic Investor Toolbox. In ogni caso mlag è molto simile al lag di R, iif è sostanzialmente l'if di Excel (i.e. condition, iftrue, iffalse) e compute.drawdown mi sembra chiaro
(l'ho modificato io in compute.drawdown.ticks per farlo in valore assoluto in ticks, piuttosto che percentuale).
Questo quanto fatto finora (strategia prese da una domanda si StackExchange per la cronaca, a cui peraltro appartengono i primi commenti). Il resto son commenti miei in inglese stentato, ma penso si capisca tutto.
Non fate caso ai pacchetti caricati (non tutti servono, ma son quelli che uso di solito), quello che abbiamo adesso in R è un xts fatto così (che altro non è che il file .csv allegato):
Img1
A questo punto costruisco la strategia:
Ovvero stabilisco lunghezza della finestra mobile, deviazione standard su cui comprare/vendere e poi creo un dataframe xts in cui ho il Close dell'ultima candela, le bollinger bands e il segnale (long/short/flat):
Img2
Il segnale è stato laggato per non entrare sulla stessa barra, ma ripeto, non è questo quello che mi interessa ora. Il segnale comunque sembra funzionare:
Img3
Il Close della barra delle 11.05.00 è sopra la deviazione standard superiore ("up") e alle 11.06.00 la strategia si gira short.
A questo punto inizio a valutare la performance:
La prima linea di codice mi dice semplicemente il numero di trades (trasforma la colonna sig, qualcosa come 0 -1 -1 -1 0 in 1 0 0 1 e poi ne fa la somma), la seconda la P&L in ticks e poi l'equity in dollari (dollars.per.ticks l'ho definito sopra). Questi i risultati:
Img4
Img5
Fin qui è dove ho potuto lurkare liberamente sul web e per quanto si accettino consigli per rendere il tutto più flessibile/bello/efficiente/realistico, sono abbastanza soddisfatto di quanto ottenuto. Da qui in poi ho dovuto fare io la maggior parte delle cose (
) e quindi si accettano consigli su come migliorare il codice stesso. Da qui in poi l'obiettivo è calcolare una serie di statistiche relative ai risultati della strategia.
Nella prima parte creo un nuovo dataframe sempre xts in cui ho la chiusura di tutte le trade (long e short), il risultato della singola trade in ticks, l'equity line cumulativa e un'ultima colonna "TradeEnd" che è semplicemente una variabile binaria che vale 1 quando una trade (long o short) finisce e 0 altrimenti.
Questo il risultato:
Img6
Da questo dataframe xts mi è molto più facile calcolare tutte le statistiche di mio interesse
E il risultato finale è il seguente:
Img7
Le "richieste di aiuto" sono:
1) Qualsiasi cosa che può valere la pena per migliorare la seconda parte in termini di flessibilità/linee di codice in meno/etcetc
2) Nonostante i miei fallimenti credo siano legati alla 1), mi interessebbe molto poter fare una analisi di sensitività al cui variare di nLookback (i.e. lunghezza finestra mobile per le Bollinger Bands) e nDeviation (i.e. quale deviazione standard utilizzare per comprare/vendere) abbia le diverse "Trading Statistics" dell'ultimo passaggio. Meglio ancora sarebbe per riga avere nLookback che varia, per colonna nDeviation che varia e in mezzo una volta le statistiche di interesse (avg.profit, avg.winning.trade blabla).
I miei tentativi con un ciclo di For son falliti miseramente, ma credo che quello che ho provato a dare in pasto ad R avrebbe fatto accapponare la pelle a qualsiasi programmatore della domenica
(e sicuramente R si è rifiutato di farlo!).
Consigli/pareri?