Moyenne mobile dans T-SQL Un calcul commun dans l'analyse des tendances est la moyenne mobile (ou mobile). Une moyenne mobile est la moyenne des, par exemple, les 10 dernières rangées. La moyenne mobile montre une courbe plus lisse que les valeurs réelles, plus avec une période plus longue pour la moyenne mobile, ce qui en fait un bon outil pour l'analyse des tendances. Ce blog affichera comment calculer la moyenne mobile dans T-SQL. Différentes méthodes seront utilisées en fonction de la version de SQL Server. Le graphique ci-dessous montre l'effet de lissage (ligne rouge) avec une moyenne mobile de 200 jours. Les cours boursiers sont la ligne bleue. La tendance à long terme est clairement visible. T-SQL Déplacement Avergage 200 jours La démonstration ci-dessous nécessite la base de données TAdb qui peut être créée avec le script situé ici. Dans l'exemple à venir, nous calculons une moyenne mobile pour les 20 derniers jours. Selon la version de SQL Server, il y aura une méthode différente pour effectuer le calcul. Et, comme nous le verrons plus loin, les nouvelles versions de SQL Server ont des fonctions permettant un calcul beaucoup plus efficace. SQL Server 2012 et versions ultérieures Moyenne mobile Cette version utilise une fonction de fenêtre agrégée. Quoi de neuf dans SQL 2012 est la possibilité de restreindre la taille de la fenêtre en spécifiant le nombre de lignes précédant la fenêtre doit contenir: lignes précédentes est 19, car nous allons inclure la ligne actuelle ainsi dans le calcul. Comme vous pouvez le voir, le calcul de la moyenne mobile dans SQL Server 2012 est assez simple. La figure ci-dessous illustre le principe de fenêtrage. La ligne courante est marquée en jaune. La fenêtre est marquée d'un fond bleu. La moyenne mobile est simplement la moyenne de QuoteClose dans les lignes bleues: T-SQL Fenêtre de moyenne mobile. Les résultats des calculs dans les anciennes versions de SQL Server sont identiques, de sorte qu'ils ne seront pas affichés à nouveau. SQL Server 2005 8211 2008R2 Moyenne mobile Cette version utilise une expression de table commune. Le CTE est auto-référencé pour obtenir les 20 dernières lignes pour chaque ligne: Moyenne mobile avant SQL Server 2005 La version antérieure à 2005 utilisera une jointure externe gauche à la même table pour obtenir les 20 dernières lignes. Comparaison des performances Si nous exécutons les trois méthodes différentes simultanément et vérifions le plan d'exécution résultant, il existe une différence spectaculaire de performance entre les méthodes: Comparaison de trois Différentes méthodes pour calculer la moyenne mobile Comme vous pouvez le constater, les améliorations apportées aux fonctionnalités de fenêtrage dans SQL 2012 font une énorme différence dans les performances. Comme mentionné au début de ce post, les moyennes mobiles sont utilisées comme un outil pour illustrer les tendances. Une approche commune consiste à combiner des moyennes mobiles de différentes longueurs, afin de repérer respectivement les variations des tendances à court, moyen et long terme. Un intérêt particulier est le franchissement des lignes de tendance. Par exemple, lorsque la courte tendance se déplace sur la tendance à long ou à moyen terme, cela peut être interprété comme un signal d'achat dans l'analyse technique. Et quand la tendance courte se déplace sous une ligne de tendance plus longue, cela peut être interprété comme un signal de vente. Le graphique ci-dessous présente les devis, Ma20, Ma50 et Ma200. T-SQL Ma20, Ma50, Ma200 acheter et vendre des signaux. Ce billet de blog fait partie d'une série sur l'analyse technique, TA, dans SQL Server. Voir les autres messages ici. Publié par Tomas LindIm essayer de mettre en œuvre une moyenne mobile exponentielle (EMA) sur postgres, mais comme je vérifier la documentation et y penser plus j'essaie le plus confus je suis. La formule pour EMA (x) est: Il semble être parfait pour un agrégateur, en gardant le résultat du dernier élément calculé est exactement ce qui doit être fait ici. Cependant, un agrégateur produit un seul résultat (comme réduire, ou plier) et ici nous avons besoin d'une liste (une colonne) de résultats (en tant que carte). J'ai vérifié comment les procédures et les fonctions fonctionnent, mais AFAIK ils produisent une seule sortie, pas une colonne. J'ai vu beaucoup de procédures et de fonctions, mais je ne peux pas vraiment comprendre comment cela interagit avec l'algèbre relationnelle, surtout quand on fait quelque chose comme ça, un EMA. Je n'ai pas eu la chance de chercher les Internets jusqu'à présent. Mais la définition d'un EMA est assez simple, j'espère qu'il est possible de traduire cette définition en quelque chose qui fonctionne dans postgres et qui est simple et efficace, car passer à NoSQL va être excessif dans mon contexte. Est-ce le calcul de l'agrégation qui produit le résultat dans chaque ligne pour chaque sous-liste des données d'entrée? Parce qu'il ressemble à l'utilisation de l'agrégateur jusqu'à la ligne n, en retournant le résultat, puis en allant à la rangée 0 pour calculer l'agrégation jusqu'à la ligne n1 encore. Existe-t-il une façon d'utiliser l'accumulation ou une variable statique (comme en C) de sorte que cela doit être calculé une fois Merci. Ndash Trylks Jan 20 12 at 11:59 Non, il utilise la valeur accumulée. Si vous exécutez la requête avec la commande quotraise infoquot non commentée, vous pourrez voir que la fonction n'est appelée qu'une seule fois pour chaque sortie de ligne. Postgresql fournit la valeur d'état sur chaque ligne (s'il y avait un définitif défini, qui serait appelé pour transformer l'état en une valeur de sortie). ErwinBrandstetter: J'ai rétabli la plupart des changements - dans le cas du format de la première partie (ancre) de la requête, EMA (x1) peut être clairement représentée avec une seule ligne - ceci Corespnds à la ligne unique la définissant dans la question. Dans le cas de la partie récursive de la requête, j'ai utilisé mn - 1 dans la condition de jointure pour indiquer l 'équivalence de la relation avec EMA (xn - 1) dans la question, même si celle - ci sera moins performante si la performance est un , Le PO peut changer la condition de jointure pour être comme vous l'avez suggéré. Ndash Mark Bannister Jan 16 12 à 9: 27SQL ne vient pas avec beaucoup de fonctions analytiques, et si un utilisateur veut effectuer des calculs analytiques dans la base de données, il faut écrire un grand nombre de procédures ou de fonctions stockées. Il s'agit d'un moyen simple de créer une moyenne mobile exponentielle, qui peut être utilisée à plusieurs fins. Cette mise en œuvre se concentre sur les données du marché. Moyennes mobiles exponentielles - Qu'est-ce que les moyennes mobiles exponentielles, communément appelé EMA ou parfois EWMA, Moyenne mobile pondérée exponentiellement, est une moyenne mobile où les poids du point de données les plus récentes sont plus importants que les points de données distants. Dans une moyenne mobile simple, toutes les observations ont le même poids. EMA sont populaires dans les applications financières où l'on peut noter que Risk Metrics utilise un ensemble d'EMA afin de calculer la valeur à risque. Elle est également assez courante dans les applications d'analyse technique car elle est perçue comme étant moins en retard que les moyennes mobiles ordinaires. Comparé à la moyenne mobile simple (SMA), un EMA a également un paramètre. Alors que le SMA a la fenêtre de lookback en tant que paramètre unique, un EMA a un facteur de lissage comme paramètre principal. Le facteur de lissage peut être facilement converti en un facteur de demi-vie qui se réfère au nombre de jours La formule pour EMA est particulièrement efficace pour les calculs informatiques, car il peut être complété en utilisant la valeur EMA précédente et les nouvelles informations. Ici, le cadre est des données financières, où nous calculons l'EMA sur une série consistant en prix de clôture. Où est le prix d'aujourd'hui, est le temps et est le facteur de désintégration. Est inférieur ou égal à 1 et l'EMA n'est généralement pas définie pour une période inférieure à 2. Dans la plupart des cas, la valeur de départ est fixée au prix actuel à. Exemple d'implémentation à l'aide de curseurs Voici un exemple de code utilisé pour implémenter l'EMA dans T-SQL, en utilisant SQL Server 2008, mais il devrait également être compatible avec les versions antérieures de SQL Server. Veuillez noter que la fonction dépend du paramètre Longueur qui est égal à la demi-vie. Ceci est converti dans le facteur de lissage dans la première ligne. Bien que la mise en œuvre utilise des curseurs, on pourrait aussi mettre en œuvre ce qui est un moyen plus propre à l'intérieur des jointures. Toutefois, pour les grands ensembles de données, ceux-ci sont susceptibles de prendre beaucoup de temps et de mémoire. (Varchar (15), convert (longueur int.)) SET cursor CURSOR FOR SELECT A. date. A. proche de dbo. Données du marché A WHERE A. Marché sur le marché et A. date entre le début et la fin de l'échéance ORDER BY A. date OPEN curseur FETCH NEXT À partir du curseur INTO date. Close WHILE FETCHSTATUS 0 BEGIN Si expaverage est null SET expaverage fermer ELSE SET expaverage expaverage smoothing (close - expaverage) INSERT INTO Résultat (date. Fermer. Expaverage. Signalname FETCH NEXT A partir du curseur INTO date. Fermer FIN
No comments:
Post a Comment