Recipe, one Python file
Earnings-week straddles
This week's reporters with the market's implied move next to what they usually do. Reads the next seven days of the earnings calendar, keeps the largest names, and prints the straddle-implied move beside the historical average move and the ratio between them. A ratio well above one says the market is paying up for the event; well below one says the event is cheap against its own history.
What it prints
The output,
as captured.
Run against the live API on 2026-09-08 with a real token. Premium sellers and buyers deciding which earnings to take a position in.
Earnings 2026-09-08 to 2026-09-15, 12 reporters, largest 8 shown
date timing implied % hist avg % ratio straddle move %
CPRT 2026-09-10 AMC 4.06 4.08 1.00 7.43
CNM 2026-09-09 TBD 7.16 8.44 0.85 9.95
KR 2026-09-11 BMO 3.87 4.72 0.82 5.55
CHWY 2026-09-09 BMO 7.26 8.94 0.81 11.20
CASY 2026-09-08 TBD 5.50 7.38 0.75 8.81
ADBE 2026-09-10 AMC 5.74 8.07 0.71 8.08
ORCL 2026-09-10 AMC 8.02 12.50 0.64 11.52
GME 2026-09-08 AMC 5.03 9.73 0.52 5.56
ratio = implied move over the average of past reported moves; above 1.2 the event is rich, below 0.8 cheap.
The script
One file,
requests and nothing else.
Set APEXVOL_API_TOKEN from Account, then API Access, and run it. The token is the only configuration.
import os
import sys
import requests
# One token, any paid or trial plan: Account, then API Access.
TOKEN = os.environ.get("APEXVOL_API_TOKEN") or sys.exit("set APEXVOL_API_TOKEN")
BASE = os.environ.get("APEXVOL_API_URL", "https://apexvol.com") + "/api/mcp/data"
S = requests.Session()
S.headers["Authorization"] = f"Bearer {TOKEN}"
def get(path, **params):
r = S.get(BASE + path, params=params, timeout=90)
body = r.json()
if not body.get("success"):
sys.exit(f"{path}: HTTP {r.status_code}: {body.get('error')}")
return body["data"]
cal = get("/earnings-calendar", days_ahead=7)
rows = [r for r in cal["earnings"] if r.get("implied_move") and r.get("hist_avg_move")]
rows.sort(key=lambda r: -(r.get("market_cap") or 0))
rows = rows[:8]
if not rows:
sys.exit("no priced reporters in the next seven days")
moves = get("/batch/expected-move", tickers=",".join(r["symbol"] for r in rows))
print(f"Earnings {cal['from_date']} to {cal['to_date']}, {cal['total_count']} reporters, largest {len(rows)} shown")
print()
print(f"{'':7}{'date':>11}{'timing':>8}{'implied %':>11}{'hist avg %':>12}{'ratio':>7}{'straddle move %':>17}")
for r in sorted(rows, key=lambda r: -(r.get("move_ratio") or 0)):
em = moves["results"].get(r["symbol"]) or {}
live = f"{em['expected_move_percent']:.2f}" if em else "n/a"
print(f"{r['symbol']:7}{r['date']:>11}{(r.get('timing') or '?'):>8}{r['implied_move']:>11.2f}"
f"{r['hist_avg_move']:>12.2f}{r['move_ratio']:>7.2f}{live:>17}")
print()
print("ratio = implied move over the average of past reported moves; above 1.2 the event is rich, below 0.8 cheap.")
How it works
- 1. Read the calendar
- GET /earnings-calendar?days_ahead=7 carries implied_move, hist_avg_move and move_ratio per reporter.
- 2. Price the straddles
- GET /batch/expected-move?tickers=... adds the live one standard deviation move to the next expiration.
- 3. Rank by ratio
- Sort by implied over historical; the extremes at either end are where a view pays.
Schedule it
- cron
0 12 * * 1 APEXVOL_API_TOKEN=avmcp_... python3 earnings_week_straddles.py
Monday 08:00 New York. Times in the crontab are UTC.- Claude Code
/loop 1d python3 earnings_week_straddles.py
Runs it on an interval inside a session, and the assistant reads the output each time.
The same job, no code
Ask an assistant
with the MCP server.
Connect the ApexVol MCP server and this recipe is one prompt. It ships in the client's prompt picker as recipe-earnings-week-straddles.
Which large caps report earnings this week, and how does each one's implied move compare with its usual move?
The assistant calls get_earnings_calendar, calculate_expected_move and answers from the same JSON the script prints.Set it up in:
Under the hood
2 endpoints,
one token.
Each card opens the endpoint's page: parameters and bounds, every field, a real response and a console that runs it on your ticker.
GET /earnings-calendar
Who reports this week, and which names have the biggest move priced in?
Upcoming reports with the implied move next to the historical average.
Basic
GET /batch/expected-move
How much is the market pricing each of these names to move by the next expiration?
Straddle-implied expected move for up to 25 symbols in a single request.
Premium
Access
- Plan
- Premium and above. Every endpoint follows the tier of its web feature; the chips on the cards say which.
- Cost
- Measured in upstream data requests against the monthly allowance, not calls; a batch call counts one rate-limit unit and one data request per symbol.
GET /api/mcp/data/me/usageshows the meter. - Reference
- The rate-limits guide, the conventions and the error model. The whole API as one Markdown file: /llms-full.txt.
Included with
every paid plan.
From $55 a month. Create a token under Account, then API Access, and this script runs as it is.
Real market data, not a sandbox. See it live on AAPL.