EMon Tool Documentation

EMon (Equities Monitor) tracks equities, analyzes portfolio risk, and measures the forward-tested success rate of trading strategies. Every tool below is also exposed as an API endpoint documented further down this page.

Suggestions or contributions welcome — reach out to [email protected].

Trading Strategies

Automated Reports

Earnings Focused Analysis Tools

Ranks stocks by their most favorable earnings-driven moves (large moves in the 30 days before and 3 days after earnings). See the write-up.

Earnings scanner for under-performing symbols whose earnings call fell within the past five days.

Sector Focused / ETF Analysis Tools

Dashboard visualizing relative P/E and relative P/B, ranked by sector.

Sector leaderboard followed by the stocks making the largest move by percentage and volume.

etf_rankings

Active

ETF rankings grouped by asset class and leverage multiple. The page itself is fixed, but the underlying daily ETF scan has been covering far fewer symbols than it used to since Oct 2025 — the page flags this with a "Sparse data" badge when a date has thin coverage; older dates have fuller data.

Volatility Focused Analysis Tools

Volatility analysis for one or more tickers. Refreshed every 15 minutes, M–F 9:45am–4pm.

Creates long straddle positions for a given ticker/dte/method (method is spot or mean). Example above uses AAPL, 30 DTE, spot.

Miscellaneous

Directly query the database and run SELECT statements.


EMon API Documentation — v1.0

Authentication. Every endpoint below requires a logged-in session. POST /auth with a password form field to receive a session cookie, then send that cookie with each API request. A request without a valid session gets:

HTTP 401
{ "error": "unauthorized", "message": "Log in at /auth to obtain a session cookie before calling this endpoint." }

Errors. Invalid input (bad date format, invalid ticker, too many tickers, malformed body) returns 400:

HTTP 400
{ "error": "bad_request", "message": "Invalid date 'not-a-date': expected YYYY-MM-DD" }

A database/upstream failure returns 502 with { "error": "upstream_error", "message": "..." } instead of a raw HTML stack trace.

GET /volatilityOutliers/{date}

Options positions with positive days-until-expiry (DTE). date is optional (YYYY-MM-DD); omit it to get all open positions regardless of record date.

Request

No request body.

Response

[
  {
    "exp_date_str": "09-18-2026",
    "record_date_str": "08-07-2026",
    "dte": 19,
    "record_date": "2026-08-07",
    "exp_date": "2026-09-18",
    "ticker": "INDI",
    "symbol": "INDI260918P00004000",
    "strike": 4.0,
    "volume": 2.0,
    "open_interest": 3.0,
    "implied_volatility": 0.811,
    "bs_sigma": 0.375,
    "bs_call": 0.2,
    "bs_put": 0.2,
    "spec_perc_move": -0.01,
    "bs_iv_call": 0.41,
    "bs_iv_put": 0.35,
    "last_option_price": 0.61,
    "last_underlying_price": 4.04,
    "side": "PUT",
    "bias": "Long"
  },
  ...
]
GET /dailyVolatility/{date}

Compares 3-month volatility with the day's percent move, for every symbol. date is optional (YYYY-MM-DD); omit it to use today.

Request

No request body.

Response

[
  {
    "record_date": "2026-08-30",
    "ticker": "A",
    "last_price": 153.84,
    "volatility": 0.145,
    "prev_day_volatility": 0.142,
    "percent_move": -0.024,
    "avg_volume": 2217725.7,
    "avg_price": 138.6,
    "time_period": 63,
    "curr_volume": 2966271.13
  },
  ...
]
GET /getVolatilityAnalysis/{ticker}

Today's volatility analysis for one ticker (path param), or every ticker if omitted.

Request

No request body.

Response

[
  {
    "record_date": "2026-08-30",
    "ticker": "MARA",
    "volatility_ratio": 0.727,
    "minimum_volatility": 0.16,
    "maximum_volatility": 0.378,
    "average_volatility": 0.243,
    "current_volatility": 0.277,
    "against_prev_volatility": -0.032,
    "curr_price": 10.67,
    "net_profitability": 0.0,
    "dividend_yield": 0.0,
    "time_period_low": 6.73,
    "time_period_high": 22.84,
    "interval": 21
  }
]
POST /getVolatilityAnalysis/

Today's volatility analysis for a list of tickers. Each ticker must be 1–12 characters (letters, digits, ., -); at most 25 tickers per request.

Request

{ "tickers": ["AAPL", "TSLA"] }

Response

Same shape as the GET response above, one record per matched ticker.

GET /runAndGetVolatilityAnalysis/{ticker}

Same as getVolatilityAnalysis, but first re-runs the volatility scan for the requested ticker(s) against live market data before reading the result back — slower, but guaranteed fresh. Omitting the ticker returns the existing table without triggering a scan (there's nothing bounded to re-run).

Request

No request body.

Response

Same shape as getVolatilityAnalysis.

POST /runAndGetVolatilityAnalysis/

Same as getVolatilityAnalysis (POST), but re-runs the scan for every listed ticker first. Same 25-ticker cap applies.

Request

{ "tickers": ["AAPL", "TSLA"] }

Response

Same shape as getVolatilityAnalysis.