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.

Ease of Movement (EMV) in Python or via the MCP

Install the Finance Toolkit with:

pip install financetoolkit -U

Then call get_ease_of_movement as shown below.

from financetoolkit import Toolkit

toolkit = Toolkit(
    tickers=["^GSPC"],
    api_key="FINANCIAL_MODELING_PREP_KEY",
    start_date="2021-01-01",
    end_date="2025-12-31",
)

toolkit.technicals.get_ease_of_movement().tail(5)

Or, after setting up the Finance Toolkit MCP, ask:

How easily did the S&P 500 move relative to its volume from 24 to 31 December 2025, measured by the Ease of Movement?

Which returns:

Date ^GSPC Benchmark
2025-12-24 1.404 2.8161
2025-12-26 0.6053 2.227
2025-12-29 0.6173 2.7602
2025-12-30 0.6371 2.7794
2025-12-31 -4.2755 0.4354

Parameters

get_ease_of_movement accepts the following parameters.

ParameterTypeDescriptionExample
periodstrThe time period to consider for historical data. Can be “intraday”, “daily”, “weekly”, “monthly”, “quarterly” or “yearly”. Defaults to “daily”."weekly"
close_columnstrThe column name for closing prices in the historical data. Defaults to “Adj Close”."Close"
windowintNumber of periods used to smooth the raw Ease of Movement values with a Simple Moving Average. Defaults to 14.20
volume_divisorfloatScaling 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.1000000.0
roundingint | NoneThe number of decimals to round the results to. Defaults to None, which uses the rounding of the Toolkit (4 unless set otherwise).2
growthboolWhether to calculate the growth of the Ease of Movement. Defaults to False.True
lagint | list[int]The lag to use for the growth calculation. Defaults to 1.4
standardizeboolWhether to standardize (Z-Score) the result. When combined with growth=True, standardizes the growth values instead of the raw values. Defaults to False.True
Share