Sunday, February 12, 2017

Php Code Exponentiel Mobile Moyenne

Je veux calculer la valeur EMA (Exponential Moving Average) en PHP. Ive a essayé avec le code suivant mais son me donnant 500 erreur. PHP: fonction de calcul d'EMA Trader-email essayé avec le googling long de temps mais n'obtenant aucune aide sur ceci en PHP. Donc, je n'ai aucune idée de ce qui doit être fait pour calculer la valeur EMA. Edit-1: Extensions installées Ive installé toutes les extensions nécessaires, Maintenant, je reçois la sortie. Mais il ne semble pas donner une sortie appropriée. Je pense que la fonction PHP pour calculer EMA ne fonctionne pas correctement. Toute aide dans ce serait grandement appreciated. Im essayant de récupérer le dernier EMA d'un grand ensemble de données (15000 valeurs). C'est un algorithme très gourmand en ressources puisque chaque valeur dépend de la précédente. Voici mon code: Ce que j'ai déjà fait: Isoler k de sorte qu'il n'est pas calculé 10000 fois Conserver uniquement la dernière EMA calculée, et ne pas garder tous dans un tableau utiliser pour () au lieu de foreach () Son un tableau de base Cela m'a permis de réduire le temps d'exécution de 2000ms à environ 500ms pour 15000 valeurs Ce qui n'a pas fonctionné: Utilisez SplFixedArray (), ce rasé seulement 10ms d'exécution de 1 000 000 de valeurs Utilisez l'extension PHPTrader. Ce qui renvoie un tableau contenant toutes les EMA au lieu de tout dernier, et son écriture plus lente et en cours d'exécution le même algorithme en C et l'exécuter plus de 2 000 000 de valeurs ne prend que 13ms Donc, évidemment, en utilisant une compilation, la langue de bas niveau semble aider P Where Je devrais aller d'ici Le code sera finalement exécuté sur Ubuntu, donc quelle langue dois-je choisir Will PHP être en mesure d'appeler et de passer un tel argument énorme pour le script demandé Jul 11 ​​14 at 19:21 Clairement la mise en œuvre avec une extension vous donne un Considérable. En outre, le calcul peut être amélioré comme lui-même et que le gain que vous pouvez ajouter dans la langue que vous choisissez. Il est facile de voir que lastEMA peut être calculé comme suit: Ceci peut être réécrit comme suit afin de sortir de la boucle le plus possible: Pour expliquer l'extraction de la k pense que dans la formulation précédente est comme si tous les Les données brutes originales sont multipliées par k alors pratiquement vous pouvez au lieu de multiplier le résultat final. Notez que, réécrit de cette façon, vous avez 2 opérations à l'intérieur de la boucle au lieu de 3 (pour être précis à l'intérieur de la boucle, il ya aussi i incrément, i comparaison avec sizeata et assignation de valeur lastEMA) de cette façon, vous pouvez vous attendre à un Accélération dans la plage entre les 16 et 33. Il ya d'autres améliorations qui peuvent être considérées au moins dans certaines circonstances: Considérez uniquement les dernières valeurs Les premières valeurs sont multipliées plusieurs fois par k1m 1 - k leur contribution peut être peu ou même aller Sous la précision en virgule flottante (ou l'erreur acceptable). Cette idée est particulièrement utile si vous pouvez faire l'hypothèse que les données plus anciennes sont du même ordre de grandeur que la plus récente, car si vous considérez uniquement les dernières n valeurs l'erreur que vous faites est erron EMAofdiscardeddata (1-k) n. Donc, si l'ordre de grandeur est globalement le même, on peut dire que l'erreur relative est relerr err lastEMA EMAofdiscardeddata (1-k) n lastEMA qui est presque égal à simplement (1-k) n. Sous l'hypothèse que lastEMA est presque égale à EMAofdiscardeddata: Supposons que vous pouvez accepter un relerr relatif d'erreur que vous pouvez considérer en toute sécurité seulement les dernières n valeurs où (1 - k) n lt relerr. Signifie que vous pouvez pré-calculer (avant la boucle) n log (relerr) log (1-k) et calculer tout en considérant uniquement les n dernières valeurs. Si l'ensemble de données est très grand, cela peut donner une accélération raisonnable. Considérons que pour les nombres à virgule flottante de 64 bits, vous avez une précision relative (relative à la mantisse) qui est 2-53 (environ 1.1e-16 et seulement 2-24 5.96e-8 pour les nombres à virgule flottante 32 bits), vous ne pouvez donc pas obtenir Mieux que cette erreur relative, si fondamentalement vous ne devriez jamais avoir un avantage dans le calcul de plus de n log (1.1e-16) log (1-k) valeurs. Pour donner un exemple si la gamme 2000 puis n log (1.1e-16) log (1-22001) 36746. Je pense que c'est intéressant de savoir que les calculs supplémentaires seraient perdus à l'intérieur des redondements, il est inutile est mieux de ne pas le faire. Maintenant un exemple pour le cas où vous pouvez accepter une erreur relative plus grande que la précision en virgule flottante relerr 1ppm 1e-6 0.00001 6 chiffres décimales significatifs que vous avez n log (1.1e-16) log (1-22001) 13815 Je pense est tout à fait Peu de nombre par rapport à vos numéros d'échantillons dernière donc dans ce cas, le speedup pourrait être évident (Im en supposant que la gamme 2000 est significatif ou élevé pour votre application, mais thi je ne peux pas savoir). Juste quelques autres nombres parce que je ne sais pas quels sont vos chiffres typiques: relerr 1e-3 gamme 2000 n 6907 relerr 1e-3 gamme 200 n 691 relerr 1e-3 gamme 20 n 69 relerr 1e-6 gamme 2000 n 13815 relerr 1e - 6 gamme 200 n 1381 relerr 1e-6 plage 20 n 138 Si l'hypothèse lastEMA presque égal à EMAofdiscardeddata ne peut pas être pris les choses sont moins faciles mais puisque l'avantage cam est significatif, il peut être utile de continuer: nous devons ré-examiner le (1-k) le point central est de calculer lastEMA (1-k), le point central est de calculer lastEMA (last-time) (Par exemple M 1000 ou M 1e6) dans ce cas n lt (log (relerrM)) log (1) est un cas où nous savons a priori que, par exemple, EMAofdiscardeddata lastEMA lt M (par exemple M 1000 ou M 1e6) - k) si vous ne pouvez pas donner de numéro M vous devez trouver une bonne idée de surestimer EMAofdiscardeddata lastEMA un moyen rapide pourrait être de prendre M max (données) min (données) Parallélisation Le calcul peut être réécrit sous une forme Où il est une simple addition de termes indépendants: Donc, si le langage d'implémentation supporte la parallélisation, le jeu de données peut être divisé en 4 (ou 8 ou n. Essentiellement le nombre de cœurs CPU disponibles) et il peut être calculé la somme des termes sur chaque morceau en parallèle résumant les résultats individuels à la fin. Je ne vais pas en détail avec cela puisque cette réponse est déjà terriblement longue et je pense que le concept est déjà exprimé. Merci pour cette I39m en utilisant ce sur les données du marché boursier, donc le fait que les données plus anciennes est sur le même ordre de grandeur que les nouvelles données dépend de la période de temps utilisée. Supposons une gamme de 200, il y aura une variation beaucoup plus grande dans les prix sur un laps de temps quotidien (200 jours) que 5 minutes (16 heures). Je vais expérimenter différents scénarios sur des données réelles et simulées. Sur les nouvelles données, avec une gamme lt 200, j'utilise un jeu de données de 1000 éléments. Mais je fais aussi quelques tests en arrière au cours des dernières années, donc j'ai encore besoin de charger l'ensemble de données. Vous avez aidé pour les deux situations, je vous remercie ndash Lykegenes Jul 16 14 at 15:11 Construire votre propre extension améliore certainement les performances. Voici un bon tutoriel du site Web de Zend. Quelques chiffres de performance: Matériel: Ubuntu 14.04, PHP 5.5.9, Intel Core3.3Ghz, 128 Mo de RAM (c'est un VPS). Avant (PHP uniquement, 16 000 valeurs). 500ms C Extension, 16 000 valeurs. 0,3ms C Extension (100 000 valeurs). 3.7ms C Extension (500.000 valeurs). 28.0ms Mais Im mémoire limitée à ce stade, en utilisant 70MB. Je vais corriger cela et mettre à jour les numéros en conséquence. Traderema la fonction traderema () ne fonctionne pas correctement. Il calcule juste la moyenne des entrées de la dernière période. Suivez le code suivant pour traderema: function EMACalculator (limite, tableau) EMApreviousday array0 printr (tableau) multiplier1 (2limit1) EMAarray () EMA array0 Fermer array1 while (limit) echoEMA est EMAn EMA (Close - EMApreviousday) multiplicateur1 EMApreviousday EMA limit - - retour EMA où limite accepter la période de ema et de tableau. Accepter tableau de données pour calcul ema.


No comments:

Post a Comment