Thursday, 2 February 2017

Exponentielle Mobile Moyenne Php

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 Googling longtemps 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 égal à 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, la vitesse pourrait être évidente (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 prise 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,3 ms Extension C (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 chiffres en conséquence. Moyenne mobile exponentielle Moyennes mobiles exponentielles sont recommandés comme le plus fiable des types de base de la moyenne mobile. Ils fournissent un élément de pondération, chaque jour précédent étant donné progressivement moins de pondération. Le lissage exponentiel évite le problème rencontré avec les moyennes mobiles simples. Où la moyenne a une tendance à quotbark deux fois: une fois au début de la période moyenne mobile et à nouveau dans la direction opposée, à la fin de la période. La pente moyenne mobile exponentielle est également plus facile à déterminer: la pente est toujours en baisse lorsque le prix se ferme au-dessous de la moyenne mobile et toujours en hausse lorsque le prix est au-dessus. Pour calculer une moyenne mobile exponentielle (EMA): Prenez le prix d'aujourd'hui multiplié par un EMA. Ajoutez ceci à l'EMA d'hier multiplié par (1 - EMA). Si nous recalculons le tableau précédent, nous voyons que la moyenne mobile exponentielle présente une tendance beaucoup plus lisse: EMA est la pondération attachée à la valeur jours actuels: 50 serait utilisé pour une moyenne mobile exponentielle de 3 jours 10 est utilisé pour un 19 jours La moyenne mobile exponentielle et 1 est utilisée pour une moyenne mobile exponentielle de 199 jours. Pour convertir une période de temps sélectionnée en EMA, utilisez cette formule: EMA 2 (n 1) où n est le nombre de jours Exemple: L'EMA pour 5 jours est 2 (5 jours 1) 33.3 Incredible Charts effectue ce calcul automatiquement lorsque vous sélectionnez Une période EMA. Inscrivez-vous à notre liste d'envoi Lire le bulletin Colin Twiggs Trading Diary, avec des articles éducatifs sur le commerce, l'analyse technique, les indicateurs et de nouvelles mises à jour logicielles.


No comments:

Post a Comment