Moving Media Attraversamento Backtest


Backtesting un Moving Average Crossover in Python con i panda nel precedente articolo sulla ricerca Backtesting ambienti in Python con i panda abbiamo creato un ambiente di backtesting basata sulla ricerca orientata agli oggetti e testato su una strategia di previsione casuale. In questo articolo andremo a fare uso della macchina abbiamo introdotto per effettuare ricerche su una strategia vera e propria, vale a dire il Moving Average Crossover su AAPL. Moving Average Crossover Strategia The Moving Average Crossover tecnica è una strategia estremamente noto slancio semplicistico. Si è spesso considerato l'esempio Ciao Mondo per la negoziazione quantitativa. La strategia, come indicato qui è long-only. vengono creati due semplici separato in movimento filtri medi, con diversi periodi di lookback, di una particolare serie di tempo. I segnali di acquisto del bene si verificano quando la media mobile lookback più breve supera la più lookback media mobile. Se la media più successivamente supera la media più breve, il bene viene venduto indietro. La strategia funziona bene quando una serie di tempo entra in un periodo di forte tendenza e poi inverte lentamente la tendenza. Per questo esempio, ho scelto di Apple, Inc. (AAPL), come le serie storiche, con una breve lookback di 100 giorni e una lunga lookback di 400 giorni. Questo è l'esempio fornito dalla libreria trading algoritmico zipline. Quindi se vogliamo implementare la nostra backtester dobbiamo garantire che corrisponda i risultati in zipline, come mezzo di base della convalida. Attuazione assicurarsi di seguire il tutorial precedente qui. che descrive come la gerarchia degli oggetti iniziale per l'backtester è costruito, in caso contrario il codice qui sotto non funziona. Per questa particolare applicazione ho usato le seguenti librerie: L'attuazione di macross. py richiede backtest. py dal tutorial precedente. Il primo passo è quello di importare i moduli e gli oggetti necessari: Come nel precedente tutorial andremo a creare una sottoclasse della classe di base astratta strategia per produrre MovingAverageCrossStrategy. che contiene tutti i dettagli su come generare i segnali quando le medie mobili di AAPL attraversare vicenda. L'oggetto richiede una shortwindow e longwindow su cui operare. I valori sono stati impostati per default di 100 giorni e 400 giorni, rispettivamente, che sono gli stessi parametri utilizzati nell'esempio principale della zipline. Le medie mobili sono creati usando i panda funzione rollingmean sul prezzo di chiusura barsClose del titolo AAPL. Una volta che i singoli medie mobili sono stati costruiti, la serie segnale viene generato impostando il colum pari a 1,0 quando la media mobile corta è maggiore della media a lungo in movimento o 0.0 altrimenti. Da questo gli ordini posizioni possono essere generati per rappresentare segnali di trading. Il MarketOnClosePortfolio è una sottoclasse di portafoglio. che si trova in backtest. py. È quasi identica alla realizzazione descritta nel tutorial precedente, con l'eccezione che le operazioni sono ora effettuate su base Close-to-Close, piuttosto che una base Open-to-Open. Per i dettagli su come l'oggetto del portafoglio è definito, vedere il tutorial precedente. Ive ha lasciato il codice per completezza e per mantenere questo tutorial autosufficiente: Ora che sono state definite le classi MovingAverageCrossStrategy e MarketOnClosePortfolio, una funzione principale sarà chiamata a legare tutte le funzionalità insieme. Inoltre le prestazioni della strategia sarà esaminata tramite un grafico della curva di equità. I download degli oggetti panda DataReader OHLCV prezzi di AAPL magazzino per il periodo 1 gennaio 1990 al 1 Gennaio 2002, a quel punto il dataframe segnali è stato creato per generare i segnali long-only. Successivamente il portafoglio è generato con una base di 100.000 dollari di capitale iniziale e il rendimento sono calcolati sulla curva di equità. Il passo finale è quello di utilizzare matplotlib per tracciare un diagramma a due cifre di entrambi i prezzi AAPL, sovrapposto con le medie mobili e segnali buysell, così come la curva di equità con gli stessi segnali buysell. Il codice tracciato è preso (e modificato) dalla esempio di implementazione zipline. L'uscita grafica del codice è il seguente. Ho fatto uso del comando Incolla IPython di mettere questo direttamente nella console IPython mentre in Ubuntu, in modo che l'output grafico è rimasto in vista. I upticks rosa rappresentano l'acquisto del magazzino, mentre i downticks neri rappresentano la vendita indietro: Come si può vedere la strategia perde denaro nel corso del periodo, con cinque di andata e ritorno dalle compravendite. Questo non è sorprendente dato il comportamento del AAPL nel corso del periodo, che era una leggera tendenza al ribasso, seguito da un significativo aumento a partire dal 1998. Il periodo lookback dei mobili segnali media è piuttosto grande e questo influenzato il profitto del commercio finale , che altrimenti potrebbe aver fatto la strategia redditizia. Negli articoli successivi creeremo un mezzo più sofisticati di analisi delle prestazioni, oltre a descrivere come ottimizzare i periodi lookback del singolo movimento segnali medi. Appena iniziato con quantitativa TradingMoving media Crossover commerciale di strategia Backtest in Python 8211 V 2.0 Questo è un test annuncio di testo di benvenuto back8230this messaggio avrà a che fare con un paio di domande che ho ricevuto nella sezione commenti di un post precedente, quello relativo ad un movimento media strategia di trading di crossover 8211 l'articolo può essere trovato qui. Le domande che ho ricevuto in un primo momento chiesto se il codice per il backtest potrebbe essere adattato a seguire le seguenti regole: (1) Se il corto in movimento croci media di sopra della media a lungo in movimento vanno lungo per x giorni. (2) Se il corto in movimento croci in media al di sotto della media mobile di breve tempo per x giorni. (3 bis) Se vi è un crossover aggiuntivo durante periodo di detenzione lo ignora (3b) Se non ci sono attraversamenti detenere liquidità Ecco il codice originale: importazione pertinenti moduli importare panda come NumPy pd importazione come NP dai dati pandasdatareader di importazione da importazione matematica importazione sqrt matplotlib. pyplot come dati PLT scaricare in dataframe e creare movimento colonne medie SP500 data. DataReader (GSPC, yahoo, start112000) sp50042d np. round (sp500Close. rolling (window42).mean (), 2) sp500252d np. round (sp500Close. rotolamento (window252).mean (), 2) creare colonna con lo spostamento differenziale medio diffusione sp50042d sp50042-252 - sp500252d impostare il numero desiderato di punti come soglia per la differenza diffusione e creare colonna contenente strategia Stance X 50 sp500Stance np. where (sp50042-252 gt X, 1, 0) sp500Stance np. where (sp50042-252 lt X, -1, sp500Stance) sp500Stance. valuecounts () creano le colonne contenenti i rendimenti di registro mercato giornaliero e strategia quotidiana restituisce registro sp500Market Returns np. log (sp500Close sp500Close. shift (1)) sp500Strategy sp500Market Restituisce sp500Stance. shift (1) strategia definita a partire patrimonio netto a 1 (cioè 100) e generare curva di equità sp500Strategy equità sp500Strategy. cumsum () 1 spettacolo grafico della curva di equità sp500Strategy Equity. plot () E qui è il codice che incorpora le regole di cui sopra: importazione pertinenti moduli importare panda come pd importazione NumPy come NP da importazione pandasdatareader i dati da importare matematica sqrt importazione matplotlib. pyplot come dati PLT matplotlib linea scaricare in dataframe e creare medie mobili colonne SP500 data. DataReader (GSPC, yahoo, start112014) sp50042d np. round (sp500Close. rolling (window42).mean (), 2 ) sp500252d np. round (sp500Close. rolling (window252).mean (), 2) creare colonna con media mobile differenziale di spread sp50042d sp50042-252 - sp500252d impostare il numero desiderato di punti come soglia per la differenza diffusione e creare colonna contenente strategia Stance X 50 sp500Stance np. where (sp50042-252 GT X, 1, 0) sp500Stance np. where (sp50042-252 lt - X, -1, sp500Stance) sp500Stance. valuecounts () creare colonne contenenti i rendimenti di registro mercato giornaliero e strategia registro giornaliero torna sp500Market Restituisce np. log (sp500Close sp500Close. shift (1)) sp500Strategy sp500Market Restituisce sp500Stance. shift (1) ha istituito una nuova colonna per contenere la nostra posizione rilevante per il periodo di detenzione pre-specificato sp500Stance2 0 di cui predeterminato periodo di detenzione, dopo di che ci sarà tornare alla detenzione di contante e aspettare il prossimo movimento trasversale media oltre - anche ignoreremo qualsiasi crossover in più durante questi giorni periodo di possesso di 50 scorrere l'dataframe e aggiornare la colonna quotStance2quot di tenere la posizione Revelant for i in range (X, len (SP500)): test logico per verificare 1) una croce sopra breve corso lungo MA 2) che stiamo attualmente in contanti se (sp500Stance. iloci gt sp500Stance. iloci-1) e (sp500Stance. iloci-1 0) e ( sp500Stance2.iloci-1 0): popolare il dataframe avanti nel tempo per la quantità di giorni nel nostro periodo di detenzione per k nella gamma (giorni): provare: sp500Stance2.ilocik 1 sp500Stance2.ilocik1 0 eccezione: superare il test logico per verificare la presenza di 1 ) una croce sopra breve sotto lunga MA 2) che stiamo attualmente in contanti se (sp500Stance. iloci lt sp500Stance. iloci-1) e (sp500Stance. iloci-1 0) e (sp500Stance2.iloci-1 0): popolano il dataframe in avanti nel tempo per la quantità di giorni nel nostro periodo di detenzione per k nella gamma (giorni): provare: sp500Stance2.ilocik -1 sp500Stance2.ilocik1 0 eccezione: passare Calcola rendimenti di mercato giornaliere e di strategia quotidiana restituisce sp500Market Returns np. log (sp500Close sp500Close. shift (1)) sp500Strategy sp500Market restituisce sp500Stance2.shift (1) strategia di trama ritorna vs rendimenti di mercato sp500Market Returns, Strategy. cumsum (). plot (gridTrue, figsize (8,5)) plt. show () strategia di insieme del patrimonio netto a partire a 1 (cioè 100) e generare curva di equità sp500Strategy equità sp500Strategy. cumsum () 1 spettacolo grafico della curva di equità sp500Strategy Equity. plot (gridTrue, figsize (8,5)) plt. show () Dopo aver postato questo codice ho ricevuto le seguenti domande di follow-up : si 8220Thank per la risposta. Sto avendo qualche difficoltà a capire questo pezzo di codice. Il codice funziona ma vorrei capire meglio. Sono soprattutto confuso con il iLOC, e K e I. Ho davvero non capisco quello che queste sono o dove stanno tirando informazioni. qualsiasi chiarezza sarebbe molto appreciated8221 So8230. Here8217s mio tentativo di cercare di chiarire la mia linea di pensiero durante la scrittura del codice, e cercare di spiegare esattamente cosa sta succedendo riga per riga. Let8217s iniziare con il 8220iloc8221 ecco informazioni dalla documentazione ufficiale Pandas:.iloc è la posizione principalmente integer base (da 0 a length-1 dell'asse), ma può anche essere usato con una matrice booleana. iLOC alzerà IndexError se un indicizzatore richiesto è fuori dal campo, ad eccezione di indicizzatori fetta che permettono di out-of-bounds indicizzazione. (Questo è conforme con la semantica fetta pythonnumpy). ingressi consentiti: Un numero intero es 5 Un elenco o un array di interi 4, 3, 0 un oggetto porzione con interi 1: 7 Una matrice booleana una funzione richiamabile con un argomento (la chiama Serie, dataframe o pannello) e che restituisce in uscita valida per l'indicizzazione (uno dei precedenti ) Quindi, come detto in precedenza, 8220iloc8221 è solo un modo semplice per fare riferimento a una posizione di fila nel 8211 dataframe semplice. Se creiamo il seguente dataframe e mostrarlo, otteniamo: scorrere l'dataframe e aggiornare la colonna quotStance2quot di tenere la posizione Revelant for i in range (X, len (SP500)): utilizza la funzione di 8220range8221 per creare una lista di I valori a partire da 8220X8221 e andando fino a (ma non compreso) il valore di quanto a lungo il dataframe SP500 è, utilizzando la funzione 8220len8221. Quindi, se X è 50, per esempio, e la lunghezza del dataframe SP500 è 500, l'elenco di valori che ci iterare si svolgerà dal 50 al 499 8211 ossia dal 50 ° giorno nel nostro dataframe all'ultimo. Quando si combinano la 8220.iloc8221 e la 8220for i in range8221 ed effettivamente passare il valore della 8220i8221 al 8220iloc8221 come 8220.iloci8221 8211 siamo in grado di utilizzare l'iteratore 8220i8221, che è l'incremento da uno ogni volta che il ciclo per corse, accedere ad ogni indice di riga dataframe, uno dopo l'altro. A destra, quindi dovremmo essere ora chiaro il principale che 8220for nella gamma (X, len (SP500)): 8221 ciclo 8211 siamo letteralmente appena iterazione se ogni riga del dataframe uno per uno, a partire dalle fila X e termina al fine del dataframe (in realtà tecnicamente stiamo ultimando alla penultima giornata, come la funzione gamma crea un elenco che va fino a, ma doesn8217t includono il secondo valore passato 8211, ma per i nostri scopi di finitura al secondo ultimo giorno non ha alcun effetto sulla uscita) Così ora let8217s cercare di affrontare tutte queste 8220if8221 e 8220for k8221 loop e test all'interno del principale esterno 8220for8221 ciclo spiegato sopra. I 8220if8221 test sono solo in esecuzione un paio di test logici su ogni riga della dataframe che stiamo scorrendo 8211 le prime prove logiche che fare con crossover quando gli breve movimento croci media di sopra della media a lungo in movimento e utilizza i valori nella colonna 8220Stance8221 in primo luogo per verificare se i valori si sposta da 0 a 1 dal giorno 8220T-18221 per giorno 8220T8221 ed il valore nella colonna 8220Stance28221 al giorno 8220T-18221 è anche 0 8211 se è così, ciò significa che la media mobile di breve ha attraversato sopra il lungo movimento media e dovremmo entrare in una posizione. Se questo isn8217t chiaro perché 8211 prendere un po 'di tempo per pensare attraverso la logica. Abbiamo bisogno colonna 8220Stance8221 per passare da 0 a 1 per indicare un breve corso lungo di crossover MA, ma abbiamo anche bisogno di colonna 8220Stance28221 al giorno 8220T-18221 a 0, come se fosse, nessuna posizione è attualmente detenuto e uno dovrebbe quindi essere stipulato. Se 8220Stance28221 al giorno 8220T-18221 wasn8217t zero, allora che significes siamo già in una posizione e niente dovrebbe essere fatto, anche se il primo test logico mostra un crossover media mobile. Apprezzo questo potrebbe prendere un po 'di tempo per lavorare attraverso e ottenere la testa intorno, ma tutto quello che posso dire è che i test logici come impostato nel codice effettivamente seguono la logica presentata nelle domande iniziali. La seconda serie di test 8220if8221 sono solo l'immagine speculare del primo 8211 e trattare con crossover quando gli breve movimento croci media di sotto della media a lungo in movimento. Ora finalmente, si spera quanto sopra è tutto chiaro (come il fango) e tutto quello che abbiamo lasciato per affrontare è l'uso di 8220k8221 nel 8220for k in range (giorni) 8221 loop. In primo luogo, 8220days8221 è solo una variabile che contiene il numero di giorni che vogliamo tenere le nostre posizioni per prima di uscire automaticamente quelle posizioni. 8220days8221 è stato fissato a 50 nel codice, ma potrebbe essere impostato su qualsiasi valore uno desidera per la loro particolare strategia. Quindi, con questo in mente, il k 8220for in range (giorni) 8221 ciclo viene eseguito se e solo se i test logici precedenti sono soddisfatti, e la nostra strategia sta dicendo di aprire una posizione (sia lungo o corto). Se un segnale di entrata è presentata, abbiamo poi iterare avanti nel tempo da 8220k8221 giorni (a partire da giorno 8220i8221 8211 così usiamo 8220ik8221 come nostro giorno di partenza) e impostare il 8220Stance28221 a 1 o -1 (a seconda che il segnale è un lungo o segnale di posizione corta). Questo rappresenta il tempo che vogliamo tenere la nostra posizione prima di uscire automaticamente. Quindi, se un segnale di entrata viene prodotto il giorno 100 (a questo punto mi sarà uguale a 100), la posizione al giorno 8220i k8221 sarà impostato su -1 o 1 k avrà inizio alle 0 e correre a 49, incrementando ad uno con ogni correre attraverso il k 8220for in8221 loop. Quindi la posizione di giorno 8220i k8221, imposterà giorno 100 0 a 1 o -1, poi giorno 100 1 100 quindi 2 ecc, fino a quando la posizione si esce al giorno 100 49, e la posizione sulla giornata 100 50 è impostato a zero per mostrare una posizione piana. Un paio di aggiunte forse confondere la logica di cui sopra e nelle seguenti righe: per k nella gamma (giorni): provare: sp500Stance2.ilocik 1 sp500Stance2.ilocik1 0 eccezione: passaggio sono l'uso della seconda linea 8220sp5008216Stance28217.ilocik1 08221 8211 I hanno incluso questo per assicurarsi che la colonna 8220Stance28221 viene reimpostato a 0 come abbiamo terminato la nostra posizione e ora sono di nuovo piatto 8211 questa posizione piatta è fissata per il giorno dopo usciamo la nostra posizione 8211 in giornata effetto (IK1). La seconda aggiunta probabilmente confusa, è l'uso del 8220try e except8221. Usiamo questo modo che se si arriva alla fine del dataframe mentre ancora l'iterazione in avanti nel tempo da X giorni, invece di vomitare un 8220index fuori bounds8221 errore ed esce il codice, il codice passa proprio e si conclude con nessun errore. Ciò può accadere per esempio se dire la nostra finestra 8220days8221 è impostato su 50 e con solo 30 giorni a sinistra dei dati, un segnale di ingresso viene prodotto 8211 se cerchiamo di iterare avanti 50 giorni in un'epoca in cui solo 30 giorni di dati esiste 8211 senza il tryexcept il nostro codice sputerà un errore e uscire. Speriamo che questo post spiega e chiarisce la stragrande maggioranza del codice aumentata 8211, se non, quindi si prega di lasciare le vostre domande e commenti qui sotto e I8217ll cercare di affrontarli all8230 Fino alla prossima volta buona informazioni. Ma devo constatare che precedente progettazione di siti web è stato molto molto meglio di questo. Quel testo grigia è difficile da leggere, zoom inout funzioni non lavorare su questo tema. L'intero sito funziona più lento di quello con il tema precedente. Forse perché diversi plugin installati come Squirrly SEO, W3 Total Cache e Jetpack. credetemi, che sia tale contenuto informativo, è don8217t bisogno di tutto ciò che spazzatura SEO a tutti. Hi there8230I assolutamente d'accordo, I8217ve dato con la theme8230it precedente era di gran lunga troppo complesso dietro le quinte e non potrei mai ottenere nulla a guardare il modo in cui ho voluto che. Così I8217ve ha deciso di utilizzare questo nuovo tema ora sarei interessato a sapere cosa ne pensate, se Grazie per il feedback 8211 it8217s sempre molto apprezzati e sicuramente get8217s ascoltato toMoving media Crossover commerciale di strategia Backtest in Python Si tratta di un annuncio di testo di prova Ciao a tutti, per questo post sarò costruzione di un semplice movimento di trading media di crossover strategia backtest in Python. Utilizzando il SampP500 come il mercato da testare. Una semplice croce media mobile su strategia è forse uno dei, se non il, più semplice esempio di una strategia commerciale basata su regole utilizzando indicatori tecnici così ho pensato che questo sarebbe un buon esempio per coloro che stanno imparando Python cercare di mantenere il più semplice possibile e costruire da lì. Quindi, come sempre quando si usa Python per dati finacial imbrogli legati, it8217s tempo per importare i nostri moduli necessari: panda importazione come pd importazione NumPy come NP dai dati pandasdatareader importazione Per prima cosa utilizzare la funzionalità di panda-DataReader per scaricare i dati sui prezzi a partire dal primo di trading giorno nel 2000, fino ad oggi, per il SampP500 da Yahoo Finance come segue: SP500 data. DataReader (GSPC, yahoo, start112000) Questa è una prova di un'altra strategia di trading VIX dalla eccellente logico-Invest (vedi il nostro test precedente della LIS Bollinger bande). Questo si usa 515-giorni in movimento crossover medi al commercio PTE VIX come XIV (o breve VXX). Il grafico qui sotto mostra i risultati della XIV strategia di trading (blu), rispetto all'acquisto e tenendo XIV (grigio), dalla metà del 2004. Leggi ipotesi di test. o ottenere aiuto seguendo questa strategia. regole di strategia: andare a lungo XIV a oggi vicino se 5 giorni di media mobile semplice (SMA) chiuderà sopra i suoi 15 giorni di SMA. Tenere premuto fino alla sua 5 giorni SMA chiuderà al di sotto del 15 giorni di SMA, per poi passare alla cassa. La strategia (come la variazione di banda di Bollinger) è in modo indiretto una strategia di slancio. La strategia è di acquistare XIV quando la sua mostra la forza recente, e tenendo premuto fino XIV si muove al di sotto della sua media di medio termine. Si noti che la nostra backtest si differenzia da Logical-Investe prova originale in tre modi: prova LI iniziato nei primi mesi del 2009. Weve ha aggiunto quasi 5 anni di dati simulati aggiuntivi (1). Test LI presume che in corto VXX. mentre Ive ha mostrato i risultati di trading a lungo XIV per consentire un confronto mele-to-mele con altri backtests qui a Volatilità Made Simple. Test LI presume abbiamo eseguito commerci ai prossimi giorni aperto, piuttosto che a oggi stretti. I test alla fine, perché non esiste un metodo affidabile per simulare i dati pre-2009 per la procedura aperta. Come ci si aspetterebbe in maniera intuitiva in base alle regole strategys, il suo fare un buon lavoro aggirando la maggior parte di XIVs utilizzi significativi perché la sua costringendo la strategia di incassare quando XIV comincia a muoversi contro il commerciante, a prescindere da ogni altra considerazione come lo stato dei futures VIX termine-struttura, ecc Ma questo desiderio di uscire posizioni lascia rapidamente anche un sacco di guadagni sul tavolo quando XIV è in una tendenza rialzista coerente (cioè VXX è in una forte tendenza al ribasso), come è stato il caso negli ultimi 2 anni. La strategia di banda di Bollinger che abbiamo testato in precedenza contribuito a rispondere che, rendendolo un po 'più difficile per uscire posizioni (vedi post per i dettagli). Sulla base del molto più tempo mette alla prova Ive presentato qui, delle due varianti, preferisco la Bollinger Band uno. Un grande grazie a logico-Invest per la pubblicazione di questa strategia. Quando le strategie che copriamo sul nostro blog (compreso questo) segnalano nuovi mestieri, includiamo un avviso in merito alla relazione quotidiana inviato agli abbonati. Questo è del tutto estraneo ai nostri strategys segnale che serve solo per aggiungere un po 'di colore al rapporto quotidiano e permette agli abbonati di vedere ciò che gli altri hanno da dire strategie quantitative circa il mercato. Clicca per vedere Volatilità Fatto Semplici propria soluzione elegante per il puzzle VIX ETP. Buon Trading, volatilità Made Simple Wonk Nota: i dati prima del lancio del XIV è stato simulato. Sono stati in grado di farlo con precisione utilizzando una combinazione di indici e dati Futures su cui si basa questo ETP. Per saperne di più la simulazione dei dati per VIX PTE. Messaggio di navigazione Categorie Messaggi Recenti

Comments

Popular Posts