Ease of Movement (EMV)
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.
| Parameter | Type | Description | Example |
|---|---|---|---|
period | str | The time period to consider for historical data. Can be “intraday”, “daily”, “weekly”, “monthly”, “quarterly” or “yearly”. Defaults to “daily”. | "weekly" |
close_column | str | The column name for closing prices in the historical data. Defaults to “Adj Close”. | "Close" |
window | int | Number of periods used to smooth the raw Ease of Movement values with a Simple Moving Average. Defaults to 14. | 20 |
volume_divisor | float | 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. | 1000000.0 |
rounding | int | None | The number of decimals to round the results to. Defaults to None, which uses the rounding of the Toolkit (4 unless set otherwise). | 2 |
growth | bool | Whether to calculate the growth of the Ease of Movement. Defaults to False. | True |
lag | int | list[int] | The lag to use for the growth calculation. Defaults to 1. | 4 |
standardize | bool | Whether to standardize (Z-Score) the result. When combined with growth=True, standardizes the growth values instead of the raw values. Defaults to False. | True |