Backtesting en Moving Average Crossover i Python med pandas. I den forrige artikkelen om Research Backtesting Environments I Python With Pandas opprettet vi et objektorientert forskningsbasert backtesting miljø og testet det på en tilfeldig prognosestrategi. I denne artikkelen vil vi gjøre bruk av maskiner vi introduserte for å utføre forskning på en faktisk strategi, nemlig Moving Average Crossover på AAPL. Moving Average Crossover Strategy. The Moving Average Crossover-teknikken er en ekstremt kjent, forenklet momentumstrategi. Det betraktes ofte som Hello World-eksempelet for kvantitativ handel . Strategien som skissert her er langvarig. To separate enkle glidende gjennomsnittlige filtre er opprettet med varierende tilbakekoblingsperioder av en bestemt tidsserie. Signaler for å kjøpe aktivet oppstår når kortere tilbakegangsgjenomsnitt overstiger det lengre tilbakegangsgjenomsnittet. gjennomsnittet overgår deretter det kortere gjennomsnittet, eiendelen er solgt tilbake. Strategien fungerer vi ll når en tidsserie går inn i en periode med sterk trend og så sakte reverserer trenden. For dette eksempelet har jeg valgt Apple, Inc AAPL som tidsserien, med en kort tilbakekall på 100 dager og et langt tilbakeblikk på 400 dager. Dette er Eksempelet fra zipline algoritmiske handelsbiblioteket. Såfremt vi ønsker å implementere vår egen backtester, må vi sikre at den samsvarer med resultatene i zipline, som et grunnleggende middel for validering. Sørg for å følge den tidligere opplæringen her som beskriver hvordan den første Objekthierarkiet for backtesteren er konstruert, ellers vil koden nedenfor ikke fungere. For denne bestemte implementeringen har jeg brukt følgende biblioteker. Implementeringen av krever fra den forrige opplæringen Det første trinnet er å importere de nødvendige modulene og objektene. Som i forrige opplæring vi skal subclass strategien abstrakt basen klassen for å produsere MovingAverageCrossStrategy som inneholder alle detaljene om hvordan å generere signalene når flytting av erobringer av AAPL krysser over hverandre. Objektet krever en shortwindow og en longwindow å betjene. Verdiene er satt til standardverdier på henholdsvis 100 dager og 400 dager, som er de samme parametrene som brukes i hovedeksempelet på zipline. gjennomsnitt er opprettet ved å bruke pandas rollingmean funksjon på stolpene Lukk sluttkurs for AAPL-aksjen Når de individuelle bevegelige gjennomsnittene er konstruert, genereres signalet Serie ved å sette kolonnen lik 1 0 når det korte glidende gjennomsnittet er større enn lengre glidende gjennomsnitt eller 0 0 ellers Fra dette kan posisjonene ordrer genereres for å representere handelssignaler. MarketOnClosePortfolio er underklasse fra Portefølje som er funnet i Det er nesten identisk med implementeringen beskrevet i den tidligere opplæringen, med unntak av at handelen utføres nå på nært hold, i stedet for en åpen til åpen basis. For detaljer om hvordan porteføljeobjektet er definert, se forrige t Utorial Jeg har forlatt koden for fullstendig og for å holde denne opplæringen selvopptatt. Nå som MovingAverageCrossStrategy og MarketOnClosePortfolio-klassene er definert, vil en hovedfunksjon bli kalt for å knytte alle funksjonalitetene sammen. I tillegg vil strategiens utførelse undersøkes ved hjelp av en kurve av egenkapitalkurven. Pandas DataReader-objektet laster ned OHLCV-priser på AAPL-lager for perioden 1. januar 1990 til 1. januar 2002, hvor signalene DataFrame er opprettet for å generere de langvarige signalene. Deretter er porteføljen generert med en basiskapital på 100 000 USD og avkastningen er beregnet på egenkapitalkurven. Det endelige trinnet er å bruke matplotlib til å tegne en tofigurert plot av begge AAPL-prisene, overlaid med de bevegelige gjennomsnitt og kjøpe selgesignaler, så vel som egenkapitalkurven med samme kjøpssalgsignaler Plottingskoden er tatt og modifisert fra zipline-implementeringseksempelet. Den grafiske produksjonen av koden er som følger: Jeg er sur e bruk av IPython Paste-kommandoen for å sette dette direkte inn i IPython-konsollen mens du er i Ubuntu, slik at den grafiske produksjonen forblir i visning. Den rosa oppskriften representerer kjøp av aksjen, mens de svarte downticks representerer å selge den tilbake. AAPL Flytter gjennomsnittlig Crossover Performance fra 1990-01-01 til 2002-01-01. Som det kan sees, mister strategien penger i løpet av perioden, med fem rundturer. Dette er ikke overraskende gitt AAPLs oppførsel i perioden, som var på en svak nedadgående trend , etterfulgt av en betydelig oppgang i 1998 Utsiktsperioden for de bevegelige gjennomsnittssignalene er ganske stor og dette påvirket resultatet av den endelige handel, noe som ellers kan ha gjort strategien lønnsom. I etterfølgende artikler vil vi skape et mer sofistikert middel for analysere ytelse, samt beskrive hvordan man optimaliserer tilbakekallingsperioder for de individuelle bevegelige gjennomsnittlige signaler. Bare å komme i gang med kvantitativ handel. Analyse av flytende gjennomsnitts Crosso ver Strategi Backtest Returns Bruke Pandas. I dette innlegget trodde jeg at jeg kunne dra nytte av resultatene vi fikk fra den bevegelige gjennomsnittlige crossover-strategi-backtesten i det siste innlegget, finner du her, og tilbringe litt tid på å grave litt dypere inn i egenkapitalkurve og produsere litt analyse om noen viktige resultatindikatorer og noen generelt forhåpentligvis interessante data. For fullstendighet er nedenfor all koden som trengs for å produsere strategiske backtestresultater for vår forestående analyse, sammen med kartlegging av egenkapitalkurven bare for å sikre at vi har kjørt det riktig. importere relevante moduler import pandas som pd import numpy som np fra pandasdatareader importere data fra matte import sqrt import som plt laste ned data i DataFrame og opprette glidende gjennomsnitt kolonner sp500 yahoo, start 1 1 2000 sp500 42d sp500 252d lag kolonne med bevegelige gjennomsnittlige spredningsdifferens sp500 42-252 sp500 42d - sp500 252d sett ønsket antall poeng som terskel for spredningsforskjell og opprett kolonne som inneholder strategi Stance X 50 sp500 Stance gt X, 1, 0 sp500 Stans lt X, -1, sp500 Stance opprette kolonner som inneholder daglig markedslogg avkastning og strategi Daglig logg returnerer sp500 Markedsavkastning sp500 Strategi sp500 Markedsavkastning satt strategi startende egenkapital til 1 ti 100 og generere egenkapitalkurve sp500 Strategi Egenkapital 1 vis diagram over egenkapitalkurve sp500 Strategi. Analysen jeg har planlagt er som følger.1 Kartleggingsavsnitt vi vil lage diagrammer for følgende serier en Rolling 1 års årlig volatilitet b Rolling 1 års treffforhold c Rolling 1 års retur d Daglig avkastning cha rt e Daglig returfordelingshistogram. Vårt første skritt er å skape en frisk DataFrame som inneholder bare de dataene vi trenger, som er strategien egenkapitalkurven, sammen med den daglige strategien. Dette gjøres som følger. Strat Equity. Now må vi bygge opp DataFrame for å inkludere alle de rå dataene som vi må beregne serien skissert ovenfor, som vi ønsker å kartlegge Koden for dette er. opprett kolonner som betyr om hver dag returnerer var positiv, negativ eller flat strat win gt 0, 1,0 strat loss lt 0, 1,0 strat scratch 0, 1,0 opprett kolonner med en kumulativ sum av hver av de kolonnene som er opprettet ovenfor strat wincum gt 0, strat losscum lt 0, strat scratchcum 0, opprett en kolonne som har en løpende summen av handelsdager - vi vil bruke dette til å opprette prosentpoengene våre senere stratedager Strat Wincum Strata Losscum Strat Scratchcum opprette kolonner som viser 252 dagene rollimg summen av den vinnende tapende flate dager strat rollwin strat rollloss strat rollcratch lage kolonner med treffforhold og tapforhold datastratten hitratio strat wincum strat wincum strat losscum strat lossratio 1 - strat hitratio lage kolonner med rullende 252-dagers treffforhold og tapforholdsdatastrat rollhitratio strat rolllossratio 1 - strat rollhitratio lage kolonne med rullende 12 måneders returstreng roll12mret opprett kolonne med gjennomsnittlig gevinst, gjennomsnittlig tap og gjennomsnittlig daglig returdata strat averagewin strat Strategistrategi Strategistrategi Strategi Strategi Strategi Strat Gjennomsnittlig Forsikring Opprett kolonne med rullende 1 års daglig standardavvik og rullende 1 år årlig standardavvik Stratrull12mstdev Stratrull12mannligisertvol Stratrull12mstdev sqrt 252.Gjengelig, nå har vi alle våre data klare til å tegne de forskjellige diagrammene vi nevnte ovenfor. Vi kan gjøre dette på følgende måte. 10 av Lønnsomme Måneder Amp Lønnsomme Måneder Positiv Måneder Strategi Strategi Strategi 0 Strategi Strategi Mark Strategi Strategi lt 0 Flatmonths Strategi Strategi Strategi 0 Positive Positive Positive Positive Positive Positive Negatives Monetary Monetary Percentage Negative Monts Positive Monts Negative Monstones Flatmonths Print av Lønnsomme Måneder, Strikke Percpositivemonths , 2 100 utskrift av ikke-lønnsomme måneder, str. Percnegativemonths, 2 100. av lønnsomme måneder 49 0 av ikke-lønnsomme måneder 45 0. 11 Antall lønnsomme måneder Antall ikke lønnsomme måneder profunprofmonths positivemonths negativemonths print Antall lønnsomme måneder Antall Ikke-lønnsomme måneder, runde profunprofmonter, 2. Antall lønnsomme måneder Antall ikke lønnsomme måneder 1 08. 12 Gjennomsnittlig månedlig fortjeneste avmonthlypos stratm Strategistrategi Strategi gt utskrift Gjennomsnittlig månedlig fortjeneste, str round avmonthlypos, 4 100 13 Gjennomsnittlig månedlig tap avmonthlyneg stratm Strate gy stratm Strategy lt print Gjennomsnittlig månedlig tap, str round avmonthlyneg 100,2 14 Gjennomsnittlig månedlig fortjeneste Gjennomsnittlig månedlig tap posnegmonth abs avmonthlypos avmonthlyneg print Gjennomsnittlig månedlig fortjeneste Gjennomsnittlig månedlig tap, runde posnegmonth, 4.Average månedlig fortjeneste 3 56 Gjennomsnittlig månedlig tap -3 33 Gjennomsnittlig månedlig fortjeneste Gjennomsnittlig månedlig tap 1 0683. Og til slutt bare for å fullføre og bruke litt mer Pandas DataFrame-funksjonalitet, skal jeg lage et bord med månedlige avkastninger. Det første trinnet er å lage et pivottabell og resample det for å skape det som er kjent som en objekt. monthlytable kolonner måned. Så at vi kan manipulere det litt mor enkelt, skal jeg konvertere dette objektet tilbake til en DataFrame ved hjelp av funksjonen. Vi kan nå sette slutt på ved å konvertere indeksdatoer for å vise bare året i stedet for fulldatoen, og erstatt deretter også kolonne måneds overskrifter for tiden i numerisk format med riktig MMM format. Først må vi raskt slippe en av tabellens kolonne indeksnivåer som for øyeblikket er ordet Strategi, vil dette gi oss et bord med kun et kolonneindeks på ett nivå som tilsvarer heltalsmånedrepresentasjonene. Slett toppnivå kolonneindeksen som fortløpende viser som Strategy. Visually vil tabellen endres fra. Nå må vi bare endre datoindeksen for å vise i årlig format YYYY og de resterende kolonneoverskriftene for å vise månedlig format MMM. Bytt ut full dato i indekskolonne med samme år. Erstatt hele kolonneoverskrifter med MMM format Jan, Feb, Mar, Apr, Mai, Juni, Jul, Aug, Sep, Okt, Nov, Des. Vi er nå igjen med en månedlig avkastning bord som ser slik ut. Stort bra, jeg tror det er nok for nå da dette innlegget begynner å bli litt langt. Jeg vil tenke over de neste dagene om et mulig emne for mitt neste innlegg og komme på jobb på det. Takk for å følge med. Det er bare rett å dele. Pandas Kolonne Operations grunnleggende matteoperasjoner og bevegelige gjennomsnitt. I denne Pandas med Python opplæringsvideo med prøvekode dekker vi noen av de raske og grunnleggende operasjonene vi kan utføre på vår data Si at du har et datasett som du vil legge til et glidende gjennomsnitt til, eller kanskje du vil gjøre noen matematikkberegninger basert på noen få biter av data i andre kolonner, og legge resultatet til en ny kolonne La oss se hvordan vi kan Gjør det. Alt av det ovenfor skal forstås, siden det er blitt dekket nå opp til dette punktet. Nå, la s lage en ny kolonne, kaller det HL, hvor dataene i kolonnen er resultatet av den høye prisen minus den lave prisen. Her, som du ville gjøre med en ordbok, definerer vi Et nytt objekt i våre Pandas-data, som heter HL Derfra sier vi at verdien av dette HL-objektet er - det har ikke blitt oppdratt, men det er faktisk ganske interessant at vi kan gjøre dette, men det kan også være forvirrende. Vi kan også si df HL df High - df Low, men siden Pandas er så tungt objektbasert, kan vi også referere det rent som et objekt. Det er opp til deg hvordan du vil gjøre det jeg foretrekker å behandle det som et objekt, siden det er hva det er. Etter at vi har kjørt dette, kan vi se ved å skrive ut hodet, at vi har en fin ny kolonne som inneholder våre nye data. Det er pent, men hva med referanse tidligere data i andre kolonner Kan vi gjøre det Jeg vil gjøre et bevegelige gjennomsnitt Sikkert vi kan Flytte gjennomsnitt er faktisk bygget inn i Pandas, som kalles rullende mann. Ovenfor har vi d omined enda en kolonne, mye som vi kan en ordbok, og sa at kolonnen er lik av den nære prisen Vår andre parameter her er tidsrammen for dette glidende gjennomsnittet Da skriver vi bare en del av dataene fra 200. element til 210. Vi kan egentlig ikke gjøre her Vi kunne, men dataene for 100MA ville ikke bli beregnet før vi hadde 100 datadata for å beregne. En annen interessant innebygd funksjon med Pandas er diff. With diff-funksjonen, er vi igjen kunne beregne forskjellen eller endre fra forrige verdi til en kolonne. Så det er noen grunnleggende operasjoner og en start introduksjon til noen datamanipulering og analyse med Pandas. Jeg tror at du sannsynligvis ser nå hvor imponerende denne modulen er.
No comments:
Post a Comment