Thursday 21 December 2017

Php code exponentiell glidande medelvärde


Jag vill beräkna EMA Exponential Moving Average-värdet i PHP. Jag har provat med följande kod men det ger mig 500 error. PHP EMA-beräkningsfunktion trader-ema. Tried med lång tid Googling men inte få någon hjälp på detta i PHP så , Jag har ingen aning om vad som behöver göras för att beräkna EMA value. Edit-1 Installerade extensions. I har installerat alla nödvändiga tillägg, Nu får jag utmatningen Men det verkar inte som att ge rätt output. I tror PHP funktion för beräkning av EMA fungerar inte korrekt. Vilken hjälp i detta skulle vara mycket uppskattad. Jag försöker hämta den senaste EMA av en stor dataset 15000-värden. Det är en mycket resurshämmad algoritm eftersom varje värde beror på det föregående. Här är min kod. Vad jag redan gjorde. Isolera k så det beräknas inte 10000 gånger. Håll bara den senaste beräknade EMA, och håll dem inte i en array. use för istället för foreach. the data array har inte nycklar det är en grundläggande array. Detta gjorde det möjligt för mig att reducera körtiden från 2000ms till abo ut 500ms för 15000 värden. Vad fungerade inte. Använd SplFixedArray, detta rakade bara.10ms exekvera 1.000.000 värden. Använd PHPTrader-förlängningen returnerar en array som innehåller alla EMAs istället för bara det senaste och det är långsammare. Skriv och kör samma algoritmen i C och köra den över 2.000.000 värden tar bara 13ms Så uppenbarligen använder ett kompilerat språk på lägre nivå att hjälpa P. Var ska jag gå härifrån Koden kommer slutligen att köras på Ubuntu, så vilket språk ska jag välja Will PHP Kunna ringa och vidarebefordra ett så stort argument till manuset. asked den 11 juli 14 på 19 21.Helt implementering med en förlängning ger dig en betydande ökning Dessutom kan beräkningen förbättras som sig själv och det som du kan lägga till i vilket språk du använder Välj. Det är lätt att se att lastEMA kan beräknas enligt följande. Detta kan omskrivas på följande sätt för att ta bort slingan så mycket som möjligt. För att förklara extraktionen av k tror att i föregående formulering är som om Allt De ursprungliga rådata multipliceras med k så praktiskt kan du istället multiplicera slutresultatet. Notera att, omskrivet på det här sättet, har du 2 operationer inuti slingan i stället för 3 för att vara exakt inne i slingan finns också en ökning i jämförelse Med sizeata - och lastEMA-värdetilldelning så här kan du förvänta dig att uppnå en extra hastighet i intervallet mellan 16 och 33. Vidare finns det andra förbättringar som kan beaktas åtminstone under vissa omständigheter. Överväg endast sista värden. De första värdena är Multipliceras flera gånger med k1m 1 - k så att deras bidrag kan vara små eller till och med gå under precisionsfrekvensen eller det acceptabla felet. Denna idé är särskilt användbar om du kan antar att äldre data har samma storleksordning som Nyare eftersom om du bara anser de sista n-värdena är det fel du gör. Err EMAofdiscardeddata 1- k n. Så om storleksordningen är i stort sett densamma kan vi säga att det relativa felet är gjort. relerr err lastEMA EMAofdiscardeddata 1- kn lastEMA. that är nästan lika med bara 1- k n. Under antagandet att lastEMA nästan motsvarar EMAofdiscardeddata. Säg att du kan acceptera en relativ felreläer. Du kan säkert överväga endast den sista n värden där 1 - kn relerr. Means som du kan förberäkna före loop n loggen relerr log 1 k och beräkna alla endast med tanke på de sista n värdena. Om datasetet är mycket stort kan detta ge en förnuftig speedup. Consider that for 64 bitar flytande punkttal har en relativ precision relaterad till mantiten som är 2 -53 ca 1 1-16 och endast 2 -24 5 96e-8 för 32 bitar flytande punkttal så att du inte kan få bättre än det här relativa felet. I grund och botten borde du aldrig ha en fördel vid beräkning av mer än n log 1 1 -16 log 1 k-värden. För att ge ett exempel om intervall 2000 då n log 1 1-16 log 1-2 2001 36 746. Jag tycker att det är intressant Att veta att extra beräkningar skulle gå vilse i avrundningarna är det värdelöst är bättre nej T för att göra. nu ett exempel på det fall där du kan acceptera ett relativfel större än flytpunkten precisionsrelä 1ppm 1e-6 0 00001 6 signifikanta decimaler du har n log 1 1e-16 logg 1-2 2001 13 815.I Tänk är ganska litet antal jämfört med dina sista prover siffror så i så fall kan speedup vara uppenbart Jag antar att intervallet 2000 är meningsfullt eller högt för din ansökan men det kan jag inte veta. Just andra få siffror eftersom jag inte vet vad är dina typiska figurer. relerr 1e-3 intervall 2000 n 6 907. relerr 1e-3-intervall 200 n 691. relerr 1e-3-intervall 20 n 69. relerr 1e-6-intervall 2000 n 13 815. relerr 1e-6 intervall 200 n 1 381. relerr 1e -6 intervall 20 n 138. Om antagandet sistEMA nästan lika med EMAofdiscarddata kan inte tas är sakerna mindre enkla men eftersom fördelen cam är signifikant kan det vara meningsfullt att gå on. we måste överväga den fullständiga formeln relerr EMAofdiscardeddata 1- kn lastEMA. so n log relerr lastEMA EMAofdiscardeddata log 1 k log relerr log lastEMA EMAofdiscardeddata log 1- k. the central point är att beräkna lastEMA EMAofdiscardeddata utan att faktiskt beräkna lastEMA eller EMAofdiscardeddata förstås. Ett fall är när vi vet a-priori att till exempel EMAofdiscardeddata lastEMA M till exempel M 1000 eller M 1e6.I det här fallet kan n log relerr M log 1 k. if du inte ge något M-nummer. Du måste hitta en bra idé att överskatta EMAofdiscarddata lastEMA. on quick way Kan vara att ta M max data min data. Beräkningen kan skrivas om I en form där det är ett enkelt tillägg av oberoende termer. Så om implementationsspråket stöder parallellisering kan datasetet delas i 4 eller 8 eller n i grunden antalet CPU-kärnor tillgängliga bitar och det kan beräknas summen av termer på varje Chunk parallellt sammanfatta de enskilda resultaten i slutet. Jag går inte i detalj med detta eftersom det här svaret redan är fruktansvärt länge och jag tror att konceptet redan är uttryckt. Tack för det här använder jag det här på aktiemarknadsdata, så Det faktum att den äldre data har samma storleksordning som den nyare data beror på vilken tidsram som används. Antag att ett intervall på 200 kommer att bli en mycket större variation i priserna på en daglig tidsram 200 dagar än 5 minuters tidsram 16 timmar Jag kommer att experimentera med olika scenarier på reala och simulerade data På nya data med ett intervall 200 använder jag en 1000-dataset. Men jag har också gjort några backtest under de senaste åren, så jag behöver fortfarande ladda hela datasetet Du hjälpte till båda situationer, tack Lykegenes Jul 16 14 på 15 11.Building your own extension förbättrar definitivt prestanda Här är en bra handledning från Zend hemsidan. Några prestationsfigurer Hårdvara Ubuntu 14 04, PHP 5 5 9, 1-kärn Intel CPU 3 3Ghz, 128 MB RAM det är VPS. För endast PHP, 16.000 värden 500ms. C Förlängning, 16.000 värden 0 3ms. C Förlängning 100.000 värden 3 7ms. C Förlängning 500.000 värden 28 0ms. Men jag m minnet begränsat vid denna punkt, med hjälp av 70MB kommer jag att åtgärda det och uppdatera siffrorna i enlighet med detta. Exponentialrörande medelvärde. Exponentiala glidmedelvärden rekommenderas som de mest tillförlitliga av de grundläggande glidande typerna. De utgör ett viktelement, varvid varje föregående dag ges gradvis mindre viktning. Exponentiell utjämning undviker problemet med enkla glidande medelvärden Där genomsnittet har en tendens att barka två gånger en gång i början av den glidande medeltiden och igen i motsatt riktning, vid slutet av perioden exponentiell glidande medelhöjd är också e Asier för att bestämma lutningen är alltid nere när priset stänger under det glidande genomsnittet och alltid upp när priset är över. Colin Twiggs veckovisa granskning av den globala ekonomin hjälper dig att identifiera marknadsrisk och förbättra din tidpunkt.

No comments:

Post a Comment