Logo

DEMA

Updated 2023-11-10 21:51:52.187000

Syntax

SELECT [westclintech].[wct].[DEMA](
  <@Val, float,>
 ,<@Days, int,>
 ,<@Lag, int,>
 ,<@FirstValue, nvarchar(4000),>
 ,<@RowNum, int,>
 ,<@Id, tinyint,>)

Description

Use DEMA to calculate the daily exponential weighted moving average of column values in an ordered resultant table, without the need for a self-join. DEMA allows you to define the size of a window calculates the DEMA for each row in the window. If the column values are presented to the functions out of order, an error message will be generated.

Arguments

@Days

the size of the window, including the current row. @Days is the number or rows, including the current row, in the window. @Days is an expression of type int or of a type that can be implicitly converted to int.

@Id

a unique identifier for the DEMA calculation. @Id allows you to specify multiple DEMA calculation s within a resultant table. @Id is an expression of type tinyint or of a type that can be implicitly converted to tinyint.

@FirstValue

Identifies whether the first value returned for the window is calculated using the exponential-weighted moving average from the beginning of the set ('E'), the last value immediately prior to the current row ('L') or the simple average ('S').

@Val

the value passed into the function. @Val is an expression of type float or of a type that can be implicitly converted to float.

@RowNum

the number of the row within the group for which the sum is being calculated. If @RowNum for the current row in a set is less than or equal to the previous @RowNum and @RowNum is not equal to 1, an error message will be generated. @RowNum is an expression of type int or of a type that can be implicitly converted to int.

@Lag

permits the exponentially weighted moving average to by returned with the current row (@Lag = 0) or the subsequent row (@Lag = 1). @Lag is an expression of type int or of a type that can be implicitly converted to int.

Return Type

float

Remarks

If @Id is NULL then @Id = 0.

To calculate daily weighted moving averages, use the DWMA function.

To calculate a moving exponentially weighted moving average, use the MovingEWMA function

Alpha is automatically calculated as 2 / (@Days + 1).

@Lag must be 0 or 1.

@RowNum must be in ascending order.

There may be cases where the order in which the data are returned to the function and the order in which the results are returned are different, generally due to parallelism. You can use OPTION(MAXDOP 1) or OPTION(MAXDOP 1,FORCE ORDER) to help eliminate this problem.

Examples

In this example we will calculate the exponentially-weighted moving average for the closing price of MSFT. We will create a temporary table, #p, populate it with some data and then run the SELECT.

--Create the temporary table

CREATE TABLE #p

(

    ticker varchar(4),

    date_trade datetime,

    price_adj_close money,

    PRIMARY KEY (

                    ticker,

                    date_trade

                )

);

--Put data into the table

INSERT INTO #p

VALUES

('MSFT', '2012-10-31', 28.54);

INSERT INTO #p

VALUES

('MSFT', '2012-10-26', 28.21);

INSERT INTO #p

VALUES

('MSFT', '2012-10-25', 27.88);

INSERT INTO #p

VALUES

('MSFT', '2012-10-24', 27.9);

INSERT INTO #p

VALUES

('MSFT', '2012-10-23', 28.05);

INSERT INTO #p

VALUES

('MSFT', '2012-10-22', 28);

INSERT INTO #p

VALUES

('MSFT', '2012-10-19', 28.64);

INSERT INTO #p

VALUES

('MSFT', '2012-10-18', 29.5);

INSERT INTO #p

VALUES

('MSFT', '2012-10-17', 29.59);

INSERT INTO #p

VALUES

('MSFT', '2012-10-16', 29.49);

INSERT INTO #p

VALUES

('MSFT', '2012-10-15', 29.51);

INSERT INTO #p

VALUES

('MSFT', '2012-10-12', 29.2);

INSERT INTO #p

VALUES

('MSFT', '2012-10-11', 28.95);

INSERT INTO #p

VALUES

('MSFT', '2012-10-10', 28.98);

INSERT INTO #p

VALUES

('MSFT', '2012-10-09', 29.28);

INSERT INTO #p

VALUES

('MSFT', '2012-10-08', 29.78);

INSERT INTO #p

VALUES

('MSFT', '2012-10-05', 29.85);

INSERT INTO #p

VALUES

('MSFT', '2012-10-04', 30.03);

INSERT INTO #p

VALUES

('MSFT', '2012-10-03', 29.86);

INSERT INTO #p

VALUES

('MSFT', '2012-10-02', 29.66);

INSERT INTO #p

VALUES

('MSFT', '2012-10-01', 29.49);

INSERT INTO #p

VALUES

('MSFT', '2012-09-28', 29.76);

INSERT INTO #p

VALUES

('MSFT', '2012-09-27', 30.16);

INSERT INTO #p

VALUES

('MSFT', '2012-09-26', 30.17);

INSERT INTO #p

VALUES

('MSFT', '2012-09-25', 30.39);

INSERT INTO #p

VALUES

('MSFT', '2012-09-24', 30.78);

INSERT INTO #p

VALUES

('MSFT', '2012-09-21', 31.19);

INSERT INTO #p

VALUES

('MSFT', '2012-09-20', 31.45);

INSERT INTO #p

VALUES

('MSFT', '2012-09-19', 31.05);

INSERT INTO #p

VALUES

('MSFT', '2012-09-18', 31.18);

INSERT INTO #p

VALUES

('MSFT', '2012-09-17', 31.21);

INSERT INTO #p

VALUES

('MSFT', '2012-09-14', 31.21);

INSERT INTO #p

VALUES

('MSFT', '2012-09-13', 30.94);

INSERT INTO #p

VALUES

('MSFT', '2012-09-12', 30.78);

INSERT INTO #p

VALUES

('MSFT', '2012-09-11', 30.79);

INSERT INTO #p

VALUES

('MSFT', '2012-09-10', 30.72);

INSERT INTO #p

VALUES

('MSFT', '2012-09-07', 30.95);

INSERT INTO #p

VALUES

('MSFT', '2012-09-06', 31.35);

INSERT INTO #p

VALUES

('MSFT', '2012-09-05', 30.39);

INSERT INTO #p

VALUES

('MSFT', '2012-09-04', 30.39);

INSERT INTO #p

VALUES

('MSFT', '2012-08-31', 30.82);

INSERT INTO #p

VALUES

('MSFT', '2012-08-30', 30.32);

INSERT INTO #p

VALUES

('MSFT', '2012-08-29', 30.65);

INSERT INTO #p

VALUES

('MSFT', '2012-08-28', 30.63);

INSERT INTO #p

VALUES

('MSFT', '2012-08-27', 30.69);

INSERT INTO #p

VALUES

('MSFT', '2012-08-24', 30.56);

INSERT INTO #p

VALUES

('MSFT', '2012-08-23', 30.26);

INSERT INTO #p

VALUES

('MSFT', '2012-08-22', 30.54);

INSERT INTO #p

VALUES

('MSFT', '2012-08-21', 30.8);

INSERT INTO #p

VALUES

('MSFT', '2012-08-20', 30.74);

INSERT INTO #p

VALUES

('MSFT', '2012-08-17', 30.9);

INSERT INTO #p

VALUES

('MSFT', '2012-08-16', 30.78);

INSERT INTO #p

VALUES

('MSFT', '2012-08-15', 30.2);

INSERT INTO #p

VALUES

('MSFT', '2012-08-14', 30.13);

INSERT INTO #p

VALUES

('MSFT', '2012-08-13', 30.19);

INSERT INTO #p

VALUES

('MSFT', '2012-08-10', 30.22);

INSERT INTO #p

VALUES

('MSFT', '2012-08-09', 30.3);

INSERT INTO #p

VALUES

('MSFT', '2012-08-08', 30.13);

INSERT INTO #p

VALUES

('MSFT', '2012-08-07', 30.06);

INSERT INTO #p

VALUES

('MSFT', '2012-08-06', 29.75);

INSERT INTO #p

VALUES

('MSFT', '2012-08-03', 29.55);

INSERT INTO #p

VALUES

('MSFT', '2012-08-02', 29);

INSERT INTO #p

VALUES

('MSFT', '2012-08-01', 29.22);

INSERT INTO #p

VALUES

('MSFT', '2012-07-31', 29.28);

--Calculate the 5-day exponentially weighted moving average

SELECT cast(date_trade as date) as date_trade,

       price_adj_close,

       wct.DEMA(price_adj_close, 5, 0, NULL, ROW_NUMBER() OVER (ORDER BY date_trade)

                 , NULL) as [5-day]

FROM #p

ORDER BY 1;

--Clean up

DROP TABLE #p;

This produces the following result.

{"columns":[{"field":"date_trade","headerClass":"ag-right-aligned-header","cellClass":"ag-right-aligned-cell"},{"field":"price_adj_close","headerClass":"ag-right-aligned-header","cellClass":"ag-right-aligned-cell"},{"field":"5-day"}],"rows":[{"date_trade":"2012-07-31","price_adj_close":"29.28","5-day":"NULL"},{"date_trade":"2012-08-01","price_adj_close":"29.22","5-day":"NULL"},{"date_trade":"2012-08-02","price_adj_close":"29.00","5-day":"NULL"},{"date_trade":"2012-08-03","price_adj_close":"29.55","5-day":"NULL"},{"date_trade":"2012-08-06","price_adj_close":"29.75","5-day":"29.4492592592593"},{"date_trade":"2012-08-07","price_adj_close":"30.06","5-day":"29.36"},{"date_trade":"2012-08-08","price_adj_close":"30.13","5-day":"29.6166666666667"},{"date_trade":"2012-08-09","price_adj_close":"30.30","5-day":"29.8444444444444"},{"date_trade":"2012-08-10","price_adj_close":"30.22","5-day":"29.9696296296296"},{"date_trade":"2012-08-13","price_adj_close":"30.19","5-day":"30.0430864197531"},{"date_trade":"2012-08-14","price_adj_close":"30.13","5-day":"30.0720576131687"},{"date_trade":"2012-08-15","price_adj_close":"30.20","5-day":"30.1147050754458"},{"date_trade":"2012-08-16","price_adj_close":"30.78","5-day":"30.3364700502972"},{"date_trade":"2012-08-17","price_adj_close":"30.90","5-day":"30.5243133668648"},{"date_trade":"2012-08-20","price_adj_close":"30.74","5-day":"30.5962089112432"},{"date_trade":"2012-08-21","price_adj_close":"30.80","5-day":"30.6641392741621"},{"date_trade":"2012-08-22","price_adj_close":"30.54","5-day":"30.6227595161081"},{"date_trade":"2012-08-23","price_adj_close":"30.26","5-day":"30.5018396774054"},{"date_trade":"2012-08-24","price_adj_close":"30.56","5-day":"30.5212264516036"},{"date_trade":"2012-08-27","price_adj_close":"30.69","5-day":"30.5774843010691"},{"date_trade":"2012-08-28","price_adj_close":"30.63","5-day":"30.5949895340461"},{"date_trade":"2012-08-29","price_adj_close":"30.65","5-day":"30.6133263560307"},{"date_trade":"2012-08-30","price_adj_close":"30.32","5-day":"30.5155509040205"},{"date_trade":"2012-08-31","price_adj_close":"30.82","5-day":"30.6170339360136"},{"date_trade":"2012-09-04","price_adj_close":"30.39","5-day":"30.5413559573424"},{"date_trade":"2012-09-05","price_adj_close":"30.39","5-day":"30.4909039715616"},{"date_trade":"2012-09-06","price_adj_close":"31.35","5-day":"30.7772693143744"},{"date_trade":"2012-09-07","price_adj_close":"30.95","5-day":"30.8348462095829"},{"date_trade":"2012-09-10","price_adj_close":"30.72","5-day":"30.796564139722"},{"date_trade":"2012-09-11","price_adj_close":"30.79","5-day":"30.794376093148"},{"date_trade":"2012-09-12","price_adj_close":"30.78","5-day":"30.7895840620987"},{"date_trade":"2012-09-13","price_adj_close":"30.94","5-day":"30.8397227080658"},{"date_trade":"2012-09-14","price_adj_close":"31.21","5-day":"30.9631484720438"},{"date_trade":"2012-09-17","price_adj_close":"31.21","5-day":"31.0454323146959"},{"date_trade":"2012-09-18","price_adj_close":"31.18","5-day":"31.0902882097973"},{"date_trade":"2012-09-19","price_adj_close":"31.05","5-day":"31.0768588065315"},{"date_trade":"2012-09-20","price_adj_close":"31.45","5-day":"31.2012392043543"},{"date_trade":"2012-09-21","price_adj_close":"31.19","5-day":"31.1974928029029"},{"date_trade":"2012-09-24","price_adj_close":"30.78","5-day":"31.0583285352686"},{"date_trade":"2012-09-25","price_adj_close":"30.39","5-day":"30.8355523568457"},{"date_trade":"2012-09-26","price_adj_close":"30.17","5-day":"30.6137015712305"},{"date_trade":"2012-09-27","price_adj_close":"30.16","5-day":"30.4624677141537"},{"date_trade":"2012-09-28","price_adj_close":"29.76","5-day":"30.2283118094358"},{"date_trade":"2012-10-01","price_adj_close":"29.49","5-day":"29.9822078729572"},{"date_trade":"2012-10-02","price_adj_close":"29.66","5-day":"29.8748052486381"},{"date_trade":"2012-10-03","price_adj_close":"29.86","5-day":"29.8698701657588"},{"date_trade":"2012-10-04","price_adj_close":"30.03","5-day":"29.9232467771725"},{"date_trade":"2012-10-05","price_adj_close":"29.85","5-day":"29.8988311847817"},{"date_trade":"2012-10-08","price_adj_close":"29.78","5-day":"29.8592207898544"},{"date_trade":"2012-10-09","price_adj_close":"29.28","5-day":"29.6661471932363"},{"date_trade":"2012-10-10","price_adj_close":"28.98","5-day":"29.4374314621575"},{"date_trade":"2012-10-11","price_adj_close":"28.95","5-day":"29.274954308105"},{"date_trade":"2012-10-12","price_adj_close":"29.20","5-day":"29.2499695387367"},{"date_trade":"2012-10-15","price_adj_close":"29.51","5-day":"29.3366463591578"},{"date_trade":"2012-10-16","price_adj_close":"29.49","5-day":"29.3877642394385"},{"date_trade":"2012-10-17","price_adj_close":"29.59","5-day":"29.4551761596257"},{"date_trade":"2012-10-18","price_adj_close":"29.50","5-day":"29.4701174397505"},{"date_trade":"2012-10-19","price_adj_close":"28.64","5-day":"29.1934116265003"},{"date_trade":"2012-10-22","price_adj_close":"28.00","5-day":"28.7956077510002"},{"date_trade":"2012-10-23","price_adj_close":"28.05","5-day":"28.5470718340001"},{"date_trade":"2012-10-24","price_adj_close":"27.90","5-day":"28.3313812226668"},{"date_trade":"2012-10-25","price_adj_close":"27.88","5-day":"28.1809208151112"},{"date_trade":"2012-10-26","price_adj_close":"28.21","5-day":"28.1906138767408"},{"date_trade":"2012-10-31","price_adj_close":"28.54","5-day":"28.3070759178272"}]}