Calculate the Keltner Channels for a given price series.

The Keltner Channels consist of three lines: - Upper Channel Line = Exponential Moving Average (EMA) of High Prices + ATR * ATR Multiplier - Middle Channel Line = Exponential Moving Average (EMA) of Closing Prices - Lower Channel Line = Exponential Moving Average (EMA) of Low Prices - ATR * ATR Multiplier

The formula is as follows:

\[\text{EMA} = (\text{Close} - \text{Previous EMA}) \cdot (2 / (1 + \text{Window})) + \text{Previous EMA}\] \[\text{ATR} = \operatorname{EMA}(\text{TR},\; \text{ATR Window})\] \[\text{Upper Channel Line} = \operatorname{EMA}(\text{High},\; \text{Window}) + \text{ATR} \cdot \text{ATR Multiplier}\] \[\text{Middle Channel Line} = \operatorname{EMA}(\text{Close},\; \text{Window})\] \[\text{Lower Channel Line} = \operatorname{EMA}(\text{Low},\; \text{Window}) - \text{ATR} \cdot \text{ATR Multiplier}\]

Also known as: ATR-based bands, volatility channels.

No programming experience? With the Finance Toolkit MCP server, AI assistants such as Claude and ChatGPT can calculate the Keltners Channels for you. Just ask in plain English.

Calculate the Keltners Channels in Python

The Keltners Channels is available in the Technicals module of the open-source Finance Toolkit. Install it with:

pip install financetoolkit -U

Then call get_keltner_channels as shown below.

from financetoolkit import Toolkit

toolkit = Toolkit(tickers=["AAPL", "MSFT"])

toolkit.technicals.get_keltner_channels().xs("AAPL", level=1, axis="columns")

Which returns:

Date Lower Line Middle Line Upper Line
2026-06-18 282.479 298.807 315.134
2026-06-22 282.437 298.567 314.697
2026-06-23 282.108 297.998 313.888
2026-06-24 281.642 297.342 313.042
2026-06-25 276.478 294.383 312.289
2026-06-26 274.532 292.969 311.407
2026-06-29 274.137 291.472 308.808
2026-06-30 274.501 291.191 307.881
2026-07-01 274.923 291.616 308.309
2026-07-02 276.002 293.884 311.767

Parameters

get_keltner_channels accepts the following parameters:

  • period (str, optional): The time period to consider for historical data. Can be “daily”, “weekly”, “quarterly”, or “yearly”. Defaults to “daily”.
  • close_column (str, optional): The column name for closing prices in the historical data. Defaults to “Adj Close”.
  • window (int, optional): Number of periods for the moving average. Defaults to 14.
  • atr_window (int, optional): Number of periods for ATR calculation. Defaults to 14.
  • atr_multiplier (int, optional): Multiplier for ATR to determine channel width. Defaults to 2.
  • rounding (int | None, optional): The number of decimals to round the results to. Defaults to 4.
  • growth (bool, optional): Whether to calculate the growth of the channels. Defaults to False.
  • lag (int | list[int], optional): The lag to use for the growth calculation.
  • standardize (bool, optional): Whether to standardize (Z-Score) the result. When combined with growth=True, standardizes the growth values instead of the raw values. Defaults to False. Defaults to 1.

The Technicals module page introduces the module, and the sidebar lists all of its functions.

Share