Python Calculate Eksponentiell Moving Average


Jeg har en rekke datoer og en måling på hver av disse datoene. Jeg liker å beregne et eksponentielt glidende gjennomsnitt for hver av datoene. Vet noen hvordan å gjøre dette, jeg er ny på python. Det ser ikke ut til at gjennomsnitt er bygget inn i standard pythonbiblioteket, noe som slår meg som et lite merkelig. Kanskje jeg ikke ser på rett sted. Så, gitt følgende kode, hvordan kunne jeg beregne det flytende vektede gjennomsnittet av IQ-poeng for kalenderdatoer (det er sannsynligvis en bedre måte å strukturere dataene på, noe råd ville bli verdsatt) spurte 28. jan kl 18:01 Min python er en litt rustet (noen kan gjerne redigere denne koden for å gjøre rettelser, hvis jeg har slått opp syntaxen på en eller annen måte), men her går det. Denne funksjonen beveges bakover, fra slutten av listen til begynnelsen, beregner eksponentielt glidende gjennomsnitt for hver verdi ved å arbeide bakover til vektkoeffisienten for et element er mindre enn det angitte epsilonet. På slutten av funksjonen reverserer den verdiene før du returnerer listen (slik at de er i riktig rekkefølge for den som ringer). (SIDE MERK: Hvis jeg brukte et annet språk enn python, oppretter jeg en fullstendig tom rekke først, og fyller den deretter på baksiden, slik at jeg ikke ville måtte reversere den på slutten. Men jeg tror ikke du kan erklære et stort tomt utvalg i python. Og i pythonlister er tilkobling mye billigere enn forutsetningen, og derfor bygde jeg opp listen i omvendt rekkefølge. Vennligst rett meg hvis jeg er feil.) Alfa-argumentet er forfallsfaktoren på hver iterasjon. Hvis du for eksempel brukte en alfa på 0,5, ville dagens glidende gjennomsnittsverdi bestå av følgende vektede verdier: Selvfølgelig, hvis du har et stort utvalg av verdier, vil verdiene fra ti eller femten dager siden ikke bidra veldig mye til dagens vektede gjennomsnitt. Epsilon-argumentet lar deg angi et cutoff-punkt, under hvilket du vil slutte å bry deg om gamle verdier (siden deres bidrag til dagens verdi vil være ubetydelig). Youd påkaller funksjonen noe slikt: Besvart 28. januar 09 kl 18:46 Jeg vet ikke Python, men for den gjennomsnittlige delen, mener du et eksponentielt forfallende lavpassfilter i skjemaet der alfa dttau, dt filterets tidstap , tau filterets tidskonstant (variabeltidsformen for dette er som følger, bare klipp dttau til ikke være mer enn 1,0) Hvis du vil filtrere noe som en dato, må du kontrollere at du konverterer til en flytende punktmengde som om sekunder siden 1. januar 1970. Besvart 28. jan kl 18:10 Jeg fant den ovennevnte kodestykket av earino ganske nyttig - men jeg trengte noe som kunne kontinuerlig jevne en strøm av verdier - så jeg refactored det til dette: og jeg bruker det slik: (hvor pin. read () produserer den neste verdien som jeg liker å konsumere). besvart 12. februar 14 klokka 20:35 Jeg beregner alltid EMAer med Pandas: Her er et eksempel på hvordan du gjør det: Mer informasjon om Pandas EWMA: svarte 4. okt 15 kl 12:42 Don39t nyere versjoner av Pandas har nye og bedre funksjoner. ndash Cristian Ciupitu 11 mai 16 kl 14:10 Merk at i motsetning til i regnearket, beregner jeg ikke SMA, og jeg venter ikke på å generere EMA etter 10 prøver. Dette betyr at mine verdier er forskjellige, men hvis du kartlegger det, følger det nøyaktig etter 10 prøver. Under de første 10 prøvene, EMA jeg beregner er riktig jevnt. Hmmm, det virker som dette quoteasy å implementquot funksjonen er faktisk ganske enkelt å bli feil og har fremmet en god diskusjon om minneeffektivitet. Jeg er glad for å ha oppblåst hvis det betyr å vite at noe har blitt gjort riktig. ndash Richard Sep 20 14 kl 19:23 NumPys mangel på en bestemt domenespesifikk funksjon er kanskje på grunn av Core Teams disiplin og troskap til NumPys hoveddirektiv: gi en N-dimensjonal array type. samt funksjoner for å opprette og indeksere disse arrays. Som mange grunnleggende mål er denne ikke liten, og NumPy gjør det glimrende. Den (mye) større SciPy inneholder en mye større samling av domenespesifikke biblioteker (kalt delpakker med SciPy devs) - for eksempel numerisk optimalisering (optimalisering), signalprosessering (signal) og integralkalkulator (integrere). Min gjetning er at funksjonen du er ute etter, er i minst en av SciPy-subpackages (scipy. signal kanskje), men jeg vil se først ut i samlingen av SciPy scikits. identifiser relevante scikit (er) og se etter interessens funksjon der. Scikits er selvstendig utviklede pakker basert på NumPySciPy og rettet mot en bestemt teknisk disiplin (f. Eks. Scikits-image. Scikits-learn etc.) Flere av disse var (spesielt den fantastiske OpenOpt for numerisk optimalisering) høyt ansett, modne prosjekter lange før du velger å bo under de relativt nye scikits rubric. Scikits hjemmeside likte å overliste omtrent 30 slike scikits. selv om minst flere av dem ikke lenger er under aktiv utvikling. Etter dette rådene vil du lede til scikits-timeseries, men denne pakken er ikke lenger under aktiv utvikling. Pandas er faktisk blitt AFAIK, de facto NumPy-baserte tidsserienbiblioteket. Pandas har flere funksjoner som kan brukes til å beregne et glidende gjennomsnitt. Det enkleste av disse er trolig rullende. som du bruker slik: Nå bare ring funksjonen rullende mens passerer i Serie objektet og en vindu størrelse. som i mitt eksempel nedenfor er 10 dager. bekreft at det virket - f. eks. sammenlignet verdier 10-15 i den opprinnelige serien versus den nye serien jevnet med rullende middel Funksjonen rullende mean sammen med omtrent et dusin eller annen funksjon er informelt gruppert i Pandas dokumentasjon under rubrikk flyttingsvinduet fungerer en andre relatert gruppe funksjoner i Pandas refereres til som eksponentielt vektede funksjoner (f. eks. ewma. som beregner eksponentielt flytende vektet gjennomsnitt). Det faktum at denne andre gruppen ikke er inkludert i de første (flyttbare vindufunksjonene), er kanskje fordi de eksponentielt vektede transformasjonene ikke stole på et fastlengtingsvindu. Jeg er i ferd med å lage en forex tradingalgoritme og ønsket å prøve mitt skudd ved beregning EMA (eksponentielle flytende gjennomsnitt). Mine resultater synes å være riktige (sammenlignet med beregningene jeg gjorde for hånden), så jeg tror at følgende metode virker, men ville bare få et ekstra sett med øyne for å sikre at jeg ikke savner noe. Merk at dette bare returnerer EMA for den siste prisen, det returnerer ikke en rekke EMAer som det er ikke det jeg trenger for søknaden min. Rekursjon er et godt verktøy for riktig jobb, men her er det vant til å utføre enkel looping. Som sådan koden. er vanskeligere å lese og begrunnelse om. er langsommere fordi mye av koden i ema bare trenger å kjøre en gang. vil mislykkes med stor nok verdi av vinduet på grunn av overfylt Pythons call stack. Vennligst dokument minst parametere for hver funksjon, f. eks. Dette vinduet er lengden på vinduet, og den posisjonen teller bakover fra datasendingen. (Faktisk ville det være tydeligere hvis posisjonen var en normal fremoverindeks i data) Løft et unntak når du finner en parameter har en ugyldig verdi. Returnerer ingen i stedet vil bare føre til et mer forvirrende unntak senere. Faktisk, hvis jeg prøver Indikatorer (). Ema (closeprices, 600) får jeg uendelig rekursjon fordi sma returnerer None. som gjør ema call sma igjen og igjen. Det forrige punktet viser også at hvis len (data) lt vindu 2 ikke er riktig gyldighetskontroll. Den 1 i data-vinduet2 1: - vindu 1 virker ikke riktig for meg. Jeg antar at du vil ha data-window2: - window Oppsigelsen returner tidligereem er på et merkelig sted fordi du på dette tidspunktet har beregnet et nytt aktuelt emne. Dette er grunnleggende tilfelle av rekursjonen, og det er vanlig å håndtere basissettet først. Mitt forslag til ema: svarte 26. november kl 14:56 Ganske grunne gjennomgang: Du trenger ikke å skrive en klasse for hva du gjør (og jeg foreslår at du ser på denne videoen). Klassen din innkapsler ikke noen data, og du bruker den bare til å ha dine funksjoner i samme enhet. Jeg antar at ting ville være lettere å forstå hvis du skulle definere klassemetode for å gjøre det klart at du ikke vil stole på noe som helst tilfelle. Men et enda bedre alternativ ville være å bare definere funksjoner i en indikatormodul. svarte 24. november kl 14:04 Takk for forslagene jeg faktisk hadde dem som classmethods og debatterte å gå frem og tilbake mellom selv å bruke en klasse eller bare definere funksjoner i en indikatormodul (som jeg nå skal gjøre). ndash ChrisC Nov 25 14 at 19:12 Bare så på videoen, gode ting. ndash ChrisC Nov 25 14 at 19:43 Ditt svar 2017 Stack Exchange, IncSmoothing med eksponentielt vektet Flytende gjennomsnitt Et glidende gjennomsnitt tar en støyende tidsserie og erstatter hver verdi med gjennomsnittlig verdi av et nabolag om den oppgitte verdien. Dette nabolaget kan bestå av rent historiske data, eller det kan være sentrert om den oppgitte verdien. Videre kan verdiene i nabolaget vektes ved å bruke forskjellige sett av vekter. Her er et eksempel på et likevekt trepunkts glidende gjennomsnitt, ved hjelp av historiske data, Her representerer det glatte signalet, og representerer støyende tidsserier. I motsetning til enkle bevegelige gjennomsnitt, justerer et eksponentielt vektet glidende gjennomsnitt (EWMA) en verdi i henhold til en eksponentielt vektet sum av alle tidligere verdier. Dette er grunnleggende ideen, dette er fint fordi du ikke trenger å bekymre deg for å ha et trepunktsvindu, i motsetning til et fempunktsvindu, eller bekymre deg for hensiktsmessigheten av vektingsplanen din. Med EWMA ble tidligere forstyrrelser 8220remembered, 8221 og 8220glemt glemt, 8221 av begrepet i siste ligning, mens med et vindu eller nabolag med diskrete grenser, glemmes en forstyrrelse så snart den går ut av vinduet. Gjennomgang av EWMA for å imøtekomme trender Etter å ha lest om EWMAer i en dataanalysebok, hadde jeg lykkes med å bruke dette verktøyet på hvert enkelt utjevningsprogram som jeg kom over. Det var ikke før senere at jeg lærte at EWMA-funksjonen egentlig bare passer for stasjonære data, det vil si data uten trender eller sesongmessighet. Spesielt motstår EWMA-funksjonen trender bort fra dagens, at it8217 er allerede 8220seen22221. Så hvis du har en bråkete hattfunksjon som går fra 0 til 1 og deretter tilbake til 0, vil EWMA-funksjonen returnere lave verdier på opp-baksiden og høye verdier på nedre siden. En måte å omgå dette er å glatte signalet i begge retninger, marsjerer fremover, og marsjerer deretter bakover, og deretter gjennomsnittlig de to. Her vil vi bruke EWMA-funksjonen som leveres av pandas-modulen. Holt-Winters Second Order EWMA Og her er noen Python-kode som implementerer Holt-Winters andreordsmetode på en annen støyende hattfunksjon, som før. Post navigasjon Siste innlegg

Comments