# InfluxQL analysis functions

Use technical analysis functions to apply algorithms to your data–often used to analyze financial and investment data.

Each analysis function below covers **syntax**, including parameters to pass to the function, and **examples** of how to use the function. Examples use NOAA water sample data.

## Predictive analysis

Predictive analysis functions are a type of technical analysis algorithms that predict and forecast future values.

### HOLT_WINTERS()

Returns N number of predicted field values
using the Holt-Winters seasonal method.
Supports int64 and float64 field value data types.
Works with data that occurs at consistent time intervals.
Requires an InfluxQL function and the `GROUP BY time()`

clause to ensure that
the Holt-Winters function operates on regular data.

Use `HOLT_WINTERS()`

to:

- Predict when data values will cross a given threshold
- Compare predicted values with actual values to detect anomalies in your data

#### Syntax

```
SELECT HOLT_WINTERS[_WITH-FIT](<function>(<field_key>),<N>,<S>) FROM_clause [WHERE_clause] GROUP_BY_clause [ORDER_BY_clause] [LIMIT_clause] [OFFSET_clause] [SLIMIT_clause] [SOFFSET_clause]
```

`HOLT_WINTERS(function(field_key),N,S)`

returns `N`

seasonally adjusted
predicted field values for the specified field key.

The `N`

predicted values occur at the same interval as the `GROUP BY time()`

interval.
If your `GROUP BY time()`

interval is `6m`

and `N`

is `3`

you’ll
receive three predicted values that are each six minutes apart.

`S`

is the seasonal pattern parameter and delimits the length of a seasonal
pattern according to the `GROUP BY time()`

interval.
If your `GROUP BY time()`

interval is `2m`

and `S`

is `3`

, then the
seasonal pattern occurs every six minutes, that is, every three data points.
If you do not want to seasonally adjust your predicted values, set `S`

to `0`

or `1.`

`HOLT_WINTERS_WITH_FIT(function(field_key),N,S)`

returns the fitted values in
addition to `N`

seasonally adjusted predicted field values for the specified field key.

#### Examples

#### Common issues with `HOLT_WINTERS()`

##### Receiving fewer than `N`

points

In some cases, you may receive fewer predicted points than requested by the `N`

parameter.
That behavior typically occurs when the math becomes unstable and cannot forecast more
points. In this case, `HOLT_WINTERS()`

may not be suited for the dataset or the seasonal adjustment parameter is invalid.

## Technical analysis functions

Technical analysis functions apply widely used algorithms to your data. While they are primarily used in finance and investing, they have application in other industries.

For technical analysis functions, consider whether to include the `PERIOD`

, `HOLD_PERIOD`

, and `WARMUP_TYPE`

arguments:

`PERIOD`

**Required, integer, min=1**

The sample size for the algorithm, which is the number of historical samples with significant
effect on the output of the algorithm.
For example, `2`

means the current point and the point before it.
The algorithm uses an exponential decay rate to determine the weight of a historical point,
generally known as the alpha (α). The `PERIOD`

controls the decay rate.

**Note:** Older points can still have an impact.

`HOLD_PERIOD`

**integer, min=-1**

How many samples the algorithm needs before emitting results.
The default of `-1`

means the value is based on the algorithm, the `PERIOD`

,
and the `WARMUP_TYPE`

. Verify this value is enough for the algorithm to emit meaningful results.

**Default hold periods:**

For most technical analysis functions, the default `HOLD_PERIOD`

is
determined by the function and the `WARMUP_TYPE`

shown in the following table:

Algorithm \ Warmup Type | simple | exponential | none |
---|---|---|---|

EXPONENTIAL_MOVING_AVERAGE | PERIOD - 1 | PERIOD - 1 | n/a |

DOUBLE_EXPONENTIAL_MOVING_AVERAGE | ( PERIOD - 1 ) * 2 | PERIOD - 1 | n/a |

TRIPLE_EXPONENTIAL_MOVING_AVERAGE | ( PERIOD - 1 ) * 3 | PERIOD - 1 | n/a |

TRIPLE_EXPONENTIAL_DERIVATIVE | ( PERIOD - 1 ) * 3 + 1 | PERIOD | n/a |

RELATIVE_STRENGTH_INDEX | PERIOD | PERIOD | n/a |

CHANDE_MOMENTUM_OSCILLATOR | PERIOD | PERIOD | PERIOD - 1 |

**Kaufman algorithm default hold periods:**

Algorithm | Default Hold Period |
---|---|

KAUFMANS_EFFICIENCY_RATIO() | PERIOD |

KAUFMANS_ADAPTIVE_MOVING_AVERAGE() | PERIOD |

`WARMUP_TYPE`

**default=‘exponential’**

Controls how the algorithm initializes for the first `PERIOD`

samples.
It is essentially the duration for which it has an incomplete sample set.

##### simple

Simple moving average (SMA) of the first `PERIOD`

samples.
This is the method used by ta-lib.

##### exponential

Exponential moving average (EMA) with scaling alpha (α).
Uses an EMA with `PERIOD=1`

for the first point, `PERIOD=2`

for the second point, and so on, until the algorithm has consumed `PERIOD`

number of points.
As the algorithm immediately starts using an EMA, when this method is used and
`HOLD_PERIOD`

is unspecified or `-1`

, the algorithm may start emitting points
after a much smaller sample size than with `simple`

.

##### none

The algorithm does not perform any smoothing at all.
Method used by ta-lib.
When this method is used and `HOLD_PERIOD`

is unspecified, `HOLD_PERIOD`

defaults to `PERIOD - 1`

.

**Note:** The `none`

warmup type is only available with the `CHANDE_MOMENTUM_OSCILLATOR()`

function.

## CHANDE_MOMENTUM_OSCILLATOR()

The Chande Momentum Oscillator (CMO) is a technical momentum indicator developed by Tushar Chande.
The CMO indicator is created by calculating the difference between the sum of all
recent higher data points and the sum of all recent lower data points,
then dividing the result by the sum of all data movement over a given time period.
The result is multiplied by 100 to give the -100 to +100 range.
^{Source}

Supports `GROUP BY`

clauses that group by tags but not `GROUP BY`

clauses that group by time. To use `CHANDE_MOMENTUM_OSCILLATOR()`

with a `GROUP BY time()`

clause, see Advanced syntax.

### Basic syntax

```
CHANDE_MOMENTUM_OSCILLATOR([ * | <field_key> | /regular_expression/ ], <period>[, <hold_period>, [warmup_type]])
```

### Arguments

- period
- (Optional) hold_period
- (Optional) warmup_type

`CHANDE_MOMENTUM_OSCILLATOR(field_key, 2)`

Returns the field values associated with the field key
processed using the Chande Momentum Oscillator algorithm with a 2-value period
and the default hold period and warmup type.

`CHANDE_MOMENTUM_OSCILLATOR(field_key, 10, 9, 'none')`

Returns the field values associated with the field key
processed using the Chande Momentum Oscillator algorithm with a 10-value period
a 9-value hold period, and the `none`

warmup type.

`CHANDE_MOMENTUM_OSCILLATOR(MEAN(<field_key>), 2) ... GROUP BY time(1d)`

Returns the mean of field values associated with the field key
processed using the Chande Momentum Oscillator algorithm with a 2-value period
and the default hold period and warmup type.

**Note:** When aggregating data with a `GROUP BY`

clause, you must include an aggregate function in your call to the `CHANDE_MOMENTUM_OSCILLATOR()`

function.

`CHANDE_MOMENTUM_OSCILLATOR(/regular_expression/, 2)`

Returns the field values associated with each field key that matches the regular expression
processed using the Chande Momentum Oscillator algorithm with a 2-value period
and the default hold period and warmup type.

`CHANDE_MOMENTUM_OSCILLATOR(*, 2)`

Returns the field values associated with each field key in the measurement
processed using the Chande Momentum Oscillator algorithm with a 2-value period
and the default hold period and warmup type.

`CHANDE_MOMENTUM_OSCILLATOR()`

supports int64 and float64 field value data types.

## EXPONENTIAL_MOVING_AVERAGE()

An exponential moving average (EMA) (or exponentially weighted moving average) is a type of moving average similar to a simple moving average, except more weight is given to the latest data.

This type of moving average reacts faster to recent data changes than a simple moving average.
^{Source}

Supports `GROUP BY`

clauses that group by tags but not `GROUP BY`

clauses that group by time.
To use `EXPONENTIAL_MOVING_AVERAGE()`

with a `GROUP BY time()`

clause, see Advanced syntax.

### Basic syntax

```
EXPONENTIAL_MOVING_AVERAGE([ * | <field_key> | /regular_expression/ ], <period>[, <hold_period)[, <warmup_type]])
```

`EXPONENTIAL_MOVING_AVERAGE(field_key, 2)`

Returns the field values associated with the field key
processed using the Exponential Moving Average algorithm with a 2-value period
and the default hold period and warmup type.

`EXPONENTIAL_MOVING_AVERAGE(field_key, 10, 9, 'exponential')`

Returns the field values associated with the field key
processed using the Exponential Moving Average algorithm with a 10-value period
a 9-value hold period, and the `exponential`

warmup type.

`EXPONENTIAL_MOVING_AVERAGE(MEAN(<field_key>), 2) ... GROUP BY time(1d)`

Returns the mean of field values associated with the field key
processed using the Exponential Moving Average algorithm with a 2-value period
and the default hold period and warmup type.

**Note:** When aggregating data with a `GROUP BY`

clause, you must include an aggregate function in your call to the `EXPONENTIAL_MOVING_AVERAGE()`

function.

`EXPONENTIAL_MOVING_AVERAGE(/regular_expression/, 2)`

Returns the field values associated with each field key that matches the regular expression
processed using the Exponential Moving Average algorithm with a 2-value period
and the default hold period and warmup type.

`EXPONENTIAL_MOVING_AVERAGE(*, 2)`

Returns the field values associated with each field key in the measurement
processed using the Exponential Moving Average algorithm with a 2-value period
and the default hold period and warmup type.

`EXPONENTIAL_MOVING_AVERAGE()`

supports int64 and float64 field value data types.

### Arguments

- period
- (Optional) hold_period
- (Optional) warmup_type

## DOUBLE_EXPONENTIAL_MOVING_AVERAGE()

The Double Exponential Moving Average (DEMA) attempts to remove the inherent lag
associated with moving averages by placing more weight on recent values.
The name suggests this is achieved by applying a double exponential smoothing which is not the case.
The value of an EMA is doubled.
To keep the value in line with the actual data and to remove the lag, the value “EMA of EMA”
is subtracted from the previously doubled EMA.
^{Source}

Supports `GROUP BY`

clauses that group by tags but not `GROUP BY`

clauses that group by time.
To use `DOUBLE_EXPONENTIAL_MOVING_AVERAGE()`

with a `GROUP BY time()`

clause, see Advanced syntax.

### Basic syntax

```
DOUBLE_EXPONENTIAL_MOVING_AVERAGE([ * | <field_key> | /regular_expression/ ], <period>[, <hold_period)[, <warmup_type]])
```

`DOUBLE_EXPONENTIAL_MOVING_AVERAGE(field_key, 2)`

Returns the field values associated with the field key
processed using the Double Exponential Moving Average algorithm with a 2-value period
and the default hold period and warmup type.

`DOUBLE_EXPONENTIAL_MOVING_AVERAGE(field_key, 10, 9, 'exponential')`

Returns the field values associated with the field key
processed using the Double Exponential Moving Average algorithm with a 10-value period
a 9-value hold period, and the `exponential`

warmup type.

`DOUBLE_EXPONENTIAL_MOVING_AVERAGE(MEAN(<field_key>), 2) ... GROUP BY time(1d)`

Returns the mean of field values associated with the field key
processed using the Double Exponential Moving Average algorithm with a 2-value period
and the default hold period and warmup type.

**Note:** When aggregating data with a `GROUP BY`

clause, you must include an aggregate function in your call to the `DOUBLE_EXPONENTIAL_MOVING_AVERAGE()`

function.

`DOUBLE_EXPONENTIAL_MOVING_AVERAGE(/regular_expression/, 2)`

Returns the field values associated with each field key that matches the regular expression
processed using the Double Exponential Moving Average algorithm with a 2-value period
and the default hold period and warmup type.

`DOUBLE_EXPONENTIAL_MOVING_AVERAGE(*, 2)`

Returns the field values associated with each field key in the measurement
processed using the Double Exponential Moving Average algorithm with a 2-value period
and the default hold period and warmup type.

`DOUBLE_EXPONENTIAL_MOVING_AVERAGE()`

supports int64 and float64 field value data types.

### Arguments

- period
- (Optional) hold_period
- (Optional) warmup_type

## KAUFMANS_EFFICIENCY_RATIO()

Kaufman’s Efficiency Ration, or simply “Efficiency Ratio” (ER), is calculated by dividing the data change over a period by the absolute sum of the data movements that occurred to achieve that change. The resulting ratio ranges between 0 and 1 with higher values representing a more efficient or trending market.

The ER is very similar to the Chande Momentum Oscillator (CMO).
The difference is that the CMO takes market direction into account, but if you take the absolute CMO and divide by 100, you you get the Efficiency Ratio.
^{Source}

Supports `GROUP BY`

clauses that group by tags but not `GROUP BY`

clauses that group by time.
To use `KAUFMANS_EFFICIENCY_RATIO()`

with a `GROUP BY time()`

clause, see Advanced syntax.

### Basic syntax

```
KAUFMANS_EFFICIENCY_RATIO([ * | <field_key> | /regular_expression/ ], <period>[, <hold_period>])
```

`KAUFMANS_EFFICIENCY_RATIO(field_key, 2)`

Returns the field values associated with the field key
processed using the Efficiency Index algorithm with a 2-value period
and the default hold period and warmup type.

`KAUFMANS_EFFICIENCY_RATIO(field_key, 10, 10)`

Returns the field values associated with the field key
processed using the Efficiency Index algorithm with a 10-value period and
a 10-value hold period.

`KAUFMANS_EFFICIENCY_RATIO(MEAN(<field_key>), 2) ... GROUP BY time(1d)`

Returns the mean of field values associated with the field key
processed using the Efficiency Index algorithm with a 2-value period
and the default hold period.

**Note:** When aggregating data with a `GROUP BY`

clause, you must include an aggregate function in your call to the `KAUFMANS_EFFICIENCY_RATIO()`

function.

`KAUFMANS_EFFICIENCY_RATIO(/regular_expression/, 2)`

Returns the field values associated with each field key that matches the regular expression
processed using the Efficiency Index algorithm with a 2-value period
and the default hold period and warmup type.

`KAUFMANS_EFFICIENCY_RATIO(*, 2)`

Returns the field values associated with each field key in the measurement
processed using the Efficiency Index algorithm with a 2-value period
and the default hold period and warmup type.

`KAUFMANS_EFFICIENCY_RATIO()`

supports int64 and float64 field value data types.

**Arguments:**

- period
- (Optional) hold_period

## KAUFMANS_ADAPTIVE_MOVING_AVERAGE()

Kaufman’s Adaptive Moving Average (KAMA) is a moving average designed to
account for sample noise or volatility.
KAMA will closely follow data points when the data swings are relatively small and noise is low.
KAMA will adjust when the data swings widen and follow data from a greater distance.
This trend-following indicator can be used to identify the overall trend,
time turning points and filter data movements.
^{Source}

Supports `GROUP BY`

clauses that group by tags but not `GROUP BY`

clauses that group by time.
To use `KAUFMANS_ADAPTIVE_MOVING_AVERAGE()`

with a `GROUP BY time()`

clause, see Advanced syntax.

### Basic syntax

```
KAUFMANS_ADAPTIVE_MOVING_AVERAGE([ * | <field_key> | /regular_expression/ ], <period>[, <hold_period>])
```

`KAUFMANS_ADAPTIVE_MOVING_AVERAGE(field_key, 2)`

Returns the field values associated with the field key
processed using the Kaufman Adaptive Moving Average algorithm with a 2-value period
and the default hold period and warmup type.

`KAUFMANS_ADAPTIVE_MOVING_AVERAGE(field_key, 10, 10)`

Returns the field values associated with the field key
processed using the Kaufman Adaptive Moving Average algorithm with a 10-value period
and a 10-value hold period.

`KAUFMANS_ADAPTIVE_MOVING_AVERAGE(MEAN(<field_key>), 2) ... GROUP BY time(1d)`

Returns the mean of field values associated with the field key
processed using the Kaufman Adaptive Moving Average algorithm with a 2-value period
and the default hold period.

**Note:** When aggregating data with a `GROUP BY`

clause, you must include an aggregate function in your call to the `KAUFMANS_ADAPTIVE_MOVING_AVERAGE()`

function.

`KAUFMANS_ADAPTIVE_MOVING_AVERAGE(/regular_expression/, 2)`

Returns the field values associated with each field key that matches the regular expression
processed using the Kaufman Adaptive Moving Average algorithm with a 2-value period
and the default hold period and warmup type.

`KAUFMANS_ADAPTIVE_MOVING_AVERAGE(*, 2)`

Returns the field values associated with each field key in the measurement
processed using the Kaufman Adaptive Moving Average algorithm with a 2-value period
and the default hold period and warmup type.

`KAUFMANS_ADAPTIVE_MOVING_AVERAGE()`

supports int64 and float64 field value data types.

**Arguments:**

- period
- (Optional) hold_period

## TRIPLE_EXPONENTIAL_MOVING_AVERAGE()

The triple exponential moving average (TEMA) filters out
volatility from conventional moving averages.
While the name implies that it’s a triple exponential smoothing, it’s actually a
composite of a single exponential moving average,
a double exponential moving average,
and a triple exponential moving average.
^{Source}

Supports `GROUP BY`

clauses that group by tags but not `GROUP BY`

clauses that group by time.
To use `TRIPLE_EXPONENTIAL_MOVING_AVERAGE()`

with a `GROUP BY time()`

clause, see Advanced syntax.

### Basic syntax

```
TRIPLE_EXPONENTIAL_MOVING_AVERAGE([ * | <field_key> | /regular_expression/ ], <period>[, <hold_period)[, <warmup_type]])
```

`TRIPLE_EXPONENTIAL_MOVING_AVERAGE(field_key, 2)`

Returns the field values associated with the field key
processed using the Triple Exponential Moving Average algorithm with a 2-value period
and the default hold period and warmup type.

`TRIPLE_EXPONENTIAL_MOVING_AVERAGE(field_key, 10, 9, 'exponential')`

Returns the field values associated with the field key
processed using the Triple Exponential Moving Average algorithm with a 10-value period
a 9-value hold period, and the `exponential`

warmup type.

`TRIPLE_EXPONENTIAL_MOVING_AVERAGE(MEAN(<field_key>), 2) ... GROUP BY time(1d)`

Returns the mean of field values associated with the field key
processed using the Triple Exponential Moving Average algorithm with a 2-value period
and the default hold period and warmup type.

**Note:** When aggregating data with a `GROUP BY`

clause, you must include an aggregate function in your call to the `TRIPLE_EXPONENTIAL_MOVING_AVERAGE()`

function.

`TRIPLE_EXPONENTIAL_MOVING_AVERAGE(/regular_expression/, 2)`

Returns the field values associated with each field key that matches the regular expression
processed using the Triple Exponential Moving Average algorithm with a 2-value period
and the default hold period and warmup type.

`TRIPLE_EXPONENTIAL_MOVING_AVERAGE(*, 2)`

Returns the field values associated with each field key in the measurement
processed using the Triple Exponential Moving Average algorithm with a 2-value period
and the default hold period and warmup type.

`TRIPLE_EXPONENTIAL_MOVING_AVERAGE()`

supports int64 and float64 field value data types.

**Arguments:**

- period
- (Optional) hold_period
- (Optional) warmup_type

## TRIPLE_EXPONENTIAL_DERIVATIVE()

The triple exponential derivative indicator, commonly referred to as “TRIX,” is an oscillator used to identify oversold and overbought markets, and can also be used as a momentum indicator. TRIX calculates a triple exponential moving average of the log of the data input over the period of time. The previous value is subtracted from the previous value. This prevents cycles that are shorter than the defined period from being considered by the indicator.

Like many oscillators, TRIX oscillates around a zero line. When used as an oscillator,
a positive value indicates an overbought market while a negative value indicates an oversold market.
When used as a momentum indicator, a positive value suggests momentum is increasing
while a negative value suggests momentum is decreasing.
Many analysts believe that when the TRIX crosses above the zero line it gives a
buy signal, and when it closes below the zero line, it gives a sell signal.
^{Source}

Supports `GROUP BY`

clauses that group by tags but not `GROUP BY`

clauses that group by time.
To use `TRIPLE_EXPONENTIAL_DERIVATIVE()`

with a `GROUP BY time()`

clause, see Advanced syntax.

### Basic syntax

```
TRIPLE_EXPONENTIAL_DERIVATIVE([ * | <field_key> | /regular_expression/ ], <period>[, <hold_period)[, <warmup_type]])
```

`TRIPLE_EXPONENTIAL_DERIVATIVE(field_key, 2)`

Returns the field values associated with the field key
processed using the Triple Exponential Derivative algorithm with a 2-value period
and the default hold period and warmup type.

`TRIPLE_EXPONENTIAL_DERIVATIVE(field_key, 10, 10, 'exponential')`

Returns the field values associated with the field key
processed using the Triple Exponential Derivative algorithm with a 10-value period,
a 10-value hold period, and the `exponential`

warmup type.

`TRIPLE_EXPONENTIAL_DERIVATIVE(MEAN(<field_key>), 2) ... GROUP BY time(1d)`

Returns the mean of field values associated with the field key
processed using the Triple Exponential Derivative algorithm with a 2-value period
and the default hold period and warmup type.

**Note:** When aggregating data with a `GROUP BY`

clause, you must include an aggregate function in your call to the `TRIPLE_EXPONENTIAL_DERIVATIVE()`

function.

`TRIPLE_EXPONENTIAL_DERIVATIVE(/regular_expression/, 2)`

Returns the field values associated with each field key that matches the regular expression
processed using the Triple Exponential Derivative algorithm with a 2-value period
and the default hold period and warmup type.

`TRIPLE_EXPONENTIAL_DERIVATIVE(*, 2)`

Returns the field values associated with each field key in the measurement
processed using the Triple Exponential Derivative algorithm with a 2-value period
and the default hold period and warmup type.

`TRIPLE_EXPONENTIAL_DERIVATIVE()`

supports int64 and float64 field value data types.

## RELATIVE_STRENGTH_INDEX()

The relative strength index (RSI) is a momentum indicator that compares the magnitude of recent increases and decreases over a specified time period to measure speed and change of data movements.
^{Source}

Supports `GROUP BY`

clauses that group by tags but not `GROUP BY`

clauses that group by time.

To use `RELATIVE_STRENGTH_INDEX()`

with a `GROUP BY time()`

clause, see Advanced syntax.

### Basic syntax

```
RELATIVE_STRENGTH_INDEX([ * | <field_key> | /regular_expression/ ], <period>[, <hold_period)[, <warmup_type]])
```

`RELATIVE_STRENGTH_INDEX(field_key, 2)`

Returns the field values associated with the field key
processed using the Relative Strength Index algorithm with a 2-value period
and the default hold period and warmup type.

`RELATIVE_STRENGTH_INDEX(field_key, 10, 10, 'exponential')`

Returns the field values associated with the field key
processed using the Relative Strength Index algorithm with a 10-value period,
a 10-value hold period, and the `exponential`

warmup type.

`RELATIVE_STRENGTH_INDEX(MEAN(<field_key>), 2) ... GROUP BY time(1d)`

Returns the mean of field values associated with the field key
processed using the Relative Strength Index algorithm with a 2-value period
and the default hold period and warmup type.

**Note:** When aggregating data with a `GROUP BY`

clause, you must include an aggregate function in your call to the `RELATIVE_STRENGTH_INDEX()`

function.

`RELATIVE_STRENGTH_INDEX(/regular_expression/, 2)`

Returns the field values associated with each field key that matches the regular expression
processed using the Relative Strength Index algorithm with a 2-value period
and the default hold period and warmup type.

`RELATIVE_STRENGTH_INDEX(*, 2)`

Returns the field values associated with each field key in the measurement
processed using the Relative Strength Index algorithm with a 2-value period
and the default hold period and warmup type.

`RELATIVE_STRENGTH_INDEX()`

supports int64 and float64 field value data types.

**Arguments:**

- period
- (Optional) hold_period
- (Optional) warmup_type

Was this page helpful?

Thank you for your feedback!

#### Support and feedback

Thank you for being part of our community! We welcome and encourage your feedback and bug reports for InfluxDB and this documentation. To find support, use the following resources:

**InfluxDB Cloud and InfluxDB Enterprise customers** can contact InfluxData Support.