Tuesday 12 September 2017

Viktat Glidande Medelvärde C


Jag försöker beräkna det rörliga genomsnittet av en signal. Signalvärdet (en dubbel) uppdateras vid slumpmässiga tider. Jag letar efter ett effektivt sätt att beräkna sitt tidsvägda genomsnitt över ett tidsfönster, i realtid. Jag skulle kunna göra det själv, men det är mer utmanande än jag trodde. De flesta av de resurser som Ive hittat över internet beräknar glidande medelvärde av periodisk signal, men min uppdateringar slumpmässigt. Vet någon bra resurser för det? Tricket är följande: Du får uppdateringar i slumpmässiga tider via tomt uppdatering (int tid, float värde). Men du måste också spåra när en uppdatering faller utanför tidsfönstret, så du ställer in ett larm som kallas vid tidpunkt N som tar bort den föregående uppdateringen från att någonsin ses över i beräkningen. Om det händer i realtid kan du begära att operativsystemet gör ett samtal till en metod om bortfall av upplösning (int tid) som ska ringas vid tidpunkten N Om det här är en simulering kan du inte få hjälp från operativsystemet och du behöver gör det manuellt I en simulering skulle du anropa metoder med tiden som levereras som ett argument (vilket inte korrelerar med realtid). Ett rimligt antagande är dock att samtalen garanteras vara sådana att tidsargumenten ökar. I det här fallet behöver du behålla en sorterad lista över alarmtidvärden och för varje uppdatering och lässamtal kontrollerar du om tidsargumentet är större än huvudet på larmlistan. Medan den är större gör du den larmrelaterade behandlingen (släpp av den äldsta uppdateringen), ta bort huvudet och kontrollera igen tills alla larm före den angivna tiden behandlas. Då uppdaterar uppdateringen. Jag har hittills antagit att det är uppenbart vad du skulle göra för den faktiska beräkningen, men jag kommer att utveckla just i fallet. Jag antar att du har en metod float read (int tid) som du använder för att läsa värdena. Målet är att göra detta samtal så effektivt som möjligt. Så du beräknar inte det glidande genomsnittet varje gång läsmetoden heter. I stället precomputerar du värdet från den senaste uppdateringen eller det senaste larmet och tweakar det här värdet med ett par flytande punkter för att beräkna tidens gång sedan senaste uppdateringen. (det vill säga ett konstant antal operationer förutom att kanske bearbeta en lista över uppstartade larm). Förhoppningsvis är detta klart - det här borde vara en ganska enkel algoritm och ganska effektiv. Ytterligare optimering. Ett av de återstående problemen är om ett stort antal uppdateringar händer inom tidsfönstret, då finns det en lång tid som det varken läser eller uppdaterar, och sedan kommer en läsning eller uppdatering att komma med. I det här fallet kommer ovanstående algoritm att vara ineffektiv när man stegvis uppdaterar värdet för varje uppdatering som faller av. Det här är inte nödvändigt eftersom vi bara bryr oss om den senaste uppdateringen bortom tidsfönstret, så om det finns ett sätt att effektivt släppa bort alla äldre uppdateringar, skulle det hjälpa. För att göra detta kan vi modifiera algoritmen för att göra en binär sökning av uppdateringar för att hitta den senaste uppdateringen före tidsfönstret. Om det finns relativt få uppdateringar som behöver släppas, kan man stegvis uppdatera värdet för varje uppladdad uppdatering. Men om det finns många uppdateringar som behöver släppas kan man ompröva värdet från början efter att ha släppt bort de gamla uppdateringarna. Bilaga om inkrementell beräkning: Jag borde klargöra vad jag menar med inkrementell beräkning ovan i meningen tweak det här värdet med ett par flytande punkter för att beräkna tidens gång sedan den senaste uppdateringen. Initial icke-inkrementell beräkning: sedan iterera över relevanta uppdateringar i följd av ökande tid: movingaverage (summa lastupdate timesincelastupdate) windowlength. Nu om exakt en uppdatering faller av fönstret men inga nya uppdateringar ankommer, justera summan som: (notera att det är priorupdate som har sin tidstämpel modifierad till början av sista fönstret). Och om exakt en uppdatering kommer in i fönstret men inga nya uppdateringar faller av, justera summan som: Som det är uppenbart är det här en grov skiss men förhoppningsvis visar det hur du kan behålla medelvärdet så att det är O (1) operationer per uppdatering amorterad. Men notera ytterligare optimering i föregående stycke. Observera också stabilitetsproblem hänvisade till i ett äldre svar, vilket innebär att floating point-fel kan ackumuleras över ett stort antal sådana inkrementella operationer så att det skiljer sig från resultatet av den fullständiga beräkningen som är signifikant för applikationen. Om en approximation är OK och det är en minimal tid mellan proverna, kan du prova superprovtagning. Har en matris som representerar jämnt fördelade tidsintervaller som är kortare än minimumet och vid varje tidsperiod lagrar det senaste provet som mottogs. Ju kortare intervallet desto närmare är medelvärdet det verkliga värdet. Perioden bör inte vara större än hälften av lägsta eller det finns en chans att missa ett prov. svarat dec 15 11 at 18:12 svarat dec 15 11 at 22:38 Tack för svaret. En förbättring som skulle behövas för att faktiskt citerar värdet av det totala genomsnittet så att vi inte slog hela tiden. Det kan också vara en liten punkt, men skulle det inte vara mer effektivt att använda en deque eller en lista för att lagra värdet, eftersom vi antar att uppdateringen kommer i rätt ordning. Infoga skulle vara snabbare än i kartan. ndash Arthur Dec 16 11 at 8:55 Ja, du kan cache värdet av summan. Subtrahera värdena för de prov du raderar, lägg till värdena för de prov du lägger in. Ja, en dequeltpairltSample, Dategtgt kan också vara effektivare. Jag valde kartan för läsbarhet, och det enkla att påkalla kartan :: övre delen. Skriv alltid rätt kod först och alltid, profilera och mät stegvisa ändringar. ndash Rob Dec 16 11 kl 15:00 Anm .: Det här är tydligen inte sättet att närma sig detta. Lämna den här för referens om vad som är fel med detta tillvägagångssätt. Kontrollera kommentarerna. UPPDATERAD - baserat på Olis kommentar. inte säker på instabiliteten som han pratar om. Använd en sorterad karta över ankomsttider mot värden. Vid ankomsten av ett värde lägg till ankomsttiden till den sorterade kartan tillsammans med dess värde och uppdatera det glidande medlet. varning detta är pseudokod: där. Inte helt fleshed ut men du får tanken. Saker att notera. Som jag sa ovanstående är pseudokoden. Du måste välja en lämplig karta. Ta inte bort paren när du repeterar eftersom du kommer att ogiltiggöra iteratorn och måste börja om igen. Se också Olis kommentar nedan. svarat dec 15 11 at 12:22 Detta fungerar inte: det tar inte hänsyn till vilken andel av fönstrets längd som varje värde existerar för. Dessutom är detta tillvägagångssätt för att lägga till och sedan subtrahera endast stabilt för heltalstyper, inte flytande. ndash Oliver Charlesworth Dec 15 11 at 12:29 OliCharlesworth - ledsen jag missade några viktiga punkter i beskrivningen (dubbel och tidsvägd). Jag kommer att uppdatera. Tack. ndash Dennis Dec 15 11 at 12:33 Tidsvägningen är ännu ett problem. Men det är inte det jag talar om. Jag hänvisade till det faktum att när ett nytt värde först når tidsfönstret är dess bidrag till medeltalet minimalt. Dess bidrag fortsätter att öka tills ett nytt värde går in. ndash Oliver Charlesworth Dec 15 11 på 12:35 Jag vet att detta kan uppnås med boost enligt: ​​Men jag vill verkligen undvika att använda boost. Jag har googled och inte hittat några lämpliga eller läsbara exempel. I grund och botten vill jag spåra det rörliga genomsnittet av en pågående ström av en ström av flytande punkttal med de senaste 1000 siffrorna som ett dataprov. Vad är det enklaste sättet att uppnå detta jag experimenterade med att använda ett cirkulärt array, exponentiellt glidande medelvärde och ett enklare glidande medelvärde och fann att resultaten från den cirkulära gruppen passade mina behov bäst. frågade 12 juni 12 kl 4:38 Om dina behov är enkla kan du bara försöka använda ett exponentiellt glidande medelvärde. Enkelt, du gör en ackumulatorvariabel, och när din kod tittar på varje prov uppdateras koden med ackumulatorn med det nya värdet. Du väljer en konstant alfa som ligger mellan 0 och 1 och beräknar det här: Du behöver bara hitta ett värde av alfa där effekten av ett visst prov endast varar för cirka 1000 prover. Hmm, jag är inte säker på att det här är lämpligt för dig, nu när jag har lagt den här. Problemet är att 1000 är ett ganska långt fönster för ett exponentiellt rörligt medelvärde. Jag är inte säker på att det finns en alfa som skulle sprida genomsnittet över de senaste 1000 siffrorna, utan underflöde i flytpunktsberäkningen. Men om du ville ha ett mindre medelvärde, som 30 nummer eller så, är det här ett mycket enkelt och snabbt sätt att göra det. svarade den 12 juni 12 kl 4:44 1 på ditt inlägg. Det exponentiella glidande medlet kan låta alfabetet vara variabelt. Så här tillåter det att det används för att beräkna tidsbaserade medelvärden (t ex byte per sekund). Om tiden sedan den senaste ackumulatorns uppdatering är mer än 1 sekund, låter du alpha vara 1,0. Annars kan du låta alpha vara (usecs sedan senaste uppdateringen1000000). ndash jxh Jun 12 12 at 6:21 I grund och botten vill jag spåra det rörliga genomsnittet av en pågående ström av en ström av flytande punkttal med de senaste 1000 numren som ett dataprov. Observera att nedanstående uppdaterar summan som element som läggs ut, vilket undviker kostnadskrävande O (N) - korsning för att beräkna summan som behövs för genomsnittet - efterfrågan. Totalt görs en annan parameter från T för att stödja t. ex. använder en lång lång när totalt 1000 lång s, ett int för char s, eller en dubbel till totalt float s. Det här är lite bristfälligt, eftersom numsamples kan gå förbi INTMAX - om du bryr dig att du kan använda en unsigned long long. eller använd en extra bool data medlem för att spela in när behållaren fylls första gången medan cykeltalsprover runt arrayen (bäst omnämndes något oskadd som pos). svarade den 12 juni 12 kl 5:19 antar man att kvoträttsoperatören (T-prov) citationstecken är faktiskt quotvoid operatorltlt (T-prov) citat. ndash oPless 8 juni 14 kl 11:52 oPless ahhh. välspotted. egentligen menade jag att det skulle vara tomt operatör () (T-prov) men självklart kan du använda vilken anteckning du helst tyckte. Kommer att fixa, tack. ndash Tony D Jun 8 14 at 14: 27Weighted Moving Averages: Grunderna Under åren har tekniker hittat två problem med det enkla glidande medlet. Det första problemet ligger i tidsramen för glidande medelvärdet (MA). De flesta tekniska analytiker tror att prisåtgärder. det öppnande eller stängande aktiekurset räcker inte för att bero på att förutsäga köp - eller försäljningssignaler för MAs crossover-åtgärden korrekt. För att lösa detta problem, tilldelar analytiker nu mer vikt till de senaste prisuppgifterna med hjälp av det exponentiellt jämnaste glidande genomsnittet (EMA). (Läs mer om att utforska exponentiellt vägda rörliga medelvärdet.) Ett exempel Till exempel, med en 10-dagars MA, skulle en analytiker ta slutkursen för den 10: e dagen och multiplicera detta nummer med 10, den nionde dagen med nio, den åttonde dag med åtta och så vidare till den första av MA. Så snart summan har bestämts, fördelar analytikern sedan numret genom tillsats av multiplikatorerna. Om du lägger till multiplikatorerna i 10-dagars MA-exemplet är numret 55. Denna indikator kallas det linjärt viktade glidande medlet. (För relaterad läsning, kolla in Enkla rörliga genomsnittsvärden. Utveckla tendenser.) Många tekniker är fasta troende i det exponentiellt jämnaste glidande genomsnittet (EMA). Denna indikator har förklarats på så många sätt att det både förvirrar studenter och investerare. Kanske kommer den bästa förklaringen från John J. Murphys tekniska analys av finansmarknaderna (publicerad av New York Institute of Finance, 1999). Det exponentiellt jämnaste glidande genomsnittet adresserar båda problemen i samband med det enkla glidande medlet. För det första tilldelar det exponentiellt jämnde medlet en större vikt till de senaste data. Därför är det ett viktat glidande medelvärde. Men medan det tilldelar mindre betydelse för tidigare prisdata, ingår det i beräkningen av alla data i instrumentets livstid. Dessutom kan användaren justera viktningen för att ge större eller mindre vikt till det senaste dagspriset, vilket läggs till i procent av värdet för tidigare dagar. Summan av båda procentvärdena lägger till 100. Till exempel kan det sista dagspriset tilldelas en vikt av 10 (.10), vilket läggs till föregående dagsvikt på 90 (.90). Detta ger den sista dagen 10 av totalvikten. Detta skulle motsvara ett 20-dagarsmedelvärde genom att ge priset för sista dag ett mindre värde av 5 (.05). Figur 1: Exponentiellt slät Flyttande medelvärde Ovanstående diagram visar Nasdaq Composite Index från den första veckan i augusti 2000 till 1 juni 2001. Som du tydligt kan se, EMA, som i detta fall använder slutkursdata över en nio dagars period, har bestämda säljsignaler den 8 september (markerad med en svart nedåtpil). Det var den dag då indexet bröt sig under 4 000-nivån. Den andra svarta pilen visar ett annat ben som teknikerna faktiskt förväntade sig. Nasdaq kunde inte generera tillräckligt mycket volym och intresse från detaljhandeln för att bryta 3 000 mark. Därefter dyker du ner igen till botten ut vid 1619.58 den 4 april. Upptrenden av 12 april markeras med en pil. Här stängde indexet 1961.46, och tekniker började se att institutionella fondförvaltare började hämta några fynd som Cisco, Microsoft och några av de energirelaterade frågorna. (Läs våra relaterade artiklar: Flytta genomsnittliga kuvert: Raffinera ett populärt handelsverktyg och flytta genomsnittlig studs.) Artikel 50 är en klausul i EU-fördraget som beskriver de åtgärder som ett medlemsland måste vidta för att lämna Europeiska unionen. Storbritannien. Beta är ett mått på volatiliteten, eller systematisk risk, av en säkerhet eller en portfölj i jämförelse med marknaden som helhet. En typ av skatt som tas ut på kapitalvinster som uppkommit av individer och företag. Realisationsvinster är vinsten som en investerare. En beställning att köpa en säkerhet till eller under ett angivet pris. En köpgränsorder tillåter näringsidkare och investerare att specificera. En IRS-regel (Internal Revenue Service Rule) som tillåter utbetalningar från ett IRA-konto i samband med straff. Regeln kräver att. What039s skillnaden mellan glidande medeltal och vägat glidande medelvärde En 5-års glidande medelvärde baserad på ovanstående priser skulle beräknas med hjälp av följande formel: På grundval av ekvationen ovan är genomsnittspriset över perioden ovan var 90,66. Att använda glidande medelvärden är en effektiv metod för att eliminera starka prisfluktuationer. Huvudbegränsningen är att datapunkter från äldre data inte vägs något annorlunda än datapunkter nära början av datasatsen. Det är här viktiga glidande medelvärden kommer i spel. Viktiga medelvärden tilldelar tyngre viktning till mer aktuella datapunkter eftersom de är mer relevanta än datapunkter i det avlägsna förflutna. Summan av viktningen ska lägga till upp till 1 (eller 100). När det gäller det enkla glidande medlet fördelas viktningarna jämnt, varför de inte visas i tabellen ovan. Slutpriset för AAPL

No comments:

Post a Comment