Volatility Cone
Retrieves the Volatility Cone for the specified period and assets.
The Volatility Cone summarizes the distribution of historical annualized realized volatility over a range of rolling windows, showing how the current realized volatility for each window compares to its own historical range. It is commonly used to judge whether current (or implied) volatility is cheap or expensive relative to history.
Realized volatility is the standard deviation of the log returns over each rolling window, annualized with the square root of the observations per year of the period (252 for daily, 52 for weekly and 12 for monthly data). For each window, the cone reports the minimum, the 10th, 25th, 50th, 75th and 90th percentiles, the maximum and the most recent value of that realized volatility series.
The formula is as follows:
\[\text{Log Return} (t) = \ln(\text{Close} (t) / \text{Close} (t-1))\] \[\text{Realized Volatility} (t,\; \text{Window}) = \text{Sample Standard Deviation} (\text{ddof} = 1) \text{of the Log Returns over the last Window periods} \cdot \sqrt{\text{Periods per Year}}\] \[\text{Cone} (\text{Window}) = \text{Min},\;\; \text{10th},\;\; \text{25th},\;\; \text{50th (Median)},\;\; \text{75th and 90th Percentile},\;\; \text{Max and Current (latest) value of Realized Volatility (t, Window) over the full history},\;\; \text{for each window (10, 20, 30, 60, 90 and 120 by default)}\]Where Close is the close_column, the Adj Close by default (the Close for intraday data).
Options traders compare implied volatility with the cone at the matching horizon: implied volatility near the top of the historical range for that window suggests options are expensive relative to history, near the bottom cheap. The percentiles depend on the sample, so a period that includes a crash widens the cone for as long as it stays in the data; five years of daily data or more gives a more stable picture than one.
Also known as: volatility cone, realized volatility term structure.
Volatility Cone in Python or via the MCP
Install the Finance Toolkit with:
pip install financetoolkit -U
Then call get_volatility_cone as shown below.
from financetoolkit import Toolkit
toolkit = Toolkit(
tickers=["BTCUSD"],
api_key="FINANCIAL_MODELING_PREP_KEY",
start_date="2021-01-01",
end_date="2025-12-31",
)
volatility_cone = toolkit.technicals.get_volatility_cone().xs("BTCUSD", level=1, axis="columns")
volatility_cone.loc[:, ["Min", "10th Percentile", "Median", "90th Percentile", "Max", "Current"]]
Or, after setting up the Finance Toolkit MCP, ask:
How did Bitcoin's realized volatility at the end of 2025 compare with its minimum, 10th percentile, median, 90th percentile and maximum from 2021 to 2025, across windows of 10 to 120 days?
Which returns:
| Window | Min | 10th Percentile | Median | 90th Percentile | Max | Current |
|---|---|---|---|---|---|---|
| 10 | 0.0727 | 0.2073 | 0.3975 | 0.7323 | 1.3284 | 0.1308 |
| 20 | 0.0952 | 0.2474 | 0.4151 | 0.713 | 1.0995 | 0.2209 |
| 30 | 0.1416 | 0.2634 | 0.4278 | 0.6834 | 1.0096 | 0.2865 |
| 60 | 0.2175 | 0.2859 | 0.4537 | 0.6445 | 0.903 | 0.3453 |
| 90 | 0.2306 | 0.2962 | 0.445 | 0.6358 | 0.8003 | 0.3433 |
| 120 | 0.2412 | 0.3038 | 0.4334 | 0.6228 | 0.7615 | 0.3208 |
Parameters
get_volatility_cone accepts the following parameters.
| Parameter | Type | Description | Example |
|---|---|---|---|
windows | list[int] | None | The rolling windows (in periods) to calculate realized volatility for. Defaults to [10, 20, 30, 60, 90, 120]. | [21, 63, 126, 252] |
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" |
rounding | int | None | The number of decimals to round the results to. If None, the rounding value specified during the initialization of the Toolkit instance will be used. Defaults to None. | 2 |