Wednesday 18 October 2017

Enkel Bevegelse Gjennomsnittet Java


En enkel, flytende gjennomsnittsimplementering i Java Ved flere anledninger ønsket jeg å beregne enkle beregninger i Java-applikasjonene, for eksempel antall treff i timen eller feil over en tidsperiode. Mens beregning av enkle beregninger ikke er veldig vanskelig, er det bare ekstra arbeid og ID heller å bruke den tiden på problemdomenet. Jeg var overrasket over å ikke finne noen allment aksepterte løsninger for beregninger i Java. Jeg fant Metrics, men det virket litt for komplisert og ikke godt dokumentert. Alt jeg virkelig ønsket var å beregne et bevegelige gjennomsnitt. Jeg tenkte på problemet litt mer og bestemte seg for at det ikke var et vanskelig problem. Heres min løsning Dette virker ved å skape en rekke vindu oppdateringsfrekvens størrelse, og en tråd setter tellingen til neste indeks i arrayet på oppdateringsfrekvensen. Tellingen for intervallet er ganske enkelt arrayi - arrayi1, som er den siste tellingen minus den eldste tellingen. I et 10-minutters intervall er den eldste tellingen (i1) nøyaktig 10 minutter gammel. For å legge til et bevegelige gjennomsnitt til vår kode først trenger du en teller, ved hjelp av AtomicLong. Denne telleren skal økes basert på hendelsene du er interessert i å beregne (for eksempel POST-forespørsler for en REST-tjeneste). Vi må gi implementeringen tilgang til disken, og det er oppnådd gjennom GetCount-grensesnittet. Her lager jeg et glidende gjennomsnitt med et 5 minutters vindu som oppdateres hvert sekund. Og for å få det nåværende gjennomsnittet kaller vi bare getAverage-metoden: En nøkkelimplementeringsdetalj er hvordan arraystørrelsen bestemmes: ved å dele vinduet med oppdateringsfrekvensen. Så et stort vindu med en hyppig oppdateringsfrekvens kan forbruke en betydelig mengde minne. I dette eksemplet er arraystørrelsen rimelig 300. Men hvis vi opprettet et 24-timers glidende gjennomsnitt med et intervall på 1 sekund, vil størrelsen være 86400 En mer fornuftig oppdateringsfrekvens for en 24-timers periode kan være hvert 5. minutt (arraystørrelse på 288 ). En annen vurdering av valg av vindu og oppdateringsfrekvens er at vinduet må deles med frekvensen. For eksempel er et 2-minutters vindu med en 6 sekunders oppdateringsfrekvens ok, men en 7 sekunders oppdateringsfrekvens er ikke, siden den ikke er delelig med 120. En ulovligArgumentException blir kastet hvis oppdateringsfrekvensen for vindumodul ikke er null. Denne implementeringen krever en tråd per glidende gjennomsnitt, noe som ikke er veldig effektivt. En bedre løsning ville være å dele en tråd over mange gjennomsnitt. Oppdater . Jeg har oppdatert koden for å dele en tråd her. Til slutt, det er et opprinnelig statsproblem: vi har ikke data ennå for hele vinduet. For eksempel hvis du har et 5 minutters vindu og kun 15 sekunder med data. Denne implementeringen returnerer null til vi har 5 minutter med data. En annen tilnærming er å anslå gjennomsnittet. Anta at vi har en telling på 10 i 30 sekunder, da kan vi anslå gjennomsnittet som 40 om 2 minutter. Imidlertid er det risiko for betydelig feil ved ekstrapolering av ufullstendige data. For eksempel, hvis vi hadde en utbrudd på 20 treff på 2 sekunder, må du estimere 1200 per 2 minutter, noe som med all sannsynlighet er langt unna. Din indre for er iterating all array, så derfor får du alltid det samme gjennomsnittet en for hele gruppen), bør du iterere fra 0 til nåværende nummer av det ytre for stedet. Det bevegelige gjennomsnittet blir oppdatert basert på j i ditt indre, for det betyr at det vil tilsidesette tidligere verdier hver ny sløyfe, dette burde være innenfor det ytre for stedet for det indre som bruker jeg som indeks. Du deler sumj for å beregne gjennomsnitt, hver ny indre sløyfe j du vil dele med 0 første summen. Jeg tror du mente å bruke j1 i stedet, indeksen er ikke den samme som den nåværende lengden. Tips for feilsøking: Unngå å bruke variabler til loop-arrays, du bør bruke array. length i stedet. For å reprodusere problemet kan du gi oss det isolerte problemet i stedet for din nåværende kode. det vil si: Tenk deg om feilen er i dine innspillinger, hvordan kan vi tro at du virkelig brukte dem besvart 4. okt 13 kl 20:54 Du løser over alle dataene hver gang. Du bør ha for (int j (igteverageLengthi-averageLength2: 0) jlt iaverageLength2 ampamp jltnumDataPoints j) (eller noe lignende) for ditt innerste gjennomsnitt. Også, movingAverageisumj bør modifiseres for å håndtere saken når j er 0. Spesielt bør det sannsynligvis være movingAverageisumaverageLength og det skal påføres movingAveragei-sporet utenfor gjennomsnittsløkken. besvart 4. okt 13 kl 20:42 Neste gang, ta kommentarene til oppgaven ut av spørsmålet før du legger inn det. Men siden du virker ganske ny på dette, tenk på hvordan du ville gå gjennom dataene, og få det til å gjøre det. Du bør prøve å sørge for at hver løkke stopper på det riktige punktet, og husk at hvis du vil stoppe når det ikke er flere tall, (som når du gjør indre sløyfe, og du kan bare få 3 flere tall i stedet for 4) programmet må også stoppe. Kontroller at koden din sjekker etter dette. svarte 4. okt 13 kl. 20:56 Uten ytterligere detaljer, trenger du sannsynligvis et uvevet glidende gjennomsnitt. På et hvilket som helst punkt Ai i inngangsarmen A med lengde N (med 0ltiltN), er det bare middelverdien av de forrige K-oppføringene i gruppen, inntil og med Ai. Hvis det arent K slike verdier, så gjennomsnittlig (i1) verdiene fra A0 til Ai. inklusive. En liten tanke vil vise deg at du ikke trenger å legge opp alle K-verdier hver gang. Bare hold summen, og når du går videre til neste punkt (dette er et glidende gjennomsnitt), trekker du verdien som blir erstattet og legger til den nye verdien som erstatter den. (I løpet av de første K-1 poengene, legger du bare til den nye verdien til summen og øker telleren din med 1.) På hvert punkt i denne prosessen er glidende gjennomsnitt gjeldende sum dividert med gjeldende telleverdi. svarte 4. okt 13 kl 21:05 I et glidende gjennomsnitt må du ha en slags vindusstørrelse. Din vindusstørrelse er gjennomsnittligLengde, slik at den ser slik ut: For-sløyfen starter ved de nåværende dataene og går tilbake gjennomsnittligLengde datapunkter og legger til dem. Du vil bare ha et glidende gjennomsnitt når du har når du har nok datapunkter og gjennomsnittet blir summen delt med gjennomsnittlig lengde. Merk: Ikke testet bare sudo kode, men dette er ideen. svarte 4. okt 13 kl 21:05 Ditt svar 2017 Stack Exchange, IncMoving Gjennomsnitt - MA BREAKING DOWN Moving Average - MA Som et SMA-eksempel, vurder en sikkerhet med følgende lukkepriser over 15 dager: Uke 1 (5 dager) 20, 22 , 24, 25, 23 Uke 2 (5 dager) 26, 28, 26, 29, 27 Uke 3 (5 dager) 28, 30, 27, 29, 28 En 10-dagers MA vil gjennomsnittsføre sluttkursene for den første 10 dager som det første datapunktet. Det neste datapunktet vil slippe den tidligste prisen, legge til prisen på dag 11 og ta gjennomsnittet, og så videre som vist nedenfor. Som nevnt tidligere lagrer MAs nåværende prishandling fordi de er basert på tidligere priser, jo lengre tidsperioden for MA, desto større er lagret. Dermed vil en 200-dagers MA ha en mye større grad av forsinkelse enn en 20-dagers MA fordi den inneholder priser for de siste 200 dagene. Lengden på MA å bruke, avhenger av handelsmålene, med kortere MA'er som brukes til kortvarig handel og langsiktig MAs som er mer egnet for langsiktige investorer. 200-dagers MA er mye etterfulgt av investorer og forhandlere, med brudd over og under dette bevegelige gjennomsnittet regnes som viktige handelssignaler. MAs gir også viktige handelssignaler på egen hånd, eller når to gjennomsnitt overgår. En stigende MA indikerer at sikkerheten er i en uptrend. mens en fallende MA indikerer at den er i en downtrend. På samme måte er oppadgående momentum bekreftet med en bullish kryssovergang. som oppstår når en kortsiktig MA krysser over en langsiktig MA. Nedadgående momentum er bekreftet med en bearish crossover, som oppstår når en kortsiktig MA krysser under en langsiktig MA.

No comments:

Post a Comment