Eksponentiell Flytende Gjennomsnitt Det eksponentielle Flytende Gjennomsnitt Det eksponentielle Flytende Gjennomsnitt avviger fra et enkelt Flytende Gjennomsnitt både etter beregningsmetode og i måten at prisene vektes. Det eksponentielle flytende gjennomsnittet (forkortet til initialene EMA) er effektivt et vektet glidende gjennomsnitt. Med EMA er vektingen slik at de siste dagene prisene blir gitt mer vekt enn eldre priser. Teorien bak dette er at nyere priser anses å være viktigere enn eldre priser, særlig ettersom et langsiktig enkelt gjennomsnitt (for eksempel en 200 dag) plasserer like vekt på prisdata som er over 6 måneder gamle, og kan tenkes av som litt utdatert. Beregning av EMA er litt mer kompleks enn Simple Moving Average, men har fordelen at en stor datapost som dekker alle sluttkursene de siste 200 dagene (eller men mange dager blir vurdert) ikke beholdes . Alt du trenger er EMA for forrige dag og dagens sluttkurs for å beregne det nye eksponentielle flytende gjennomsnittet. Beregning av eksponenten I utgangspunktet må en eksponent beregnes for EMA. For å starte, ta antall dager EMA som du vil beregne og legg til ett til antall dager du vurderer (for eksempel for et 200 dagers glidende gjennomsnitt, legg til en for å få 201 som en del av beregningen). Nå ring dette Days1. Så, for å få eksponenten, bare ta nummeret 2 og del det av Days1. Eksempelvis vil eksponenten for et 200 dagers glidende gjennomsnitt være: 2 201. Som tilsvarer 0,01 Full beregning hvis eksponentiell flytende gjennomsnittlig Når vi har fått eksponenten, er alt vi trenger nå to biter av informasjon for å gjøre det mulig for oss å utføre full beregning . Den første er Yesterdays Eksponentiell Moving Average. Vel antar vi allerede vet dette som vi ville ha beregnet det i går. Men hvis du ikke allerede er klar over dagens EMA, kan du begynne med å beregne Simple Moving Average for i går, og bruke dette i stedet for EMA for den første beregningen (dvs. beregning i dag) av EMA. Så i morgen kan du bruke EMA du har beregnet i dag, og så videre. Den andre informasjonen vi trenger er dagens sluttkurs. La oss anta at vi vil beregne dagens 200 dagers eksponentielle flytende gjennomsnitt for en aksje eller aksje som har en tidligere dager EMA på 120 pence (eller cent) og en nåværende dags sluttkurs på 136 pence. Den fullstendige beregningen er alltid som følger: Eksponentiell flytende gjennomsnitt i dag (dagens dager avsluttende pris x Eksponent) (tidligere dager EMA x (1-eksponent)) Med dagens eksempeleksempler ovenfor vil dagens 200 dagers EMA være: (136 x 0,01 ) (120 x (1-0,01)) Som tilsvarer en EMA for i dag på 120,16. Beregning av en flytende gjennomsnittsovergang i Python med pandas I den forrige artikkelen om Research Backtesting Environments I Python With Pandas opprettet vi en objektorientert forskningsbasert backtesting miljø og testet det på en tilfeldig prognosestrategi. I denne artikkelen vil vi gjøre bruk av maskineri vi introduserte for å utføre forskning på en faktisk strategi, nemlig Moving Average Crossover på AAPL. Flytte Gjennomsnittlig Crossover Strategy Den Moving Average Crossover teknikken er en ekstremt kjent, forenklet momentum strategi. Det regnes ofte som Hello World-eksempelet for kvantitativ handel. Strategien som skissert her er langvarig. To separate enkle bevegelige gjennomsnittsfiltre opprettes, med varierende tilbakekallingsperioder, av en bestemt tidsserie. Signaler for å kjøpe eiendelen oppstår når det kortere tilbakegangsgjenomsnittet overstiger det lengre tilbakegående glidende gjennomsnittet. Hvis det lengre gjennomsnittet senere overgår kortere gjennomsnitt, blir aktiva solgt tilbake. Strategien fungerer bra 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 oversikt over 100 dager og en lang tilbakekalling på 400 dager. Dette er eksemplet fra zipline algoritmiske handelsbiblioteket. Dermed hvis vi ønsker å implementere vår egen backtester, må vi sørge for at den samsvarer med resultatene i zipline, som et grunnleggende middel for validering. Gjennomføring Sørg for å følge den tidligere opplæringen her. som beskriver hvordan det opprinnelige objekthierarkiet for backtesteren er konstruert, ellers vil koden under ikke fungere. For denne bestemte implementeringen har jeg brukt følgende biblioteker: Implementeringen av macross. py krever backtest. py fra den forrige opplæringen. Det første trinnet er å importere de nødvendige modulene og objektene: Som i den tidligere opplæringen skal vi subclass strategisk abstrakt baseklasse for å produsere MovingAverageCrossStrategy. som inneholder alle detaljer om hvordan man genererer signaler når de bevegelige gjennomsnittene av AAPL krysser over hverandre. Objektet krever en shortwindow og en longwindow å operere. Verdiene er satt til standardverdier på henholdsvis 100 dager og 400 dager, som er de samme parametrene som brukes i hovedeksempelet på zipline. De bevegelige gjennomsnittene opprettes ved å bruke pandas rollingmean-funksjonen på stolpene. Sluttprisen på AAPL-aksjen er avsluttet. Når de individuelle bevegelige gjennomsnittene er blitt konstruert, genereres signalet Serie ved å sette kolonnen lik 1,0 når det korte glidende gjennomsnittet er større enn det lange glidende gjennomsnittet, eller 0,0 ellers. Herfra kan stillingsordrene genereres for å representere handelssignaler. MarketOnClosePortfolio er subclassed fra Portfolio. som finnes i backtest. py. Det er nesten identisk med implementeringen beskrevet i den tidligere opplæringen, med unntak av at handlingene nå utføres på nært hold, i stedet for en åpen til åpen basis. For detaljer om hvordan porteføljeobjektet er definert, se den forrige opplæringen. Ive forlot koden for fullstendig og å holde denne opplæringen selvstendig: Nå som MovingAverageCrossStrategy og MarketOnClosePortfolio-klassene er definert, vil en hovedfunksjon bli kalt for å knytte alle funksjonalitetene sammen. I tillegg vil utførelsen av strategien bli undersøkt via 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 langvarige signaler. Deretter genereres porteføljen med en startkapital på 100 000 USD og avkastningen beregnes på egenkapitalkurven. Det endelige trinnet er å bruke matplotlib til å tegne en tofigurert plot av begge AAPL-prisene, overlaid med de bevegelige gjennomsnittene og buysell-signaler, samt egenkapitalkurven med de samme buysell-signalene. Plottingskoden er tatt (og endret) fra zipline implementeringseksemplet. Kodenes grafiske utgang er som følger. Jeg benyttet seg av IPython Paste-kommandoen for å sette dette direkte inn i IPython-konsollen mens du var i Ubuntu, slik at den grafiske utgangen forblir i visning. Den rosa oppturen representerer kjøp av aksjen, mens de svarte downticks representerer å selge den tilbake: Som det kan sees, mister strategien penger over perioden, med fem rundturer. Dette er ikke overraskende gitt AAPLs oppførsel i perioden, noe som var på en liten nedadgående trend, etterfulgt av en signifikant oppgang i 1998. Reflekteringsperioden for de bevegelige gjennomsnittssignalene er ganske stor og dette påvirket resultatet av den endelige handel , som ellers kan ha gjort strategien lønnsom. I etterfølgende artikler vil vi skape et mer sofistikert middel til å analysere ytelse, samt å beskrive hvordan man optimaliserer tilbakekallingsperioder for de enkelte bevegelige gjennomsnittssignaler. Bare Komme i gang med kvantitative TradingComputational Tools Analogt, DataFrame har en metode for å beregne parvise covariances blant serien i DataFrame, også unntatt NAnull-verdier. Forutsatt at manglende data mangler tilfeldig, resulterer dette i et estimat for kovariansmatrisen som er objektiv. For mange anvendelser kan dette estimatet imidlertid ikke være akseptabelt fordi den estimerte kovariansmatrisen ikke er garantert å være positiv semi-bestemt. Dette kan føre til estimerte korrelasjoner med absolutte verdier som er større enn en, og eller en ikke-inverterbar kovariansmatrise. Se Estimering av kovariansmatriser for flere detaljer. DataFrame. cov støtter også et valgfritt søkeord for minperioder som angir ønsket minimumsantal observasjoner for hvert kolonnepar for å få et gyldig resultat. Vektene som brukes i vinduet er spesifisert av wintype søkeordet. Listen over anerkjente typer er: boxcar triang blackman hamming bartlett parzen bohman blackmanharris nuttall barthann kaiser (trenger beta) gaussian (needs std) generalgaussian (trenger kraft, bredde) slepian (trenger bredde). Merk at bokservinduet er lik gjennomsnittet (). For noen vindufunksjoner må ytterligere parametere angis: For. sum () med en wintype. Det er ingen normalisering gjort til vekter for vinduet. Ved å sende tilpassede vekter på 1, 1, 1 vil det gi et annet resultat enn passerende vekter på 2, 2, 2. for eksempel. Når du passerer en wintype i stedet for å spesifisere tyngden, er vektene allerede normalisert slik at den største vekten er 1. I motsetning er naturen av. mean () beregningen slik at vektene normaliseres i forhold til hverandre. Vekter på 1, 1, 1 og 2, 2, 2 gir det samme resultatet. Time-aware Rolling Ny i versjon 0.19.0. Ny i versjon 0.19.0 er muligheten til å overføre en forskyvning (eller konvertibel) til en. rolling () - metode og få den til å produsere variabelstørrelsesvinduer basert på passet tidsvindu. For hvert tidspunktspunkt inkluderer dette alle tidligere verdier som forekommer innen det angitte tidspunktet delta. Dette kan være spesielt nyttig for en ikke-vanlig tidsfrekvensindeks. Dette er en vanlig frekvensindeks. Ved å bruke et heltallsparameter virker parameteren å rulle langs vinduets frekvens. Angi en forskyvning gir en mer intuitiv spesifikasjon av rullfrekvensen. Ved å bruke en ikke-vanlig, men likevel monotonisk indeks, gir det ikke noen spesiell beregning å rulle med et heltallvindu. Ved bruk av tidsspesifikasjonen genereres variabelvinduer for denne sparsomme data. Videre tillater vi nå en valgfri parameter for å spesifisere en kolonne (i stedet for standardindeksen) i en DataFrame. Time-aware Rolling vs Resampling Using. rolling () med en tidsbasert indeks er ganske lik resampling. De opererer og utfører reduktiv operasjon på tidindekserte pandasobjekter. Når du bruker. rolling () med en forskyvning. Forskjellen er et tids-delta. Ta et bakover-i-tid-ser vindu, og aggregat alle verdiene i vinduet (inkludert sluttpunktet, men ikke startpunktet). Dette er den nye verdien på det tidspunktet i resultatet. Dette er vinduer med variabel størrelse i tidsrom for hvert punkt på inngangen. Du får samme resultat som inngangen. Når du bruker. resample () med en forskyvning. Konstruer en ny indeks som er frekvensen av forskyvningen. For hver frekvensfylle peker aggregatet fra inngangen i et bakover-i-tid-ser vindu som faller i boksen. Resultatet av denne aggregeringen er utgangen for det aktuelle frekvenspunktet. Vinduene er fast størrelse i frekvensområdet. Resultatet ditt vil ha formen på en vanlig frekvens mellom min og maksimum for det opprinnelige inngangsobjektet. Å oppsummere. rullende () er en tidsbasert vindusoperasjon, mens. resample () er en frekvensbasert vindusoperasjon. Sentering av Windows Som standard er etikettene satt til høyre kant av vinduet, men et senter søkeord er tilgjengelig slik at etikettene kan settes i sentrum. Binære vindufunksjoner cov () og corr () kan beregne flyttbar vinduestatistikk om to serier eller en kombinasjon av DataFrameSeries eller DataFrameDataFrame. Her er oppførselen i hvert tilfelle: to serier. beregne statistikken for paringen. DataFrameSeries. beregne statistikken for hver kolonne i DataFrame med den bestått serien, og returnerer dermed en DataFrame. DataFrameDataFrame. beregner som standard statistikken for å tilpasse kolonnenavn, og returnerer en DataFrame. Hvis søkeordet argumentet pairwiseTrue er bestått beregner du statistikken for hvert par kolonner, og returnerer et panel hvis elementer er de aktuelle datoene (se neste avsnitt). Computing rolling parvis covariances og korrelasjoner I økonomisk data analyse og andre felt it8217s vanlig å beregne kovarians og korrelasjon matriser for en samling av tidsserier. Ofte er man også interessert i flyttevindukovarians og korrelasjonsmatriser. Dette kan gjøres ved å passere argumentet for parvis søkeord, som i tilfelle av DataFrame-innganger vil gi et panel hvis gjenstander er datoene i spørsmålet. I tilfelle av et enkelt DataFrame-argument kan det parvisvise argumentet utelates: Manglende verdier ignoreres, og hver oppføring beregnes ved hjelp av de parvis fullstendige observasjonene. Vennligst se kovarianseksjonen for advarsler knyttet til denne metoden for beregning av kovarians - og korrelasjonsmatriser. Bortsett fra ikke å ha en vindusparameter, har disse funksjonene de samme grensesnittene som deres. rolling-kolleger. Som ovenfor er parametrene de alle aksepterer: minperiodene. terskel for ikke-null datapunkter å kreve. Standard er nødvendig for å beregne statistikk. Ingen NaNs vil bli sendt ut når minperioder ikke-null datapunkter er blitt sett. senter. boolsk, om du vil sette etikettene i midten (standard er False) Utgangene til. rolling og. expanding-metodene returnerer ikke en NaN hvis det er minst minverdier ikke-nullverdier i det nåværende vinduet. Dette er forskjellig fra cumsum. cumprod. cummax. og cummin. som returnerer NaN i utgangen hvor et NaN oppstår i inngangen. En ekspanderende vinduestatistikk vil være mer stabil (og mindre responsiv) enn den rullende vinduesmodellen, da den økende vindustørrelsen reduserer den relative effekten av et individuelt datapunkt. Eksempel: Her er gjennomsnittlig () - utgangen for den tidligere tidsseriensdatasettet: Eksponentielt vektet Windows Et tilhørende sett av funksjoner er eksponentielt vektede versjoner av flere av ovennevnte statistikker. Et lignende grensesnitt for. rolling og. expanding er tilgjengelig gjennom. ewm-metoden for å motta et EWM-objekt. En rekke ekspanderende EW-metoder (eksponentielt vektet) er gitt: Takk for at du sendte EMA. Og ja, TAlib burde virkelig være tilgjengelig. Det er noe arbeid på dette som faktisk ser veldig lovende ut (githubquantopianziplinepull100). Jeg vil prøve å trekke dette inn snart for å gjøre det tilgjengelig for et større publikum. Materiellet på denne nettsiden er kun gitt til informasjonsformål og er ikke et tilbud om å selge, en forespørsel om å kjøpe, eller en anbefaling eller påtegning for noen sikkerhet eller strategi, og det er heller ikke et tilbud om å gi investeringsrådgivnings tjenester av Quantopian. I tillegg gir materialet ingen mening med hensyn til egnetheten til noen sikkerhet eller spesifikk investering. Quantopian gir ingen garantier for nøyaktigheten eller fullstendigheten av synspunkter uttrykt på nettstedet. Synspunktene kan endres, og kan ha blitt upålitelige av ulike årsaker, inkludert endringer i markedsforhold eller økonomiske forhold. Alle investeringer innebærer risiko, inkludert tap av hovedstol. Du bør rådføre deg med en investering profesjonell før du gjør noen investeringsbeslutninger. Det gjør det. Men det meste av arbeidet med å finne ut den beste måten er allerede gjort. Vi trenger bare å fullføre den. Etter det er det bare en haug med copyamppaste å pakke hele TAlib-biblioteket. Det er mange gode ting i arbeidene for å takle visse kortkomninger. Det er et spørsmål om ressurser for det meste. Materiellet på denne nettsiden er kun gitt til informasjonsformål og er ikke et tilbud om å selge, en forespørsel om å kjøpe, eller en anbefaling eller påtegning for noen sikkerhet eller strategi, og det er heller ikke et tilbud om å gi investeringsrådgivnings tjenester av Quantopian. I tillegg gir materialet ingen mening med hensyn til egnetheten til noen sikkerhet eller spesifikk investering. Quantopian gir ingen garantier for nøyaktigheten eller fullstendigheten av synspunkter uttrykt på nettstedet. Synspunktene kan endres, og kan ha blitt upålitelige av ulike årsaker, inkludert endringer i markedsforhold eller økonomiske forhold. Alle investeringer innebærer risiko, inkludert tap av hovedstol. Du bør rådføre deg med en investering profesjonell før du gjør noen investeringsbeslutninger.
No comments:
Post a Comment