Volatlas

Connect ThetaData

Point the app at a running Theta Terminal and load history from your subscription.

How the connection works

Volatlas never talks to ThetaData directly. You run ThetaData's own Theta Terminal on the same machine, signed in with your own ThetaData credentials, and the app reads it over plain HTTP on localhost. The app never sees your ThetaData login, and nothing it downloads leaves your machine.

Both live Terminal versions are supported. They answer on different ports, and the app probes both.

TerminalPortPagination
v3 (current)25503None, every query answers in one response
v225510Large answers split across pages

Which subscription you need

Option quotes are what a backtest runs on, and ThetaData serves them on its paid tiers only. The Value tier at $40 a month is the lowest one that does. The tier sets how far back history reaches, about four years on Value, eight on Standard and twelve on Pro. ThetaData is cancel-anytime, and code VOLATLAS20 takes 20% off the first month. To compare what a window would cost on ThetaData and on Databento, use the data cost calculator.

A free ThetaData account is enough for the app to find the Terminal and list expirations, but every quote request answers 403. The load stops with that error rather than returning an empty chain.

Status of this path. Detection and the expirations list have been run against a real v3 Terminal on a free account. The quote parsing, the v2 page walk and the assembly of quotes into bars are covered by tests against recorded and documented responses, but have not yet returned a row from a paid Terminal. The app checks every chain it parses before using it (see below), so a format mismatch fails the load loudly instead of producing a backtest on wrong numbers. If you need a path verified end to end against the live vendor today, Databento is that path.

Connect

  1. Start the Theta Terminal and sign in with your ThetaData account.
  2. Open Data in Volatlas. Under Source, Theta Terminal is selected by default.
  3. Read the status line. While probing it shows Looking for a Theta Terminal. When a Terminal answers it shows, for example, Theta Terminal v3 answering on port 25503.
  4. If it shows No Theta Terminal answering on 25503 or 25510, start the Terminal and press Check again. The app probes once when the Data screen opens and again only when you press that button.

Detection asks each port for the SPY expiration list, v3 first. Any answer other than 404 counts as a running Terminal, including a permission refusal, so a free account is detected. If both versions answer, v3 is used. With no Terminal found, Load chain stays disabled while Theta Terminal is the source. The app does not quietly fall back to the cache.

Load a window

Fill in the Window block and press Load chain.

FieldDefaultMeaning
Option rootSPXWThe root whose expirations and quotes are pulled
UnderlyingIndexIndex reads index prices, Stock reads stock bars
SymbolSPXThe underlying's symbol
From / To8 days ago / yesterdayBoth required; To before From is refused
Interval1 min1, 5, 10, 15, 30 or 60 min
Max DTE60How far past To an expiry may lie
Rate %4Used for greeks and implied vol
Dividend yield %0Used for greeks and implied vol

The session is fixed at 09:30 to 16:00 Eastern. ThetaData stamps its rows in Eastern already, so no conversion happens.

The window is pulled one day at a time. For each day, the app lists the root's expirations and keeps those from that day up to Max DTE days after it. It then requests the quote history for each of those expirations, followed by the underlying's prices for the same session. A larger Max DTE means more expirations and more requests per day.

The load bar counts days, for example 3 of 5 days, and names the date being downloaded. Cancel stops the load between days. Every day already downloaded stays cached, and loading the same window again resumes at the first missing date.

Pagination on v2

A v2 Terminal splits a large answer into pages and names the next page in its response header. The app follows every page and joins them before parsing. If any page fails partway through, the whole request fails, because a chain with rows missing would look complete and be cached as a finished day. The walk stops with an error after 10,000 pages or if a page points back to itself. v3 has no pages.

The cache

Every downloaded day is written to disk as Parquet under the app data directory as soon as it lands. A later load of the same window downloads nothing and does not need the Terminal at all. Choose Cached only under Source to load without any vendor, which is how history keeps working after a ThetaData subscription lapses. A window with a day missing then says so instead of fetching it.

  • The cache is keyed by option root and interval. The ThetaData path caches exactly the interval and Max DTE you asked for.
  • A 1-minute series already on disk serves any coarser interval without a download.
  • Raising Max DTE past what a cached day covers downloads that day again.
  • Today is not cached, because the vendor is still publishing it. It is pulled again on the next load.
  • Days that come back empty, such as weekends, are cached as empty.

Cached history lists each series with its dates, days, bars and size on disk. Clear deletes one series.

Errors

Each failure is shown under Data as one of these messages. Text in angle brackets is filled in from the failure itself.

  • No Theta Terminal answered at <url> (<cause>). Start the Terminal and press Check again. The Terminal is not running or stopped mid-load. Days already cached stay. Restart it, press Check again, then load again.
  • Your ThetaData subscription does not include this data (403 PERMISSION). <Terminal text> A quote request on a tier without option quotes. The Terminal's own upgrade text follows unchanged. Upgrade to a paid tier.
  • Other Terminal codes read the same way, a plain sentence then the status and code name, then any text the Terminal sent. For example The request is too large for the Theta Terminal. Load a shorter window or a lower Max DTE (570 LARGE_REQUEST). or ThetaData's servers are still starting. Wait a minute and load again (571 SERVER_STARTING).
  • No data for a request. The Terminal's NO_DATA answer is treated as an empty result, not a failure, so no message is shown.
  • Could not read the Theta Terminal's response (<reason>). Includes the implausible chain check. Before a day is used, the app refuses negative or non-finite prices, zero strikes, a large share of quotes with bid above ask, and a large share of quotes outside the requested session. Each points to a format mismatch rather than a real market, and the load stops instead of caching it.
  • Some days in this window are not in the cache, and Cached only downloads nothing. Pick a vendor under Source to fetch them. A Cached only load reached a day that is not on disk.
  • Load stopped. Days already downloaded stay cached, so loading this window again resumes. Shown after Cancel.

Once a chain is loaded, continue with Build a strategy or read how to backtest options strategies. Licence pricing is on the pricing page.