diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index f01c6219..3750dec3 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -30,8 +30,14 @@ applyTo: '/**' * Do not use em dashes (—) in documentation files or docstrings. Use colons, parentheses, or restructure the sentence instead. * Math in documentation and docstrings: always use `\begin{equation}...\end{equation}` for any formula or equation. Use `$...$` only for brief inline references to variables (e.g. $F$, $K$). Do not use `$$...$$`, `` `...` ``, or RST syntax (`.. math::`, `:math:`). * Glossary entries in `docs/glossary.md` must be kept in alphabetical order. +* Do not repeat concept definitions inline in tutorials or docstrings — link to the glossary instead using a relative markdown link (e.g. `[moneyness](../glossary.md#moneyness)`). * To rebuild doc examples run `uv run ./dev/build-examples` — runs all scripts in `docs/examples/` and writes their output to `docs/examples_output/` +## Pydantic models + +* Always document Pydantic fields with `Field(description=...)` — never use a docstring below a field assignment +* Split long description strings across lines using implicit string concatenation rather than shortening the text + ## Package structure * Strategy runtime markdown descriptions (read by `load_description()` at runtime) live inside the package at `quantflow/options/strategies/docs/` — they must be inside the package to be accessible when the library is installed diff --git a/.github/instructions/makefile.instructions.md b/.github/instructions/makefile.instructions.md new file mode 100644 index 00000000..002d45a2 --- /dev/null +++ b/.github/instructions/makefile.instructions.md @@ -0,0 +1,5 @@ +# Makefile Conventions + +- Keep all targets sorted alphabetically. +- targets should be separated by a one blank line only. +- Each target should have a one-line description, starting with `##`, that describes what the target does. This description is used by the `help` target to generate documentation for all targets. diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1d642dbf..2da905fd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,6 +23,8 @@ jobs: - uses: actions/checkout@v4 - name: install rops uses: quantmind/rops/.github/actions/setup-rops@main + env: + GITHUB_TOKEN: ${{ secrets.TOKEN_DEPLOYMENT }} - name: install taplo run: rops tools update taplo - name: Set up Python ${{ matrix.python-version }} diff --git a/.github/workflows/docker-multiarch.yml b/.github/workflows/docker-multiarch.yml index 2d121681..756d40c7 100644 --- a/.github/workflows/docker-multiarch.yml +++ b/.github/workflows/docker-multiarch.yml @@ -23,6 +23,8 @@ jobs: password: ${{ github.token }} - name: install rops uses: quantmind/rops/.github/actions/setup-rops@main + env: + GITHUB_TOKEN: ${{ secrets.TOKEN_DEPLOYMENT }} - name: build amd64 run: rops docker build ${{ inputs.image-name }} - name: push amd64 @@ -44,6 +46,8 @@ jobs: password: ${{ github.token }} - name: install rops uses: quantmind/rops/.github/actions/setup-rops@main + env: + GITHUB_TOKEN: ${{ secrets.TOKEN_DEPLOYMENT }} - name: build arm64 run: rops docker build ${{ inputs.image-name }} - name: push arm64 @@ -64,5 +68,7 @@ jobs: password: ${{ github.token }} - name: install rops uses: quantmind/rops/.github/actions/setup-rops@main + env: + GITHUB_TOKEN: ${{ secrets.TOKEN_DEPLOYMENT }} - name: create manifest run: rops docker manifest ${{ inputs.image-name }} diff --git a/CLAUDE.md b/CLAUDE.md index 874699b3..8086e58b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,2 +1,3 @@ @readme.md @.github/copilot-instructions.md +@.github/instructions/makefile.instructions.md diff --git a/Makefile b/Makefile index d0846b78..d3a7e66c 100644 --- a/Makefile +++ b/Makefile @@ -5,38 +5,39 @@ help: @fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/##//' @echo ================================================================================ +.PHONY: docs +docs: ## build documentation + @cp docs/index.md readme.md + @uv run ./dev/build-examples + @uv run mkdocs build + +.PHONY: docs-examples +docs-examples: ## Regenerate docs examples + @uv run ./dev/build-examples + +.PHONY: docs-serve +docs-serve: ## serve documentation + @uv run mkdocs serve --livereload --watch quantflow --watch docs + +.PHONY: install-dev +install-dev: ## Install development dependencies + @./dev/install .PHONY: lint lint: ## Lint and fix @uv run ./dev/lint fix - .PHONY: lint-check lint-check: ## Lint check only @uv run ./dev/lint - -.PHONY: install-dev -install-dev: ## Install development dependencies - @./dev/install - .PHONY: marimo marimo: ## Run marimo for editing notebooks @./dev/marimo edit -.PHONY: docs-png -docs-png: ## Regenerate PNG assets in docs/assets/ (requires Chrome via kaleido) - @for f in docs/examples_png/*.py; do uv run python $$f; done - -.PHONY: docs -docs: ## build documentation - @cp docs/index.md readme.md - @uv run ./dev/build-examples - @uv run mkdocs build - -.PHONY: docs-serve -docs-serve: ## serve documentation - @uv run mkdocs serve --livereload --watch quantflow --watch docs +.PHONY: outdated +outdated: ## Show outdated packages + uv tree --outdated .PHONY: publish publish: ## Release to pypi @@ -47,11 +48,6 @@ publish: ## Release to pypi tests: ## Unit tests @./dev/test - -.PHONY: outdated -outdated: ## Show outdated packages - uv tree --outdated - .PHONY: upgrade upgrade: ## Upgrade dependencies uv lock --upgrade diff --git a/dev/build-examples b/dev/build-examples index 8ef726a3..50142d27 100755 --- a/dev/build-examples +++ b/dev/build-examples @@ -1,28 +1,10 @@ #!/usr/bin/env python """Run all example scripts in docs/examples/ and capture their stdout to .out files.""" -import subprocess import sys -from pathlib import Path -out_dir = Path("docs/examples_output") -out_dir.mkdir(exist_ok=True) +from docs.examples._utils import build_examples -examples = sorted(Path("docs/examples").glob("*.py")) -failed = [] - -for script in examples: - out_file = out_dir / script.with_suffix(".out").name - print(f"running {script} -> {out_file}") - result = subprocess.run( - [sys.executable, str(script)], - capture_output=True, - text=True, - ) - if result.returncode != 0: - print(f"FAILED: {script}\n{result.stderr}", file=sys.stderr) - failed.append(script) - else: - out_file.write_text(result.stdout) +failed = build_examples() if failed: sys.exit(1) diff --git a/dev/lint b/dev/lint index a3ba9103..adfca376 100755 --- a/dev/lint +++ b/dev/lint @@ -5,6 +5,7 @@ ISORT_ARGS="-c" BLACK_ARG="--check" RUFF_ARG="" TAPLO_ARG="format --check" +PACKAGES="quantflow quantflow_tests docs/examples" if [ "$1" = "fix" ] ; then ISORT_ARGS="" @@ -15,12 +16,10 @@ fi taplo ${TAPLO_ARG} echo isort -uv run isort quantflow quantflow_tests ${ISORT_ARGS} +uv run isort ${PACKAGES} ${ISORT_ARGS} echo black -uv run black quantflow quantflow_tests ${BLACK_ARG} +uv run black ${PACKAGES} ${BLACK_ARG} echo ruff -uv run ruff check quantflow quantflow_tests ${RUFF_ARG} +uv run ruff check ${PACKAGES} ${RUFF_ARG} echo mypy -uv run mypy quantflow -echo mypy tests -uv run mypy quantflow_tests --explicit-package-bases +uv run mypy ${PACKAGES} diff --git a/docs/__init__.py b/docs/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/docs/api/options/calibration.md b/docs/api/options/calibration.md index 01bddf3c..49fb5865 100644 --- a/docs/api/options/calibration.md +++ b/docs/api/options/calibration.md @@ -1,5 +1,9 @@ # Vol Model Calibration +::: quantflow.options.calibration.OptionEntry + ::: quantflow.options.calibration.VolModelCalibration -::: quantflow.options.calibration.HestonCalibration +::: quantflow.options.heston_calibration.HestonCalibration + +::: quantflow.options.heston_calibration.HestonJCalibration diff --git a/docs/assets/heston_calibrated_smile.png b/docs/assets/heston_calibrated_smile.png index d7b31059..c1d3b995 100644 Binary files a/docs/assets/heston_calibrated_smile.png and b/docs/assets/heston_calibrated_smile.png differ diff --git a/docs/assets/hestonj_calibrated_smile.png b/docs/assets/hestonj_calibrated_smile.png index 6d875033..a3d3e492 100644 Binary files a/docs/assets/hestonj_calibrated_smile.png and b/docs/assets/hestonj_calibrated_smile.png differ diff --git a/docs/examples/__init__.py b/docs/examples/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/docs/examples/_utils.py b/docs/examples/_utils.py new file mode 100644 index 00000000..9ebc4570 --- /dev/null +++ b/docs/examples/_utils.py @@ -0,0 +1,36 @@ +import subprocess +import sys +from pathlib import Path + +from pydantic import BaseModel + +EXAMPLE_DIR = Path(__file__).parent +OUT_DIR = EXAMPLE_DIR.parent / "examples_output" + + +def print_model(model: BaseModel) -> None: + """Helper function to print a Pydantic model as pretty JSON""" + text = model.model_dump_json(indent=2) + text_data = ["", "```json", text, "```"] + print("\n".join(text_data)) + + +def build_examples() -> list[Path]: + failed = [] + OUT_DIR.mkdir(exist_ok=True) + for script in sorted(EXAMPLE_DIR.glob("*.py")): + if script.stem.startswith("_"): + continue + out_file = OUT_DIR / script.with_suffix(".out").name + print(f"running {script} -> {out_file}") + result = subprocess.run( + [sys.executable, str(script)], + capture_output=True, + text=True, + ) + if result.returncode != 0: + print(f"FAILED: {script}\n{result.stderr}", file=sys.stderr) + failed.append(script) + else: + out_file.write_text(result.stdout) + return failed diff --git a/docs/examples/vol_surface_heston_calibration.py b/docs/examples/vol_surface_heston_calibration.py index 7fe11f1b..9c08608a 100644 --- a/docs/examples/vol_surface_heston_calibration.py +++ b/docs/examples/vol_surface_heston_calibration.py @@ -1,13 +1,15 @@ import json +from pathlib import Path -from quantflow.options.calibration import HestonCalibration +from docs.examples._utils import print_model +from quantflow.options.heston_calibration import HestonCalibration from quantflow.options.pricer import OptionPricer -from quantflow.options.surface import VolSurface, VolSurfaceInputs, surface_from_inputs +from quantflow.options.surface import VolSurfaceInputs, surface_from_inputs from quantflow.sp.heston import Heston # Load a saved volatility surface snapshot and build the surface with open("docs/examples/volsurface.json") as fp: - surface: VolSurface = surface_from_inputs(VolSurfaceInputs(**json.load(fp))) + surface = surface_from_inputs(VolSurfaceInputs(**json.load(fp))) surface.bs() surface.disable_outliers() @@ -15,19 +17,19 @@ # Create a Heston pricer with initial parameters pricer = OptionPricer(model=Heston.create(vol=0.5, kappa=1, sigma=0.8, rho=0)) -# Set up the calibration, dropping the first (very short) maturity and high-vol wings -calibration = HestonCalibration( +# Set up the calibration, dropping the first (very short) maturity +calibration: HestonCalibration[Heston] = HestonCalibration( pricer=pricer, - vol_surface=surface.trim(len(surface.maturities) - 1), - moneyness_weight=1.0, -).remove_implied_above(quantile=0.95) + vol_surface=surface, +) result = calibration.fit() print(result.message) -params = calibration.get_params() -model = calibration.model -print(f"vol: {model.variance_process.rate**0.5:.4f}") -print(f"theta: {model.variance_process.theta**0.5:.4f}") -print(f"kappa: {model.variance_process.kappa:.4f}") -print(f"sigma: {model.variance_process.sigma:.4f}") -print(f"rho: {model.rho:.4f}") +print_model(calibration.model) + +# Plot the calibrated smile for all maturities and save as PNG +fig = calibration.plot_maturities(max_moneyness_ttm=1.5, support=101) +fig.update_layout(title="Heston Calibrated Smiles") + +out_path = Path("docs/assets/heston_calibrated_smile.png") +fig.write_image(str(out_path), width=1200) diff --git a/docs/examples/vol_surface_hestonj_calibration.py b/docs/examples/vol_surface_hestonj_calibration.py index 7893cb1a..1fc3f73d 100644 --- a/docs/examples/vol_surface_hestonj_calibration.py +++ b/docs/examples/vol_surface_hestonj_calibration.py @@ -1,6 +1,8 @@ import json +from pathlib import Path -from quantflow.options.calibration import HestonJCalibration +from docs.examples._utils import print_model +from quantflow.options.heston_calibration import HestonJCalibration from quantflow.options.pricer import OptionPricer from quantflow.options.surface import VolSurface, VolSurfaceInputs, surface_from_inputs from quantflow.sp.heston import HestonJ @@ -26,21 +28,20 @@ ) ) -# Set up the calibration, dropping the first (very short) maturity and high-vol wings -calibration = HestonJCalibration( +# Set up the calibration, dropping the first (very short) maturity +calibration: HestonJCalibration[DoubleExponential] = HestonJCalibration( pricer=pricer, - vol_surface=surface.trim(len(surface.maturities) - 1), - moneyness_weight=1.0, -).remove_implied_above(quantile=0.95) + vol_surface=surface, + moneyness_weight=0.5, +) result = calibration.fit() print(result.message) -model = calibration.model -print(f"vol: {model.variance_process.rate**0.5:.4f}") -print(f"theta: {model.variance_process.theta**0.5:.4f}") -print(f"kappa: {model.variance_process.kappa:.4f}") -print(f"sigma: {model.variance_process.sigma:.4f}") -print(f"rho: {model.rho:.4f}") -print(f"jump intensity: {model.jumps.intensity:.4f}") -print(f"jump variance: {model.jumps.jumps.variance():.6f}") -print(f"jump asymmetry: {model.jumps.jumps.asymmetry():.4f}") +print_model(calibration.model) + +# Plot the calibrated smile for all maturities and save as PNG +fig = calibration.plot_maturities(max_moneyness_ttm=1.5, support=101) +fig.update_layout(title="HestonJ Calibrated Smiles") + +out_path = Path("docs/assets/hestonj_calibrated_smile.png") +fig.write_image(str(out_path), width=1200) diff --git a/docs/examples/vol_surface_inputs.py b/docs/examples/vol_surface_inputs.py index 200cc716..7cc82635 100644 --- a/docs/examples/vol_surface_inputs.py +++ b/docs/examples/vol_surface_inputs.py @@ -21,4 +21,8 @@ inputs = surface.inputs(converged=True) option_inputs = [i for i in inputs.inputs if isinstance(i, OptionInput)] df = pd.DataFrame([i.model_dump() for i in option_inputs]) -print(df[["maturity", "strike", "option_type", "bid", "ask", "iv_bid", "iv_ask"]].head(10).to_string(index=False)) +print( + df[["maturity", "strike", "option_type", "bid", "ask", "iv_bid", "iv_ask"]] + .head(10) + .to_string(index=False) +) diff --git a/docs/examples/volsurface.json b/docs/examples/volsurface.json index 1e23240d..35d4d689 100644 --- a/docs/examples/volsurface.json +++ b/docs/examples/volsurface.json @@ -1,4359 +1,5348 @@ { - "asset": "eth", - "ref_date": "2026-01-31T12:25:19.499850Z", + "asset": "BTC", + "ref_date": "2026-04-27T08:54:57.694519Z", "inputs": [ { - "bid": "2635.25", - "ask": "2635.30", - "open_interest": "397478495", - "volume": "233177071.0", + "bid": "77775.5", + "ask": "77776", + "open_interest": "987675860", + "volume": "434177180", "security_type": "spot" }, { - "bid": "2637.00", - "ask": "2637.75", - "open_interest": "8615529", - "volume": "7197233.0", - "maturity": "2026-02-06T08:00:00Z", + "bid": "77688.0", + "ask": "77847.5", + "open_interest": "0", + "volume": "0", + "maturity": "2026-04-28T08:00:00Z", "security_type": "forward" }, { - "bid": "0.0970", - "ask": "0.1000", - "open_interest": "65.0", - "volume": "17808.85", - "strike": "2400.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0080", - "ask": "0.0085", - "open_interest": "8334.0", - "volume": "39295.43", - "strike": "2400.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0001", + "ask": "0.0002", + "open_interest": "112.9", + "volume": "1727.33", + "strike": "73000", + "maturity": "2026-04-28T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5375622", + "iv_ask": "0.5919214", + "inverse": true }, { - "bid": "0.0100", - "ask": "0.0110", - "open_interest": "790.0", - "volume": "20308.16", - "strike": "2450.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0004", + "ask": "0.0006", + "open_interest": "250.8", + "volume": "1424.59", + "strike": "75000", + "maturity": "2026-04-28T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4188391", + "iv_ask": "0.4554825", + "inverse": true }, { - "bid": "0.0135", - "ask": "0.0145", - "open_interest": "336.0", - "volume": "12741.23", - "strike": "2500.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0006", + "ask": "0.0008", + "open_interest": "49.3", + "volume": "3460.73", + "strike": "75500", + "maturity": "2026-04-28T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3889021", + "iv_ask": "0.4165291", + "inverse": true }, { - "bid": "0.0500", - "ask": "0.0535", - "open_interest": "1.0", - "volume": "172.2", - "strike": "2550.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.001", + "ask": "0.0012", + "open_interest": "100.2", + "volume": "8113.88", + "strike": "76000", + "maturity": "2026-04-28T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.3668268", + "iv_ask": "0.3868547", + "inverse": true }, { - "bid": "0.0180", - "ask": "0.0190", - "open_interest": "993.0", - "volume": "142363.24", - "strike": "2550.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0016", + "ask": "0.0019", + "open_interest": "66.7", + "volume": "8226.51", + "strike": "76500", + "maturity": "2026-04-28T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3392663", + "iv_ask": "0.3616924", + "inverse": true }, { - "bid": "0.0385", - "ask": "0.0395", - "open_interest": "72.0", - "volume": "5403.44", - "strike": "2600.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0028", + "ask": "0.0032", + "open_interest": "98.1", + "volume": "26045.32", + "strike": "77000", + "maturity": "2026-04-28T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.3235727", + "iv_ask": "0.3467574", + "inverse": true }, { - "bid": "0.0240", - "ask": "0.0255", - "open_interest": "5175.0", - "volume": "97966.61", - "strike": "2600.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0048", + "ask": "0.0055", + "open_interest": "63.7", + "volume": "24109.03", + "strike": "77500", + "maturity": "2026-04-28T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3117853", + "iv_ask": "0.3467488", + "inverse": true }, { - "bid": "0.0275", - "ask": "0.0290", - "open_interest": "237.0", - "volume": "23482.45", - "strike": "2650.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.005", + "ask": "0.0055", + "open_interest": "45.5", + "volume": "20438.49", + "strike": "78000", + "maturity": "2026-04-28T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3111888", + "iv_ask": "0.3359649", + "inverse": true }, { - "bid": "0.0325", - "ask": "0.0335", - "open_interest": "788.0", - "volume": "61913.3", - "strike": "2650.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0032", + "ask": "0.0035", + "open_interest": "38.8", + "volume": "16645.2", + "strike": "78500", + "maturity": "2026-04-28T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.335916", + "iv_ask": "0.3526992", + "inverse": true }, { - "bid": "0.0195", - "ask": "0.0200", - "open_interest": "511.0", - "volume": "33138.18", - "strike": "2700.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0017", + "ask": "0.0021", + "open_interest": "70.5", + "volume": "12791.91", + "strike": "79000", + "maturity": "2026-04-28T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3353014", + "iv_ask": "0.3637628", + "inverse": true }, { - "bid": "0.0415", - "ask": "0.0450", - "open_interest": "6388.0", - "volume": "57465.12", - "strike": "2700.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.001", + "ask": "0.0012", + "open_interest": "33.7", + "volume": "9985.45", + "strike": "79500", + "maturity": "2026-04-28T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.353494", + "iv_ask": "0.3729134", + "inverse": true }, { - "bid": "0.0130", - "ask": "0.0140", - "open_interest": "776.0", - "volume": "32574.29", - "strike": "2750.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0005", + "ask": "0.0007", + "open_interest": "304.8", + "volume": "11838.5", + "strike": "80000", + "maturity": "2026-04-28T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3582481", + "iv_ask": "0.3870258", + "inverse": true }, { - "bid": "0.0540", - "ask": "0.0575", - "open_interest": "2691.0", - "volume": "93993.49", - "strike": "2750.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0003", + "ask": "0.0004", + "open_interest": "78", + "volume": "8399.42", + "strike": "80500", + "maturity": "2026-04-28T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3787766", + "iv_ask": "0.4001093", + "inverse": true }, { - "bid": "0.0085", - "ask": "0.0095", - "open_interest": "2046.0", - "volume": "39680.28", - "strike": "2800.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0002", + "ask": "0.0003", + "open_interest": "67.7", + "volume": "2909.5", + "strike": "81000", + "maturity": "2026-04-28T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4046507", + "iv_ask": "0.4333609", + "inverse": true }, { - "bid": "0.0680", - "ask": "0.0715", - "open_interest": "4290.0", - "volume": "26795.96", - "strike": "2800.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0001", + "ask": "0.0002", + "open_interest": "101.3", + "volume": "2441.79", + "strike": "82000", + "maturity": "2026-04-28T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4573552", + "iv_ask": "0.5047645", + "inverse": true + }, + { + "bid": "77700.0", + "ask": "77815.0", + "open_interest": "0", + "volume": "0", + "maturity": "2026-04-29T08:00:00Z", + "security_type": "forward" }, { - "bid": "0.0055", - "ask": "0.0060", - "open_interest": "1699.0", - "volume": "6380.46", - "strike": "2850.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0001", + "ask": "0.0003", + "open_interest": "78.1", + "volume": "949.38", + "strike": "70000", + "maturity": "2026-04-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5886027", + "iv_ask": "0.6803194", + "inverse": true }, { - "bid": "0.0830", - "ask": "0.0890", - "open_interest": "2040.0", - "volume": "58465.05", - "strike": "2850.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0002", + "ask": "0.0004", + "open_interest": "8.8", + "volume": "187.38", + "strike": "71000", + "maturity": "2026-04-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5664797", + "iv_ask": "0.6280995", + "inverse": true }, { - "bid": "0.0035", - "ask": "0.0040", - "open_interest": "1675.0", - "volume": "4139.29", - "strike": "2900.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0002", + "ask": "0.0005", + "open_interest": "3.6", + "volume": "60.16", + "strike": "72000", + "maturity": "2026-04-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4902668", + "iv_ask": "0.5665876", + "inverse": true }, { - "bid": "0.1000", - "ask": "0.1060", - "open_interest": "3555.0", - "volume": "7128.68", - "strike": "2900.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0004", + "ask": "0.0007", + "open_interest": "46", + "volume": "1682.65", + "strike": "73000", + "maturity": "2026-04-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4623826", + "iv_ask": "0.5127515", + "inverse": true }, { - "bid": "0.0028", - "ask": "0.0033", - "open_interest": "1218.0", - "volume": "9791.21", - "strike": "2925.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0007", + "ask": "0.001", + "open_interest": "32.2", + "volume": "1348.04", + "strike": "74000", + "maturity": "2026-04-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4220138", + "iv_ask": "0.4563569", + "inverse": true }, { - "bid": "0.1090", - "ask": "0.1145", - "open_interest": "1317.0", - "volume": "9570.87", - "strike": "2925.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.001", + "ask": "0.0012", + "open_interest": "20.1", + "volume": "929.25", + "strike": "74500", + "maturity": "2026-04-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.407718", + "iv_ask": "0.4263311", + "inverse": true }, { - "bid": "0.0023", - "ask": "0.0026", - "open_interest": "1937.0", - "volume": "1391.37", - "strike": "2950.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0013", + "ask": "0.0016", + "open_interest": "52.2", + "volume": "2394.27", + "strike": "75000", + "maturity": "2026-04-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.3835137", + "iv_ask": "0.4062553", + "inverse": true }, { - "bid": "0.1180", - "ask": "0.1235", - "open_interest": "1125.0", - "volume": "1996.38", - "strike": "2950.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0019", + "ask": "0.0023", + "open_interest": "10.9", + "volume": "2131.48", + "strike": "75500", + "maturity": "2026-04-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3709432", + "iv_ask": "0.3950226", + "inverse": true }, { - "bid": "0.0015", - "ask": "0.0019", - "open_interest": "4544.0", - "volume": "9774.06", - "strike": "3000.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0028", + "ask": "0.003", + "open_interest": "30.5", + "volume": "7010.16", + "strike": "76000", + "maturity": "2026-04-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.3606688", + "iv_ask": "0.3706205", + "inverse": true }, { - "bid": "0.1360", - "ask": "0.1415", - "open_interest": "13493.0", - "volume": "8342.81", - "strike": "3000.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0041", + "ask": "0.0044", + "open_interest": "165.7", + "volume": "6172.95", + "strike": "76500", + "maturity": "2026-04-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.352067", + "iv_ask": "0.3646061", + "inverse": true }, { - "bid": "0.0010", - "ask": "0.0013", - "open_interest": "2036.0", - "volume": "1212.68", - "strike": "3050.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.006", + "ask": "0.0065", + "open_interest": "44.6", + "volume": "17287.94", + "strike": "77000", + "maturity": "2026-04-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.34822", + "iv_ask": "0.3666432", + "inverse": true }, { - "bid": "0.1545", - "ask": "0.1600", - "open_interest": "559.0", - "volume": "629.96", - "strike": "3050.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.008", + "ask": "0.009", + "open_interest": "19.8", + "volume": "8876.2", + "strike": "77500", + "maturity": "2026-04-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3275722", + "iv_ask": "0.362119", + "inverse": true }, { - "bid": "0.0007", - "ask": "0.0010", - "open_interest": "3019.0", - "volume": "8077.18", - "strike": "3100.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0085", + "ask": "0.009", + "open_interest": "13.9", + "volume": "9131.59", + "strike": "78000", + "maturity": "2026-04-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3407638", + "iv_ask": "0.3579606", + "inverse": true }, { - "bid": "0.1730", - "ask": "0.1785", - "open_interest": "1698.0", - "volume": "0.0", - "strike": "3100.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.006", + "ask": "0.0065", + "open_interest": "6.2", + "volume": "5492.23", + "strike": "78500", + "maturity": "2026-04-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3423951", + "iv_ask": "0.3606088", + "inverse": true }, { - "bid": "0.0006", - "ask": "0.0009", - "open_interest": "3461.0", - "volume": "1003.42", - "strike": "3150.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0041", + "ask": "0.0044", + "open_interest": "5", + "volume": "4461.19", + "strike": "79000", + "maturity": "2026-04-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3443416", + "iv_ask": "0.3566525", + "inverse": true }, { - "bid": "0.1920", - "ask": "0.1975", - "open_interest": "150.0", - "volume": "0.0", - "strike": "3150.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0027", + "ask": "0.0029", + "open_interest": "21.4", + "volume": "15740.49", + "strike": "79500", + "maturity": "2026-04-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3458753", + "iv_ask": "0.3556803", + "inverse": true }, { - "bid": "0.0004", - "ask": "0.0007", - "open_interest": "2895.0", - "volume": "29.82", - "strike": "3200.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0018", + "ask": "0.002", + "open_interest": "136.9", + "volume": "46707.64", + "strike": "80000", + "maturity": "2026-04-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.352621", + "iv_ask": "0.3647188", + "inverse": true }, { - "bid": "0.2110", - "ask": "0.2165", - "open_interest": "853.0", - "volume": "49751.34", - "strike": "3200.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0012", + "ask": "0.0015", + "open_interest": "57", + "volume": "21009.19", + "strike": "80500", + "maturity": "2026-04-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3609259", + "iv_ask": "0.3835217", + "inverse": true }, { - "bid": "0.0003", - "ask": "0.0006", - "open_interest": "1694.0", - "volume": "16.95", - "strike": "3250.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0008", + "ask": "0.001", + "open_interest": "31.3", + "volume": "7861.02", + "strike": "81000", + "maturity": "2026-04-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3699856", + "iv_ask": "0.3896471", + "inverse": true }, { - "bid": "0.2295", - "ask": "0.2350", - "open_interest": "246.0", - "volume": "0.0", - "strike": "3250.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0004", + "ask": "0.0006", + "open_interest": "3.6", + "volume": "428.85", + "strike": "82000", + "maturity": "2026-04-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3969482", + "iv_ask": "0.4280958", + "inverse": true }, { "bid": "0.0002", - "ask": "0.0005", - "open_interest": "1916.0", - "volume": "15.8", - "strike": "3300.0000", - "maturity": "2026-02-06T08:00:00Z", + "ask": "0.0004", + "open_interest": "22.9", + "volume": "905.57", + "strike": "83000", + "maturity": "2026-04-29T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.2485", - "ask": "0.2540", - "open_interest": "306.0", - "volume": "0.0", - "strike": "3300.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4214744", + "iv_ask": "0.4699667", + "inverse": true }, { "bid": "0.0001", - "ask": "0.0004", - "open_interest": "1848.0", - "volume": "7.01", - "strike": "3350.0000", - "maturity": "2026-02-06T08:00:00Z", + "ask": "0.0003", + "open_interest": "10.1", + "volume": "523.75", + "strike": "84000", + "maturity": "2026-04-29T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.2675", - "ask": "0.2730", - "open_interest": "42.0", - "volume": "0.0", - "strike": "3350.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4439978", + "iv_ask": "0.5163625", + "inverse": true }, { "bid": "0.0001", - "ask": "0.0004", - "open_interest": "666.0", - "volume": "103.36", - "strike": "3400.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "ask": "0.0003", + "open_interest": "13.4", + "volume": "171.28", + "strike": "85000", + "maturity": "2026-04-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5028555", + "iv_ask": "0.5823179", + "inverse": true + }, + { + "bid": "77709.5", + "ask": "77821.5", + "open_interest": "0", + "volume": "0", + "maturity": "2026-04-30T08:00:00Z", + "security_type": "forward" }, { - "bid": "0.2860", - "ask": "0.2920", - "open_interest": "103.0", - "volume": "0.0", - "strike": "3400.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0003", + "ask": "0.0005", + "open_interest": "56.5", + "volume": "2535.67", + "strike": "69000", + "maturity": "2026-04-30T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6190282", + "iv_ask": "0.6685198", + "inverse": true }, { - "bid": "0.0001", - "ask": "0.0003", - "open_interest": "1528.0", - "volume": "18.54", - "strike": "3450.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0004", + "ask": "0.0006", + "open_interest": "0.1", + "volume": "3.9", + "strike": "70000", + "maturity": "2026-04-30T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5787191", + "iv_ask": "0.6181027", + "inverse": true }, { - "bid": "0.3050", - "ask": "0.3110", - "open_interest": "65.0", - "volume": "0.0", - "strike": "3450.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0006", + "ask": "0.0008", + "open_interest": "0.4", + "volume": "21.79", + "strike": "71000", + "maturity": "2026-04-30T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5476061", + "iv_ask": "0.5768897", + "inverse": true }, { - "bid": "0.0001", - "ask": "0.0002", - "open_interest": "1005.0", - "volume": "13.37", - "strike": "3500.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0008", + "ask": "0.001", + "open_interest": "0.7", + "volume": "45.13", + "strike": "72000", + "maturity": "2026-04-30T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5033645", + "iv_ask": "0.5263468", + "inverse": true }, { - "bid": "0.3240", - "ask": "0.3300", - "open_interest": "6.0", - "volume": "0.0", - "strike": "3500.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0011", + "ask": "0.0014", + "open_interest": "127.2", + "volume": "13425.15", + "strike": "73000", + "maturity": "2026-04-30T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4592521", + "iv_ask": "0.4852733", + "inverse": true }, { - "bid": "0.0001", - "ask": "0.0002", - "open_interest": "741.0", - "volume": "0.27", - "strike": "3550.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0018", + "ask": "0.002", + "open_interest": "26", + "volume": "4001.11", + "strike": "74000", + "maturity": "2026-04-30T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4306846", + "iv_ask": "0.4433194", + "inverse": true }, { - "bid": "0.3430", - "ask": "0.3490", - "open_interest": "3.0", - "volume": "0.0", - "strike": "3550.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0029", + "ask": "0.0033", + "open_interest": "32.2", + "volume": "8385.22", + "strike": "75000", + "maturity": "2026-04-30T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3990423", + "iv_ask": "0.4174519", + "inverse": true }, { - "bid": "0.0001", - "ask": "0.0002", - "open_interest": "863.0", - "volume": "9.02", - "strike": "3600.0000", - "maturity": "2026-02-06T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0038", + "ask": "0.0042", + "open_interest": "19.5", + "volume": "8779.89", + "strike": "75500", + "maturity": "2026-04-30T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.3873955", + "iv_ask": "0.4033429", + "inverse": true }, { - "bid": "0.3620", - "ask": "0.3680", - "open_interest": "18.0", - "volume": "1776.78", - "strike": "3600.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.005", + "ask": "0.0055", + "open_interest": "18.1", + "volume": "6707.94", + "strike": "76000", + "maturity": "2026-04-30T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3772585", + "iv_ask": "0.3947663", + "inverse": true }, { - "bid": "0.3995", - "ask": "0.4060", - "open_interest": "10.0", - "volume": "0.0", - "strike": "3700.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0065", + "ask": "0.0075", + "open_interest": "3.5", + "volume": "2969.98", + "strike": "76500", + "maturity": "2026-04-30T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.366274", + "iv_ask": "0.3977172", + "inverse": true }, { - "bid": "0.5130", - "ask": "0.5205", - "open_interest": "5.0", - "volume": "6236.57", - "strike": "4000.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.0085", + "ask": "0.009", + "open_interest": "17.1", + "volume": "13690.5", + "strike": "77000", + "maturity": "2026-04-30T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3586642", + "iv_ask": "0.3732924", + "inverse": true }, { - "bid": "0.5885", - "ask": "0.5965", - "open_interest": "142.0", - "volume": "4490.75", - "strike": "4200.0000", - "maturity": "2026-02-06T08:00:00Z", + "bid": "0.011", + "ask": "0.012", + "open_interest": "26.7", + "volume": "22941.75", + "strike": "77500", + "maturity": "2026-04-30T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3521661", + "iv_ask": "0.3801943", + "inverse": true }, { - "bid": "2638.50", - "ask": "2639.00", - "open_interest": "1793521", - "volume": "3591089.0", - "maturity": "2026-02-13T08:00:00Z", - "security_type": "forward" + "bid": "0.0115", + "ask": "0.012", + "open_interest": "114.8", + "volume": "125803.96", + "strike": "78000", + "maturity": "2026-04-30T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3598777", + "iv_ask": "0.3738297", + "inverse": true }, { - "bid": "0.1720", - "ask": "0.1750", - "open_interest": "36.0", - "volume": "0.0", - "strike": "2200.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0085", + "ask": "0.0095", + "open_interest": "18", + "volume": "21300.07", + "strike": "78500", + "maturity": "2026-04-30T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3508133", + "iv_ask": "0.3796688", + "inverse": true }, { - "bid": "0.0060", - "ask": "0.0070", - "open_interest": "2557.0", - "volume": "7628.56", - "strike": "2200.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0065", + "ask": "0.007", + "open_interest": "112", + "volume": "142139.84", + "strike": "79000", + "maturity": "2026-04-30T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3565683", + "iv_ask": "0.37206", + "inverse": true }, { - "bid": "0.1045", - "ask": "0.1085", - "open_interest": "26.0", - "volume": "1311.26", - "strike": "2400.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0048", + "ask": "0.0055", + "open_interest": "82.4", + "volume": "56724.13", + "strike": "79500", + "maturity": "2026-04-30T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3584929", + "iv_ask": "0.3824691", + "inverse": true }, { - "bid": "0.0150", - "ask": "0.0160", - "open_interest": "2531.0", - "volume": "9805.64", - "strike": "2400.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0034", + "ask": "0.0038", + "open_interest": "24", + "volume": "11431.76", + "strike": "80000", + "maturity": "2026-04-30T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3573297", + "iv_ask": "0.3732309", + "inverse": true }, { - "bid": "0.0190", - "ask": "0.0200", - "open_interest": "137.0", - "volume": "6730.16", - "strike": "2450.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0024", + "ask": "0.0028", + "open_interest": "160", + "volume": "72073.42", + "strike": "80500", + "maturity": "2026-04-30T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3589487", + "iv_ask": "0.3777727", + "inverse": true }, { - "bid": "0.0755", - "ask": "0.0790", - "open_interest": "25.0", - "volume": "5100.76", - "strike": "2500.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0017", + "ask": "0.0019", + "open_interest": "14.6", + "volume": "5405.8", + "strike": "81000", + "maturity": "2026-04-30T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3629189", + "iv_ask": "0.3744968", + "inverse": true }, { - "bid": "0.0240", - "ask": "0.0250", - "open_interest": "735.0", - "volume": "16615.35", - "strike": "2500.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0012", + "ask": "0.0014", + "open_interest": "1.9", + "volume": "195.91", + "strike": "81500", + "maturity": "2026-04-30T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3677125", + "iv_ask": "0.3819824", + "inverse": true }, { - "bid": "0.0300", - "ask": "0.0310", - "open_interest": "10.0", - "volume": "958.44", - "strike": "2550.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0008", + "ask": "0.001", + "open_interest": "42.8", + "volume": "6840.17", + "strike": "82000", + "maturity": "2026-04-30T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3687651", + "iv_ask": "0.3870011", + "inverse": true }, { - "bid": "0.0520", - "ask": "0.0535", - "open_interest": "62.0", - "volume": "6790.02", - "strike": "2600.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0004", + "ask": "0.0006", + "open_interest": "33.7", + "volume": "3504.41", + "strike": "83000", + "maturity": "2026-04-30T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3819902", + "iv_ask": "0.4104745", + "inverse": true }, { - "bid": "0.0370", - "ask": "0.0380", - "open_interest": "1803.0", - "volume": "54753.08", - "strike": "2600.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0002", + "ask": "0.0004", + "open_interest": "50.6", + "volume": "3508.83", + "strike": "84000", + "maturity": "2026-04-30T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3955028", + "iv_ask": "0.4392871", + "inverse": true }, { - "bid": "0.0420", - "ask": "0.0430", - "open_interest": "94.0", - "volume": "15978.18", - "strike": "2650.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0001", + "ask": "0.0003", + "open_interest": "46.2", + "volume": "2409.81", + "strike": "85000", + "maturity": "2026-04-30T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4088416", + "iv_ask": "0.4734637", + "inverse": true + }, + { + "bid": "77730", + "ask": "77732.5", + "open_interest": "30198620", + "volume": "5038760", + "maturity": "2026-05-01T08:00:00Z", + "security_type": "forward" }, { - "bid": "0.0455", - "ask": "0.0470", - "open_interest": "399.0", - "volume": "32858.32", - "strike": "2650.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0001", + "ask": "0.0003", + "open_interest": "996.5", + "volume": "1651.85", + "strike": "65000", + "maturity": "2026-05-01T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6662974", + "iv_ask": "0.7605", + "inverse": true }, { - "bid": "0.0330", - "ask": "0.0340", - "open_interest": "202.0", - "volume": "17763.67", - "strike": "2700.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0001", + "ask": "0.0002", + "open_interest": "774.4", + "volume": "460.43", + "strike": "66000", + "maturity": "2026-05-01T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.614914", + "iv_ask": "0.6671515", + "inverse": true }, { - "bid": "0.0560", - "ask": "0.0570", - "open_interest": "1627.0", - "volume": "69889.92", - "strike": "2700.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0003", + "ask": "0.0005", + "open_interest": "551.5", + "volume": "13.36", + "strike": "68000", + "maturity": "2026-05-01T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5898027", + "iv_ask": "0.6359126", + "inverse": true }, { - "bid": "0.0260", - "ask": "0.0270", - "open_interest": "364.0", - "volume": "38301.64", - "strike": "2750.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0004", + "ask": "0.0006", + "open_interest": "213.5", + "volume": "1598.06", + "strike": "69000", + "maturity": "2026-05-01T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5565995", + "iv_ask": "0.5934968", + "inverse": true }, { - "bid": "0.0660", - "ask": "0.0705", - "open_interest": "660.0", - "volume": "61385.41", - "strike": "2750.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0005", + "ask": "0.0007", + "open_interest": "1573.6", + "volume": "1174.28", + "strike": "70000", + "maturity": "2026-05-01T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5166318", + "iv_ask": "0.5469371", + "inverse": true }, { - "bid": "0.0200", - "ask": "0.0210", - "open_interest": "469.0", - "volume": "20120.55", - "strike": "2800.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0008", + "ask": "0.0011", + "open_interest": "447.3", + "volume": "1654.46", + "strike": "71000", + "maturity": "2026-05-01T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4968149", + "iv_ask": "0.5286282", + "inverse": true }, { - "bid": "0.0790", - "ask": "0.0835", - "open_interest": "563.0", - "volume": "43479.87", - "strike": "2800.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0012", + "ask": "0.0014", + "open_interest": "1153.7", + "volume": "20262.68", + "strike": "72000", + "maturity": "2026-05-01T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4707589", + "iv_ask": "0.487009", + "inverse": true }, { - "bid": "0.0150", - "ask": "0.0160", - "open_interest": "843.0", - "volume": "30665.25", - "strike": "2850.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0017", + "ask": "0.002", + "open_interest": "679", + "volume": "3836.82", + "strike": "73000", + "maturity": "2026-05-01T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4374705", + "iv_ask": "0.4559868", + "inverse": true }, { - "bid": "0.0930", - "ask": "0.0975", - "open_interest": "597.0", - "volume": "40759.3", - "strike": "2850.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0027", + "ask": "0.0031", + "open_interest": "431.6", + "volume": "6673.85", + "strike": "74000", + "maturity": "2026-05-01T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.415717", + "iv_ask": "0.4340148", + "inverse": true }, { - "bid": "0.0115", - "ask": "0.0125", - "open_interest": "1061.0", - "volume": "33224.32", - "strike": "2900.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0044", + "ask": "0.0047", + "open_interest": "584.5", + "volume": "64541.48", + "strike": "75000", + "maturity": "2026-05-01T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.3987878", + "iv_ask": "0.4093333", + "inverse": true }, { - "bid": "0.1070", - "ask": "0.1130", - "open_interest": "1412.0", - "volume": "77553.06", - "strike": "2900.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.007", + "ask": "0.0075", + "open_interest": "1073.9", + "volume": "30847.2", + "strike": "76000", + "maturity": "2026-05-01T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3816549", + "iv_ask": "0.395859", + "inverse": true }, { - "bid": "0.0090", - "ask": "0.0095", - "open_interest": "1967.0", - "volume": "22104.43", - "strike": "2950.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.011", + "ask": "0.0115", + "open_interest": "565.5", + "volume": "89851.21", + "strike": "77000", + "maturity": "2026-05-01T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.3685241", + "iv_ask": "0.3809728", + "inverse": true }, { - "bid": "0.1230", - "ask": "0.1295", - "open_interest": "1107.0", - "volume": "0.0", - "strike": "2950.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0135", + "ask": "0.0145", + "open_interest": "6.3", + "volume": "7191.7", + "strike": "77500", + "maturity": "2026-05-01T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3600164", + "iv_ask": "0.3841877", + "inverse": true }, { - "bid": "0.0065", - "ask": "0.0075", - "open_interest": "2947.0", - "volume": "14510.47", - "strike": "3000.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0135", + "ask": "0.014", + "open_interest": "520.4", + "volume": "84779.86", + "strike": "78000", + "maturity": "2026-05-01T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3642812", + "iv_ask": "0.3763406", + "inverse": true }, { - "bid": "0.1405", - "ask": "0.1465", - "open_interest": "497.0", - "volume": "1942.36", - "strike": "3000.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0105", + "ask": "0.011", + "open_interest": "0.2", + "volume": "155.35", + "strike": "78500", + "maturity": "2026-05-01T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3573817", + "iv_ask": "0.3697657", + "inverse": true }, { - "bid": "0.0050", - "ask": "0.0060", - "open_interest": "770.0", - "volume": "2741.81", - "strike": "3050.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.008", + "ask": "0.009", + "open_interest": "471.1", + "volume": "209444.25", + "strike": "79000", + "maturity": "2026-05-01T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3519466", + "iv_ask": "0.3780838", + "inverse": true }, { - "bid": "0.1580", - "ask": "0.1640", - "open_interest": "398.0", - "volume": "666.19", - "strike": "3050.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0047", + "ask": "0.005", + "open_interest": "1442.7", + "volume": "137543.46", + "strike": "80000", + "maturity": "2026-05-01T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3553669", + "iv_ask": "0.3649151", + "inverse": true }, { - "bid": "0.0041", - "ask": "0.0045", - "open_interest": "1841.0", - "volume": "784.72", - "strike": "3100.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0025", + "ask": "0.0028", + "open_interest": "491.3", + "volume": "110407.93", + "strike": "81000", + "maturity": "2026-05-01T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3540833", + "iv_ask": "0.3669875", + "inverse": true }, { - "bid": "0.1750", - "ask": "0.1820", - "open_interest": "1195.0", - "volume": "364.96", - "strike": "3100.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0032", - "ask": "0.0035", - "open_interest": "1111.0", - "volume": "394.09", - "strike": "3150.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1930", - "ask": "0.2000", - "open_interest": "8.0", - "volume": "1726.42", - "strike": "3150.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0025", - "ask": "0.0029", - "open_interest": "5029.0", - "volume": "4107.27", - "strike": "3200.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0014", + "ask": "0.0016", + "open_interest": "825.1", + "volume": "69654.05", + "strike": "82000", + "maturity": "2026-05-01T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.2115", - "ask": "0.2185", - "open_interest": "27.0", - "volume": "0.0", - "strike": "3200.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.364147", + "iv_ask": "0.3763902", + "inverse": true }, { - "bid": "0.0016", - "ask": "0.0020", - "open_interest": "1966.0", - "volume": "2844.13", - "strike": "3300.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0008", + "ask": "0.0009", + "open_interest": "667.4", + "volume": "8398.29", + "strike": "83000", + "maturity": "2026-05-01T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.2490", - "ask": "0.2555", - "open_interest": "6.0", - "volume": "0.0", - "strike": "3300.0000", - "maturity": "2026-02-13T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3771286", + "iv_ask": "0.3862035", + "inverse": true }, { - "bid": "0.0011", - "ask": "0.0014", - "open_interest": "2460.0", - "volume": "1870.7", - "strike": "3400.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0004", + "ask": "0.0006", + "open_interest": "129.8", + "volume": "3924.17", + "strike": "84000", + "maturity": "2026-05-01T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3816245", + "iv_ask": "0.408895", + "inverse": true }, { - "bid": "0.0005", - "ask": "0.0008", - "open_interest": "1537.0", - "volume": "12.75", - "strike": "3600.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0003", + "ask": "0.0005", + "open_interest": "954.6", + "volume": "415.26", + "strike": "85000", + "maturity": "2026-05-01T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4110852", + "iv_ask": "0.4453186", + "inverse": true }, { - "bid": "0.0003", - "ask": "0.0006", - "open_interest": "298.0", - "volume": "14.52", - "strike": "3800.0000", - "maturity": "2026-02-13T08:00:00Z", + "bid": "0.0002", + "ask": "0.0003", + "open_interest": "39.2", + "volume": "306.28", + "strike": "86000", + "maturity": "2026-05-01T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4312223", + "iv_ask": "0.4561907", + "inverse": true }, { - "bid": "2641.75", - "ask": "2642.50", - "open_interest": "39806132", - "volume": "2917427.0", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0001", + "ask": "0.0003", + "open_interest": "205.4", + "volume": "155.2", + "strike": "87000", + "maturity": "2026-05-01T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4347883", + "iv_ask": "0.5001501", + "inverse": true + }, + { + "bid": "77755", + "ask": "77757.5", + "open_interest": "2718240", + "volume": "2864240", + "maturity": "2026-05-08T08:00:00Z", "security_type": "forward" }, { - "bid": "0.4325", - "ask": "0.4350", - "open_interest": "37.0", - "volume": "22493.2", - "strike": "1500.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0010", + "bid": "0.001", "ask": "0.0012", - "open_interest": "8160.0", - "volume": "1027.3", - "strike": "1500.0000", - "maturity": "2026-02-27T08:00:00Z", + "open_interest": "217.3", + "volume": "1119.53", + "strike": "65000", + "maturity": "2026-05-08T08:00:00Z", "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.2490", - "ask": "0.2520", - "open_interest": "90.0", - "volume": "384784.09", - "strike": "2000.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5487305", + "iv_ask": "0.5664115", + "inverse": true }, { - "bid": "0.0065", - "ask": "0.0070", - "open_interest": "13386.0", - "volume": "8713.36", - "strike": "2000.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0012", + "ask": "0.0014", + "open_interest": "370.2", + "volume": "5839.88", + "strike": "66000", + "maturity": "2026-05-08T08:00:00Z", "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.1180", - "ask": "0.1215", - "open_interest": "2916.0", - "volume": "742.53", - "strike": "2400.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5257564", + "iv_ask": "0.5409071", + "inverse": true }, { - "bid": "0.0275", - "ask": "0.0280", - "open_interest": "10615.0", - "volume": "90062.38", - "strike": "2400.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0018", + "ask": "0.002", + "open_interest": "1041.1", + "volume": "14507.73", + "strike": "68000", + "maturity": "2026-05-08T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4824045", + "iv_ask": "0.493292", + "inverse": true }, { - "bid": "0.0915", - "ask": "0.0950", - "open_interest": "28.0", - "volume": "5822.63", - "strike": "2500.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0029", + "ask": "0.0032", + "open_interest": "108.4", + "volume": "3075.54", + "strike": "70000", + "maturity": "2026-05-08T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4446109", + "iv_ask": "0.455945", + "inverse": true }, { - "bid": "0.0390", - "ask": "0.0395", - "open_interest": "16411.0", - "volume": "497716.42", - "strike": "2500.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0038", + "ask": "0.0041", + "open_interest": "137", + "volume": "11800.49", + "strike": "71000", + "maturity": "2026-05-08T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4289334", + "iv_ask": "0.4383776", + "inverse": true }, { - "bid": "0.0700", - "ask": "0.0715", - "open_interest": "262.0", - "volume": "38654.38", - "strike": "2600.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.005", + "ask": "0.0055", + "open_interest": "170.8", + "volume": "22088.81", + "strike": "72000", + "maturity": "2026-05-08T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4139109", + "iv_ask": "0.4270395", + "inverse": true }, { - "bid": "0.0535", - "ask": "0.0550", - "open_interest": "13574.0", - "volume": "217258.45", - "strike": "2600.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0065", + "ask": "0.007", + "open_interest": "192.5", + "volume": "6559.66", + "strike": "73000", + "maturity": "2026-05-08T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3974257", + "iv_ask": "0.4086612", + "inverse": true }, { - "bid": "0.0515", - "ask": "0.0525", - "open_interest": "243.0", - "volume": "14246.82", - "strike": "2700.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0085", + "ask": "0.0095", + "open_interest": "621.5", + "volume": "42889.31", + "strike": "74000", + "maturity": "2026-05-08T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.3820314", + "iv_ask": "0.4013904", + "inverse": true }, { - "bid": "0.0725", - "ask": "0.0740", - "open_interest": "6346.0", - "volume": "230336.81", - "strike": "2700.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.012", + "ask": "0.0125", + "open_interest": "255.4", + "volume": "107071.38", + "strike": "75000", + "maturity": "2026-05-08T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3824536", + "iv_ask": "0.3909715", + "inverse": true }, { - "bid": "0.0370", - "ask": "0.0375", - "open_interest": "2284.0", - "volume": "40517.06", - "strike": "2800.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0155", + "ask": "0.0165", + "open_interest": "87.3", + "volume": "28202.41", + "strike": "76000", + "maturity": "2026-05-08T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.3687289", + "iv_ask": "0.3842928", + "inverse": true }, { - "bid": "0.0955", - "ask": "0.0985", - "open_interest": "7559.0", - "volume": "117513.15", - "strike": "2800.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0205", + "ask": "0.021", + "open_interest": "293.6", + "volume": "56530.03", + "strike": "77000", + "maturity": "2026-05-08T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3643546", + "iv_ask": "0.3717117", + "inverse": true }, { - "bid": "0.0310", - "ask": "0.0320", - "open_interest": "1095.0", - "volume": "30306.07", - "strike": "2850.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0235", + "ask": "0.0245", + "open_interest": "441.7", + "volume": "106843.94", + "strike": "78000", + "maturity": "2026-05-08T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3616212", + "iv_ask": "0.3760875", + "inverse": true }, { - "bid": "0.1075", - "ask": "0.1120", - "open_interest": "890.0", - "volume": "5128.61", - "strike": "2850.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0175", + "ask": "0.0185", + "open_interest": "271.8", + "volume": "250080.7", + "strike": "79000", + "maturity": "2026-05-08T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.354168", + "iv_ask": "0.368993", + "inverse": true }, { - "bid": "0.0260", - "ask": "0.0265", - "open_interest": "4056.0", - "volume": "46909.13", - "strike": "2900.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.013", + "ask": "0.0135", + "open_interest": "574.4", + "volume": "90683.65", + "strike": "80000", + "maturity": "2026-05-08T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3537403", + "iv_ask": "0.3616659", + "inverse": true }, { - "bid": "0.1220", - "ask": "0.1260", - "open_interest": "5364.0", - "volume": "20429.94", - "strike": "2900.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0095", + "ask": "0.01", + "open_interest": "438.6", + "volume": "44904.99", + "strike": "81000", + "maturity": "2026-05-08T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.354583", + "iv_ask": "0.36338", + "inverse": true }, { - "bid": "0.0215", - "ask": "0.0225", - "open_interest": "2190.0", - "volume": "18903.96", - "strike": "2950.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0065", + "ask": "0.007", + "open_interest": "913.3", + "volume": "154210.98", + "strike": "82000", + "maturity": "2026-05-08T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3493293", + "iv_ask": "0.3595734", + "inverse": true }, { - "bid": "0.1355", - "ask": "0.1400", - "open_interest": "844.0", - "volume": "3805.06", - "strike": "2950.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0031", + "ask": "0.0034", + "open_interest": "939.8", + "volume": "93358.52", + "strike": "84000", + "maturity": "2026-05-08T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3520139", + "iv_ask": "0.3611368", + "inverse": true }, { - "bid": "0.0180", - "ask": "0.0190", - "open_interest": "11071.0", - "volume": "29625.59", - "strike": "3000.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0021", + "ask": "0.0024", + "open_interest": "1483.1", + "volume": "57029.06", + "strike": "85000", + "maturity": "2026-05-08T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3542017", + "iv_ask": "0.3657113", + "inverse": true }, { - "bid": "0.1495", - "ask": "0.1550", - "open_interest": "6092.0", - "volume": "68573.33", - "strike": "3000.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0015", + "ask": "0.0017", + "open_interest": "302.6", + "volume": "10072.55", + "strike": "86000", + "maturity": "2026-05-08T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3614836", + "iv_ask": "0.3711836", + "inverse": true }, { - "bid": "0.0150", - "ask": "0.0155", - "open_interest": "847.0", - "volume": "11219.97", - "strike": "3050.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0004", + "ask": "0.0006", + "open_interest": "479.2", + "volume": "8258.29", + "strike": "90000", + "maturity": "2026-05-08T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3908739", + "iv_ask": "0.4149628", + "inverse": true + }, + { + "bid": "77701.5", + "ask": "77862.0", + "open_interest": "0", + "volume": "0", + "maturity": "2026-05-15T08:00:00Z", + "security_type": "forward" }, { - "bid": "0.1650", - "ask": "0.1730", - "open_interest": "286.0", - "volume": "3958.45", - "strike": "3050.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0023", + "ask": "0.0026", + "open_interest": "124.9", + "volume": "813.5", + "strike": "65000", + "maturity": "2026-05-15T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5021365", + "iv_ask": "0.5152999", + "inverse": true }, { - "bid": "0.0125", - "ask": "0.0130", - "open_interest": "5952.0", - "volume": "40623.98", - "strike": "3100.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.006", + "ask": "0.0065", + "open_interest": "70.3", + "volume": "18603.75", + "strike": "70000", + "maturity": "2026-05-15T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4268486", + "iv_ask": "0.4377581", + "inverse": true }, { - "bid": "0.1810", - "ask": "0.1895", - "open_interest": "4122.0", - "volume": "43080.5", - "strike": "3100.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0095", + "ask": "0.0105", + "open_interest": "124.6", + "volume": "9119.02", + "strike": "72000", + "maturity": "2026-05-15T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4077988", + "iv_ask": "0.4244853", + "inverse": true }, { - "bid": "0.0085", - "ask": "0.0095", - "open_interest": "6936.0", - "volume": "14280.86", - "strike": "3200.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.015", + "ask": "0.016", + "open_interest": "129.5", + "volume": "39340.5", + "strike": "74000", + "maturity": "2026-05-15T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.3929067", + "iv_ask": "0.4064881", + "inverse": true }, { - "bid": "0.2150", - "ask": "0.2235", - "open_interest": "2626.0", - "volume": "2013.75", - "strike": "3200.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.019", + "ask": "0.0195", + "open_interest": "50.7", + "volume": "41847.1", + "strike": "75000", + "maturity": "2026-05-15T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.390482", + "iv_ask": "0.3967645", + "inverse": true }, { - "bid": "0.0060", - "ask": "0.0070", - "open_interest": "14920.0", - "volume": "19381.75", - "strike": "3300.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.023", + "ask": "0.024", + "open_interest": "32", + "volume": "49361.37", + "strike": "76000", + "maturity": "2026-05-15T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.3796642", + "iv_ask": "0.3915336", + "inverse": true }, { - "bid": "0.2505", - "ask": "0.2590", - "open_interest": "2863.0", - "volume": "0.0", - "strike": "3300.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0285", + "ask": "0.0295", + "open_interest": "108.7", + "volume": "56828.82", + "strike": "77000", + "maturity": "2026-05-15T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3781084", + "iv_ask": "0.3895557", + "inverse": true }, { - "bid": "0.0045", - "ask": "0.0049", - "open_interest": "8132.0", - "volume": "1229.63", - "strike": "3400.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.032", + "ask": "0.0325", + "open_interest": "176.4", + "volume": "141630.22", + "strike": "78000", + "maturity": "2026-05-15T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.2865", - "ask": "0.2950", - "open_interest": "1123.0", - "volume": "0.0", - "strike": "3400.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3768078", + "iv_ask": "0.3824578", + "inverse": true }, { - "bid": "0.0034", - "ask": "0.0038", - "open_interest": "6440.0", - "volume": "3217.49", - "strike": "3500.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0255", + "ask": "0.0265", + "open_interest": "43.4", + "volume": "48689", + "strike": "79000", + "maturity": "2026-05-15T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3671444", + "iv_ask": "0.378566", + "inverse": true }, { - "bid": "0.3230", - "ask": "0.3320", - "open_interest": "640.0", - "volume": "4505.66", - "strike": "3500.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0205", + "ask": "0.0215", + "open_interest": "85", + "volume": "25163.88", + "strike": "80000", + "maturity": "2026-05-15T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3656068", + "iv_ask": "0.3774266", + "inverse": true }, { - "bid": "0.0025", - "ask": "0.0029", - "open_interest": "6370.0", - "volume": "83.28", - "strike": "3600.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.016", + "ask": "0.017", + "open_interest": "42.2", + "volume": "7730.4", + "strike": "81000", + "maturity": "2026-05-15T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3609931", + "iv_ask": "0.3735362", + "inverse": true }, { - "bid": "0.3600", - "ask": "0.3690", - "open_interest": "150.0", - "volume": "0.0", - "strike": "3600.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0125", + "ask": "0.0135", + "open_interest": "85.7", + "volume": "9669.77", + "strike": "82000", + "maturity": "2026-05-15T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3600389", + "iv_ask": "0.3736357", + "inverse": true }, { - "bid": "0.0020", - "ask": "0.0023", - "open_interest": "2072.0", - "volume": "24.99", - "strike": "3700.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0075", + "ask": "0.008", + "open_interest": "460.4", + "volume": "13417.51", + "strike": "84000", + "maturity": "2026-05-15T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3615357", + "iv_ask": "0.3700621", + "inverse": true }, { - "bid": "0.3970", - "ask": "0.4065", - "open_interest": "103.0", - "volume": "0.0", - "strike": "3700.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0043", + "ask": "0.0046", + "open_interest": "88.4", + "volume": "7720.93", + "strike": "86000", + "maturity": "2026-05-15T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3628801", + "iv_ask": "0.3698054", + "inverse": true }, { "bid": "0.0015", - "ask": "0.0019", - "open_interest": "6066.0", - "volume": "116.68", - "strike": "3800.0000", - "maturity": "2026-02-27T08:00:00Z", + "ask": "0.0018", + "open_interest": "129.4", + "volume": "2242.32", + "strike": "90000", + "maturity": "2026-05-15T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3782631", + "iv_ask": "0.3918298", + "inverse": true }, { - "bid": "0.4345", - "ask": "0.4440", - "open_interest": "30.0", - "volume": "0.0", - "strike": "3800.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0005", + "ask": "0.0007", + "open_interest": "6.1", + "volume": "22.62", + "strike": "95000", + "maturity": "2026-05-15T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4108303", + "iv_ask": "0.4310875", + "inverse": true + }, + { + "bid": "77812.5", + "ask": "77815", + "open_interest": "67350560", + "volume": "9387130", + "maturity": "2026-05-29T08:00:00Z", + "security_type": "forward" }, { - "bid": "0.0012", - "ask": "0.0016", - "open_interest": "3005.0", - "volume": "170.27", - "strike": "3900.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0007", + "ask": "0.0009", + "open_interest": "739.1", + "volume": "249.12", + "strike": "48000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.7241261", + "iv_ask": "0.749391", + "inverse": true }, { - "bid": "0.4720", - "ask": "0.4815", - "open_interest": "5.0", - "volume": "0.0", - "strike": "3900.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0008", + "ask": "0.001", + "open_interest": "1250.9", + "volume": "2674.89", + "strike": "50000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6812462", + "iv_ask": "0.7031067", + "inverse": true }, { "bid": "0.0011", "ask": "0.0013", - "open_interest": "3809.0", - "volume": "53.85", - "strike": "4000.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "open_interest": "496.1", + "volume": "47.67", + "strike": "52000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.6567867", + "iv_ask": "0.6737252", + "inverse": true }, { - "bid": "0.5095", - "ask": "0.5200", - "open_interest": "132.0", - "volume": "0.0", - "strike": "4000.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0014", + "ask": "0.0016", + "open_interest": "472.3", + "volume": "991.8", + "strike": "54000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6255369", + "iv_ask": "0.6392689", + "inverse": true }, { - "bid": "0.0007", - "ask": "0.0010", - "open_interest": "3139.0", - "volume": "19.64", - "strike": "4200.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0018", + "ask": "0.002", + "open_interest": "525.2", + "volume": "142", + "strike": "56000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5957779", + "iv_ask": "0.6068514", + "inverse": true }, { - "bid": "0.0004", - "ask": "0.0007", - "open_interest": "4886.0", - "volume": "8.72", - "strike": "4500.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.002", + "ask": "0.0023", + "open_interest": "527.5", + "volume": "1373.33", + "strike": "57000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5789308", + "iv_ask": "0.593825", + "inverse": true }, { - "bid": "0.6970", - "ask": "0.7090", - "open_interest": "1.0", - "volume": "0.0", - "strike": "4500.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0023", + "ask": "0.0026", + "open_interest": "282.7", + "volume": "148.52", + "strike": "58000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5657187", + "iv_ask": "0.579027", + "inverse": true }, { - "bid": "0.0002", - "ask": "0.0004", - "open_interest": "3663.0", - "volume": "162.61", - "strike": "5000.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0026", + "ask": "0.0029", + "open_interest": "346", + "volume": "84.41", + "strike": "59000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5507657", + "iv_ask": "0.5627731", + "inverse": true }, { - "bid": "0.0001", - "ask": "0.0002", - "open_interest": "5584.0", - "volume": "5.39", - "strike": "5500.0000", - "maturity": "2026-02-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.003", + "ask": "0.0033", + "open_interest": "852", + "volume": "10889.66", + "strike": "60000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5380795", + "iv_ask": "0.5488048", + "inverse": true }, { - "bid": "1.0735", - "ask": "1.0885", - "open_interest": "862.0", - "volume": "0.0", - "strike": "5500.0000", - "maturity": "2026-02-27T08:00:00Z", + "bid": "0.0034", + "ask": "0.0038", + "open_interest": "290.6", + "volume": "262.53", + "strike": "61000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5234718", + "iv_ask": "0.5362842", + "inverse": true }, { - "bid": "2649.25", - "ask": "2649.50", - "open_interest": "127513022", - "volume": "5914666.0", - "maturity": "2026-03-27T08:00:00Z", - "security_type": "forward" + "bid": "0.0039", + "ask": "0.0043", + "open_interest": "347.7", + "volume": "304.55", + "strike": "62000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5102348", + "iv_ask": "0.5217509", + "inverse": true }, { - "bid": "0.8095", - "ask": "0.8120", - "open_interest": "1229.0", - "volume": "0.0", - "strike": "500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0045", + "ask": "0.0049", + "open_interest": "275.5", + "volume": "3685.61", + "strike": "63000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4977308", + "iv_ask": "0.5080668", + "inverse": true }, { - "bid": "0.6215", - "ask": "0.6245", - "open_interest": "191.0", - "volume": "0.0", - "strike": "1000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.005", + "ask": "0.0055", + "open_interest": "344.9", + "volume": "17058.37", + "strike": "64000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4807026", + "iv_ask": "0.4924656", + "inverse": true }, { - "bid": "0.0003", - "ask": "0.0005", - "open_interest": "15884.0", - "volume": "112.92", - "strike": "1000.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.006", + "ask": "0.0065", + "open_interest": "967.7", + "volume": "20444.21", + "strike": "65000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.473088", + "iv_ask": "0.4835113", + "inverse": true }, { - "bid": "0.5470", - "ask": "0.5495", - "open_interest": "108.0", - "volume": "0.0", - "strike": "1200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.007", + "ask": "0.0075", + "open_interest": "767.4", + "volume": "38202.78", + "strike": "66000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4622161", + "iv_ask": "0.4715945", + "inverse": true }, { - "bid": "0.0009", - "ask": "0.0014", - "open_interest": "4155.0", - "volume": "5.35", - "strike": "1200.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.008", + "ask": "0.009", + "open_interest": "381.4", + "volume": "19427.36", + "strike": "67000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4486493", + "iv_ask": "0.4655219", + "inverse": true }, { - "bid": "0.5095", - "ask": "0.5125", - "open_interest": "81.0", - "volume": "0.0", - "strike": "1300.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0095", + "ask": "0.01", + "open_interest": "695.2", + "volume": "2533.12", + "strike": "68000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4405757", + "iv_ask": "0.4482546", + "inverse": true }, { - "bid": "0.0015", - "ask": "0.0019", - "open_interest": "2009.0", - "volume": "0.0", - "strike": "1300.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.011", + "ask": "0.012", + "open_interest": "660.7", + "volume": "8364.57", + "strike": "69000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.429087", + "iv_ask": "0.4430004", + "inverse": true }, { - "bid": "0.4725", - "ask": "0.4755", - "open_interest": "167.0", - "volume": "0.0", - "strike": "1400.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.013", + "ask": "0.014", + "open_interest": "3084.5", + "volume": "36353.17", + "strike": "70000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4210971", + "iv_ask": "0.4337965", + "inverse": true }, { - "bid": "0.0022", - "ask": "0.0026", - "open_interest": "1424.0", - "volume": "0.0", - "strike": "1400.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.0155", + "ask": "0.0165", + "open_interest": "360.6", + "volume": "36300.47", + "strike": "71000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4153419", + "iv_ask": "0.4269854", + "inverse": true }, { - "bid": "0.4355", - "ask": "0.4390", - "open_interest": "469.0", - "volume": "0.0", - "strike": "1500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0185", + "ask": "0.019", + "open_interest": "1096.9", + "volume": "20156", + "strike": "72000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4109078", + "iv_ask": "0.4163026", + "inverse": true }, { - "bid": "0.0031", - "ask": "0.0035", - "open_interest": "3118.0", - "volume": "31.65", - "strike": "1500.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.0215", + "ask": "0.0225", + "open_interest": "479.9", + "volume": "673656.53", + "strike": "73000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4021122", + "iv_ask": "0.412195", + "inverse": true }, { - "bid": "0.3990", - "ask": "0.4025", - "open_interest": "760.0", - "volume": "0.0", - "strike": "1600.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0255", + "ask": "0.0265", + "open_interest": "1841.2", + "volume": "36817.48", + "strike": "74000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.3989167", + "iv_ask": "0.4084237", + "inverse": true }, { - "bid": "0.0044", - "ask": "0.0048", - "open_interest": "6396.0", - "volume": "11.89", - "strike": "1600.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.03", + "ask": "0.0305", + "open_interest": "991.1", + "volume": "84666.73", + "strike": "75000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3956157", + "iv_ask": "0.400154", + "inverse": true }, { - "bid": "0.3275", - "ask": "0.3310", - "open_interest": "752.0", - "volume": "0.0", - "strike": "1800.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.035", + "ask": "0.0355", + "open_interest": "981.3", + "volume": "90930.8", + "strike": "76000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.3920165", + "iv_ask": "0.396398", + "inverse": true }, { - "bid": "0.0080", - "ask": "0.0090", - "open_interest": "9932.0", - "volume": "629.52", - "strike": "1800.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.0405", + "ask": "0.041", + "open_interest": "241.5", + "volume": "303035.32", + "strike": "77000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3879827", + "iv_ask": "0.3922652", + "inverse": true }, { - "bid": "0.2590", - "ask": "0.2625", - "open_interest": "2242.0", - "volume": "2273.85", - "strike": "2000.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.044", + "ask": "0.045", + "open_interest": "1029.4", + "volume": "413684.52", + "strike": "78000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3825106", + "iv_ask": "0.390987", + "inverse": true }, { - "bid": "0.0150", - "ask": "0.0160", - "open_interest": "14029.0", - "volume": "46084.53", - "strike": "2000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.038", + "ask": "0.039", + "open_interest": "330.9", + "volume": "93354.3", + "strike": "79000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3803055", + "iv_ask": "0.3888008", + "inverse": true }, { - "bid": "0.1955", - "ask": "0.1995", - "open_interest": "9808.0", - "volume": "0.0", - "strike": "2200.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.0325", + "ask": "0.0335", + "open_interest": "7198.7", + "volume": "14159.05", + "strike": "80000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3774939", + "iv_ask": "0.3861169", + "inverse": true }, { - "bid": "0.0270", + "bid": "0.0275", "ask": "0.0285", - "open_interest": "6140.0", - "volume": "74443.2", - "strike": "2200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "open_interest": "1002.5", + "volume": "58284.14", + "strike": "81000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.374137", + "iv_ask": "0.3830036", + "inverse": true }, { - "bid": "0.1395", - "ask": "0.1435", - "open_interest": "12137.0", - "volume": "0.0", - "strike": "2400.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.023", + "ask": "0.024", + "open_interest": "4595.2", + "volume": "260884.82", + "strike": "82000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3703197", + "iv_ask": "0.3795593", + "inverse": true }, { - "bid": "0.0475", - "ask": "0.0490", - "open_interest": "9087.0", - "volume": "158492.99", - "strike": "2400.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0195", + "ask": "0.02", + "open_interest": "864.3", + "volume": "129161.75", + "strike": "83000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3710584", + "iv_ask": "0.3759287", + "inverse": true }, { - "bid": "0.1175", - "ask": "0.1200", - "open_interest": "1685.0", - "volume": "9273.65", - "strike": "2500.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.016", + "ask": "0.017", + "open_interest": "2237.3", + "volume": "207661.75", + "strike": "84000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.367117", + "iv_ask": "0.3775085", + "inverse": true }, { - "bid": "0.0620", - "ask": "0.0630", - "open_interest": "24803.0", - "volume": "360220.03", - "strike": "2500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.013", + "ask": "0.014", + "open_interest": "1754", + "volume": "20347.15", + "strike": "85000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3634411", + "iv_ask": "0.3746992", + "inverse": true }, { - "bid": "0.0970", - "ask": "0.0985", - "open_interest": "2659.0", - "volume": "461328.1", - "strike": "2600.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.011", + "ask": "0.0115", + "open_interest": "708.9", + "volume": "27863.79", + "strike": "86000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3667496", + "iv_ask": "0.3728768", + "inverse": true }, { - "bid": "0.0785", - "ask": "0.0800", - "open_interest": "13629.0", - "volume": "271734.24", - "strike": "2600.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.009", + "ask": "0.0095", + "open_interest": "215.5", + "volume": "116228.33", + "strike": "87000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3660756", + "iv_ask": "0.3728294", + "inverse": true }, { - "bid": "0.0790", - "ask": "0.0805", - "open_interest": "537.0", - "volume": "120536.37", - "strike": "2700.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.007", + "ask": "0.008", + "open_interest": "812.7", + "volume": "11422.71", + "strike": "88000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3605964", + "iv_ask": "0.3756909", + "inverse": true }, { - "bid": "0.0980", - "ask": "0.1000", - "open_interest": "2002.0", - "volume": "133210.99", - "strike": "2700.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0048", + "ask": "0.0055", + "open_interest": "1147.9", + "volume": "152285.26", + "strike": "90000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3654597", + "iv_ask": "0.3786821", + "inverse": true }, { - "bid": "0.0640", - "ask": "0.0655", - "open_interest": "3107.0", - "volume": "3179.84", - "strike": "2800.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.0032", + "ask": "0.0035", + "open_interest": "533.7", + "volume": "7006.13", + "strike": "92000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3685609", + "iv_ask": "0.3759941", + "inverse": true }, { - "bid": "0.1205", - "ask": "0.1225", - "open_interest": "9219.0", - "volume": "152274.58", - "strike": "2800.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0022", + "ask": "0.0024", + "open_interest": "1158.7", + "volume": "2448.17", + "strike": "94000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3746106", + "iv_ask": "0.3810515", + "inverse": true }, { - "bid": "0.0510", - "ask": "0.0525", - "open_interest": "1363.0", - "volume": "55582.05", - "strike": "2900.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.0018", + "ask": "0.0021", + "open_interest": "1463", + "volume": "1559.6", + "strike": "95000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3767028", + "iv_ask": "0.3876312", + "inverse": true }, { - "bid": "0.1445", - "ask": "0.1485", - "open_interest": "2288.0", - "volume": "36418.75", - "strike": "2900.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0014", + "ask": "0.0015", + "open_interest": "205.8", + "volume": "5771.38", + "strike": "96000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3755968", + "iv_ask": "0.3800562", + "inverse": true }, { - "bid": "0.0410", - "ask": "0.0420", - "open_interest": "7879.0", - "volume": "140805.33", - "strike": "3000.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.0011", + "ask": "0.0012", + "open_interest": "1441.5", + "volume": "220.47", + "strike": "98000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3898627", + "iv_ask": "0.3952896", + "inverse": true }, { - "bid": "0.1720", - "ask": "0.1765", - "open_interest": "12988.0", - "volume": "92927.36", - "strike": "3000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0008", + "ask": "0.0009", + "open_interest": "283.4", + "volume": "204.77", + "strike": "100000", + "maturity": "2026-05-29T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3984549", + "iv_ask": "0.4053762", + "inverse": true }, { - "bid": "0.0325", - "ask": "0.0335", - "open_interest": "2637.0", - "volume": "6257.55", - "strike": "3100.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.0003", + "ask": "0.0005", + "open_interest": "871.6", + "volume": "7905.91", + "strike": "105000", + "maturity": "2026-05-29T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1985", - "ask": "0.2080", - "open_interest": "17328.0", - "volume": "27748.62", - "strike": "3100.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4084979", + "iv_ask": "0.4345937", + "inverse": true }, { - "bid": "0.0255", - "ask": "0.0270", - "open_interest": "19963.0", - "volume": "84839.34", - "strike": "3200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "77920", + "ask": "77922.5", + "open_interest": "588089150", + "volume": "6932390", + "maturity": "2026-06-26T08:00:00Z", + "security_type": "forward" }, { - "bid": "0.2285", - "ask": "0.2395", - "open_interest": "3824.0", - "volume": "153278.2", - "strike": "3200.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.0013", + "ask": "0.0016", + "open_interest": "1700.5", + "volume": "5327.23", + "strike": "40000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0205", - "ask": "0.0215", - "open_interest": "3186.0", - "volume": "16683.15", - "strike": "3300.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.7705258", + "iv_ask": "0.7944322", + "inverse": true }, { - "bid": "0.2605", - "ask": "0.2715", - "open_interest": "5430.0", - "volume": "0.0", - "strike": "3300.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.002", + "ask": "0.0023", + "open_interest": "1859.9", + "volume": "0", + "strike": "45000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6913868", + "iv_ask": "0.7074736", + "inverse": true }, { - "bid": "0.0160", - "ask": "0.0175", - "open_interest": "13410.0", - "volume": "4837.48", - "strike": "3400.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0032", + "ask": "0.0035", + "open_interest": "2511.2", + "volume": "868.37", + "strike": "50000", + "maturity": "2026-06-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.6231686", + "iv_ask": "0.6338104", + "inverse": true }, { - "bid": "0.2940", - "ask": "0.3060", - "open_interest": "3811.0", - "volume": "36043.8", - "strike": "3400.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.005", + "ask": "0.0055", + "open_interest": "1334.6", + "volume": "14343.48", + "strike": "55000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5567148", + "iv_ask": "0.568612", + "inverse": true }, { - "bid": "0.0130", - "ask": "0.0140", - "open_interest": "22490.0", - "volume": "3884.36", - "strike": "3500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.007", + "ask": "0.0075", + "open_interest": "562.1", + "volume": "14669.57", + "strike": "58000", + "maturity": "2026-06-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5270521", + "iv_ask": "0.5362689", + "inverse": true }, { - "bid": "0.3285", - "ask": "0.3410", - "open_interest": "8707.0", - "volume": "1699.81", - "strike": "3500.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.009", + "ask": "0.0095", + "open_interest": "4488.5", + "volume": "891477.33", + "strike": "60000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5120157", + "iv_ask": "0.5197543", + "inverse": true }, { "bid": "0.0105", "ask": "0.0115", - "open_interest": "7719.0", - "volume": "6366.67", - "strike": "3600.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.3630", - "ask": "0.3760", - "open_interest": "2118.0", - "volume": "925.35", - "strike": "3600.0000", - "maturity": "2026-03-27T08:00:00Z", + "open_interest": "975.9", + "volume": "46965.67", + "strike": "62000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0085", - "ask": "0.0095", - "open_interest": "5006.0", - "volume": "4160.62", - "strike": "3700.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4839094", + "iv_ask": "0.4973974", + "inverse": true }, { - "bid": "0.3990", - "ask": "0.4115", - "open_interest": "47.0", - "volume": "0.0", - "strike": "3700.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.0135", + "ask": "0.014", + "open_interest": "351.5", + "volume": "13461.97", + "strike": "64000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0070", - "ask": "0.0080", - "open_interest": "8235.0", - "volume": "9314.26", - "strike": "3800.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.47048", + "iv_ask": "0.476281", + "inverse": true }, { - "bid": "0.4340", - "ask": "0.4480", - "open_interest": "2026.0", - "volume": "0.0", - "strike": "3800.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.015", + "ask": "0.016", + "open_interest": "1857.7", + "volume": "376167.1", + "strike": "65000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4610231", + "iv_ask": "0.4717971", + "inverse": true }, { - "bid": "0.0055", - "ask": "0.0065", - "open_interest": "1601.0", - "volume": "2112.02", - "strike": "3900.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0049", - "ask": "0.0055", - "open_interest": "16718.0", - "volume": "29327.33", - "strike": "4000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.5070", - "ask": "0.5225", - "open_interest": "8666.0", - "volume": "0.0", - "strike": "4000.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.017", + "ask": "0.018", + "open_interest": "984.4", + "volume": "14762.43", + "strike": "66000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0041", - "ask": "0.0044", - "open_interest": "858.0", - "volume": "548.96", - "strike": "4100.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.455103", + "iv_ask": "0.4651352", + "inverse": true }, { - "bid": "0.0035", - "ask": "0.0040", - "open_interest": "6496.0", - "volume": "264.82", - "strike": "4200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0215", + "ask": "0.022", + "open_interest": "2331.5", + "volume": "15414.79", + "strike": "68000", + "maturity": "2026-06-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4418524", + "iv_ask": "0.4462776", + "inverse": true }, { - "bid": "0.5810", - "ask": "0.5965", - "open_interest": "757.0", - "volume": "0.0", - "strike": "4200.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.027", + "ask": "0.0275", + "open_interest": "2642.7", + "volume": "25180.56", + "strike": "70000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4289799", + "iv_ask": "0.4329336", + "inverse": true }, { - "bid": "0.0026", - "ask": "0.0030", - "open_interest": "5749.0", - "volume": "54.69", - "strike": "4400.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.034", + "ask": "0.035", + "open_interest": "1834.5", + "volume": "54826.62", + "strike": "72000", + "maturity": "2026-06-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4189497", + "iv_ask": "0.4261325", + "inverse": true }, { - "bid": "0.6550", - "ask": "0.6725", - "open_interest": "3228.0", - "volume": "0.0", - "strike": "4400.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.0425", + "ask": "0.0435", + "open_interest": "364.5", + "volume": "20003.28", + "strike": "74000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4101679", + "iv_ask": "0.4168459", + "inverse": true }, { - "bid": "0.0023", - "ask": "0.0026", - "open_interest": "15123.0", - "volume": "118.03", - "strike": "4500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0475", + "ask": "0.0485", + "open_interest": "2108.6", + "volume": "223992.04", + "strike": "75000", + "maturity": "2026-06-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4071464", + "iv_ask": "0.4136411", + "inverse": true }, { - "bid": "0.6925", - "ask": "0.7095", - "open_interest": "2600.0", - "volume": "0.0", - "strike": "4500.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.0525", + "ask": "0.0535", + "open_interest": "687.1", + "volume": "327012.65", + "strike": "76000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4016744", + "iv_ask": "0.4080308", + "inverse": true }, { - "bid": "0.0020", - "ask": "0.0023", - "open_interest": "4231.0", - "volume": "65.96", - "strike": "4600.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.0635", + "ask": "0.0645", + "open_interest": "1441.2", + "volume": "34976.14", + "strike": "78000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3960528", + "iv_ask": "0.4022545", + "inverse": true }, { - "bid": "0.7295", - "ask": "0.7470", - "open_interest": "242.0", - "volume": "0.0", - "strike": "4600.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0515", + "ask": "0.0525", + "open_interest": "3569.8", + "volume": "2513250", + "strike": "80000", + "maturity": "2026-06-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3907505", + "iv_ask": "0.3969573", + "inverse": true }, { - "bid": "0.0015", - "ask": "0.0019", - "open_interest": "4199.0", - "volume": "69.62", - "strike": "4800.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.0415", + "ask": "0.0425", + "open_interest": "628.9", + "volume": "54016.85", + "strike": "82000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3880683", + "iv_ask": "0.3944372", + "inverse": true }, { - "bid": "0.8045", - "ask": "0.8220", - "open_interest": "220.0", - "volume": "0.0", - "strike": "4800.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.033", + "ask": "0.0335", + "open_interest": "621.1", + "volume": "54173.91", + "strike": "84000", + "maturity": "2026-06-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3854263", + "iv_ask": "0.3887765", + "inverse": true }, { - "bid": "0.0011", - "ask": "0.0015", - "open_interest": "8050.0", - "volume": "172.95", - "strike": "5000.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.029", + "ask": "0.03", + "open_interest": "4113.3", + "volume": "793351.7", + "strike": "85000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3821867", + "iv_ask": "0.3891201", + "inverse": true }, { - "bid": "0.8795", - "ask": "0.8985", - "open_interest": "992.0", - "volume": "0.0", - "strike": "5000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0255", + "ask": "0.0265", + "open_interest": "380.4", + "volume": "6595.8", + "strike": "86000", + "maturity": "2026-06-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3800176", + "iv_ask": "0.3872386", + "inverse": true }, { - "bid": "0.0008", - "ask": "0.0013", - "open_interest": "8078.0", - "volume": "296.12", - "strike": "5200.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.02", + "ask": "0.0205", + "open_interest": "1700.4", + "volume": "1400183.63", + "strike": "88000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3800168", + "iv_ask": "0.3839904", + "inverse": true }, { - "bid": "0.9540", - "ask": "0.9735", - "open_interest": "284.0", - "volume": "0.0", - "strike": "5200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.015", + "ask": "0.016", + "open_interest": "6366.2", + "volume": "54063.27", + "strike": "90000", + "maturity": "2026-06-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3751772", + "iv_ask": "0.384126", + "inverse": true }, { - "bid": "0.0006", - "ask": "0.0011", - "open_interest": "3452.0", - "volume": "90.01", - "strike": "5400.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.0115", + "ask": "0.0125", + "open_interest": "165.3", + "volume": "18050.06", + "strike": "92000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3752646", + "iv_ask": "0.3854642", + "inverse": true }, { - "bid": "1.0280", - "ask": "1.0495", - "open_interest": "81.0", - "volume": "0.0", - "strike": "5400.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0075", + "ask": "0.008", + "open_interest": "3273.8", + "volume": "48362.74", + "strike": "95000", + "maturity": "2026-06-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3741708", + "iv_ask": "0.3806715", + "inverse": true }, { - "bid": "0.0006", - "ask": "0.0010", - "open_interest": "49199.0", - "volume": "75.47", - "strike": "5500.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.004", + "ask": "0.0042", + "open_interest": "3712.3", + "volume": "21691.86", + "strike": "100000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.382784", + "iv_ask": "0.3867213", + "inverse": true }, { - "bid": "1.0655", - "ask": "1.0870", - "open_interest": "156.0", - "volume": "0.0", - "strike": "5500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0021", + "ask": "0.0023", + "open_interest": "1825.8", + "volume": "8512.31", + "strike": "105000", + "maturity": "2026-06-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3902033", + "iv_ask": "0.3963578", + "inverse": true }, { - "bid": "0.0005", - "ask": "0.0009", - "open_interest": "1908.0", - "volume": "20.12", - "strike": "5600.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.0011", + "ask": "0.0014", + "open_interest": "1453.8", + "volume": "3311.61", + "strike": "110000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3972395", + "iv_ask": "0.4115515", + "inverse": true }, { - "bid": "1.1030", - "ask": "1.1260", - "open_interest": "44.0", - "volume": "0.0", - "strike": "5600.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0006", + "ask": "0.0008", + "open_interest": "2391.3", + "volume": "515.9", + "strike": "115000", + "maturity": "2026-06-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4058538", + "iv_ask": "0.4210114", + "inverse": true }, { "bid": "0.0004", "ask": "0.0007", - "open_interest": "4698.0", - "volume": "49.7", - "strike": "5800.0000", - "maturity": "2026-03-27T08:00:00Z", + "open_interest": "2121.6", + "volume": "3.89", + "strike": "120000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "1.1780", - "ask": "1.2005", - "open_interest": "16.0", - "volume": "0.0", - "strike": "5800.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4228396", + "iv_ask": "0.4519006", + "inverse": true }, { "bid": "0.0003", - "ask": "0.0007", - "open_interest": "9987.0", - "volume": "1.91", - "strike": "6000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "1.2535", - "ask": "1.2775", - "open_interest": "2.0", - "volume": "0.0", - "strike": "6000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0002", "ask": "0.0006", - "open_interest": "2260.0", - "volume": "2.18", - "strike": "6200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "1.3280", - "ask": "1.3520", - "open_interest": "4.0", - "volume": "0.0", - "strike": "6200.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0002", - "ask": "0.0005", - "open_interest": "3778.0", - "volume": "10.76", - "strike": "6400.0000", - "maturity": "2026-03-27T08:00:00Z", + "open_interest": "1877.2", + "volume": "0", + "strike": "125000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4431012", + "iv_ask": "0.4789481", + "inverse": true }, { "bid": "0.0003", - "ask": "0.0005", - "open_interest": "53376.0", - "volume": "1.08", - "strike": "6500.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0002", - "ask": "0.0005", - "open_interest": "1457.0", - "volume": "4.07", - "strike": "6600.0000", - "maturity": "2026-03-27T08:00:00Z", + "ask": "0.0004", + "open_interest": "1532.4", + "volume": "64.54", + "strike": "130000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4749204", + "iv_ask": "0.4897225", + "inverse": true }, { "bid": "0.0002", - "ask": "0.0005", - "open_interest": "1969.0", - "volume": "0.0", - "strike": "6800.0000", - "maturity": "2026-03-27T08:00:00Z", + "ask": "0.0003", + "open_interest": "819.1", + "volume": "2.33", + "strike": "135000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4852468", + "iv_ask": "0.5052415", + "inverse": true }, { - "bid": "0.0002", - "ask": "0.0004", - "open_interest": "14068.0", - "volume": "0.0", - "strike": "7000.0000", - "maturity": "2026-03-27T08:00:00Z", + "bid": "0.0001", + "ask": "0.0003", + "open_interest": "742.6", + "volume": "128.7", + "strike": "140000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4820369", + "iv_ask": "0.5342025", + "inverse": true }, { "bid": "0.0001", - "ask": "0.0003", - "open_interest": "3116.0", - "volume": "0.0", - "strike": "7500.0000", - "maturity": "2026-03-27T08:00:00Z", + "ask": "0.0002", + "open_interest": "595.4", + "volume": "14.21", + "strike": "145000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5076161", + "iv_ask": "0.5401968", + "inverse": true }, { "bid": "0.0001", "ask": "0.0003", - "open_interest": "6360.0", - "volume": "0.0", - "strike": "8000.0000", - "maturity": "2026-03-27T08:00:00Z", + "open_interest": "2595.8", + "volume": "0", + "strike": "150000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" - }, - { - "bid": "2.0010", - "ask": "2.0365", - "open_interest": "506.0", - "volume": "0.0", - "strike": "8000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5321674", + "iv_ask": "0.588503", + "inverse": true }, { "bid": "0.0001", "ask": "0.0003", - "open_interest": "2367.0", - "volume": "0.0", - "strike": "8500.0000", - "maturity": "2026-03-27T08:00:00Z", + "open_interest": "254.9", + "volume": "0", + "strike": "155000", + "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5557704", + "iv_ask": "0.6140355", + "inverse": true }, { "bid": "0.0001", "ask": "0.0002", - "open_interest": "3739.0", - "volume": "0.0", - "strike": "9000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "2.7485", - "ask": "2.7965", - "open_interest": "11.0", - "volume": "0.0", - "strike": "10000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "3.5000", - "ask": "3.5565", - "open_interest": "21.0", - "volume": "0.0", - "strike": "12000.0000", - "maturity": "2026-03-27T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "2672.25", - "ask": "2672.75", - "open_interest": "53720583", - "volume": "2902678.0", - "maturity": "2026-06-26T08:00:00Z", - "security_type": "forward" - }, - { - "bid": "0.8120", - "ask": "0.8140", - "open_interest": "334.0", - "volume": "0.0", - "strike": "500.0000", + "open_interest": "1221.2", + "volume": "0", + "strike": "160000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5784956", + "iv_ask": "0.6145991", + "inverse": true }, { - "bid": "0.0002", - "ask": "0.0003", - "open_interest": "26674.0", - "volume": "0.0", - "strike": "500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.6275", - "ask": "0.6310", - "open_interest": "494.0", - "volume": "0.0", - "strike": "1000.0000", + "bid": "0.0001", + "ask": "0.0002", + "open_interest": "177", + "volume": "0", + "strike": "165000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6004055", + "iv_ask": "0.6375765", + "inverse": true }, { - "bid": "0.0034", - "ask": "0.0041", - "open_interest": "7717.0", - "volume": "769.28", - "strike": "1000.0000", + "bid": "0.0001", + "ask": "0.0002", + "open_interest": "753.2", + "volume": "0", + "strike": "170000", "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.6215564", + "iv_ask": "0.6597485", + "inverse": true }, { - "bid": "0.4520", - "ask": "0.4565", - "open_interest": "18.0", - "volume": "0.0", - "strike": "1500.0000", + "bid": "0.0001", + "ask": "0.0002", + "open_interest": "1178.8", + "volume": "0", + "strike": "180000", "maturity": "2026-06-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.661777", + "iv_ask": "0.7018874", + "inverse": true }, { - "bid": "0.0155", - "ask": "0.0170", - "open_interest": "7398.0", - "volume": "4300.45", - "strike": "1500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "78012.0", + "ask": "78185.5", + "open_interest": "0", + "volume": "0", + "maturity": "2026-07-31T08:00:00Z", + "security_type": "forward" }, { - "bid": "0.0315", - "ask": "0.0335", - "open_interest": "52.0", - "volume": "540.84", - "strike": "1800.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0125", + "ask": "0.0135", + "open_interest": "43.1", + "volume": "1405.02", + "strike": "58000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4928138", + "iv_ask": "0.5042139", + "inverse": true }, { - "bid": "0.2975", - "ask": "0.3030", - "open_interest": "492.0", - "volume": "883.07", - "strike": "2000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.0485", - "ask": "0.0505", - "open_interest": "18245.0", - "volume": "3418.78", - "strike": "2000.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0155", + "ask": "0.0165", + "open_interest": "38.6", + "volume": "13565.91", + "strike": "60000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.2465", - "ask": "0.2515", - "open_interest": "82.0", - "volume": "0.0", - "strike": "2200.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4816157", + "iv_ask": "0.4915485", + "inverse": true }, { - "bid": "0.0715", - "ask": "0.0740", - "open_interest": "16099.0", - "volume": "55438.45", - "strike": "2200.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.019", + "ask": "0.0195", + "open_interest": "67.2", + "volume": "53391.07", + "strike": "62000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.2010", - "ask": "0.2065", - "open_interest": "7.0", - "volume": "542.17", - "strike": "2400.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4699701", + "iv_ask": "0.4743675", + "inverse": true }, { - "bid": "0.1010", - "ask": "0.1035", - "open_interest": "2949.0", - "volume": "49608.68", - "strike": "2400.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.023", + "ask": "0.0235", + "open_interest": "17.3", + "volume": "1552.84", + "strike": "64000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.457463", + "iv_ask": "0.4613839", + "inverse": true }, { - "bid": "0.1830", - "ask": "0.1860", - "open_interest": "625.0", - "volume": "0.0", - "strike": "2500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1185", - "ask": "0.1210", - "open_interest": "3375.0", - "volume": "1502.29", - "strike": "2500.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.028", + "ask": "0.0285", + "open_interest": "8.8", + "volume": "640.92", + "strike": "66000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.1645", - "ask": "0.1675", - "open_interest": "1357.0", - "volume": "2947.94", - "strike": "2600.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4473491", + "iv_ask": "0.4508734", + "inverse": true }, { - "bid": "0.1375", - "ask": "0.1400", - "open_interest": "18710.0", - "volume": "15566.93", - "strike": "2600.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0305", + "ask": "0.0315", + "open_interest": "49.5", + "volume": "1903.78", + "strike": "67000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4402805", + "iv_ask": "0.4469974", + "inverse": true }, { - "bid": "0.1325", - "ask": "0.1350", - "open_interest": "4936.0", - "volume": "553375.49", - "strike": "2800.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.1800", - "ask": "0.1830", - "open_interest": "4566.0", - "volume": "21016.1", - "strike": "2800.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0335", + "ask": "0.0345", + "open_interest": "26.5", + "volume": "238.29", + "strike": "68000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.1060", - "ask": "0.1085", - "open_interest": "4995.0", - "volume": "530361.8", - "strike": "3000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4352386", + "iv_ask": "0.441658", + "inverse": true }, { - "bid": "0.2275", - "ask": "0.2350", - "open_interest": "13780.0", - "volume": "7194.75", - "strike": "3000.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.037", + "ask": "0.038", + "open_interest": "26.9", + "volume": "262.04", + "strike": "69000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0845", - "ask": "0.0865", - "open_interest": "2511.0", - "volume": "149706.39", - "strike": "3200.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4318989", + "iv_ask": "0.4380467", + "inverse": true }, { - "bid": "0.2810", - "ask": "0.2840", - "open_interest": "2558.0", - "volume": "0.0", - "strike": "3200.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0405", + "ask": "0.0415", + "open_interest": "20.1", + "volume": "16806.44", + "strike": "70000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0675", - "ask": "0.0695", - "open_interest": "2228.0", - "volume": "3211.07", - "strike": "3400.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4270392", + "iv_ask": "0.4329541", + "inverse": true }, { - "bid": "0.3325", - "ask": "0.3465", - "open_interest": "6002.0", - "volume": "0.0", - "strike": "3400.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0445", + "ask": "0.0455", + "open_interest": "0.2", + "volume": "666.55", + "strike": "71000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4236284", + "iv_ask": "0.4293353", + "inverse": true }, { - "bid": "0.0600", - "ask": "0.0625", - "open_interest": "2832.0", - "volume": "71023.55", - "strike": "3500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.3620", - "ask": "0.3775", - "open_interest": "4075.0", - "volume": "0.0", - "strike": "3500.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.049", + "ask": "0.05", + "open_interest": "3.2", + "volume": "361.22", + "strike": "72000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4214726", + "iv_ask": "0.4269974", + "inverse": true }, { "bid": "0.0535", - "ask": "0.0560", - "open_interest": "3765.0", - "volume": "60049.47", - "strike": "3600.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.3930", - "ask": "0.4085", - "open_interest": "2592.0", - "volume": "0.0", - "strike": "3600.0000", - "maturity": "2026-06-26T08:00:00Z", + "ask": "0.0545", + "open_interest": "0.3", + "volume": "1240.9", + "strike": "73000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0430", - "ask": "0.0450", - "open_interest": "1032.0", - "volume": "6235.32", - "strike": "3800.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4177374", + "iv_ask": "0.4231095", + "inverse": true }, { - "bid": "0.4565", - "ask": "0.4730", - "open_interest": "1190.0", - "volume": "0.0", - "strike": "3800.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0585", + "ask": "0.0595", + "open_interest": "8.5", + "volume": "0", + "strike": "74000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0345", - "ask": "0.0365", - "open_interest": "8019.0", - "volume": "27453.46", - "strike": "4000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4151357", + "iv_ask": "0.4203781", + "inverse": true }, { - "bid": "0.5225", - "ask": "0.5415", - "open_interest": "3990.0", - "volume": "0.0", - "strike": "4000.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0635", + "ask": "0.0645", + "open_interest": "2.2", + "volume": "471.15", + "strike": "75000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4109944", + "iv_ask": "0.416131", + "inverse": true }, { - "bid": "0.0280", - "ask": "0.0300", - "open_interest": "5251.0", - "volume": "2763.51", - "strike": "4200.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" - }, - { - "bid": "0.5900", - "ask": "0.6085", - "open_interest": "2111.0", - "volume": "0.0", - "strike": "4200.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.069", + "ask": "0.0705", + "open_interest": "0.3", + "volume": "1030.72", + "strike": "76000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4078978", + "iv_ask": "0.4154751", + "inverse": true }, { - "bid": "0.0230", - "ask": "0.0250", - "open_interest": "4234.0", - "volume": "119.77", - "strike": "4400.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.075", + "ask": "0.0765", + "open_interest": "8.2", + "volume": "46759.25", + "strike": "77000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4057753", + "iv_ask": "0.413257", + "inverse": true }, { - "bid": "0.6590", - "ask": "0.6785", - "open_interest": "4317.0", - "volume": "0.0", - "strike": "4400.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0815", + "ask": "0.0825", + "open_interest": "24", + "volume": "0", + "strike": "78000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.404587", + "iv_ask": "0.4095311", + "inverse": true }, { - "bid": "0.0210", - "ask": "0.0225", - "open_interest": "3921.0", - "volume": "8394.82", - "strike": "4500.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0765", + "ask": "0.0775", + "open_interest": "0", + "volume": "0", + "strike": "79000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4020575", + "iv_ask": "0.4069774", + "inverse": true }, { - "bid": "0.6940", - "ask": "0.7155", - "open_interest": "411.0", - "volume": "0.0", - "strike": "4500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0705", + "ask": "0.0715", + "open_interest": "138.9", + "volume": "267403.7", + "strike": "80000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3993124", + "iv_ask": "0.4042273", + "inverse": true + }, + { + "bid": "0.065", + "ask": "0.066", + "open_interest": "0.1", + "volume": "0", + "strike": "81000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3975185", + "iv_ask": "0.4024473", + "inverse": true + }, + { + "bid": "0.06", + "ask": "0.061", + "open_interest": "13.9", + "volume": "0", + "strike": "82000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3967051", + "iv_ask": "0.4016662", + "inverse": true + }, + { + "bid": "0.055", + "ask": "0.056", + "open_interest": "2", + "volume": "4581.03", + "strike": "83000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3944221", + "iv_ask": "0.3994351", + "inverse": true + }, + { + "bid": "0.0505", + "ask": "0.0515", + "open_interest": "1.1", + "volume": "0", + "strike": "84000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3931913", + "iv_ask": "0.3982745", + "inverse": true + }, + { + "bid": "0.046", + "ask": "0.0475", + "open_interest": "3.5", + "volume": "0", + "strike": "85000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3905105", + "iv_ask": "0.3982701", + "inverse": true + }, + { + "bid": "0.042", + "ask": "0.0435", + "open_interest": "3.5", + "volume": "12678.25", + "strike": "86000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3889773", + "iv_ask": "0.3969027", + "inverse": true }, { - "bid": "0.0190", - "ask": "0.0205", - "open_interest": "4309.0", - "volume": "0.0", - "strike": "4600.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0385", + "ask": "0.0395", + "open_interest": "5", + "volume": "16185.96", + "strike": "87000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3887166", + "iv_ask": "0.3941323", + "inverse": true }, { - "bid": "0.7295", - "ask": "0.7495", - "open_interest": "3460.0", - "volume": "0.0", - "strike": "4600.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" - }, - { - "bid": "0.0160", - "ask": "0.0175", - "open_interest": "745.0", - "volume": "0.0", - "strike": "4800.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.035", + "ask": "0.036", + "open_interest": "0.5", + "volume": "841.8", + "strike": "88000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3870983", + "iv_ask": "0.3926691", + "inverse": true }, { - "bid": "0.8005", - "ask": "0.8215", - "open_interest": "340.0", - "volume": "0.0", - "strike": "4800.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.032", + "ask": "0.033", + "open_interest": "1.2", + "volume": "0", + "strike": "89000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3869391", + "iv_ask": "0.3926805", + "inverse": true }, { - "bid": "0.0135", - "ask": "0.0150", - "open_interest": "16134.0", - "volume": "380964.1", - "strike": "5000.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.029", + "ask": "0.03", + "open_interest": "334.3", + "volume": "702111.4", + "strike": "90000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3854712", + "iv_ask": "0.3914152", + "inverse": true }, { - "bid": "0.8720", - "ask": "0.8965", - "open_interest": "433.0", - "volume": "11543.83", - "strike": "5000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0265", + "ask": "0.0275", + "open_interest": "5", + "volume": "0", + "strike": "91000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3857126", + "iv_ask": "0.391871", + "inverse": true }, { - "bid": "0.0110", - "ask": "0.0125", - "open_interest": "2305.0", - "volume": "0.0", - "strike": "5200.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.024", + "ask": "0.025", + "open_interest": "5.2", + "volume": "0", + "strike": "92000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3847205", + "iv_ask": "0.3911306", + "inverse": true }, { - "bid": "0.9440", - "ask": "0.9675", - "open_interest": "360.0", - "volume": "0.0", - "strike": "5200.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0215", + "ask": "0.0225", + "open_interest": "0", + "volume": "0", + "strike": "93000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3824065", + "iv_ask": "0.3891159", + "inverse": true }, { - "bid": "0.0095", - "ask": "0.0110", - "open_interest": "767.0", - "volume": "27.31", - "strike": "5400.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0195", + "ask": "0.0205", + "open_interest": "68.4", + "volume": "81762.95", + "strike": "94000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3821924", + "iv_ask": "0.3892072", + "inverse": true }, { - "bid": "1.0165", - "ask": "1.0435", - "open_interest": "15.0", - "volume": "0.0", - "strike": "5400.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.016", + "ask": "0.0165", + "open_interest": "19.9", + "volume": "133149.86", + "strike": "96000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3819147", + "iv_ask": "0.3857958", + "inverse": true }, { - "bid": "0.0090", - "ask": "0.0105", - "open_interest": "45069.0", - "volume": "728.82", - "strike": "5500.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.013", + "ask": "0.014", + "open_interest": "1018.5", + "volume": "15984.97", + "strike": "98000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3810492", + "iv_ask": "0.3896375", + "inverse": true }, { - "bid": "1.0530", - "ask": "1.0805", - "open_interest": "20.0", - "volume": "0.0", - "strike": "5500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0105", + "ask": "0.011", + "open_interest": "33.2", + "volume": "17857.78", + "strike": "100000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3801337", + "iv_ask": "0.3850011", + "inverse": true }, { - "bid": "0.0080", + "bid": "0.0085", "ask": "0.0095", - "open_interest": "1322.0", - "volume": "256.16", - "strike": "5600.0000", - "maturity": "2026-06-26T08:00:00Z", + "open_interest": "9.2", + "volume": "4041.41", + "strike": "102000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.379947", + "iv_ask": "0.3908171", + "inverse": true }, { - "bid": "0.0070", - "ask": "0.0085", - "open_interest": "665.0", - "volume": "20.48", - "strike": "5800.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.007", + "ask": "0.008", + "open_interest": "11.4", + "volume": "96898.84", + "strike": "104000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3816213", + "iv_ask": "0.3938358", + "inverse": true }, { - "bid": "1.1625", - "ask": "1.1920", - "open_interest": "44.0", - "volume": "0.0", - "strike": "5800.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0055", + "ask": "0.0065", + "open_interest": "12.9", + "volume": "1866.75", + "strike": "106000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3795041", + "iv_ask": "0.3935809", + "inverse": true }, { - "bid": "0.0060", - "ask": "0.0075", - "open_interest": "6485.0", - "volume": "19.18", - "strike": "6000.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.004", + "ask": "0.0043", + "open_interest": "34", + "volume": "490.85", + "strike": "110000", + "maturity": "2026-07-31T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3885566", + "iv_ask": "0.3940005", + "inverse": true }, { - "bid": "1.2360", - "ask": "1.2665", - "open_interest": "5.0", - "volume": "0.0", - "strike": "6000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0024", + "ask": "0.0029", + "open_interest": "11.1", + "volume": "497.37", + "strike": "115000", + "maturity": "2026-07-31T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3910344", + "iv_ask": "0.4036299", + "inverse": true }, { - "bid": "0.0055", - "ask": "0.0065", - "open_interest": "1062.0", - "volume": "0.0", - "strike": "6200.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "78407.5", + "ask": "78410", + "open_interest": "276427820", + "volume": "7071210", + "maturity": "2026-09-25T08:00:00Z", + "security_type": "forward" }, { - "bid": "1.3095", - "ask": "1.3410", - "open_interest": "18.0", - "volume": "0.0", - "strike": "6200.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0023", + "ask": "0.0027", + "open_interest": "1576.9", + "volume": "103.03", + "strike": "30000", + "maturity": "2026-09-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.7387981", + "iv_ask": "0.7578277", + "inverse": true }, { - "bid": "0.0050", - "ask": "0.0060", - "open_interest": "689.0", - "volume": "0.0", - "strike": "6400.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0036", + "ask": "0.004", + "open_interest": "543.3", + "volume": "544.4", + "strike": "35000", + "maturity": "2026-09-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.6780532", + "iv_ask": "0.6908654", + "inverse": true }, { - "bid": "1.3830", - "ask": "1.4130", - "open_interest": "31.0", - "volume": "0.0", - "strike": "6400.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0055", + "ask": "0.006", + "open_interest": "1844.5", + "volume": "357.77", + "strike": "40000", + "maturity": "2026-09-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6249601", + "iv_ask": "0.6360055", + "inverse": true }, { - "bid": "0.0047", - "ask": "0.0055", - "open_interest": "37688.0", - "volume": "0.0", - "strike": "6500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.008", + "ask": "0.0085", + "open_interest": "1676.4", + "volume": "444.41", + "strike": "45000", + "maturity": "2026-09-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5737061", + "iv_ask": "0.5817025", + "inverse": true }, { - "bid": "1.4195", - "ask": "1.4505", - "open_interest": "60.0", - "volume": "0.0", - "strike": "6500.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.012", + "ask": "0.013", + "open_interest": "3174", + "volume": "14910.53", + "strike": "50000", + "maturity": "2026-09-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5328755", + "iv_ask": "0.5443926", + "inverse": true }, { - "bid": "0.0044", - "ask": "0.0055", - "open_interest": "1218.0", - "volume": "4259.41", - "strike": "6600.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0185", + "ask": "0.0195", + "open_interest": "1520.4", + "volume": "12538.34", + "strike": "55000", + "maturity": "2026-09-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5023818", + "iv_ask": "0.5109083", + "inverse": true }, { - "bid": "0.0040", - "ask": "0.0047", - "open_interest": "933.0", - "volume": "0.0", - "strike": "6800.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.02", + "ask": "0.021", + "open_interest": "102.9", + "volume": "713.74", + "strike": "56000", + "maturity": "2026-09-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4957369", + "iv_ask": "0.5038211", + "inverse": true }, { - "bid": "1.5300", - "ask": "1.5660", - "open_interest": "1.0", - "volume": "0.0", - "strike": "6800.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0235", + "ask": "0.0245", + "open_interest": "551.9", + "volume": "174.49", + "strike": "58000", + "maturity": "2026-09-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4840656", + "iv_ask": "0.4913477", + "inverse": true }, { - "bid": "0.0036", - "ask": "0.0043", - "open_interest": "6490.0", - "volume": "0.0", - "strike": "7000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0275", + "ask": "0.0285", + "open_interest": "3852.1", + "volume": "27987.2", + "strike": "60000", + "maturity": "2026-09-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4727332", + "iv_ask": "0.4793387", + "inverse": true }, { - "bid": "0.0032", - "ask": "0.0039", - "open_interest": "1068.0", - "volume": "19.95", - "strike": "7200.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0325", + "ask": "0.0335", + "open_interest": "719.5", + "volume": "11432.55", + "strike": "62000", + "maturity": "2026-09-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4644218", + "iv_ask": "0.470436", + "inverse": true }, { - "bid": "1.6775", - "ask": "1.7160", - "open_interest": "76.0", - "volume": "0.0", - "strike": "7200.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.038", + "ask": "0.039", + "open_interest": "212.7", + "volume": "1163.89", + "strike": "64000", + "maturity": "2026-09-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4553685", + "iv_ask": "0.4608988", + "inverse": true }, { - "bid": "0.0029", - "ask": "0.0036", - "open_interest": "2242.0", - "volume": "0.0", - "strike": "7400.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0415", + "ask": "0.0425", + "open_interest": "460.2", + "volume": "7438.92", + "strike": "65000", + "maturity": "2026-09-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.453539", + "iv_ask": "0.4588471", + "inverse": true }, { - "bid": "0.0027", - "ask": "0.0034", - "open_interest": "1289.0", - "volume": "3921.85", - "strike": "7500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0445", + "ask": "0.0455", + "open_interest": "114.2", + "volume": "656.41", + "strike": "66000", + "maturity": "2026-09-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.448075", + "iv_ask": "0.4531978", + "inverse": true }, { - "bid": "0.0021", - "ask": "0.0028", - "open_interest": "1908.0", - "volume": "51.21", - "strike": "8000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.052", + "ask": "0.053", + "open_interest": "576.2", + "volume": "2371.39", + "strike": "68000", + "maturity": "2026-09-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.441974", + "iv_ask": "0.4467614", + "inverse": true }, { - "bid": "0.0017", - "ask": "0.0023", - "open_interest": "4017.0", - "volume": "7283.62", - "strike": "8500.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0605", + "ask": "0.0615", + "open_interest": "1487.2", + "volume": "64675.18", + "strike": "70000", + "maturity": "2026-09-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4366797", + "iv_ask": "0.4411965", + "inverse": true }, { - "bid": "0.0014", - "ask": "0.0019", - "open_interest": "9538.0", - "volume": "0.0", - "strike": "9000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0695", + "ask": "0.071", + "open_interest": "261.1", + "volume": "31282.09", + "strike": "72000", + "maturity": "2026-09-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4297844", + "iv_ask": "0.4362407", + "inverse": true }, { - "bid": "0.0009", - "ask": "0.0014", - "open_interest": "2018.0", - "volume": "0.0", - "strike": "10000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.08", + "ask": "0.081", + "open_interest": "68.6", + "volume": "6700.79", + "strike": "74000", + "maturity": "2026-09-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4255159", + "iv_ask": "0.4296568", + "inverse": true }, { - "bid": "0.0006", - "ask": "0.0011", - "open_interest": "1832.0", - "volume": "0.0", - "strike": "11000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0855", + "ask": "0.0865", + "open_interest": "3022.8", + "volume": "670604", + "strike": "75000", + "maturity": "2026-09-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4229795", + "iv_ask": "0.4270557", + "inverse": true }, { - "bid": "0.0004", - "ask": "0.0009", - "open_interest": "3617.0", - "volume": "0.0", - "strike": "12000.0000", - "maturity": "2026-06-26T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.091", + "ask": "0.0925", + "open_interest": "369.5", + "volume": "0", + "strike": "76000", + "maturity": "2026-09-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4195139", + "iv_ask": "0.425547", + "inverse": true }, { - "bid": "3.4510", - "ask": "3.5215", - "open_interest": "55.0", - "volume": "0.0", - "strike": "12000.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.1035", + "ask": "0.1045", + "open_interest": "252.9", + "volume": "368973.54", + "strike": "78000", + "maturity": "2026-09-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4158037", + "iv_ask": "0.4197477", + "inverse": true }, { - "bid": "0.0002", - "ask": "0.0007", - "open_interest": "3262.0", - "volume": "0.0", - "strike": "13000.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.0965", + "ask": "0.0975", + "open_interest": "1788", + "volume": "303998.18", + "strike": "80000", + "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4115207", + "iv_ask": "0.4154247", + "inverse": true }, { - "bid": "0.0001", - "ask": "0.0006", - "open_interest": "3571.0", - "volume": "0.0", - "strike": "14000.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.086", + "ask": "0.087", + "open_interest": "985.2", + "volume": "0", + "strike": "82000", + "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4102988", + "iv_ask": "0.414199", + "inverse": true }, { - "bid": "0.0001", - "ask": "0.0004", - "open_interest": "2736.0", - "volume": "0.0", - "strike": "15000.0000", - "maturity": "2026-06-26T08:00:00Z", + "bid": "0.076", + "ask": "0.077", + "open_interest": "570.9", + "volume": "12082.44", + "strike": "84000", + "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4075023", + "iv_ask": "0.411433", + "inverse": true }, { - "bid": "2698.00", - "ask": "2699.75", - "open_interest": "23582530", - "volume": "3549252.0", + "bid": "0.071", + "ask": "0.0725", + "open_interest": "589.4", + "volume": "17080.56", + "strike": "85000", "maturity": "2026-09-25T08:00:00Z", - "security_type": "forward" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4047999", + "iv_ask": "0.4107383", + "inverse": true }, { - "bid": "0.6355", - "ask": "0.6415", - "open_interest": "55.0", - "volume": "0.0", - "strike": "1000.0000", + "bid": "0.067", + "ask": "0.068", + "open_interest": "448", + "volume": "0", + "strike": "86000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4052159", + "iv_ask": "0.4092107", + "inverse": true }, { - "bid": "0.0085", - "ask": "0.0100", - "open_interest": "1564.0", - "volume": "1981.77", - "strike": "1000.0000", + "bid": "0.059", + "ask": "0.06", + "open_interest": "306.5", + "volume": "0", + "strike": "88000", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4036245", + "iv_ask": "0.4077164", + "inverse": true }, { - "bid": "0.4730", - "ask": "0.4790", - "open_interest": "4.0", - "volume": "0.0", - "strike": "1500.0000", + "bid": "0.0515", + "ask": "0.0525", + "open_interest": "1433.9", + "volume": "4157939.27", + "strike": "90000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4008612", + "iv_ask": "0.4050876", + "inverse": true }, { - "bid": "0.0305", - "ask": "0.0330", - "open_interest": "6296.0", - "volume": "1536.16", - "strike": "1500.0000", + "bid": "0.045", + "ask": "0.046", + "open_interest": "307.8", + "volume": "43549.7", + "strike": "92000", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3991974", + "iv_ask": "0.4035926", + "inverse": true }, { - "bid": "0.0555", - "ask": "0.0580", - "open_interest": "19.0", - "volume": "0.0", - "strike": "1800.0000", + "bid": "0.0395", + "ask": "0.04", + "open_interest": "89.7", + "volume": "60443.34", + "strike": "94000", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3989996", + "iv_ask": "0.4013002", + "inverse": true }, { - "bid": "0.3365", - "ask": "0.3420", - "open_interest": "243.0", - "volume": "0.0", - "strike": "2000.0000", + "bid": "0.0365", + "ask": "0.0375", + "open_interest": "482.3", + "volume": "54697.29", + "strike": "95000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3966385", + "iv_ask": "0.4013613", + "inverse": true }, { - "bid": "0.0780", - "ask": "0.0810", - "open_interest": "9845.0", - "volume": "2708.42", - "strike": "2000.0000", + "bid": "0.034", + "ask": "0.035", + "open_interest": "114.4", + "volume": "1963.53", + "strike": "96000", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3958875", + "iv_ask": "0.4007404", + "inverse": true }, { - "bid": "0.2900", - "ask": "0.2965", - "open_interest": "105.0", - "volume": "0.0", - "strike": "2200.0000", + "bid": "0.0295", + "ask": "0.0305", + "open_interest": "82.9", + "volume": "37404.99", + "strike": "98000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3947589", + "iv_ask": "0.3999035", + "inverse": true }, { - "bid": "0.1060", - "ask": "0.1095", - "open_interest": "3198.0", - "volume": "549.96", - "strike": "2200.0000", + "bid": "0.0255", + "ask": "0.0265", + "open_interest": "3607.7", + "volume": "25051.74", + "strike": "100000", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3935173", + "iv_ask": "0.3990043", + "inverse": true }, { - "bid": "0.2505", - "ask": "0.2550", - "open_interest": "36.0", - "volume": "0.0", - "strike": "2400.0000", + "bid": "0.018", + "ask": "0.0185", + "open_interest": "1003.3", + "volume": "41824.99", + "strike": "105000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3938507", + "iv_ask": "0.3971326", + "inverse": true }, { - "bid": "0.1395", - "ask": "0.1435", - "open_interest": "1947.0", - "volume": "0.0", - "strike": "2400.0000", + "bid": "0.0125", + "ask": "0.013", + "open_interest": "1752.4", + "volume": "24687.25", + "strike": "110000", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.3933668", + "iv_ask": "0.3973912", + "inverse": true }, { - "bid": "0.2320", - "ask": "0.2365", - "open_interest": "23.0", - "volume": "669.88", - "strike": "2500.0000", + "bid": "0.0085", + "ask": "0.009", + "open_interest": "2039.5", + "volume": "14708.22", + "strike": "115000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.3918607", + "iv_ask": "0.3969331", + "inverse": true }, { - "bid": "0.1580", - "ask": "0.1625", - "open_interest": "2767.0", - "volume": "836.69", - "strike": "2500.0000", + "bid": "0.0065", + "ask": "0.007", + "open_interest": "922.8", + "volume": "2026.33", + "strike": "120000", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4004925", + "iv_ask": "0.4065865", + "inverse": true }, { - "bid": "0.2145", - "ask": "0.2190", - "open_interest": "61.0", - "volume": "31550.33", - "strike": "2600.0000", + "bid": "0.0047", + "ask": "0.0055", + "open_interest": "2218.4", + "volume": "203.19", + "strike": "125000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4038175", + "iv_ask": "0.4157425", + "inverse": true }, { - "bid": "0.1780", - "ask": "0.1825", - "open_interest": "8624.0", - "volume": "0.0", - "strike": "2600.0000", + "bid": "0.0036", + "ask": "0.0038", + "open_interest": "2226.1", + "volume": "351.74", + "strike": "130000", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4107317", + "iv_ask": "0.4144832", + "inverse": true }, { - "bid": "0.1840", - "ask": "0.1880", - "open_interest": "562.0", - "volume": "90868.82", - "strike": "2800.0000", + "bid": "0.0027", + "ask": "0.0031", + "open_interest": "146.6", + "volume": "2608.55", + "strike": "135000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4154483", + "iv_ask": "0.4245169", + "inverse": true }, { - "bid": "0.2210", - "ask": "0.2255", - "open_interest": "1295.0", - "volume": "0.0", - "strike": "2800.0000", + "bid": "0.0021", + "ask": "0.0025", + "open_interest": "1134.5", + "volume": "4327.41", + "strike": "140000", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4218051", + "iv_ask": "0.432708", + "inverse": true }, { - "bid": "0.1575", - "ask": "0.1615", - "open_interest": "397.0", - "volume": "0.0", - "strike": "3000.0000", + "bid": "0.0017", + "ask": "0.002", + "open_interest": "475.8", + "volume": "0", + "strike": "145000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4297655", + "iv_ask": "0.4395167", + "inverse": true }, { - "bid": "0.2665", - "ask": "0.2760", - "open_interest": "6484.0", - "volume": "0.0", - "strike": "3000.0000", + "bid": "0.0013", + "ask": "0.0015", + "open_interest": "542.4", + "volume": "35.08", + "strike": "150000", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4337369", + "iv_ask": "0.4418277", + "inverse": true }, { - "bid": "0.1345", - "ask": "0.1385", - "open_interest": "1116.0", - "volume": "0.0", - "strike": "3200.0000", + "bid": "0.0011", + "ask": "0.0013", + "open_interest": "316.7", + "volume": "10.28", + "strike": "155000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4426635", + "iv_ask": "0.4519309", + "inverse": true }, { - "bid": "0.3165", - "ask": "0.3295", - "open_interest": "1436.0", - "volume": "0.0", - "strike": "3200.0000", + "bid": "0.0009", + "ask": "0.0012", + "open_interest": "830.5", + "volume": "7.84", + "strike": "160000", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4490589", + "iv_ask": "0.4647861", + "inverse": true }, { - "bid": "0.1155", - "ask": "0.1190", - "open_interest": "3707.0", - "volume": "0.0", - "strike": "3400.0000", + "bid": "0.0008", + "ask": "0.0012", + "open_interest": "127.7", + "volume": "0", + "strike": "165000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4591254", + "iv_ask": "0.4814855", + "inverse": true }, { - "bid": "0.3645", - "ask": "0.3915", - "open_interest": "1084.0", - "volume": "1983.02", - "strike": "3400.0000", + "bid": "0.0006", + "ask": "0.0009", + "open_interest": "368.9", + "volume": "0", + "strike": "170000", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4599512", + "iv_ask": "0.4810538", + "inverse": true }, { - "bid": "0.1070", - "ask": "0.1100", - "open_interest": "10484.0", - "volume": "1623.79", - "strike": "3500.0000", + "bid": "0.0005", + "ask": "0.0007", + "open_interest": "1412", + "volume": "18.81", + "strike": "175000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4656563", + "iv_ask": "0.4825423", + "inverse": true }, { - "bid": "0.3925", - "ask": "0.4200", - "open_interest": "908.0", - "volume": "0.0", - "strike": "3500.0000", + "bid": "0.0004", + "ask": "0.0008", + "open_interest": "751.7", + "volume": "3.91", + "strike": "180000", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.468996", + "iv_ask": "0.5041863", + "inverse": true }, { - "bid": "0.0990", - "ask": "0.1025", - "open_interest": "952.0", - "volume": "5604.54", - "strike": "3600.0000", + "bid": "0.0003", + "ask": "0.0007", + "open_interest": "824.3", + "volume": "0", + "strike": "190000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4817765", + "iv_ask": "0.524214", + "inverse": true }, { - "bid": "0.4215", - "ask": "0.4500", - "open_interest": "608.0", - "volume": "5830.71", - "strike": "3600.0000", + "bid": "0.0002", + "ask": "0.0006", + "open_interest": "1128.2", + "volume": "0", + "strike": "200000", "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.487836", + "iv_ask": "0.5411607", + "inverse": true }, { - "bid": "0.0850", - "ask": "0.0880", - "open_interest": "774.0", - "volume": "1302.33", - "strike": "3800.0000", + "bid": "0.0001", + "ask": "0.0003", + "open_interest": "272.8", + "volume": "0", + "strike": "220000", "maturity": "2026-09-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5017463", + "iv_ask": "0.5501913", + "inverse": true }, { - "bid": "0.4825", - "ask": "0.5110", - "open_interest": "1001.0", - "volume": "0.0", - "strike": "3800.0000", + "bid": "0.0001", + "ask": "0.0002", + "open_interest": "249.5", + "volume": "3.11", + "strike": "240000", "maturity": "2026-09-25T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5389329", + "iv_ask": "0.5697779", + "inverse": true + }, + { + "bid": "79082.5", + "ask": "79092.5", + "open_interest": "121192440", + "volume": "2532540", + "maturity": "2026-12-25T08:00:00Z", + "security_type": "forward" + }, + { + "bid": "0.005", + "ask": "0.006", + "open_interest": "1404.7", + "volume": "0", + "strike": "30000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.6715134", + "iv_ask": "0.6952157", + "inverse": true }, { - "bid": "0.0735", - "ask": "0.0765", - "open_interest": "2737.0", - "volume": "2039.32", - "strike": "4000.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.008", + "ask": "0.009", + "open_interest": "2067.1", + "volume": "2809.05", + "strike": "35000", + "maturity": "2026-12-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.6310269", + "iv_ask": "0.6473544", + "inverse": true }, { - "bid": "0.5425", - "ask": "0.5740", - "open_interest": "173.0", - "volume": "0.0", - "strike": "4000.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.012", + "ask": "0.013", + "open_interest": "2801.6", + "volume": "3785.67", + "strike": "40000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5928292", + "iv_ask": "0.6046837", + "inverse": true }, { - "bid": "0.0635", - "ask": "0.0665", - "open_interest": "808.0", - "volume": "0.0", - "strike": "4200.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.017", + "ask": "0.018", + "open_interest": "1982.1", + "volume": "0", + "strike": "45000", + "maturity": "2026-12-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5548153", + "iv_ask": "0.5638314", + "inverse": true }, { - "bid": "0.6065", - "ask": "0.6385", - "open_interest": "527.0", - "volume": "0.0", - "strike": "4200.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.024", + "ask": "0.025", + "open_interest": "1403.5", + "volume": "13076.74", + "strike": "50000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5232647", + "iv_ask": "0.5302812", + "inverse": true }, { - "bid": "0.0550", - "ask": "0.0580", - "open_interest": "3169.0", - "volume": "290.12", - "strike": "4400.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0315", + "ask": "0.033", + "open_interest": "1708.2", + "volume": "477.09", + "strike": "54000", + "maturity": "2026-12-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.5021622", + "iv_ask": "0.5109207", + "inverse": true }, { - "bid": "0.6720", - "ask": "0.7055", - "open_interest": "281.0", - "volume": "0.0", - "strike": "4400.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0335", + "ask": "0.035", + "open_interest": "1004.5", + "volume": "17069.39", + "strike": "55000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4963488", + "iv_ask": "0.5047596", + "inverse": true }, { - "bid": "0.0515", - "ask": "0.0540", - "open_interest": "7978.0", - "volume": "411.36", - "strike": "4500.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.036", + "ask": "0.0375", + "open_interest": "70.9", + "volume": "5834.36", + "strike": "56000", + "maturity": "2026-12-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4927808", + "iv_ask": "0.500843", + "inverse": true }, { - "bid": "0.7050", - "ask": "0.7395", - "open_interest": "6.0", - "volume": "0.0", - "strike": "4500.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0415", + "ask": "0.043", + "open_interest": "59.9", + "volume": "315.08", + "strike": "58000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4863054", + "iv_ask": "0.4937464", + "inverse": true }, { - "bid": "0.0480", - "ask": "0.0505", - "open_interest": "2103.0", - "volume": "0.0", - "strike": "4600.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.047", + "ask": "0.0485", + "open_interest": "6301.9", + "volume": "5915.37", + "strike": "60000", + "maturity": "2026-12-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4773844", + "iv_ask": "0.4843161", + "inverse": true }, { - "bid": "0.7390", - "ask": "0.7690", - "open_interest": "39.0", - "volume": "0.0", - "strike": "4600.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0535", + "ask": "0.0555", + "open_interest": "601.8", + "volume": "0", + "strike": "62000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4707383", + "iv_ask": "0.4793757", + "inverse": true }, { - "bid": "0.0420", - "ask": "0.0445", - "open_interest": "838.0", - "volume": "0.0", - "strike": "4800.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.061", + "ask": "0.0625", + "open_interest": "50.7", + "volume": "1417.49", + "strike": "64000", + "maturity": "2026-12-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4658683", + "iv_ask": "0.4719648", + "inverse": true }, { - "bid": "0.8055", - "ask": "0.8425", - "open_interest": "50.0", - "volume": "0.0", - "strike": "4800.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.065", + "ask": "0.0665", + "open_interest": "409.3", + "volume": "0", + "strike": "65000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4634874", + "iv_ask": "0.4694142", + "inverse": true }, { - "bid": "0.0370", - "ask": "0.0390", - "open_interest": "3704.0", - "volume": "618.41", - "strike": "5000.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.069", + "ask": "0.071", + "open_interest": "37.4", + "volume": "15240", + "strike": "66000", + "maturity": "2026-12-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4604877", + "iv_ask": "0.4681817", + "inverse": true }, { - "bid": "0.8740", - "ask": "0.9075", - "open_interest": "1.0", - "volume": "0.0", - "strike": "5000.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.078", + "ask": "0.08", + "open_interest": "241.9", + "volume": "0", + "strike": "68000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4564555", + "iv_ask": "0.4637856", + "inverse": true }, { - "bid": "0.0325", - "ask": "0.0345", - "open_interest": "1227.0", - "volume": "89.67", - "strike": "5200.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0885", + "ask": "0.0895", + "open_interest": "1173.4", + "volume": "43093.73", + "strike": "70000", + "maturity": "2026-12-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4553156", + "iv_ask": "0.4588291", + "inverse": true }, { - "bid": "0.9435", - "ask": "0.9775", - "open_interest": "3.0", - "volume": "0.0", - "strike": "5200.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.098", + "ask": "0.0995", + "open_interest": "210.6", + "volume": "59325.12", + "strike": "72000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4482641", + "iv_ask": "0.45335", + "inverse": true }, { - "bid": "0.0285", - "ask": "0.0310", - "open_interest": "654.0", - "volume": "0.0", - "strike": "5400.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.109", + "ask": "0.1115", + "open_interest": "55.9", + "volume": "0", + "strike": "74000", + "maturity": "2026-12-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4440836", + "iv_ask": "0.4523094", + "inverse": true }, { - "bid": "1.0135", - "ask": "1.0485", - "open_interest": "4.0", - "volume": "0.0", - "strike": "5400.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.115", + "ask": "0.117", + "open_interest": "729.7", + "volume": "4512.24", + "strike": "75000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4427834", + "iv_ask": "0.4492804", + "inverse": true }, { - "bid": "0.0270", - "ask": "0.0290", - "open_interest": "1582.0", - "volume": "0.0", - "strike": "5500.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.121", + "ask": "0.1235", + "open_interest": "127.2", + "volume": "0", + "strike": "76000", + "maturity": "2026-12-25T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4409156", + "iv_ask": "0.4489453", + "inverse": true }, { - "bid": "1.0485", - "ask": "1.0840", - "open_interest": "1.0", - "volume": "0.0", - "strike": "5500.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.134", + "ask": "0.1365", + "open_interest": "216", + "volume": "2082.33", + "strike": "78000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4387076", + "iv_ask": "0.4465904", + "inverse": true }, { - "bid": "0.0255", - "ask": "0.0275", - "open_interest": "1433.0", - "volume": "0.0", - "strike": "5600.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.1365", + "ask": "0.1385", + "open_interest": "3942.4", + "volume": "325204.46", + "strike": "80000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4375664", + "iv_ask": "0.443791", + "inverse": true }, { - "bid": "0.0225", - "ask": "0.0245", - "open_interest": "4908.0", - "volume": "0.0", - "strike": "5800.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.125", + "ask": "0.1275", + "open_interest": "77.3", + "volume": "0", + "strike": "82000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4335411", + "iv_ask": "0.4412604", + "inverse": true }, { - "bid": "0.0205", - "ask": "0.0220", - "open_interest": "2308.0", - "volume": "0.0", - "strike": "6000.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.115", + "ask": "0.117", + "open_interest": "527.5", + "volume": "19189.3", + "strike": "84000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.432112", + "iv_ask": "0.4382695", + "inverse": true }, { - "bid": "0.0180", - "ask": "0.0200", - "open_interest": "1754.0", - "volume": "0.0", - "strike": "6200.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.1105", + "ask": "0.112", + "open_interest": "1380.3", + "volume": "17323.71", + "strike": "85000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4321908", + "iv_ask": "0.4368105", + "inverse": true }, { - "bid": "0.0165", - "ask": "0.0180", - "open_interest": "1129.0", - "volume": "0.0", - "strike": "6400.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.105", + "ask": "0.1075", + "open_interest": "112.1", + "volume": "16586.39", + "strike": "86000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4287009", + "iv_ask": "0.4364123", + "inverse": true }, { - "bid": "0.0155", - "ask": "0.0175", - "open_interest": "1057.0", - "volume": "0.0", - "strike": "6500.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0965", + "ask": "0.0975", + "open_interest": "1586.6", + "volume": "34774.46", + "strike": "88000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.428003", + "iv_ask": "0.4311079", + "inverse": true }, { - "bid": "0.0150", - "ask": "0.0165", - "open_interest": "828.0", - "volume": "0.0", - "strike": "6600.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0885", + "ask": "0.09", + "open_interest": "2240.3", + "volume": "27861.5", + "strike": "90000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4270223", + "iv_ask": "0.4317289", + "inverse": true }, { - "bid": "0.0135", - "ask": "0.0150", - "open_interest": "756.0", - "volume": "0.0", - "strike": "6800.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0805", + "ask": "0.0825", + "open_interest": "138.1", + "volume": "13318.92", + "strike": "92000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.424245", + "iv_ask": "0.430615", + "inverse": true }, { - "bid": "0.0120", - "ask": "0.0140", - "open_interest": "1165.0", - "volume": "0.0", - "strike": "7000.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0735", + "ask": "0.0755", + "open_interest": "52.7", + "volume": "0", + "strike": "94000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4229086", + "iv_ask": "0.4293985", + "inverse": true }, { - "bid": "0.0110", - "ask": "0.0130", - "open_interest": "594.0", - "volume": "0.0", - "strike": "7200.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.071", + "ask": "0.072", + "open_interest": "878.5", + "volume": "40877.5", + "strike": "95000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4248858", + "iv_ask": "0.4281638", + "inverse": true }, { - "bid": "0.0105", - "ask": "0.0120", - "open_interest": "735.0", - "volume": "155.06", - "strike": "7400.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.067", + "ask": "0.069", + "open_interest": "49", + "volume": "0", + "strike": "96000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4215262", + "iv_ask": "0.4281631", + "inverse": true }, { - "bid": "0.0100", - "ask": "0.0115", - "open_interest": "788.0", - "volume": "0.0", - "strike": "7500.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.061", + "ask": "0.063", + "open_interest": "37.6", + "volume": "0", + "strike": "98000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4201873", + "iv_ask": "0.4269985", + "inverse": true }, { - "bid": "0.0080", - "ask": "0.0095", - "open_interest": "1160.0", - "volume": "1745.22", - "strike": "8000.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.056", + "ask": "0.0575", + "open_interest": "2382", + "volume": "1773.15", + "strike": "100000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4207486", + "iv_ask": "0.4260033", + "inverse": true }, { - "bid": "0.0065", - "ask": "0.0080", - "open_interest": "1256.0", - "volume": "0.0", - "strike": "8500.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.051", + "ask": "0.0525", + "open_interest": "39.9", + "volume": "78938.4", + "strike": "102000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4198637", + "iv_ask": "0.4252884", + "inverse": true }, { - "bid": "0.0055", - "ask": "0.0070", - "open_interest": "1533.0", - "volume": "0.0", - "strike": "9000.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0465", + "ask": "0.048", + "open_interest": "35.2", + "volume": "107766.3", + "strike": "104000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4193658", + "iv_ask": "0.4249792", + "inverse": true }, { - "bid": "0.0041", - "ask": "0.0050", - "open_interest": "1583.0", - "volume": "979.95", - "strike": "10000.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0445", + "ask": "0.0455", + "open_interest": "755.1", + "volume": "0", + "strike": "105000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4195455", + "iv_ask": "0.4233592", + "inverse": true }, { - "bid": "0.0035", - "ask": "0.0039", - "open_interest": "2666.0", - "volume": "0.0", - "strike": "11000.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.035", + "ask": "0.0365", + "open_interest": "1905", + "volume": "2288.72", + "strike": "110000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4175218", + "iv_ask": "0.423841", + "inverse": true }, { - "bid": "0.0024", - "ask": "0.0031", - "open_interest": "1348.0", - "volume": "0.0", - "strike": "12000.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.028", + "ask": "0.029", + "open_interest": "2688.7", + "volume": "23290.69", + "strike": "115000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4185056", + "iv_ask": "0.4232116", + "inverse": true }, { - "bid": "0.0019", - "ask": "0.0025", - "open_interest": "1664.0", - "volume": "0.0", - "strike": "13000.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0225", + "ask": "0.0235", + "open_interest": "6583.5", + "volume": "27714.15", + "strike": "120000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.420054", + "iv_ask": "0.425338", + "inverse": true }, { - "bid": "0.0014", - "ask": "0.0020", - "open_interest": "1168.0", - "volume": "0.0", - "strike": "14000.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.018", + "ask": "0.019", + "open_interest": "501.9", + "volume": "0", + "strike": "125000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4209927", + "iv_ask": "0.4269805", + "inverse": true }, { - "bid": "0.0011", - "ask": "0.0017", - "open_interest": "831.0", - "volume": "0.0", - "strike": "15000.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.014", + "ask": "0.0155", + "open_interest": "1730.3", + "volume": "19458.27", + "strike": "130000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4190828", + "iv_ask": "0.4293767", + "inverse": true }, { - "bid": "0.0009", - "ask": "0.0012", - "open_interest": "3210.0", - "volume": "0.0", - "strike": "16000.0000", - "maturity": "2026-09-25T08:00:00Z", + "bid": "0.0115", + "ask": "0.013", + "open_interest": "699.1", + "volume": "13730.46", + "strike": "135000", + "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4225318", + "iv_ask": "0.4341579", + "inverse": true }, { - "bid": "4.8520", - "ask": "5.0155", - "open_interest": "30.0", - "volume": "0.0", - "strike": "16000.0000", - "maturity": "2026-09-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0095", + "ask": "0.0105", + "open_interest": "1103.5", + "volume": "389.72", + "strike": "140000", + "maturity": "2026-12-25T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4260323", + "iv_ask": "0.4348952", + "inverse": true }, { - "bid": "2725.25", - "ask": "2727.25", - "open_interest": "6370628", - "volume": "1321880.0", + "bid": "0.0065", + "ask": "0.008", + "open_interest": "1508.9", + "volume": "0", + "strike": "150000", "maturity": "2026-12-25T08:00:00Z", - "security_type": "forward" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4319949", + "iv_ask": "0.4487617", + "inverse": true }, { - "bid": "0.5195", - "ask": "0.5315", - "open_interest": "10.0", - "volume": "14001.87", - "strike": "1400.0000", + "bid": "0.005", + "ask": "0.006", + "open_interest": "1029.6", + "volume": "567.37", + "strike": "160000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4449599", + "iv_ask": "0.4587394", + "inverse": true }, { - "bid": "0.0370", - "ask": "0.0405", - "open_interest": "1067.0", - "volume": "488.15", - "strike": "1400.0000", + "bid": "0.0039", + "ask": "0.0044", + "open_interest": "1979.8", + "volume": "1368.16", + "strike": "170000", "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4566378", + "iv_ask": "0.4651832", + "inverse": true }, { - "bid": "0.0545", - "ask": "0.0580", - "open_interest": "87.0", - "volume": "0.0", - "strike": "1600.0000", + "bid": "0.0028", + "ask": "0.0035", + "open_interest": "831.5", + "volume": "0", + "strike": "180000", "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4610361", + "iv_ask": "0.4759005", + "inverse": true }, { - "bid": "0.0760", - "ask": "0.0800", - "open_interest": "271.0", - "volume": "0.0", - "strike": "1800.0000", + "bid": "0.0021", + "ask": "0.0028", + "open_interest": "963.2", + "volume": "35.07", + "strike": "190000", "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4671526", + "iv_ask": "0.4853673", + "inverse": true }, { - "bid": "0.3645", - "ask": "0.3790", - "open_interest": "84.0", - "volume": "0.0", - "strike": "2000.0000", + "bid": "0.0016", + "ask": "0.002", + "open_interest": "922.6", + "volume": "128.87", + "strike": "200000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4731253", + "iv_ask": "0.4863711", + "inverse": true }, { - "bid": "0.1025", - "ask": "0.1065", - "open_interest": "1337.0", - "volume": "11678.26", - "strike": "2000.0000", + "bid": "0.0014", + "ask": "0.0018", + "open_interest": "134.2", + "volume": "0", + "strike": "210000", "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4858514", + "iv_ask": "0.5006689", + "inverse": true }, { - "bid": "0.1335", - "ask": "0.1385", - "open_interest": "96.0", - "volume": "6584.22", - "strike": "2200.0000", + "bid": "0.0014", + "ask": "0.0017", + "open_interest": "222.2", + "volume": "0", + "strike": "220000", "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5049758", + "iv_ask": "0.5166325", + "inverse": true }, { - "bid": "0.2835", - "ask": "0.2995", - "open_interest": "538.0", - "volume": "0.0", - "strike": "2400.0000", + "bid": "0.0009", + "ask": "0.0014", + "open_interest": "186.3", + "volume": "7.78", + "strike": "230000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4982523", + "iv_ask": "0.5231024", + "inverse": true }, { - "bid": "0.1695", - "ask": "0.1745", - "open_interest": "939.0", - "volume": "107315.86", - "strike": "2400.0000", + "bid": "0.0009", + "ask": "0.0015", + "open_interest": "877.9", + "volume": "0", + "strike": "240000", "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "option_type": "call", + "security_type": "option", + "iv_bid": "0.5148978", + "iv_ask": "0.5445898", + "inverse": true }, { - "bid": "0.2670", - "ask": "0.2835", - "open_interest": "3.0", - "volume": "783.61", - "strike": "2500.0000", + "bid": "0.0007", + "ask": "0.0012", + "open_interest": "1135.2", + "volume": "255.77", + "strike": "250000", "maturity": "2026-12-25T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5172986", + "iv_ask": "0.5473116", + "inverse": true }, { - "bid": "0.1890", - "ask": "0.1945", - "open_interest": "260.0", - "volume": "0.0", - "strike": "2500.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "79800", + "ask": "79802.5", + "open_interest": "15964110", + "volume": "3373920", + "maturity": "2027-03-26T08:00:00Z", + "security_type": "forward" + }, + { + "bid": "0.018", + "ask": "0.0195", + "open_interest": "430.9", + "volume": "22395.24", + "strike": "40000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.5675747", + "iv_ask": "0.5803427", + "inverse": true }, { - "bid": "0.2560", - "ask": "0.2625", - "open_interest": "64.0", - "volume": "45237.74", - "strike": "2600.0000", - "maturity": "2026-12-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0355", + "ask": "0.037", + "open_interest": "1288.2", + "volume": "1942.15", + "strike": "50000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.517943", + "iv_ask": "0.5259073", + "inverse": true }, { - "bid": "0.2095", - "ask": "0.2150", - "open_interest": "615.0", - "volume": "5599.48", - "strike": "2600.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.0485", + "ask": "0.05", + "open_interest": "629.3", + "volume": "376.13", + "strike": "55000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.499579", + "iv_ask": "0.506169", + "inverse": true }, { - "bid": "0.2265", - "ask": "0.2320", - "open_interest": "332.0", - "volume": "162390.14", - "strike": "2800.0000", - "maturity": "2026-12-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0515", + "ask": "0.053", + "open_interest": "34.8", + "volume": "0", + "strike": "56000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4963148", + "iv_ask": "0.5026841", + "inverse": true }, { - "bid": "0.2530", - "ask": "0.2590", - "open_interest": "1932.0", - "volume": "6361.06", - "strike": "2800.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.058", + "ask": "0.06", + "open_interest": "23.9", + "volume": "0", + "strike": "58000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4904471", + "iv_ask": "0.4984018", + "inverse": true }, { - "bid": "0.2005", - "ask": "0.2055", - "open_interest": "605.0", - "volume": "1179.5", - "strike": "3000.0000", - "maturity": "2026-12-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.065", + "ask": "0.067", + "open_interest": "122.7", + "volume": "1491.49", + "strike": "60000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4846734", + "iv_ask": "0.4921719", + "inverse": true }, { - "bid": "0.2915", - "ask": "0.3105", - "open_interest": "696.0", - "volume": "765.67", - "strike": "3000.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.0725", + "ask": "0.075", + "open_interest": "60.1", + "volume": "0", + "strike": "62000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4789458", + "iv_ask": "0.4878228", + "inverse": true }, { - "bid": "0.1770", - "ask": "0.1825", - "open_interest": "673.0", - "volume": "51633.27", - "strike": "3200.0000", - "maturity": "2026-12-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.081", + "ask": "0.0835", + "open_interest": "22.7", + "volume": "0", + "strike": "64000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4749216", + "iv_ask": "0.4833696", + "inverse": true + }, + { + "bid": "0.0855", + "ask": "0.088", + "open_interest": "25.4", + "volume": "0", + "strike": "65000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4730537", + "iv_ask": "0.4813104", + "inverse": true + }, + { + "bid": "0.09", + "ask": "0.0925", + "open_interest": "29.4", + "volume": "0", + "strike": "66000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4707328", + "iv_ask": "0.4788136", + "inverse": true + }, + { + "bid": "0.0995", + "ask": "0.102", + "open_interest": "34.1", + "volume": "0", + "strike": "68000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4663906", + "iv_ask": "0.4741575", + "inverse": true + }, + { + "bid": "0.11", + "ask": "0.1125", + "open_interest": "72.7", + "volume": "84054.42", + "strike": "70000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4634057", + "iv_ask": "0.4709042", + "inverse": true + }, + { + "bid": "0.121", + "ask": "0.124", + "open_interest": "104.3", + "volume": "0", + "strike": "72000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4601959", + "iv_ask": "0.4689229", + "inverse": true }, { - "bid": "0.3410", - "ask": "0.3640", - "open_interest": "209.0", - "volume": "10301.53", - "strike": "3200.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.1325", + "ask": "0.1355", + "open_interest": "23.1", + "volume": "0", + "strike": "74000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4567922", + "iv_ask": "0.4652929", + "inverse": true }, { - "bid": "0.1570", - "ask": "0.1620", - "open_interest": "751.0", - "volume": "14029.57", - "strike": "3400.0000", - "maturity": "2026-12-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.145", + "ask": "0.148", + "open_interest": "5.2", + "volume": "0", + "strike": "76000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "put", + "security_type": "option", + "iv_bid": "0.4546068", + "iv_ask": "0.462922", + "inverse": true }, { - "bid": "0.3935", - "ask": "0.4175", - "open_interest": "34.0", - "volume": "28891.61", - "strike": "3400.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.1575", + "ask": "0.1595", + "open_interest": "114.5", + "volume": "0", + "strike": "78000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "put", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4508679", + "iv_ask": "0.4563106", + "inverse": true }, { - "bid": "0.1390", - "ask": "0.1445", - "open_interest": "687.0", - "volume": "0.0", - "strike": "3600.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.1685", + "ask": "0.1715", + "open_interest": "306.6", + "volume": "0", + "strike": "80000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4483291", + "iv_ask": "0.4563785", + "inverse": true }, { - "bid": "0.4480", - "ask": "0.4735", - "open_interest": "92.0", - "volume": "29370.19", - "strike": "3600.0000", - "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.158", + "ask": "0.1595", + "open_interest": "100.9", + "volume": "1312.3", + "strike": "82000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4471844", + "iv_ask": "0.4511663", + "inverse": true }, { - "bid": "0.1235", - "ask": "0.1290", - "open_interest": "321.0", - "volume": "0.0", - "strike": "3800.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.1475", + "ask": "0.15", + "open_interest": "27", + "volume": "1190.08", + "strike": "84000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4446112", + "iv_ask": "0.4512014", + "inverse": true }, { - "bid": "0.5050", - "ask": "0.5325", - "open_interest": "36.0", - "volume": "0.0", - "strike": "3800.0000", - "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.1375", + "ask": "0.1405", + "open_interest": "30", + "volume": "0", + "strike": "86000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4419852", + "iv_ask": "0.4498641", + "inverse": true }, { - "bid": "0.1120", - "ask": "0.1140", - "open_interest": "4003.0", - "volume": "353734.29", - "strike": "4000.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.1285", + "ask": "0.1315", + "open_interest": "19.6", + "volume": "0", + "strike": "88000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4406535", + "iv_ask": "0.4485282", + "inverse": true }, { - "bid": "0.5640", - "ask": "0.5930", - "open_interest": "226.0", - "volume": "0.0", - "strike": "4000.0000", - "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.12", + "ask": "0.123", + "open_interest": "58.4", + "volume": "993.16", + "strike": "90000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4393464", + "iv_ask": "0.4472404", + "inverse": true }, { - "bid": "0.0990", - "ask": "0.1035", - "open_interest": "435.0", - "volume": "65657.7", - "strike": "4200.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.1115", + "ask": "0.1145", + "open_interest": "63.3", + "volume": "9113.44", + "strike": "92000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4367892", + "iv_ask": "0.4447267", + "inverse": true }, { - "bid": "0.6250", - "ask": "0.6550", - "open_interest": "60.0", - "volume": "0.0", - "strike": "4200.0000", - "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.104", + "ask": "0.107", + "open_interest": "28.2", + "volume": "0", + "strike": "94000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4356695", + "iv_ask": "0.4436715", + "inverse": true }, { - "bid": "0.0885", - "ask": "0.0930", - "open_interest": "277.0", - "volume": "58929.81", - "strike": "4400.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.1005", + "ask": "0.1035", + "open_interest": "65", + "volume": "16048.48", + "strike": "95000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4353399", + "iv_ask": "0.4433815", + "inverse": true }, { - "bid": "0.0840", - "ask": "0.0885", - "open_interest": "37.0", - "volume": "7340.47", - "strike": "4500.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.097", + "ask": "0.1", + "open_interest": "51.4", + "volume": "8945.05", + "strike": "96000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.434726", + "iv_ask": "0.4428132", + "inverse": true }, { - "bid": "0.0795", - "ask": "0.0840", - "open_interest": "186.0", - "volume": "0.0", - "strike": "4600.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.0905", + "ask": "0.0935", + "open_interest": "19", + "volume": "0", + "strike": "98000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4340182", + "iv_ask": "0.4422103", + "inverse": true }, { - "bid": "0.0720", - "ask": "0.0760", - "open_interest": "175.0", - "volume": "0.0", - "strike": "4800.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.084", + "ask": "0.087", + "open_interest": "128", + "volume": "6961.12", + "strike": "100000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4322207", + "iv_ask": "0.4405429", + "inverse": true }, { - "bid": "0.8155", - "ask": "0.8500", - "open_interest": "25.0", - "volume": "0.0", - "strike": "4800.0000", - "maturity": "2026-12-25T08:00:00Z", - "option_type": "put", - "security_type": "option" + "bid": "0.0785", + "ask": "0.0815", + "open_interest": "22.5", + "volume": "6478.32", + "strike": "102000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4321595", + "iv_ask": "0.4406239", + "inverse": true + }, + { + "bid": "0.073", + "ask": "0.076", + "open_interest": "1", + "volume": "0", + "strike": "104000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.431101", + "iv_ask": "0.4397331", + "inverse": true + }, + { + "bid": "0.0705", + "ask": "0.0735", + "open_interest": "51.9", + "volume": "0", + "strike": "105000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4309251", + "iv_ask": "0.4396462", + "inverse": true + }, + { + "bid": "0.068", + "ask": "0.071", + "open_interest": "0", + "volume": "0", + "strike": "106000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.430512", + "iv_ask": "0.4393289", + "inverse": true + }, + { + "bid": "0.063", + "ask": "0.066", + "open_interest": "5", + "volume": "27513.66", + "strike": "108000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4289668", + "iv_ask": "0.4379983", + "inverse": true + }, + { + "bid": "0.059", + "ask": "0.062", + "open_interest": "35.2", + "volume": "0", + "strike": "110000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4295475", + "iv_ask": "0.4387921", + "inverse": true + }, + { + "bid": "0.049", + "ask": "0.052", + "open_interest": "393.3", + "volume": "0", + "strike": "115000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.4273018", + "iv_ask": "0.4372142", + "inverse": true }, { - "bid": "0.0650", - "ask": "0.0690", - "open_interest": "2453.0", - "volume": "43834.3", - "strike": "5000.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.0415", + "ask": "0.044", + "open_interest": "80.5", + "volume": "0", + "strike": "120000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4284489", + "iv_ask": "0.4373427", + "inverse": true }, { - "bid": "0.0590", - "ask": "0.0625", - "open_interest": "132.0", - "volume": "0.0", - "strike": "5200.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.035", + "ask": "0.0375", + "open_interest": "22.6", + "volume": "0", + "strike": "125000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.428861", + "iv_ask": "0.4384941", + "inverse": true }, { - "bid": "0.0510", - "ask": "0.0545", - "open_interest": "906.0", - "volume": "7477.65", - "strike": "5500.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.0295", + "ask": "0.0315", + "open_interest": "592.1", + "volume": "253.38", + "strike": "130000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4291369", + "iv_ask": "0.4375563", + "inverse": true }, { - "bid": "0.0405", - "ask": "0.0440", - "open_interest": "3130.0", - "volume": "483.5", - "strike": "6000.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.0215", + "ask": "0.0235", + "open_interest": "80.5", + "volume": "2002.98", + "strike": "140000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4323137", + "iv_ask": "0.4423314", + "inverse": true }, { - "bid": "0.0330", - "ask": "0.0360", - "open_interest": "677.0", - "volume": "386.84", - "strike": "6500.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.0155", + "ask": "0.017", + "open_interest": "83", + "volume": "271.41", + "strike": "150000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4335328", + "iv_ask": "0.4426856", + "inverse": true }, { - "bid": "0.0270", - "ask": "0.0300", - "open_interest": "1606.0", - "volume": "0.0", - "strike": "7000.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.012", + "ask": "0.013", + "open_interest": "604", + "volume": "467.16", + "strike": "160000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4405418", + "iv_ask": "0.4478131", + "inverse": true }, { - "bid": "0.0185", - "ask": "0.0210", - "open_interest": "1134.0", - "volume": "279.34", - "strike": "8000.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.009", + "ask": "0.0105", + "open_interest": "63.3", + "volume": "82.66", + "strike": "170000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4434883", + "iv_ask": "0.4564694", + "inverse": true }, { - "bid": "0.0135", - "ask": "0.0160", - "open_interest": "1369.0", - "volume": "18148.43", - "strike": "9000.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.007", + "ask": "0.0085", + "open_interest": "198.7", + "volume": "7845.12", + "strike": "180000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.4484281", + "iv_ask": "0.4637703", + "inverse": true }, { - "bid": "0.0100", - "ask": "0.0120", - "open_interest": "1205.0", - "volume": "1085.31", - "strike": "10000.0000", - "maturity": "2026-12-25T08:00:00Z", + "bid": "0.0055", + "ask": "0.0075", + "open_interest": "64.9", + "volume": "6366.53", + "strike": "190000", + "maturity": "2027-03-26T08:00:00Z", "option_type": "call", - "security_type": "option" + "security_type": "option", + "iv_bid": "0.453116", + "iv_ask": "0.476623", + "inverse": true }, { - "bid": "0.0075", - "ask": "0.0095", - "open_interest": "346.0", - "volume": "0.0", - "strike": "11000.0000", - "maturity": "2026-12-25T08:00:00Z", - "option_type": "call", - "security_type": "option" + "bid": "0.0048", + "ask": "0.0055", + "open_interest": "57.8", + "volume": "218.23", + "strike": "200000", + "maturity": "2027-03-26T08:00:00Z", + "option_type": "call", + "security_type": "option", + "iv_bid": "0.464132", + "iv_ask": "0.4738818", + "inverse": true } ] } \ No newline at end of file diff --git a/docs/examples/weiner_volatility_pricer.py b/docs/examples/weiner_volatility_pricer.py index cb82f03b..eae572f5 100644 --- a/docs/examples/weiner_volatility_pricer.py +++ b/docs/examples/weiner_volatility_pricer.py @@ -1,13 +1,10 @@ from quantflow.options.inputs import OptionType from quantflow.options.pricer import OptionPricer from quantflow.sp.weiner import WeinerProcess -from quantflow.utils.distributions import DoubleExponential # Weiner process with constant volatility # This produces the same sensitivities as the Black-Scholes model -pricer = OptionPricer( - model=WeinerProcess(sigma=0.3) -) +pricer = OptionPricer(model=WeinerProcess(sigma=0.3)) # Price an ATM call option at time to maturity 1.0 price = pricer.price( diff --git a/docs/examples_png/vol_surface_heston_plot.py b/docs/examples_png/vol_surface_heston_plot.py deleted file mode 100644 index df3d9d32..00000000 --- a/docs/examples_png/vol_surface_heston_plot.py +++ /dev/null @@ -1,35 +0,0 @@ -import json -from pathlib import Path - -from quantflow.options.calibration import HestonCalibration -from quantflow.options.pricer import OptionPricer -from quantflow.options.surface import VolSurface, VolSurfaceInputs, surface_from_inputs -from quantflow.sp.heston import Heston - -# Load a saved volatility surface snapshot and build the surface -with open("docs/examples/volsurface.json") as fp: - surface: VolSurface = surface_from_inputs(VolSurfaceInputs(**json.load(fp))) - -surface.bs() -surface.disable_outliers() - -# Create a Heston pricer and calibrate -pricer = OptionPricer(model=Heston.create(vol=0.5, kappa=1, sigma=0.8, rho=0)) -calibration = HestonCalibration( - pricer=pricer, - vol_surface=surface.trim(len(surface.maturities) - 1), - moneyness_weight=1.0, -).remove_implied_above(quantile=0.95) -calibration.fit() - -# Plot the calibrated smile for the second maturity and save as PNG -fig = calibration.plot(index=1, max_moneyness_ttm=1.5, support=101) -fig.update_layout( - xaxis_title="Moneyness / sqrt(T)", - yaxis_title="Implied Volatility", - title="Heston Calibrated Smile — Maturity 2", -) - -out_path = Path("docs/assets/heston_calibrated_smile.png") -fig.write_image(str(out_path), width=900, height=500) -print(f"saved {out_path}") diff --git a/docs/examples_png/vol_surface_hestonj_plot.py b/docs/examples_png/vol_surface_hestonj_plot.py deleted file mode 100644 index 5e46a5cb..00000000 --- a/docs/examples_png/vol_surface_hestonj_plot.py +++ /dev/null @@ -1,46 +0,0 @@ -import json -from pathlib import Path - -from quantflow.options.calibration import HestonJCalibration -from quantflow.options.pricer import OptionPricer -from quantflow.options.surface import VolSurface, VolSurfaceInputs, surface_from_inputs -from quantflow.sp.heston import HestonJ -from quantflow.utils.distributions import DoubleExponential - -# Load a saved volatility surface snapshot and build the surface -with open("docs/examples/volsurface.json") as fp: - surface: VolSurface = surface_from_inputs(VolSurfaceInputs(**json.load(fp))) - -surface.bs() -surface.disable_outliers() - -# Create a HestonJ pricer and calibrate -pricer = OptionPricer( - model=HestonJ.create( - DoubleExponential, - vol=0.5, - kappa=2, - rho=-0.2, - sigma=0.8, - jump_fraction=0.3, - jump_asymmetry=0.2, - ) -) -calibration = HestonJCalibration( - pricer=pricer, - vol_surface=surface.trim(len(surface.maturities) - 1), - moneyness_weight=1.0, -).remove_implied_above(quantile=0.95) -calibration.fit() - -# Plot the calibrated smile for the second maturity and save as PNG -fig = calibration.plot(index=1, max_moneyness_ttm=1.5, support=101) -fig.update_layout( - xaxis_title="Moneyness / sqrt(T)", - yaxis_title="Implied Volatility", - title="HestonJ Calibrated Smile — Maturity 2", -) - -out_path = Path("docs/assets/hestonj_calibrated_smile.png") -fig.write_image(str(out_path), width=900, height=500) -print(f"saved {out_path}") diff --git a/docs/glossary.md b/docs/glossary.md index e30fc393..2d96a1ca 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -67,15 +67,15 @@ Log-strike, or log strike/forward ratio, is used in the context of option pricin where $K$ is the strike and $F$ is the Forward price. A positive value implies strikes above the forward, which means put options are in the money (ITM) and call options are out of the money (OTM). The log-strike is used as input for all Black-Scholes type formulas. -## Moneyness Time Scaled +## Moneyness -The time to maturity scaled moneyness, is used in the context of option pricing in order to compare options with different maturities. It is defined as +Moneyness is used in the context of option pricing in order to compare options with different maturities. It is defined as \begin{equation} m = \frac{1}{\sqrt{\tau}}\ln{\frac{K}{F}} \end{equation} -where $K$ is the strike, $F$ is the Forward price, and $\tau$ is the time to maturity. It is used to compare options with different maturities by scaling the moneyness by the square root of time to maturity. This is because the price of the underlying asset is subject to random fluctuations, if these fluctuations follow a Brownian motion than the standard deviation of the price movement will increase with the square root of time. +where $K$ is the strike, $F$ is the Forward price, and $\tau$ is the time to maturity. It is used to compare options with different maturities by scaling the [log-strike](#log-strike) by the square root of time to maturity. This is because the price of the underlying asset is subject to random fluctuations, if these fluctuations follow a Brownian motion than the standard deviation of the price movement will increase with the square root of time. ## Moneyness Vol Adjusted diff --git a/docs/tutorials/volatility_surface.md b/docs/tutorials/volatility_surface.md index 42ced0c1..e7250bc9 100644 --- a/docs/tutorials/volatility_surface.md +++ b/docs/tutorials/volatility_surface.md @@ -57,13 +57,7 @@ matches each bid and ask price and marks each option as `converged` or not. Raw option quotes often contain illiquid or stale prices that produce unrealistic implied volatilities. [disable_outliers()][quantflow.options.surface.VolSurface.disable_outliers] removes -them in two passes per maturity: - -1. **Wide spread filter** — options whose implied-vol bid/ask spread exceeds 30% of the - mid vol are marked as not converged. -2. **Polynomial smile fit** — a quadratic is fitted to the remaining smile; options - whose residual exceeds the 99th-percentile threshold are disabled. This is repeated - twice. +them in two passes per maturity. ```python surface.disable_outliers() @@ -106,44 +100,85 @@ surface2 = surface_from_inputs(inputs) # VolSurfaceInputs -> VolSurface ## Calibrating the Heston Model -[HestonCalibration][quantflow.options.calibration.HestonCalibration] wraps an -[OptionPricer][quantflow.options.pricer.OptionPricer] and the surface, then minimises -the squared residuals between market bid/ask call prices and model prices across all -strikes and maturities. +[HestonCalibration][quantflow.options.heston_calibration.HestonCalibration] fits the +five Heston parameters ($v_0$, $\theta$, $\kappa$, $\sigma$, $\rho$) to the implied +volatility surface using a two-stage optimisation: + +1. **L-BFGS-B** minimises the scalar cost function (sum of squared weighted price + residuals) to reach a good basin of attraction. +2. **Trust-region reflective** (`least_squares` with `method="trf"`) refines the + solution on the residual vector with tight tolerances and enforces parameter bounds. + +Residuals are computed as `weight * (model_call_price - mid_call_price)` where +`mid_call_price` is the average of the bid and ask call prices, and the weight is +$e^{-w \cdot |k|}$ controlled by `moneyness_weight`. A penalty for violating the +Feller condition ($2\kappa\theta \geq \sigma^2$) is added during stage 1 to keep the +variance process well-behaved. ```python --8<-- "docs/examples/vol_surface_heston_calibration.py" ``` -``` +### Output + --8<-- "docs/examples_output/vol_surface_heston_calibration.out" -``` ### Calibration Options -[remove_implied_above()][quantflow.options.calibration.VolModelCalibration.remove_implied_above] -drops options with implied vols above the given quantile before fitting — useful for -excluding illiquid deep wings. - The `moneyness_weight` parameter down-weights far-from-the-money options via $e^{-w \cdot |k|}$ where $k = \log(K/F)$. Setting `ttm_weight > 0` similarly down-weights near-expiry options. ### Plotting the Calibrated Smile -Use [plot()][quantflow.options.calibration.VolModelCalibration.plot] to produce a -Plotly figure overlaying market bid/ask implied vols against the model smile: +Use [plot_maturities()][quantflow.options.calibration.VolModelCalibration.plot_maturities] +to produce a Plotly figure overlaying market bid/ask implied vols against the model smile +for all maturities at once: ```python -fig = calibration.plot(index=1, max_moneyness_ttm=1.5, support=101) -fig.write_image("heston_calibrated_smile.png", width=900, height=500) +fig = calibration.plot_maturities(max_moneyness_ttm=1.5, support=101) +fig.write_image("heston_calibrated_smile.png", width=1200) ``` +The x axis is [moneyness](../glossary.md#moneyness). + ![Heston calibrated smile](../assets/heston_calibrated_smile.png) +### Model Limitations at Short Maturities + +Inspecting the calibrated smiles across all maturities reveals a systematic pattern: +the Heston model fits long-dated options reasonably well but struggles with short-term +maturities, where the market smile is steeper than the model can reproduce. + +This is a fundamental structural limitation, not a numerical issue. The Heston model +generates an implied volatility smile through two mechanisms: the correlation $\rho$ +between spot and variance (which creates skew) and the volatility-of-variance $\sigma$ +(which inflates the wings). Both effects accumulate diffusively over time. For a maturity +$T$, the smile roughly scales as $\sigma \sqrt{T}$, so as $T \to 0$ the distribution +collapses toward a Gaussian and the smile flattens. + +More precisely, the Heston characteristic function at short maturities satisfies: + +\begin{equation} +\log \phi(u, T) \approx i u \mu T - \tfrac{1}{2} u^2 v_0 T + O(T^2) +\end{equation} + +which is the characteristic function of a Gaussian with variance $v_0 T$. The higher +cumulants that produce skew and excess kurtosis are all $O(T^2)$ or smaller, so they +vanish faster than the Gaussian term as $T \to 0$. + +In practice this means the Heston model essentially reduces to Black-Scholes for +near-expiry options. The market, however, exhibits pronounced short-term skew driven by +jump risk and the market microstructure of short-dated hedging demand. A diffusion-only +model cannot reproduce this behaviour regardless of how its parameters are tuned. + +The natural extension is to add a jump component to the dynamics, which contributes +a term of order $O(T)$ to the cumulants and restores the short-term smile. This is +the motivation for the Heston jump-diffusion model described in the next section. + ## Calibrating the Heston Jump-Diffusion Model -[HestonJCalibration][quantflow.options.calibration.HestonJCalibration] extends the +[HestonJCalibration][quantflow.options.heston_calibration.HestonJCalibration] extends the Heston calibration with a compound Poisson jump component via the [HestonJ][quantflow.sp.heston.HestonJ] model. Jumps are drawn from a [DoubleExponential][quantflow.utils.distributions.DoubleExponential] distribution, @@ -153,22 +188,43 @@ which captures asymmetric jump behaviour common in equity and crypto markets. --8<-- "docs/examples/vol_surface_hestonj_calibration.py" ``` -``` --8<-- "docs/examples_output/vol_surface_hestonj_calibration.out" -``` ### Plotting the Calibrated Smile -Use [plot()][quantflow.options.calibration.VolModelCalibration.plot] to produce a -Plotly figure overlaying market bid/ask implied vols against the model smile: - ```python -fig = calibration.plot(index=1, max_moneyness_ttm=1.5, support=101) -fig.write_image("hestonj_calibrated_smile.png", width=900, height=500) +fig = calibration.plot_maturities(max_moneyness_ttm=1.5, support=101) +fig.write_image("hestonj_calibrated_smile.png", width=1200) ``` ![HestonJ calibrated smile](../assets/hestonj_calibrated_smile.png) +### Remaining Limitations at Short Maturities + +Adding jumps improves the short-term smile significantly compared to plain Heston, but +the fit at the nearest maturities is still imperfect. Several structural reasons combine: + +**Jump parameters are global.** The compound Poisson component has a single intensity +$\lambda$, jump variance, and asymmetry shared across all maturities. Increasing +$\lambda$ to steepen the short-term smile simultaneously distorts the long-term smile, +so the optimizer settles on a compromise. + +**Long maturities dominate the cost function.** They have more liquid strikes and +therefore more data points. The optimizer minimizes total squared residuals across the +whole surface, so short maturities — with fewer strikes — are outvoted and their fit is +systematically sacrificed. + +**The jump distribution is not rich enough.** The short-term smile in crypto is driven +by large, rare, asymmetric events. A [DoubleExponential][quantflow.utils.distributions.DoubleExponential] +with fixed parameters cannot simultaneously match the wing curvature at short and long +maturities. + +The natural next step is a rough volatility model (for example rough Heston with Hurst +parameter $H < \tfrac{1}{2}$). Because the variance process has long memory and does not +behave diffusively at short time scales, rough models produce a steep short-term skew +without requiring jumps, and the skew decays as a power law $T^H$ rather than the +$T^{1/2}$ rate of classical stochastic volatility. + ### Parameter Reference The calibrated parameter vector for the jump-diffusion model is: diff --git a/quantflow/ai/tools/crypto.py b/quantflow/ai/tools/crypto.py index 24a51b31..52ef79e1 100644 --- a/quantflow/ai/tools/crypto.py +++ b/quantflow/ai/tools/crypto.py @@ -1,5 +1,7 @@ """Crypto tools for the quantflow MCP server.""" +from pathlib import Path + from mcp.server.fastmcp import FastMCP from quantflow.data.deribit import Deribit, InstrumentKind @@ -46,11 +48,9 @@ async def crypto_term_structure(currency: str) -> str: Args: currency: Cryptocurrency symbol e.g. BTC, ETH """ - from quantflow.options.surface import VolSurface - async with Deribit() as client: loader = await client.volatility_surface_loader(currency) - vs: VolSurface = loader.surface() + vs = loader.surface() ts = vs.term_structure().round({"ttm": 4}) return ts.to_csv(index=False) @@ -62,17 +62,32 @@ async def crypto_implied_volatility(currency: str, maturity_index: int = -1) -> currency: Cryptocurrency symbol e.g. BTC, ETH maturity_index: Maturity index (-1 for all maturities) """ - from quantflow.options.surface import VolSurface - async with Deribit() as client: loader = await client.volatility_surface_loader(currency) - vs: VolSurface = loader.surface() + vs = loader.surface() index = None if maturity_index < 0 else maturity_index vs.bs(index=index) df = vs.options_df(index=index) df["implied_vol"] = df["implied_vol"].map("{:.2%}".format) return df.to_csv(index=False) + @mcp.tool() + async def vol_surface_snapshot(currency: str, path: str) -> str: + """Fetch a live volatility surface from Deribit and save it as a JSON snapshot. + + Args: + currency: Cryptocurrency symbol e.g. BTC, ETH + path: File path to write the snapshot to + """ + async with Deribit() as client: + loader = await client.volatility_surface_loader(currency) + vs = loader.surface() + vs.bs() + vs.disable_outliers() + inputs = vs.inputs(converged=True) + Path(path).write_text(inputs.model_dump_json(indent=2)) + return f"Saved {len(vs.maturities)} maturities to {path}" + @mcp.tool() async def crypto_prices(symbol: str, frequency: str = "") -> str: """Get OHLC price history for a cryptocurrency via FMP. diff --git a/quantflow/options/bs.py b/quantflow/options/bs.py index fb6abe2e..cf2df1c4 100644 --- a/quantflow/options/bs.py +++ b/quantflow/options/bs.py @@ -1,5 +1,6 @@ from __future__ import annotations +import warnings from typing import NamedTuple import numpy as np @@ -258,12 +259,14 @@ def implied_black_volatility( """ if not np.isscalar(k) and np.isscalar(initial_sigma): initial_sigma = np.full_like(k, initial_sigma) - result = newton( - lambda x: black_price(k, x, ttm, call_put) - price, - initial_sigma, - fprime=lambda x: black_vega(k, x, ttm), - full_output=True, - ) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + result = newton( + lambda x: black_price(k, x, ttm, call_put) - price, + initial_sigma, + fprime=lambda x: black_vega(k, x, ttm), + full_output=True, + ) if hasattr(result, "root"): return ImpliedVols(values=result.root, converged=result.converged) else: diff --git a/quantflow/options/calibration.py b/quantflow/options/calibration.py index c7c93e0f..4c598570 100644 --- a/quantflow/options/calibration.py +++ b/quantflow/options/calibration.py @@ -1,19 +1,16 @@ from __future__ import annotations from abc import ABC, abstractmethod -from dataclasses import dataclass, field from datetime import datetime from decimal import Decimal -from typing import Any, Generic, NamedTuple, Sequence, TypeVar +from typing import Any, Generic, NamedTuple, TypeVar import numpy as np import pandas as pd -from pydantic import BaseModel, Field -from scipy.optimize import Bounds, OptimizeResult, minimize +from pydantic import BaseModel, Field, PrivateAttr +from scipy.optimize import Bounds, OptimizeResult, least_squares, minimize from quantflow.sp.base import StochasticProcess1D -from quantflow.sp.heston import Heston, HestonJ -from quantflow.sp.jump_diffusion import D from quantflow.utils import plot from .pricer import OptionPricerBase @@ -27,37 +24,49 @@ class ModelCalibrationEntryKey(NamedTuple): strike: Decimal -@dataclass -class OptionEntry: - """Entry for a single option""" +class OptionEntry(BaseModel): + """Entry for a single option in the calibration dataset. - ttm: float - moneyness: float - options: list[OptionPrice] = field(default_factory=list) - _price_range: Bounds | None = None + Each entry corresponds to a unique (maturity, strike) pair and holds the + bid and ask sides as separate + [OptionPrice][quantflow.options.surface.OptionPrice] objects. + """ + + ttm: float = Field(description="Time to maturity in years") + moneyness: float = Field(description="Log-moneyness: log(strike / forward)") + options: list[OptionPrice] = Field(default_factory=list) + """Bid and ask option prices for this entry""" + _mid_price: float | None = PrivateAttr(default=None) def implied_vol_range(self) -> Bounds: - """Get the range of implied volatilities""" + """Get the range of implied volatilities across bid and ask""" implied_vols = tuple(option.implied_vol for option in self.options) return Bounds(min(implied_vols), max(implied_vols)) - def residual(self, price: float) -> float: - """Calculate the residual for a given price + def mid_price(self) -> float: + """Mid price as the average of bid and ask call prices""" + if self._mid_price is None: + prices = tuple(float(option.call_price) for option in self.options) + self._mid_price = sum(prices) / len(prices) + return self._mid_price - when inside bid/offer, the residual is 0 - """ - return min(np.min(self.price_range().residual(price)), 0) + def mid_iv(self) -> float: + """Mid implied volatility as the average of bid and ask""" + ivs = tuple(option.implied_vol for option in self.options) + return sum(ivs) / len(ivs) - def price_range(self) -> Bounds: - """Get the range of prices""" - if self._price_range is None: - prices = tuple(float(option.call_price) for option in self.options) - self._price_range = Bounds(min(prices), max(prices)) - return self._price_range +class VolModelCalibration(BaseModel, ABC, Generic[M]): + """Abstract base class for calibration of a stochastic volatility model. -class VolModelCalibration(BaseModel, ABC, Generic[M], arbitrary_types_allowed=True): - """Abstract class for calibration of a stochastic volatility model""" + Subclasses must implement `get_params`, `set_params`, and `get_bounds`. + + The two-stage `fit` method is provided here and works for any subclass: + + - Stage 1: Nelder-Mead on the scalar `cost_function` to find a good basin. + - Stage 2: Levenberg-Marquardt (TRF) on the `residuals` vector for + precise convergence with bound constraints. + """ pricer: OptionPricerBase = Field( description=( @@ -65,28 +74,37 @@ class VolModelCalibration(BaseModel, ABC, Generic[M], arbitrary_types_allowed=Tr " for the model" ) ) - vol_surface: VolSurface[Any] = Field(repr=False) - """The [VolSurface][quantflow.options.surface.VolSurface] - to calibrate the model with""" - minimize_method: str | None = None - """The optimization method to use - if None, the default is used""" - moneyness_weight: float = Field(default=0.0, ge=0.0) - """The weight for penalize options with moneyness as it moves away from 0 - - The weight is applied as exp(-moneyness_weight * moneyness), therefore - a value of 0 won't penalize moneyness at all - """ - ttm_weight: float = Field(default=0.0, ge=0.0, le=1.0) - """The weight for penalize options with ttm as it approaches 0 - - The weight is applied as `1 - ttm_weight*exp(-ttm)`, therefore - a value of 0 won't penalize ttm at all, a value of 1 will penalize - options with ttm->0 the most - """ + vol_surface: VolSurface[Any] = Field( + repr=False, + description=( + "The [VolSurface][quantflow.options.surface.VolSurface]" + " to calibrate the model with" + ), + ) + moneyness_weight: float = Field( + default=0.0, + ge=0.0, + description=( + "Weight penalising options as moneyness moves away from 0." + " Applied as `exp(-moneyness_weight * |moneyness|)`." + " A value of 0 applies no penalisation." + ), + ) + ttm_weight: float = Field( + default=0.0, + ge=0.0, + le=1.0, + description=( + "Weight penalising short-dated options as ttm approaches 0." + " Applied as `1 - ttm_weight * exp(-ttm)`." + " A value of 0 applies no penalisation." + ), + ) options: dict[ModelCalibrationEntryKey, OptionEntry] = Field( - default_factory=dict, repr=False + default_factory=dict, + repr=False, + description="The options to calibrate", ) - """The options to calibrate""" def model_post_init(self, _ctx: Any) -> None: if not self.options: @@ -100,26 +118,22 @@ def model_post_init(self, _ctx: Any) -> None: @abstractmethod def get_params(self) -> np.ndarray: - """Get the parameters of the model - - Must be implemented by the subclass - """ + """Current model parameters as a flat array (starting point for fit)""" @abstractmethod def set_params(self, params: np.ndarray) -> None: - """Set the parameters of the model + """Apply a flat parameter array back to the model""" - Must be implemented by the subclass - """ + @abstractmethod + def get_bounds(self) -> Bounds: + """Parameter bounds for the optimiser""" @property def model(self) -> M: - """Get the model""" return self.pricer.model # type: ignore[attr-defined] @property def ref_date(self) -> datetime: - """Get the reference date""" return self.vol_surface.ref_date @property @@ -129,67 +143,66 @@ def implied_vols(self) -> np.ndarray: data.extend(option.implied_vol for option in entry.options) return np.asarray(data) - def remove_implied_above(self, quantile: float = 0.95) -> VolModelCalibration: - exclude_above = np.quantile(self.implied_vols, quantile) - options = {} - for key, entry in self.options.items(): - if entry.implied_vol_range().ub <= exclude_above: - options[key] = entry - return self.model_copy(update=dict(options=options)) - - def get_bounds(self) -> Bounds | None: # pragma: no cover - """Get the parameter bounds for the calibration""" - return None - - def get_constraints(self) -> Sequence[dict[str, Any]] | None: - """Get the constraints for the calibration""" - return None - - def get_minimize_method(self) -> str | None: - """Get the minimisation method to use. - - Returns `minimize_method` by default. Override in subclasses to select - a method based on active constraints or bounds. - """ - return self.minimize_method - def implied_vol_range(self) -> Bounds: - """Get the range of implied volatilities""" + """Range of implied volatilities across all calibration options""" return Bounds( min(option.implied_vol_range().lb for option in self.options.values()), max(option.implied_vol_range().ub for option in self.options.values()), ) def fit(self) -> OptimizeResult: - """Fit the model""" - return minimize( + """Two-stage fit: Nelder-Mead basin search then LM refinement. + + Stage 1 (Nelder-Mead): gradient-free minimisation of `cost_function` + to reach the right basin of attraction. + + Stage 2 (TRF/LM): `scipy.optimize.least_squares` on the `residuals` + vector with parameter bounds for precise convergence. + """ + bounds = self.get_bounds() + stage1 = minimize( self.cost_function, self.get_params(), - method=self.get_minimize_method(), - bounds=self.get_bounds(), - constraints=self.get_constraints(), + method="L-BFGS-B", + bounds=list(zip(bounds.lb, bounds.ub)), + ) + result = least_squares( + self.residuals, + np.clip(stage1.x, bounds.lb, bounds.ub), + method="trf", + bounds=(bounds.lb, bounds.ub), + ftol=1e-10, + xtol=1e-10, + gtol=1e-10, ) + self.set_params(result.x) + return result def cost_weight(self, ttm: float, moneyness: float) -> float: - """Calculate the weight for the cost function for - a given time to maturity and moneyness""" + """Weight for a given time to maturity and moneyness""" return np.exp(-self.moneyness_weight * moneyness) def penalize(self) -> float: - """Penalize the cost function""" + """Additional scalar penalty added to the cost function (default: 0)""" return 0.0 - def cost_function(self, params: np.ndarray) -> float: - """Calculate the cost function from the model prices""" + def residuals(self, params: np.ndarray) -> np.ndarray: + """Weighted price residuals: `weight * (model_price - mid_price)` per option""" self.set_params(params) self.pricer.reset() - cost = 0.0 - for entry in self.options.values(): - model_price = self.pricer.call_price(entry.ttm, entry.moneyness) - if residual := entry.residual(model_price): + res = [] + with np.errstate(all="ignore"): + for entry in self.options.values(): + model_price = self.pricer.call_price(entry.ttm, entry.moneyness) weight = self.cost_weight(entry.ttm, entry.moneyness) - cost += weight * residual**2 - return cost + self.penalize() + r = weight * (model_price - entry.mid_price()) + res.append(r if np.isfinite(r) else 1e6) + return np.asarray(res) + + def cost_function(self, params: np.ndarray) -> float: + """Scalar cost: sum of squared residuals plus any penalty""" + r = self.residuals(params) + return float(np.dot(r, r)) + self.penalize() def plot( self, @@ -199,10 +212,9 @@ def plot( support: int = 51, **kwargs: Any, ) -> Any: - """Plot the implied volatility for market and model prices""" + """Plot implied volatility for market and model prices""" cross = self.vol_surface.maturities[index] options = tuple(self.vol_surface.option_prices(index=index, converged=True)) - cross = self.vol_surface.maturities[index] model = self.pricer.maturity(cross.ttm(self.ref_date)) if max_moneyness_ttm is not None: model = model.max_moneyness_ttm( @@ -214,144 +226,39 @@ def plot( **kwargs, ) - -class HestonCalibration(VolModelCalibration[Heston]): - """A [VolModelCalibration][quantflow.options.calibration.VolModelCalibration] - for the [Heston][quantflow.sp.heston.Heston] stochastic volatility model""" - - feller_penalize: float = 0.0 - feller_enforce: bool = Field( - default=True, - description=( - "Enforce the Feller condition $2\\kappa\\theta \\geq \\sigma^2$ as a hard " - "inequality constraint during optimisation. When True, " - "`get_minimize_method` returns SLSQP unless `minimize_method` " - "is already set explicitly." - ), - ) - - def get_bounds(self) -> Sequence[Bounds] | None: - vol_range = self.implied_vol_range() - vol_lb = 0.5 * vol_range.lb[0] - vol_ub = 1.5 * vol_range.ub[0] - return Bounds( - [vol_lb * vol_lb, vol_lb * vol_lb, 0.0, 0.0, -0.9], - [vol_ub * vol_ub, vol_ub * vol_ub, np.inf, np.inf, 0], - ) - - def get_params(self) -> np.ndarray: - return np.asarray( - [ - self.model.variance_process.rate, - self.model.variance_process.theta, - self.model.variance_process.kappa, - self.model.variance_process.sigma, - self.model.rho, - ] - ) - - def set_params(self, params: np.ndarray) -> None: - self.model.variance_process.rate = params[0] - self.model.variance_process.theta = params[1] - self.model.variance_process.kappa = params[2] - self.model.variance_process.sigma = params[3] - self.model.rho = params[4] - - def get_constraints(self) -> Sequence[dict[str, Any]] | None: - """Return the Feller condition $2\\kappa\\theta \\geq \\sigma^2$ as a scipy - inequality constraint when `feller_enforce` is True. - - Params layout: `[rate, theta, kappa, sigma, rho]` at indices 0-4. - The constraint function returns $2 \\cdot kappa \\cdot theta - sigma^2$, - which scipy requires to be $\\geq 0$. - """ - if not self.feller_enforce: - return None - return [{"type": "ineq", "fun": lambda p: 2.0 * p[2] * p[1] - p[3] ** 2}] - - def get_minimize_method(self) -> str | None: - """Return SLSQP when `feller_enforce` is True and no explicit method is - set, since SLSQP supports both bounds and inequality constraints. - Otherwise delegates to the base class. - """ - if self.feller_enforce and self.minimize_method is None: - return "SLSQP" - return self.minimize_method - - def penalize(self) -> float: - kt = 2 * self.model.variance_process.kappa * self.model.variance_process.theta - neg = max(0.5 * self.model.variance_process.sigma2 - kt, 0) - return self.feller_penalize * neg * neg - - -class HestonJCalibration(VolModelCalibration[HestonJ[D]], Generic[D]): - """A [VolModelCalibration][quantflow.options.calibration.VolModelCalibration] - for the [HestonJ][quantflow.sp.heston.HestonJ] stochastic volatility model - with [DoubleExponential][quantflow.utils.distributions.DoubleExponential] jumps - """ - - feller_penalize: float = 0.0 - - def get_bounds(self) -> Sequence[Bounds] | None: - vol_range = self.implied_vol_range() - vol_lb = 0.5 * vol_range.lb[0] - vol_ub = 1.5 * vol_range.ub[0] - lower = [ - (0.5 * vol_lb) ** 2, # rate - (0.5 * vol_lb) ** 2, # theta - 0.001, # kappa - mean reversion speed - 0.001, # sigma - vol of vol - -0.9, # correlation - 1.0, # jump intensity - (0.01 * vol_lb) ** 2, # jump variance - ] - upper = [ - (1.5 * vol_ub) ** 2, # rate - (1.5 * vol_ub) ** 2, # theta - np.inf, # kappa - np.inf, # sigma - 0.0, # correlation - np.inf, # jump intensity - (0.5 * vol_ub) ** 2, # jump variance - ] - try: - self.model.jumps.jumps.asymmetry() - lower.append(-2.0) # jump asymmetry - upper.append(2.0) - except NotImplementedError: - pass - return Bounds(lower, upper) - - def get_params(self) -> np.ndarray: - params = [ - self.model.variance_process.rate, - self.model.variance_process.theta, - self.model.variance_process.kappa, - self.model.variance_process.sigma, - self.model.rho, - self.model.jumps.intensity, - self.model.jumps.jumps.variance(), + def plot_maturities( + self, + *, + max_moneyness_ttm: float | None = 1.0, + support: int = 51, + cols: int = 2, + row_height: int = 400, + showlegend: bool = False, + **kwargs: Any, + ) -> Any: + """Plot implied volatility for all maturities as a subplot grid""" + plot.check_plotly() + n = len(self.vol_surface.maturities) + rows = (n + cols - 1) // cols + titles = [ + cross.maturity.strftime("%Y-%m-%d") for cross in self.vol_surface.maturities ] - try: - params.append(self.model.jumps.jumps.asymmetry()) - except NotImplementedError: - pass - return np.asarray(params) - - def set_params(self, params: np.ndarray) -> None: - self.model.variance_process.rate = params[0] - self.model.variance_process.theta = params[1] - self.model.variance_process.kappa = params[2] - self.model.variance_process.sigma = params[3] - self.model.rho = params[4] - self.model.jumps.intensity = params[5] - self.model.jumps.jumps.set_variance(params[6]) - try: - self.model.jumps.jumps.set_asymmetry(params[7]) - except IndexError: - pass - - def penalize(self) -> float: - kt = 2 * self.model.variance_process.kappa * self.model.variance_process.theta - neg = max(0.5 * self.model.variance_process.sigma2 - kt, 0) - return self.feller_penalize * neg * neg + fig = plot.make_subplots(rows=rows, cols=cols, subplot_titles=titles) + fig.update_layout(height=rows * row_height, showlegend=showlegend) + for i, cross in enumerate(self.vol_surface.maturities): + row = i // cols + 1 + col = i % cols + 1 + options = tuple(self.vol_surface.option_prices(index=i, converged=True)) + model = self.pricer.maturity(cross.ttm(self.ref_date)) + if max_moneyness_ttm is not None: + model = model.max_moneyness_ttm( + max_moneyness_ttm=max_moneyness_ttm, support=support + ) + plot.plot_vol_surface( + pd.DataFrame([d.info_dict() for d in options]), + model=model.df, + fig=fig, + fig_params={"row": row, "col": col}, + **kwargs, + ) + return fig diff --git a/quantflow/options/heston_calibration.py b/quantflow/options/heston_calibration.py new file mode 100644 index 00000000..00e3fc8b --- /dev/null +++ b/quantflow/options/heston_calibration.py @@ -0,0 +1,107 @@ +from __future__ import annotations + +from typing import Generic, TypeVar + +import numpy as np +from pydantic import Field +from scipy.optimize import Bounds + +from quantflow.sp.heston import Heston, HestonJ +from quantflow.sp.jump_diffusion import D + +from .calibration import VolModelCalibration + +H = TypeVar("H", bound=Heston) + + +class HestonCalibration(VolModelCalibration[H], Generic[H]): + """Calibration of the [Heston][quantflow.sp.heston.Heston] model. + + Also serves as the base class for Heston-with-jumps calibration, providing + the Feller condition penalty and the core variance-process parameter handling. + """ + + feller_penalize: float = Field( + default=1000.0, + description=( + "Penalty weight for violating the Feller condition " + "$2\\kappa\\theta \\geq \\sigma^2$. Applied during the Nelder-Mead " + "stage. Set to 0 to disable." + ), + ) + + def get_bounds(self) -> Bounds: + vol_range = self.implied_vol_range() + vol_lb = 0.5 * vol_range.lb[0] + vol_ub = 1.5 * vol_range.ub[0] + return Bounds( + [vol_lb**2, vol_lb**2, 0.0, 0.0, -0.9], + [vol_ub**2, vol_ub**2, np.inf, np.inf, 0.0], + ) + + def get_params(self) -> np.ndarray: + return np.asarray( + [ + self.model.variance_process.rate, + self.model.variance_process.theta, + self.model.variance_process.kappa, + self.model.variance_process.sigma, + self.model.rho, + ] + ) + + def set_params(self, params: np.ndarray) -> None: + self.model.variance_process.rate = params[0] + self.model.variance_process.theta = params[1] + self.model.variance_process.kappa = params[2] + self.model.variance_process.sigma = params[3] + self.model.rho = params[4] + + def penalize(self) -> float: + """Penalty for violating the Feller condition""" + kt = 2 * self.model.variance_process.kappa * self.model.variance_process.theta + neg = max(self.model.variance_process.sigma2 - kt, 0.0) + return self.feller_penalize * neg * neg + + +class HestonJCalibration(HestonCalibration[HestonJ[D]], Generic[D]): + """Calibration of the [HestonJ][quantflow.sp.heston.HestonJ] model with jumps. + + Extends [HestonCalibration][quantflow.options.heston_calibration.HestonCalibration] + by appending jump parameters to the parameter vector and bounds. + """ + + def get_bounds(self) -> Bounds: + base = super().get_bounds() + vol_range = self.implied_vol_range() + vol_lb = 0.5 * vol_range.lb[0] + vol_ub = 1.5 * vol_range.ub[0] + lower = list(base.lb) + [1.0, (0.01 * vol_lb) ** 2] + upper = list(base.ub) + [np.inf, (0.5 * vol_ub) ** 2] + try: + self.model.jumps.jumps.asymmetry() + lower.append(-2.0) + upper.append(2.0) + except NotImplementedError: + pass + return Bounds(lower, upper) + + def get_params(self) -> np.ndarray: + params = list(super().get_params()) + [ + self.model.jumps.intensity, + self.model.jumps.jumps.variance(), + ] + try: + params.append(self.model.jumps.jumps.asymmetry()) + except NotImplementedError: + pass + return np.asarray(params) + + def set_params(self, params: np.ndarray) -> None: + super().set_params(params) + self.model.jumps.intensity = params[5] + self.model.jumps.jumps.set_variance(params[6]) + try: + self.model.jumps.jumps.set_asymmetry(params[7]) + except IndexError: + pass diff --git a/quantflow/utils/plot.py b/quantflow/utils/plot.py index 8d47fdc6..b11dfc77 100644 --- a/quantflow/utils/plot.py +++ b/quantflow/utils/plot.py @@ -13,10 +13,12 @@ import plotly.express as px # type: ignore import plotly.graph_objects as go import plotly.io as pio + from plotly.subplots import make_subplots pio.templates.default = PLOTLY_THEME except ImportError: px = None + make_subplots = None # type: ignore[assignment] def check_plotly() -> None: diff --git a/quantflow_tests/__init__.py b/quantflow_tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/quantflow_tests/test_options.py b/quantflow_tests/test_options.py index 7337d4e7..03425ca0 100644 --- a/quantflow_tests/test_options.py +++ b/quantflow_tests/test_options.py @@ -1,10 +1,13 @@ import math +from datetime import datetime, timedelta +from decimal import Decimal import numpy as np import pytest from quantflow.options import bs -from quantflow.options.calibration import HestonCalibration +from quantflow.options.calibration import ModelCalibrationEntryKey, OptionEntry +from quantflow.options.heston_calibration import HestonCalibration, HestonJCalibration from quantflow.options.inputs import OptionInput from quantflow.options.pricer import OptionPricer from quantflow.options.surface import ( @@ -13,7 +16,8 @@ VolSurface, surface_from_inputs, ) -from quantflow.sp.heston import Heston +from quantflow.sp.heston import Heston, HestonJ +from quantflow.utils.distributions import DoubleExponential from quantflow_tests.utils import has_plotly a = np.asarray @@ -180,25 +184,116 @@ def test_call_put_parity_otm(): def test_calibration_setup(vol_surface: VolSurface, heston: OptionPricer[Heston]): - cal = HestonCalibration(pricer=heston, vol_surface=vol_surface) + cal: HestonCalibration[Heston] = HestonCalibration( + pricer=heston, vol_surface=vol_surface + ) assert cal.ref_date == vol_surface.ref_date assert cal.options - n = len(cal.options) vol_range = cal.implied_vol_range() assert vol_range.lb < vol_range.ub assert vol_range.lb > 0 assert vol_range.ub < 10 - cal2 = cal.remove_implied_above(1.0) - assert len(cal2.options) == n - cal2 = cal.remove_implied_above(0.95) - assert len(cal2.options) < n def test_calibration(vol_surface: VolSurface, heston: OptionPricer[Heston]): vol_surface.maturities = vol_surface.maturities[1:] - cal = HestonCalibration( + cal: HestonCalibration[Heston] = HestonCalibration( pricer=heston, vol_surface=vol_surface - ).remove_implied_above(0.95) + ) cal.fit() if has_plotly: assert cal.plot(index=2) is not None + + +def _synthetic_options( + pricer: OptionPricer, ref_date: datetime +) -> dict[ModelCalibrationEntryKey, OptionEntry]: + ttms = [0.25, 0.5, 1.0, 2.0] + moneynesses = np.linspace(-0.3, 0.3, 11) + options: dict[ModelCalibrationEntryKey, OptionEntry] = {} + for ttm in ttms: + maturity = ref_date + timedelta(days=round(ttm * 365)) + for k in moneynesses: + price = pricer.call_price(ttm, float(k)) + strike = round(np.exp(k), 6) + key = ModelCalibrationEntryKey( + maturity=maturity, strike=Decimal(str(strike)) + ) + op = OptionPrice.create( + strike=strike, + forward=1.0, + price=Decimal(str(round(price, 8))), + ref_date=ref_date, + maturity=maturity, + ) + entry = OptionEntry(ttm=ttm, moneyness=float(k)) + entry.options.append(op) + options[key] = entry + return options + + +def test_calibration_synthetic(vol_surface: VolSurface) -> None: + """Calibration recovers known Heston parameters from synthetic prices.""" + true_vol = 0.3 + true_kappa = 2.0 + true_sigma = 0.5 + true_rho = -0.7 + true_pricer = OptionPricer( + model=Heston.create( + vol=true_vol, kappa=true_kappa, sigma=true_sigma, rho=true_rho + ) + ) + options = _synthetic_options(true_pricer, vol_surface.ref_date) + perturbed = OptionPricer( + model=Heston.create(vol=0.5, kappa=1.0, sigma=0.8, rho=0.0) + ) + cal: HestonCalibration[Heston] = HestonCalibration( + pricer=perturbed, vol_surface=vol_surface, options=options + ) + result = cal.fit() + + assert result.cost < 1e-6 + vp = cal.model.variance_process + assert pytest.approx(vp.theta, rel=0.05) == true_vol**2 + assert pytest.approx(vp.kappa, rel=0.1) == true_kappa + assert pytest.approx(vp.sigma, rel=0.1) == true_sigma + assert pytest.approx(cal.model.rho, abs=0.05) == true_rho + + +def test_hestonj_calibration_synthetic(vol_surface: VolSurface) -> None: + """HestonJCalibration recovers known parameters from synthetic prices.""" + true_vol = 0.3 + true_kappa = 2.0 + true_sigma = 0.5 + true_rho = -0.5 + true_jump_fraction = 0.2 + true_jump_asymmetry = 0.3 + true_pricer = OptionPricer( + model=HestonJ.create( + DoubleExponential, + vol=true_vol, + kappa=true_kappa, + sigma=true_sigma, + rho=true_rho, + jump_fraction=true_jump_fraction, + jump_asymmetry=true_jump_asymmetry, + ) + ) + options = _synthetic_options(true_pricer, vol_surface.ref_date) + perturbed = OptionPricer( + model=HestonJ.create( + DoubleExponential, + vol=0.35, + kappa=1.7, + sigma=0.6, + rho=-0.3, + jump_fraction=0.15, + jump_asymmetry=0.1, + ) + ) + cal: HestonJCalibration[DoubleExponential] = HestonJCalibration( + pricer=perturbed, vol_surface=vol_surface, options=options + ) + result = cal.fit() + + assert result.cost < 1e-6