Friday, 27 October 2017

Java exponentiell glidande medelvärde algoritm


Jag har i huvudsak en mängd värden som denna: Ovanstående array är förenklad, jag samlar 1 värde per millisekund i min riktiga kod och jag behöver bearbeta utmatningen på en algoritm som jag skrev för att hitta den närmaste toppen före en tidpunkt. Min logik misslyckas eftersom i mitt exempel ovan är 0.36 den riktiga toppen, men min algoritm skulle se bakåt och se det sista numret 0,25 som toppen, eftersom det är en minskning till 0,24 före den. Målet är att ta dessa värden och tillämpa en algoritm för dem som släpper ut dem lite så att jag har mer linjära värden. (dvs: Jag tycker att mina resultat är kurva, inte jaggediga) Jag har blivit tillsagd att tillämpa ett exponentiellt glidande medelfilter till mina värden. Hur kan jag göra det här Det är verkligen svårt för mig att läsa matematiska ekvationer, jag hanterar mycket bättre med kod. Hur bearbetar jag värden i min array, tillämpar en exponentiell glidande medelberäkning för att jämföra dem ut frågade 8 feb 12 kl 20:27 för att beräkna ett exponentiellt glidande medelvärde. du behöver behålla en del tillstånd och du behöver en inställningsparameter. Detta kräver en liten klass (förutsatt att du använder Java 5 eller senare): Instantiate with decay parameteren du vill ha (det kan ta tuning ska vara mellan 0 och 1) och sedan använda genomsnittet () för att filtrera. När du läser en sida om någon matematisk återkommande, behöver allt du verkligen vet när du gör det till kod, att matematiker gillar att skriva index i arrays och sekvenser med prenumerationer. (Theyve några andra noteringar också, vilket inte hjälper.) EMA är dock ganska enkel eftersom du bara behöver komma ihåg ett gammalt värde, inga komplicerade tillståndsskivor krävs. svarat 8 feb 12 kl 20:42 TKKocheran: Ganska mycket. Det är inte bra när saker kan vara enkla (Om du börjar med en ny sekvens, få en ny medelvärde.) Observera att de första villkoren i den genomsnittliga sekvensen kommer att hoppa runt lite på grund av gränseffekter, men du får de med andra glidande medelvärden för. En bra fördel är dock att du kan förflytta den glidande genomsnittliga logiken till medelvärdena och experimentera utan att störa resten av ditt program för mycket. ndash Donal Fellows Feb 9 12 på 0:06 Jag har svårt att förstå dina frågor, men jag kommer att försöka svara ändå. 1) Om din algoritm hittat 0,25 istället för 0,36, då är det fel. Det är fel eftersom det förutsätter en monotonisk ökning eller minskning (det går alltid upp eller går alltid ner). Om du inte genomsnittar ALLA dina data, dina datapunkter --- som du presenterar dem --- är olinjära. Om du verkligen vill hitta det maximala värdet mellan två punkter i tid, skivar du din matris från tmin till tmax och hittar maximal av den subarrayen. 2) Nu är begreppet glidande medelvärden mycket enkelt: tänk att jag har följande lista: 1,4, 1,5, 1,4, 1,5, 1,5. Jag kan släta ut det genom att ta medeltalet av två nummer: 1,45, 1,45, 1,45, 1,5. Observera att det första numret är medeltalet 1,5 och 1,4 (andra och första siffrorna) den andra (nya listan) är genomsnittet av 1,4 och 1,5 (tredje och andra gamla listan) den tredje (nya listan) i genomsnitt 1,5 och 1,4 (fjärde och tredje), och så vidare. Jag kunde ha gjort det period tre eller fyra, eller n. Lägg märke till hur dataen är mycket mjukare. Ett bra sätt att se glidande medelvärden på jobbet är att gå till Google Finance, välj ett lager (försök Tesla Motors ganska flyktiga (TSLA)) och klicka på technicals längst ner i diagrammet. Välj Flytta genomsnittet med en given period och Exponentiell glidande medelvärde för att jämföra deras skillnader. Exponentiellt glidande medelvärde är bara en annan utarbetande av detta, men vikter äldre data mindre än de nya data så är det ett sätt att förspänna utjämningen mot baksidan. Vänligen läs Wikipedia-posten. Så det här är mer en kommentar än ett svar, men den lilla kommentarrutan var bara för liten. Lycka till. Om du har problem med matte kan du gå med ett enkelt rörligt medel istället för exponentiellt. Så den produkt du får är de sista x-termerna dividerad med x. Obestämd pseudokod: Observera att du måste hantera start - och slutdelarna av data eftersom det klart är att du inte kan räkna med de senaste 5 termerna när du befinner dig på din andra datapunkt. Det finns också mer effektiva sätt att beräkna detta glidande medelvärde (summa summan - äldsta nyaste), men det här är att få konceptet av vad som händer över. svarat 8 februari 12 kl 20:41 Exponential Moving Average - EMA BREAKING DOWN Exponential Moving Average - EMA De 12 och 26-dagars EMA-erna är de mest populära kortsiktiga medelvärdena, och de används för att skapa indikatorer som den rörliga genomsnittliga konvergensdivergensen ( MACD) och den procentuella prisoscillatorn (PPO). I allmänhet används 50- och 200-dagars EMA som signaler för långsiktiga trender. Handlare som anställer teknisk analys hittar glidande medelvärden som är mycket användbara och insiktsfulla när de tillämpas korrekt men skapar kaos när de används felaktigt eller felaktigt tolkas. Alla glidande medelvärden som vanligtvis används i teknisk analys är av sin natur slående indikatorer. Följaktligen bör slutsatserna från att tillämpa ett glidande medelvärde till ett visst marknadsdiagram vara att bekräfta en marknadsrörelse eller att indikera dess styrka. Mycket ofta, då en rörlig genomsnittlig indikatorlinje har förändrats för att återspegla ett betydande drag på marknaden har den optimala marknaden för marknadsinträde redan passerat. En EMA tjänar till att lindra detta dilemma till viss del. Eftersom EMA-beräkningen lägger mer vikt på de senaste uppgifterna, kramar prisåtgärden lite snävare och reagerar därför snabbare. Detta är önskvärt när en EMA används för att härleda en handelsinmatningssignal. Tolkning av EMA Liksom alla glidande medelindikatorer är de mycket bättre lämpade för trending marknader. När marknaden är i en stark och hållbar uptrend. EMA-indikatorlinjen visar också en uptrend och vice versa för en nedåtgående trend. En vaksam näringsidkare kommer inte bara att uppmärksamma EMA-linjens riktning utan också förhållandet mellan förändringshastigheten från en stapel till en annan. När prisåtgärden för en stark uppåtriktning börjar prata och vända, kommer EMA: s förändringshastighet från en stapel till nästa att minska till dess att indikatorlinjen plattas och förändringshastigheten är noll. På grund av den försvagande effekten, vid denna punkt, eller till och med några få barer innan, bör prisåtgärden redan ha reverserat. Det följer således att observera en konsekvent minskning i förändringshastigheten hos EMA kan själv användas som en indikator som ytterligare kan motverka det dilemma som orsakas av den släpande effekten av rörliga medelvärden. Vanliga användningar av EMA-EMA används ofta i kombination med andra indikatorer för att bekräfta betydande marknadsrörelser och att mäta deras giltighet. För näringsidkare som handlar intradag och snabba marknader är EMA mer tillämplig. Ofta använder handlare EMA för att bestämma en handelsförskjutning. Till exempel om en EMA på ett dagligt diagram visar en stark uppåtgående trend kan en intraday-traderstrategi vara att endast handla från långsidan på en intradagskarta. Jag behöver hålla reda på de senaste 7 dagarna arbetstimmarna i en platt fil läsningsling. Det används för att mäta utmattningsförmåga hos arbetsrutiner. Just nu har jag något som fungerar, men det verkar ganska ordentligt och jag är inte säker på om det är ett mönster som är mer kortfattat. För närvarande har jag en Java-klass med en statisk matris för att hålla de senaste x-dagarna data, då jag läser igenom filen, hugger jag av det första elementet och flyttar de andra 6 (för en veckas rullande summa) tillbaka med en. Bearbetningen av denna statiska matris görs i sin egen metod, dvs. Min fråga: Är det här en rimlig designmetod, eller är det något bländande självklart och enkelt att göra den här uppgiften Tack gubbar frågade Aug 30 11 kl 14:33 Tack många killar: Jag har fått meddelandet: använd ett objekt på högre nivå och utnyttja relevanta metoder eller en cirkulär buffert. Stora svar, alla av dem. När du tänker på det behöver du alltid tillgång till hela matrisen så att du kan bli av med den första inmatningen - som jag inte var säker på själv. I39m lät mig inte missa något liner och var i grunden på ett rimligt, om inte effektivt och tätt spår. Det här är vad jag älskar om den här webbplatsen: Högkvalitativa, relevanta svar från personer som känner till deras sht. ndash Pete855217 Aug 30 11 på 15:05 Varför initierar du runningTotal till null Vad är dess typ Var det deklareras Det skulle gå bra om du lägger några kodprover som liknar den faktiska Java-koden. Att fortsätta, min kritik skulle vara följande: din funktion gör för mycket. En funktion eller metod bör vara sammanhängande. Mer lämpligt borde de bara göra en sak och en sak. Värre fortfarande, vad händer i din för loop när x 5 Du kopierar runningTotal6 till runningTotal5. men då har du två kopior av samma värde i position 5 och 6. I din design, flyttar din funktion rörliga objekten i din matris beräknar totalt antal utskrifter till standardfel returnerar summan. Det gör för mycket. Mitt första förslag är att inte flytta saker runt i matrisen. I stället implementerar du en cirkulär buffert och använder den istället för arrayen. Det kommer att förenkla din design. Mitt andra förslag är att bryta ner saker i sammanhängande funktioner: ha en datastruktur (en cirkulär buffert) som gör det möjligt att lägga till det (och det faller den äldsta posten när den når sin kapacitet.) Har datastrukturen implementera en interator har en funktion som beräknar totalvärdet på iteratorn (du bryr dig inte om du beräknar summan av en array, lista eller cirkulär bufer.) Ring inte det totalt. Ring det summa, vilket är vad du beräknar. Det är vad Id gör :) That39s stora info luis, kom ihåg att den här funktionen är en liten del av klassens funktionalitet, och det skulle vara overkill att lägga till för mycket kod för att göra den perfekt. Du är tekniskt korrekt, och jag förstår min kod gör 39too mycket39 men samtidigt är det bättre att fel på sidan av mindre, tydligare kod än att gå till perfektion. Med tanke på mina Java-färdigheter kan jag, även om den pseudokod du beskriver beskriver kompilera, få mig att blåsa min budget på detta (), men tack för den tydliga beskrivningen. ndash Pete855217 31 aug 11 kl 2:23 Hmmm, det handlar inte om perfektion, utan om etablerade industripraktik som vi har känt för de senaste tre decennierna. Ren kod är alltid en som är partitionerad. Vi har årtionden av bevis som visar att detta är vägen att gå i det allmänna fallet (vad gäller kostnadseffektivitet, defektminskning, förståelse etc.). om det inte är kasta bort koden för en engångsslag. Det är aldrig dyrt att göra detta när man påbörjar någon problemanalys på detta sätt. Kodning 101, bryta ner problemet och koden följer, varken överkill eller svårt) ndash luis. espinal Aug 31 11 på 15:55 Din uppgift är för enkel och det som du har antagit är säkert bra för jobbet. Om du vill använda en bättre design måste du emellertid avskaffa all denna rörelse, du använder bättre en FIFO-kö och använder dig av push - och popmetoder så att koden inte speglar någon datarörelse, bara de två logiska åtgärderna av nya data och ta bort data som är äldre än 7 dagar. besvarade aug 30 11 kl 14:49

No comments:

Post a Comment