Monday 6 November 2017

Flytte Gjennomsnittet Pseudo Kode


Eksponentiell flytende gjennomsnitt - EMA BREAKING DOWN Eksponensiell flytende gjennomsnitt - EMA De 12 og 26-dagers EMAene er de mest populære kortsiktige gjennomsnittene, og de brukes til å skape indikatorer som den flytende gjennomsnittlige konvergensdivergensen (MACD) og prosentvis prisoscillator (PPO). Generelt brukes 50- og 200-dagers EMAer som signaler for langsiktige trender. Traders som ansetter teknisk analyse, finner glidende gjennomsnitt veldig nyttige og innsiktsfulle når de brukes riktig, men skaper kaos når de brukes feil eller blir feilfortolket. Alle de bevegelige gjennomsnittene som vanligvis brukes i teknisk analyse, er av sin natur sakende indikatorer. Følgelig bør konklusjonene fra å bruke et glidende gjennomsnitt til et bestemt markedskart være å bekrefte et markedskryss eller for å indikere dets styrke. Svært ofte, etter hvert har en glidende gjennomsnittlig indikatorlinje endret seg for å reflektere et betydelig trekk i markedet, og det optimale punktet for markedsinngang har allerede gått. En EMA tjener til å lette dette dilemmaet til en viss grad. Fordi EMA-beregningen plasserer mer vekt på de nyeste dataene, klemmer prishandlingen litt strammere og reagerer derfor raskere. Dette er ønskelig når en EMA brukes til å utlede et handelsinngangssignal. Tolke EMA Som alle bevegelige gjennomsnittsindikatorer, er de mye bedre egnet for trending markeder. Når markedet er i en sterk og vedvarende opptrinn. EMA-indikatorlinjen vil også vise en uptrend og vice versa for en nedtrend. En årvåken handelsmann vil ikke bare være oppmerksom på retningen til EMA-linjen, men også forholdet mellom endringshastigheten fra en linje til den neste. For eksempel, da prisvirkningen av en sterk opptrend begynner å flate og reversere, vil EMAs endringshastighet fra en linje til den neste begynne å redusere til den tid som indikatorlinjen flater og endringshastigheten er null. På grunn av den slanke effekten, ved dette punktet, eller til og med noen få barer før, bør prishandlingen allerede ha reversert. Det følger derfor at observere en konsistent reduksjon i endringshastigheten til EMA, kunne seg selv brukes som en indikator som ytterligere kunne motvirke dilemmaet forårsaket av den bølgende effekten av bevegelige gjennomsnitt. Vanlige bruksområder til EMA-EMAer brukes ofte i forbindelse med andre indikatorer for å bekrefte betydelige markedsbevegelser og å måle deres gyldighet. For handelsmenn som handler intradag og rasktflyttende markeder, er EMA mer anvendelig. Ofte bruker handelsmenn EMAer for å bestemme en handelspartiskhet. For eksempel, hvis en EMA på et daglig diagram viser en sterk oppadgående trend, kan en intraday-tradere strategi være å handle kun fra den lange siden på en intradag-kart. Jeg prøver å beregne det bevegelige gjennomsnittet av et signal. Signalverdien (en dobbel) oppdateres i tilfeldige tider. Jeg ser etter en effektiv måte å beregne sitt tidsvektede gjennomsnitt på over et tidsvindu, i sanntid. Jeg kunne gjøre det selv, men det er mer utfordrende enn jeg trodde. De fleste av ressursene jeg har funnet over Internett, er å beregne glidende gjennomsnitt av periodisk signal, men mine oppdateringer tilfeldigvis. Kjenner noen gode ressurser til det? Tricket er det følgende: Du får oppdateringer i tilfeldige tider via ugyldig oppdatering (int time, float value). Men du må også spore når en oppdatering faller av tidsvinduet, så du stiller en alarm som kalles på tidspunktet N som fjerner den forrige oppdateringen, fra å bli vurdert på nytt i beregningen. Hvis dette skjer i sanntid, kan du be om at operativsystemet skal ringe til en metode som ikke lenger kan hentes fra tid til annen. N Hvis dette er en simulering, kan du ikke få hjelp fra operativsystemet, og du må gjør det manuelt. I en simulering vil du ringe metoder med tiden som følger med som et argument (som ikke korrelerer med sanntid). En rimelig forutsetning er imidlertid at anropene er garantert slik at tidsargumentene øker. I dette tilfellet må du opprettholde en sortert liste over alarmtidsverdier, og for hver oppdatering og leseanrop må du kontrollere om tidsargumentet er større enn hodet til alarmlisten. Mens det er større gjør du den alarmrelaterte behandlingen (slipp av den eldste oppdateringen), fjern hodet og kontroller igjen til alle alarmer før den angitte tiden behandles. Oppdater deretter oppdateringen. Jeg har så langt antatt at det er åpenbart hva du ville gjøre for den faktiske beregningen, men jeg vil utarbeide bare i tilfelle. Jeg antar at du har en metodeflottslest (int tid) som du bruker til å lese verdiene. Målet er å gjøre denne anrop så effektiv som mulig. Så du beregner ikke det bevegelige gjennomsnittet hver gang lesemetoden kalles. I stedet forkalkulerer du verdien som for den siste oppdateringen eller den siste alarmen, og justerer denne verdien ved hjelp av et par flytende punktoperasjoner for å regne for tidsforløpet siden den siste oppdateringen. (dvs. et konstant antall operasjoner bortsett fra kanskje å behandle en liste over oppstartede alarmer). Forhåpentligvis er dette klart - dette burde være en ganske enkel algoritme og ganske effektiv. Ytterligere optimalisering. Et av de gjenværende problemene er at hvis et stort antall oppdateringer skjer i tidsvinduet, så er det lang tid som det ikke finnes, eller oppdateringer, og deretter kommer en lesing eller oppdatering. I dette tilfellet vil ovennevnte algoritme være ineffektiv i trinnvis oppdatering av verdien for hver av oppdateringene som faller av. Dette er ikke nødvendig fordi vi bare bryr oss om den siste oppdateringen utover tidsvinduet, så hvis det er en måte å effektivt slippe av alle eldre oppdateringer, ville det hjelpe. For å gjøre dette kan vi endre algoritmen for å gjøre et binært søk med oppdateringer for å finne den nyeste oppdateringen før tidsvinduet. Hvis det er relativt få oppdateringer som må slettes, kan man trinnvis oppdatere verdien for hver oppdatert oppdatering. Men hvis det er mange oppdateringer som må slettes, kan man rekomputere verdien fra bunnen av etter å ha slått av de gamle oppdateringene. Tillegg om inkrementell beregning: Jeg bør klargjøre hva jeg mener med inkrementell beregning over i setningen justere denne verdien ved hjelp av et par flytende punktoperasjoner for å regne for tidsovergangen siden siste oppdatering. Innledende ikke-inkrementell beregning: deretter iterate over relevant oppdateringer i rekkefølge av økende tid: movingaverage (sum siste oppdatert timesincelastupdate) windowlength. Nå dersom nøyaktig en oppdatering faller av vinduet, men ingen nye oppdateringer kommer, juster summen som: (Merk at det er forhåndsdatat som har tidsstempel endret til begynnelsen av det siste vinduet som begynner). Og hvis akkurat en oppdatering kommer inn i vinduet, men ingen nye oppdateringer faller av, juster summen som: Som det skal være klart, er dette en grov skisse, men forhåpentligvis viser den hvordan du kan opprettholde gjennomsnittet slik at det er O (1) operasjoner per oppdatering på amortisert basis. Men vær oppmerksom på ytterligere optimalisering i forrige avsnitt. Legg også merke til stabilitetsproblemer som refereres til i et eldre svar, noe som betyr at flytpunktsfeil kan akkumulere over et stort antall slike inkrementelle operasjoner slik at det er en avvik fra resultatet av den fullstendige beregningen som er viktig for applikasjonen. Hvis en tilnærming er OK, og det er en minimal tid mellom prøver, kan du prøve superprøving. Har en matrise som representerer jevnt fordelte tidsintervaller som er kortere enn minimumet, og i hver tidsperiode lagrer du den siste prøven som ble mottatt. Jo kortere intervallet, jo nærmere gjennomsnittet blir den sanne verdien. Perioden bør ikke være større enn halvparten av minimumet, eller det er en sjanse for å mangle en prøve. svarte des 15 11 kl 18:12 svarte des 15 11 kl 22:38 Takk for svaret. En forbedring som ville være nødvendig for å faktisk citerer verdien av det totale gjennomsnittet, slik at vi ikke slår hele tiden. Det kan også være et mindre punkt, men det ville ikke være mer effektivt å bruke en deque eller en liste for å lagre verdien, siden vi antar at oppdateringen kommer i riktig rekkefølge. Innsetting vil være raskere enn i kartet. ndash Arthur Dec 16 11 at 8:55 Ja, du kan cache verdien av summen. Trekk verdiene av prøvene du sletter, legg til verdiene av prøvene du legger inn. Også, en dequeltpairltSample, Dategtgt kan være mer effektiv. Jeg valgte kart for lesbarhet, og det enkle å påkalle kart :: overgående. Som alltid, skriv riktig kode først, og profil og måle trinnvise endringer. ndash Rob Dec 16 11 kl 15:00 Merk: Dette er tilsynelatende ikke veien til å nærme seg dette. Leaving det her for referanse om hva som er galt med denne tilnærmingen. Sjekk kommentarene. OPPDATERT - basert på Olis kommentar. Ikke sikker på om ustabiliteten han snakker om skjønt. Bruk et sortert kart over ankomsttider mot verdier. Ved ankomst av verdi legger du ankomsttid til det sorterte kartet sammen med verdien og oppdaterer glidende gjennomsnitt. advarsel dette er pseudokode: der. Ikke helt fleshed ut, men du får ideen. Ting å merke seg. Som jeg sa ovenfor er pseudokoden. Du må velge et passende kart. Ikke ta av parene ettersom du gjennomfører det, da du vil ugyldiggjøre iteratoren og må starte på nytt. Se Olis kommentar nedenfor også. besvart 15. desember kl 12:22 Dette virker ikke: det tar ikke hensyn til hvilken andel av vinduslengden hver verdi eksisterer for. Også denne tilnærmingen til å legge til og deretter subtrahere er bare stabil for heltalltyper, ikke flyter. ndash Oliver Charlesworth Dec 15 11 at 12:29 OliCharlesworth - beklager jeg savnet noen viktige punkter i beskrivelsen (dobbelt og tidsvektet). Jeg vil oppdatere. Takk. ndash Dennis Dec 15 11 at 12:33 Tidsvekten er enda et problem. Men det er ikke det jeg snakker om. Jeg refererte til det faktum at når en ny verdi først kommer inn i tidsvinduet, er dets bidrag til gjennomsnittet minimalt. Dens bidrag fortsetter å øke inntil en ny verdi går inn. ndash Oliver Charlesworth Dec 15 11 at 12:35 Jeg har egentlig en rekke verdier som dette: Ovennevnte array er oversimplified, jeg samler 1 verdi per millisekund i min virkelige kode og jeg må behandle utdataene på en algoritme jeg skrev for å finne nærmeste topp før et tidspunkt. Min logikk feiler fordi i mitt eksempel over, er 0.36 den virkelige toppen, men min algoritme vil se bakover og se det aller siste nummeret 0,25 som toppen, da det er en reduksjon til 0,24 før den. Målet er å ta disse verdiene og bruke en algoritme til dem som vil glatte dem ut litt, slik at jeg har mer lineære verdier. (dvs.: Jeg synes at resultatene mine skal være svingete, ikke ekte). Jeg har blitt fortalt å bruke et eksponentielt glidende gjennomsnittsfilter til mine verdier. Hvordan kan jeg gjøre dette? Det er veldig vanskelig for meg å lese matematiske ligninger, jeg har mye bedre med kode. Hvordan behandler jeg verdier i mitt utvalg, og bruker en eksponentiell glidende gjennomsnittlig beregning for å jevne dem ut, spurte 8 februar klokken 20:27 for å beregne et eksponentielt glidende gjennomsnitt. du trenger å holde noen stat rundt og du trenger en tuning parameter. Dette krever en liten klasse (forutsatt at du bruker Java 5 eller nyere): Instantiate med decay-parameteren du vil ha (kanskje ta tuning skal være mellom 0 og 1) og bruk deretter gjennomsnittlig () for å filtrere. Når du leser en side om matematisk tilbakevending, trenger du bare å vite når du gjør det til kode, at matematikere liker å skrive indekser i arrays og sekvenser med abonnementer. (De har også et par andre notater, noe som ikke hjelper.) EMA er imidlertid ganske enkel, da du bare trenger å huske en gammel verdi, ingen kompliserte tilstandsarrayer kreves. svarte 8. februar kl 12:42 TKKocheran: Ganske mye. Det er ikke bra når ting kan være enkle (Hvis du starter med en ny sekvens, får du en ny gjennomsnittlig.) Vær oppmerksom på at de første betingelsene i gjennomsnittssekvensen vil hoppe rundt litt på grunn av grenseeffekter, men du får de med andre bevegelige gjennomsnitt også. En god fordel er imidlertid at du kan pakke den bevegelige gjennomsnittlige logikken inn i avvergeren og eksperimentere uten å forstyrre resten av programmet for mye. ndash Donal Fellows 9 Feb 12 kl 0:06 Jeg har det vanskelig å forstå dine spørsmål, men jeg vil prøve å svare uansett. 1) Hvis algoritmen din fant 0,25 i stedet for 0,36, så er det feil. Det er feil fordi det forutsetter en monotonisk økning eller reduksjon (det går alltid opp eller går alltid ned). Med mindre du gjennomsnittlig ALLE dataene dine, er datapunktene dine --- som du presenterer dem --- ikke-lineære. Hvis du virkelig vil finne den maksimale verdien mellom to poeng i tid, skar du matrisen din fra tmin til tmax og finn maksimalt for den subarrayen. 2) Nå er begrepet bevegelige gjennomsnitt veldig enkle: forestill deg at jeg har følgende liste: 1.4, 1.5, 1.4, 1.5, 1.5. Jeg kan glatte det ut ved å ta gjennomsnittet av to tall: 1,45, 1,45, 1,45, 1,5. Legg merke til at første nummer er gjennomsnittet på 1,5 og 1,4 (andre og første tall) den andre (nye listen) er gjennomsnittet på 1,4 og 1,5 (tredje og andre gamle liste) den tredje (nye listen) gjennomsnittet på 1,5 og 1,4 (fjerde og tredje), og så videre. Jeg kunne ha gjort det perioden tre eller fire, eller n. Legg merke til hvordan dataene er mye jevnere. En god måte å se glidende gjennomsnitt på jobben er å gå til Google Finance, velg en aksje (prøv Tesla Motors ganske flyktig (TSLA)) og klikk på technicals nederst i diagrammet. Velg Moving Average med en gitt periode, og eksponentiell glidende gjennomsnitt for å sammenligne forskjellene sine. Eksponentielt glidende gjennomsnitt er bare en annen utbygging av dette, men veier de eldre dataene mindre enn de nye dataene, dette er en måte å forvirre utjevningen mot baksiden. Vennligst les Wikipedia-oppføringen. Så dette er mer en kommentar enn et svar, men den lille kommentarboksen var bare for liten. Lykke til. Hvis du har problemer med matematikken, kan du gå med et enkelt bevegelige gjennomsnitt i stedet for eksponentiell. Så utgangen du får, vil være de siste x-vilkårene delt med x. Ikke testet pseudokode: Vær oppmerksom på at du må håndtere start - og sluttdelene av dataene, siden du klart ikke kan gjennomsnittlig de siste 5 vilkårene når du er på ditt andre datapunkt. Det er også mer effektive måter å beregne dette glidende gjennomsnittet (sum sum - eldste nyeste), men dette er å få konseptet av hva som skjer over. besvart 8. februar kl 12:41

No comments:

Post a Comment