Jag har väsentligen en mängd värden som denna: Ovanstående array är översimplifierad, 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 matris, 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 måste 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 the 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 trevligt 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 dem med andra glidande medelvärden för. En bra fördel är dock att du kan förflytta den glidande genomsnittliga logiken till avtagaren 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 med 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, skar du din matris från tmin till tmax och hitta 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å tal: 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 tre eller fyra år, 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. Exponentiell 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 kommer att behöva hantera start - och slutdelarna av data eftersom det klart är att du inte kan räkna med de senaste 5 termerna när du är på din andra datapunkt. Det finns också effektivare 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. besvarade feb 8 12 klockan 20: 41March 29th, 2014 av Ryan Hamilton Let8217s tittar på hur man skriver glidande genomsnittliga analyser i q för kdb-databasen. Som exempel data (mcd. csv) kommer vi att använda aktiekursdata för McDonalds MCD. Nedanstående kod laddar ner historiska lagerdata för MCD och placerar den i tabell t: Enkelt rörligt medelvärde Det enkla rörliga genomsnittet kan användas för att släpa ut fluktuerade data för att identifiera övergripande trender och cykler. Det enkla glidande medlet är medelvärdet av datapunkterna och vikter varje värde i beräkningen lika. Till exempel för att hitta det genomsnittliga priset på ett lager under de senaste tio dagarna, lägger vi helt enkelt till det dagliga priset för de tio dagarna och delas med tio. Det här fönstret med storlek tio dagar rör sig sedan över datumen, med värdena i fönstret för att hitta medelvärdet. Here8217s koden i kdb för 1020 dagars glidande medelvärde och det resulterande diagrammet. Enkel rörlig genomsnittlig Aktiediagram Kdb (Producerad med hjälp av qStudio) Vilket exponentiellt rörande medelvärde är och hur man beräknar det En av problemen med det enkla glidande medlet är att det ger varje dag lika stor viktning. För många ändamål är det mer meningsfullt att ge de senaste dagarna en högre viktning, en metod att göra detta är genom att använda det exponentiala rörliga genomsnittet. Detta använder en exponentiellt minskande vikt för datum i det förflutna. Den enklaste formen av exponentiell utjämning ges med formeln: var är utjämningsfaktorn och 0 Denna tabell visar hur de olika vikternaema beräknas med tanke på värdena 1,2,3 , 4,8,10,20 och en utjämningsfaktor av 0,7. (Excel-kalkylblad) För att utföra denna beräkning i kdb kan vi göra följande: (Denna kod ursprungligen postades på google-postlistan av Attila, den fullständiga diskussionen kan hittas här) Det här backslash-adverbet fungerar som Alternativsyntaxen generaliseras till funktioner av 3 eller fler argument där det första argumentet används som initialvärdet och argumenten är motsvarande element från listorna: Exponentiell rörlig genomsnittsdiagram Slutligen tar vi vår formel och tillämpar den på vår lagerprisdata, så att vi kan se det exponentiella glidande medlet för två olika utjämningsfaktorer: Exponentiell rörlig genomsnittsprispappersdiagram som produceras med qStudio Som du kan se med EMA kan vi prioritera de senaste värdena med en vald utjämningsfaktor för att bestämma balansen mellan senaste och historiska data. Skriva kdb analytics som Exponential Moving Average omfattas av vår kdb-kurs. Vi tillhandahåller regelbundet kurser i London, New York. Asien eller vår online kdb kurs är tillgänglig för att börja just nu. 1 Response to 8220Exponential Moving Average EMA i Kdb8221 Tack Ryan, det här är mycket användbart. Men jag tror att det finns ett typsnitt i ema8217s definition, ska vara: ema: xyJava glidande medel Metod Om du letar efter en EMA som är optimerad för strömmande data, som kommer från en fil eller citat, kommer följande provklass att göra dig bra , i motsats till att använda brute-force beräkningar. Detta tillvägagångssätt är särskilt användbart om du behandlar data i realtid. EMAs, ett speciellt fall av viktade glidmedel, har fördelen att relativ viktning för varje successiv period minskar med en konstant faktor f 2 (N1), där N är antalet perioder över vilka EMA ska appliceras. Med tanke på det kan du beräkna den aktuella EMA (dvs. för den aktuella perioden) med följande iterativa formel: eman fprice (1-f) eman-1 Följande provklass implementerar denna iterativa karaktär av EMA och minimerar beräkningskraven över brute - kraftmetoder eller efterbehandlingsmetoder. privata int NumPeriods 0 Private Int TotalPeriods 0 Private Double RunEMA 0,0 Private Double Factor 0.0 Public EMA (int numPeriods) this. numPeriods numPeriods factor 2.0 (numPeriods 1.0) Återställ beräkningar för att generera EMA för den angivna perioden. public void reset (int numPeriods) Returnerar EMA för perioden definieras under konstruktorn. Om bearbetade perioder är mindre än EMA-området returneras noll. offentlig dubbelkalkylera (dubbelpris) runningEMA faktorprice (1-faktor) runningEMA om (totalPeriods lt numPeriods) Från var du källar prisdata och vad du gör med EMA-resultaten är upp till dig. Om du till exempel hade prisdata i en array och vill beräkna en EMA i en annan array, fungerar följande kod: dubbla priser. hämtas från beräkningar, fil eller citera service dubbel ema ny doubleprices. length EMA ema ny EMA (50) 50 period EMA för (int idx0 iltprices. length idx) emaidx ema (pricesidx) Lycka till och bästa önskningar för ditt projekt. GenomsnittSimple glidande medelvärden Genomsnittlig rörlig genomsnitts Du uppmuntras att lösa den här uppgiften enligt uppgiftsbeskrivningen, med vilket språk du kanske känner. Beräknar det enkla glidande medlet av en serie siffror. Skapa en stateful funktionsklassinstans som tar en period och returnerar en rutin som tar ett tal som argument och returnerar ett enkelt glidande medelvärde av dess argument hittills. Ett enkelt glidande medelvärde är en metod för att beräkna ett medelvärde av en ström av siffror genom att endast beräkna de senaste 160 P 160-talen från strömmen, 160 var 160 P 160 är känd som perioden. Det kan genomföras genom att anropa en initialiseringsrutin med 160 P 160 som sitt argument 160 I (P), 160, som sedan ska returnera en rutin som, när den kallas med enskilda successiva medlemmar i en ström av tal, beräknar medelvärdet av (upp till), de senaste 160 P 160 av dem, kan ringa denna 160 SMA (). Ordet 160 stateful 160 i uppgiftsbeskrivningen hänvisar till behovet av 160 SMA () 160 för att komma ihåg viss information mellan samtal till den: 160 Perioden, 160 P 160 En beställd behållare med minst de senaste 160 P 160 numren från var och en av dess enskilda samtal. Stateful 160 betyder också att successiva samtal till 160 I (), 160 initialiseraren, 160 bör returnera separata rutiner som gör 160 inte 160 delade sparade tillstånd så att de kunde användas på två oberoende dataströmmar. Pseudokod för en implementering av 160 SMA 160 är: Denna version använder en bestående kö för att hålla de senaste p-värdena. Varje funktion som returneras från init-moving-genomsnittet har sitt tillstånd i en atom som håller ett kövärde. Denna implementering använder en cirkellista för att lagra siffrorna i fönstret i början av varje iterationspekare hänvisar till listcellen som håller värdet bara förflyttning ur fönstret och att ersättas med det tillförda värdet. Använda en avslutningsredigering För närvarande kan denna sma vara nogc eftersom den allokerar en stängning på högen. Några flyktanalyser kunde ta bort heapfördelningen. Använda en strukturredigering Den här versionen undviker hällanslutningen av stängningen och håller data i stapelramen för huvudfunktionen. Samma utmatning: För att undvika att de flytande punktens approximationer fortsätter att växa upp och växer, kan koden utföra en periodisk summa på hela cirkulärkön. Denna implementering producerar två (funktion) objekt delningstillstånd. Det är idiomatiskt i E att separera inmatning från utgång (läs från skriv) istället för att kombinera dem i ett objekt. Strukturen är densamma som implementeringen av Standard DeviationE. Elixirprogrammet nedan genererar en anonym funktion med en inbäddad period p, som används som perioden för det enkla glidande medlet. Körningsfunktionen läser numerisk ingång och skickar den till den nyupprettade anonyma funktionen och inspekterar sedan resultatet till STDOUT. Utgången visas nedan, med medelvärdet, följt av den grupperade ingången, som utgör grunden för varje glidande medelvärde. Erlang har stängningar, men oföränderliga variabler. En lösning är då att använda processer och ett enkelt meddelande som passerar baserat API. Matrisspråken har rutiner för att beräkna glidningsavvikelserna för en given sekvens av objekt. Det är mindre effektivt att slinga som i följande kommandon. Ständigt uppmanar till en ingång I. som läggs till i slutet av en lista L1. L1 kan hittas genom att trycka på 2ND1, och medel kan hittas i ListOPS Tryck på ON för att avsluta programmet. Funktion som returnerar en lista som innehåller medelvärdet för det medföljande argumentet Program som returnerar ett enkelt värde vid varje tillkännagivande: Listan är listan som medelvärde: p är perioden: 5 returnerar den genomsnittliga listan: Exempel 2: Använda programmet movinav2 , 5) - Initialisering av glidande medelberäkning, och definiera en period på 5 movinav2 (3, x): x - nya data i listan (värde 3) och resultatet lagras på variabel x och visas movinav2 (4, x) : x - ny data (värde 4), och det nya resultatet lagras på variabel x och visas (43) 2. Beskrivning av funktionen movinavg: variabel r - är resultatet (den genomsnittliga listan) som kommer att returneras variabel i - är indexvariabeln, och den pekar på slutet av dellistan som listan är medeltal. variabel z - en hjälparvariabel Funktionen använder variabel i för att bestämma vilka värden av listan som ska beaktas i nästa genomsnittliga beräkning. Vid varje iteration pekar variabel I till det sista värdet i listan som kommer att användas i medelberäkningen. Så vi behöver bara ta reda på vilka som kommer att vara det första värdet i listan. Vanligtvis måste man överväga p-element, så det första elementet kommer att vara det som indexeras av (i-p1). Men vid de första iterationerna kommer denna beräkning normalt att vara negativ, så kommer följande ekvation att undvika negativa index: max (i-p1,1) eller, ordna ekvationen, max (i-p, 0) 1. Men antalet element på de första iterationerna kommer också att vara mindre, det korrekta värdet kommer att vara (slutet index - start index 1) eller, arrangera ekvationen, (i - (max (ip, 0) 1) 1) och sedan , (i-max (ip, 0)). Variabel z håller det vanliga värdet (max (ip), 0) så börjar indexindexet (z1) och nummerfältet blir (iz) mitt (lista, z1, iz) kommer att returnera listan över värde som kommer att vara medelvärde ( .) summerar dem summa (.) (iz) ri kommer att genomsöka dem och lagra resultatet på lämpligt ställe i resultatlistan fp1 skapar en partiell applikation som fastställer (i detta fall) andra och tredje parametrar
No comments:
Post a Comment