Calculate the Ease of Movement (EMV) for a given price series.

The Ease of Movement indicator relates how far price moved (the change in the midpoint of the high-low range from one period to the next) to the volume required to move it (via the “Box Ratio”, volume scaled down and divided by the period’s high-low range). High positive readings mean price is moving up easily on relatively little volume; high negative readings mean price is moving down easily on relatively little volume. The raw daily reading is smoothed with a Simple Moving Average to reduce noise.

The formula is as follows:

\[\text{Distance Moved} = (\operatorname{High}(t) + \operatorname{Low}(t)) / 2 - (\operatorname{High}(t-1) + \operatorname{Low}(t-1)) / 2\] \[\text{Box Ratio} = (\text{Volume} / \text{volume\_divisor}) / (\text{High} - \text{Low})\] \[\text{Raw EMV} = \text{Distance Moved} / \text{Box Ratio}\] \[\text{EMV} = \operatorname{SMA}(\text{Raw EMV},\; \text{window})\]

Also known as: EMV, Ease of Movement.

No programming experience? With the Finance Toolkit MCP server, AI assistants such as Claude and ChatGPT can calculate the Ease of Movement (EMV) for you. Just ask in plain English.

Calculate the Ease of Movement (EMV) in Python

The Ease of Movement (EMV) is available in the Technicals module of the open-source Finance Toolkit. Install it with:

pip install financetoolkit -U

Then call get_ease_of_movement as shown below.

from financetoolkit import Toolkit

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

toolkit.technicals.get_ease_of_movement()

Parameters

get_ease_of_movement 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 used to smooth the raw Ease of Movement values with a Simple Moving Average. Defaults to 14.
  • volume_divisor (float, optional): Scaling constant applied to volume so that the Box Ratio (and therefore EMV) stays in a readable range regardless of an asset’s typical share volume. Defaults to 100,000,000.
  • 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 Ease of Movement. 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