Stock & Options Data Methodology
HistoricalData.net prepares US stock and options CSV files using the data sources, stock adjustment formulas, implied volatility (IV) and Greeks calculations, and validation checks documented below.
For general market conventions, see the market data reference.
Data sources
HistoricalData.net stock bars use consolidated trade data from US exchanges and reporting venues, including off-exchange reporting and OTC markets. HistoricalData.net options files combine archived end-of-day records with ongoing daily capture from 6 August 2026.
Historical options records and ongoing daily options capture use the same pricing models and calculation conventions. The field definitions document availability across the historical and daily collection periods.
HistoricalData.net checks published files before release; see validation. CSV empty fields represent unavailable values, while zero represents a recorded zero value, such as no trading volume.
Stock methodology
Stock daily bars and trading sessions
| Field | Time window |
|---|---|
open, high, low, close | Regular-session opening, highest, lowest and closing prices. Extended-hours prices are excluded. |
volume | Consolidated volume for the whole trading day, including extended-hours and off-exchange trades. |
vwap | Volume-weighted average price over the same whole-day window as volume. |
Stock daily OHLC prices describe the regular session, while daily vwap covers the whole trading day. Daily VWAP can therefore lie outside the daily low–high range. Use minute session labels to inspect regular and extended hours separately.
See historical measurements for daily VWAP and daily/minute volume comparisons.
Stock timestamps and the session column
Stock timestamps use US Eastern time, following EST and EDT. Minute bars are labelled pre, reg or post using the exchange calendar for that date, including early closes.
On a 13:00 close, regular-session minutes end at 12:59. A fixed 09:30–16:00 filter would include some after-hours activity. Options quote_time uses UTC instead of Eastern time.
Stock adjustments
HistoricalData.net per-security stock files carry raw prices and split- and dividend-adjusted values in adj_*. Dated stock cross-section files are point-in-time records: their adj_* values equal the raw values. Use per-security stock files, or the stock library maintained by update.py, for cumulative adjustments.
Stock adjustment formulas
| Action | Price factor | Application |
|---|---|---|
| Split | from / to | A split recorded as 1:3 contributes a factor of one third. |
| Cash distribution | (prev_close - cash) / prev_close | cash is the total distribution on the ex-date; prev_close is the preceding trading day's published close. |
| Combined adjustment | F = product of later event factors | F is the cumulative stock price adjustment factor for a row. Prices and VWAP are multiplied by F; volume is divided by F. Price × volume is preserved before rounding. |
Both regular and special cash distributions participate. dividend_type preserves the supplied classification; it does not decide whether a cash amount is included. A split-only price series can be derived from split, but is not a separate delivered column.
Which stock rows are adjusted
Each stock row's adjustment factor combines events dated after that row. An event never adjusts its own effective-date row. In a full per-security stock history, raw and adjusted values therefore agree from the most recent event date onward; there is no fixed base date. A security with no events has a factor of one throughout.
Historical stock extracts can retain adjustments for events after the extract ends. The last row of a stock sample therefore need not have adj_close = close.
Stock adjustment special cases
| Case | Rule |
|---|---|
| Several cash distributions on one date | Sum the cash amounts, then calculate one dividend factor. |
| Several splits, or a split and dividend on one date | Multiply their factors. The dividend factor uses the published previous close, without first adjusting it for that day's split. |
| Non-USD distribution | The factor is unknown, so earlier rows' adjusted values are blank. The event-date row is not affected by its own event, though a later unknown factor can affect it. |
| The same distribution recorded in USD and another currency | Use the USD records for that date. |
| Cash amount at least as large as the previous close | Retain the event, but do not apply its zero or negative factor to earlier prices. |
Calculations use the published input precision. Reproduced adjusted values are compared at the output precision and documented tolerances.
Stock updates and revisions
A new dividend or split rescales earlier adjusted values for that security. This adjustment does not itself change raw observations or event records, but those records can change through later data corrections.
Recent daily volume, transaction counts and VWAP may be revised as late reports and cancellations settle. Corporate-action records can also be corrected or withdrawn. update.py checks file hashes, applies published corrections and recomputes the affected adjustments. If maintaining files manually, use the current manifest and replace changed files instead of only appending rows.
Stock daily and minute files
Stock daily and 1-minute files use the same adjustment formulas, with one factor across a day's minute bars. The daily and minute event histories can differ: a daily file can include an event-only row when the security did not trade, while a minute file has no bar on which to record that event. Use the daily event history when comparing stock adjustments across the two frequencies.
On a trading day with an event but no trading, the daily event row has blank prices, zero volume and zero transactions. If the recorded event date is a market holiday, prices and trading quantities are blank; the date is declared in event_only_days. The recorded event date is preserved rather than moved to a guessed trading day.
When rebuilding minute adjustments, update.py uses the last regular-session minute close as the previous close. Small rounding or closing-price differences can therefore remain relative to the daily calculation.
Options methodology
What an end-of-day options row represents
Each HistoricalData.net end-of-day options row represents one contract on one trading date: its last standing bid/ask quote, that day's trading activity and the calculated values. End-of-day options files are not synchronized snapshots across contracts.
An options row's bid and ask belong to the same quote record. From 6 August 2026, quote_time records the quote's last update in UTC when available; that time can precede the file date. Earlier options files have no quote timestamp, so per-row quote age cannot be measured.
In options files, underlying_close normally uses the unadjusted official close, but some historical rows and indices use a quote-time underlying price. See the underlying-price exceptions.
Options pricing models and inputs
| Choice | Calculation |
|---|---|
| American-style contracts | Leisen-Reimer binomial tree, 101 steps, allowing early exercise. Greeks are calculated by finite differences using the same tree. |
| European-style contracts | Black-76 on the forward, with analytic Greeks. |
| Forward price | Within each contract-root and expiration group, choose the strike nearest the underlying price with usable call and put quotes. Calculate F = K + exp(rT) × (call_mid - put_mid). |
| Fallback and dividends | If no usable pair or positive forward is available, use F = S × exp(rT). Otherwise derive q = r - ln(F/S) / T for the American model. This infers dividends and financing effects from quotes rather than forecasting cash payments; the fallback ignores dividends. |
| Risk-free rate | US Treasury daily par yields, interpolated linearly to maturity and held flat beyond the available tenors. Missing tenors are omitted. When no curve is published, the most recent curve within five days can be used; the manifest records carried-forward dates. |
| IV solver | Brent's method, tolerance 1e-6, at most 60 iterations, over 0.0001 to 5.0 volatility (500%). |
| Exercise and settlement | style distinguishes American and European exercise; settlement_time distinguishes AM and PM settlement. These are separate properties. For example, OEX is American and XEO European. |
Options formula variables
F- Options forward price; distinct from the stock adjustment factor above.
S- Underlying price from
underlying_close. K- Strike price; the paired strike in the call–put parity formula.
T- Effective time to expiry in years, using the calendar adjustments below.
r- Annual risk-free rate as a decimal;
0.05means 5%. q- Implied continuous dividend yield used by the American model, as an annual decimal rate; includes financing effects inferred from quotes.
call_mid- Mean of the bid and ask for the selected call.
put_mid- Mean of the bid and ask for the put at the same strike and expiration.
HistoricalData.net options finite-difference Greeks are constrained to their theoretical sign and domain bounds. Theta is per year, vega per 1.00 volatility, and rho per 1.00 interest rate; see field definitions and conversions.
Options time to expiry
HistoricalData.net options calculations start with T = (expiration - quote_date) / 365, using a calendar-day difference to express time in years. The Saturday-expiration and AM-settlement deductions below can both apply to the same contract.
| Case | Convention |
|---|---|
| Nominal Saturday expirations before February 2015 | Subtract one day to use Friday instead of Saturday. |
| AM settlement | Subtract one day. Under this daily convention, T reaches zero before the settlement morning, even when the standing quote still contains overnight time value. |
| No remaining time | No midpoint IV or Greeks are published when T is zero or negative. PM expiry-day rows and AM rows on the preceding day can therefore contain quotes but no calculated values. |
A pre-2015 Saturday expiration with AM settlement receives both deductions. This is a daily pricing convention, not an intraday time-to-expiry calculation.
Options IV solutions and status
HistoricalData.net calculates options implied volatility independently from the midpoint, bid and ask. The midpoint is usable only when both quote sides are positive. In options CSV files, iv_flag describes the midpoint solve: flags 0 and 1 mean iv and all five Greeks are populated; flags 2–7 mean those fields are blank.
Options rows with iv_flag = 0 use a parity-derived forward; rows with iv_flag = 1 use the dividend-free fallback. iv_bid and iv_ask can be present or blank independently of iv_flag. See all status definitions.
Options bid–ask IV range
In HistoricalData.net options files, iv_ask - iv_bid describes the range of volatilities implied by the bid and ask under the pricing model. A wider range means the implied volatility varies more with the choice of quoted price; it is not a measured IV error or a statistical confidence interval.
Width of iv_ask − iv_bid | Rows | Median absolute difference vs. source IV |
|---|---|---|
| under 0.02 | 58,836 | 0.0035 |
| 0.02 – 0.05 | 57,056 | 0.0049 |
| 0.05 – 0.10 | 47,639 | 0.0068 |
| 0.10 – 0.25 | 46,180 | 0.0144 |
| 0.25 and above | 18,221 | 0.0415 |
Among options rows with complete bid/ask IV ranges and a source comparison IV on 2 January 2013, wider ranges were associated with larger median absolute differences between HistoricalData.net and source IV. In the same single-session measurement, median IV range width was 0.0307 at the money and 0.0952 in the money; the three time-to-expiry buckets differed by less than 0.005. All values are in decimal volatility units. The observations do not establish archive-wide accuracy.
Options trading activity
| Field | Interpretation |
|---|---|
multileg_volume | Options contract volume attributed to multi-leg executions. The reported total can exceed volume; subtracting multileg_volume from volume does not reliably establish the number of contracts traded outside multi-leg orders. |
active_minutes | The number of one-minute windows containing trades. Use it with transactions to distinguish concentrated from sustained activity; it is not a direct measure of liquidity. |
close and last_trade_date | close is intended to represent a trade from that session; carried-forward old trade prices are suppressed. last_trade_date records the most recent day this contract was observed trading within the archive. It can remain populated when today's close is blank. |
Options multi-leg measurement: six sampled sessions from 4 November 2019 to 25 August 2026. Between 42% and 54% of traded contracts had some multi-leg activity; for 12%–21%, reported multi-leg volume matched or exceeded the day's total volume. The denominator is the number of traded option contracts in each sampled session, not total traded volume.
Options activity measurement: 392,561 traded contracts on 1 June 2026. Median active minutes: 2; 34.9% traded in one minute. Among contracts with volume 101–1,000, the 10th and 90th percentiles were 4 and 71 minutes. In 52.0% of the 392,561 traded-contract rows, active_minutes = min(transactions, 390), comparing transaction counts capped at 390 minutes.
Early options trade-price checks have limits; see early closing-price verification. For surface fitting, see volatility surface research.
Validation
HistoricalData.net stock and options files undergo release checks. Each product's supplied verify.py lets you repeat the documented file checks locally using Python's standard library; the accompanying README defines the scope and tolerances.
| Check | What it establishes |
|---|---|
| File integrity | Compare file checksums with the supplied manifest. Archive-member checks apply when reading a ZIP. This checks the downloaded bytes, separately from their market-data meaning. |
| Structure and dates | Check the expected headers, row widths and date formats. In options files, quote_date must match the filename. |
| Calendar coverage | Compare available files with the covered date range and manifest. Distinguish files not downloaded from gaps in the published collection; consult trading_days_missing instead of assuming every trading date has a file. |
| Options identities | iv and five Greeks are populated exactly when iv_flag <= 1. When all three IV values exist, iv_bid <= iv <= iv_ask. Positive quote values, bid/ask ordering and Greek domain bounds are checked where the required fields are present. |
| Stock adjustments | Recalculate event factors from the published raw and event columns, compare adjusted values within documented tolerances, and check the rules appropriate to per-security or dated files. |
HistoricalData.net verification checks establish file integrity and consistency with the documented rules. Their scope is structural and computational validation, rather than independent exchange-source reconciliation. See sample verification commands.
Coverage notes
These technical notes document HistoricalData.net historical coverage, field conventions and dated measurements. Use the delivery README and matching manifest for the files in your release. Measurements below describe the stated test populations and dates, rather than a current archive-wide completeness rate.
Stock coverage notes
| Topic | Meaning & use |
|---|---|
| Historical dividend labels |
Compare payment amounts and neighbouring distributions when identifying specials; do not rely on Example: Costco special dividends in 2012, 2015, 2017 and 2020 carry CD; its 2023 special carries SC. These examples do not establish a year after which every label is reliable. |
| Daily session coverage | Daily OHLC describes the regular session; Account for these different time windows when validating prices. Use minute Measurement: 20 long-lived tickers, 112,996 daily rows from 1 October 2003 through 26 August 2026. VWAP was outside the low–high range in 119 rows (0.11%); 27 exceeded the nearest boundary by more than 1%. |
| Daily vs minute volume | Summing minute-bar volume does not necessarily reproduce daily volume. The difference varies by security and date. Compare the two aggregates without assuming a fixed percentage gap. Check days with no minute records separately. 2026 source-data comparison through 24 August 2026: 1,874,978 symbol-days with both daily and minute aggregates. Median minute/daily volume: 91.75%; 10th percentile: 68.85%. |
| Missing minute days | A security can have daily volume for a trading day with no corresponding minute records. This is a coverage gap, separate from a difference between two available volume totals. Check minute coverage for the securities and dates your strategy needs; do not treat an absent day as zero trading. Measurement: 68,209 symbol-days with daily volume but no minute records in the 2026 source-data comparison through 24 August 2026. These days are excluded from the volume-ratio statistics above. |
Options coverage notes
| Topic | Meaning & use |
|---|---|
| Corporate-action adjusted contracts | HistoricalData.net's archive through 5 August 2026 lacks corporate-action adjusted contracts, such as non-standard contracts with a numeric root suffix like Account for this coverage gap when researching corporate actions or following adjusted positions through time. Measurement: four test dates from June 2021 to June 2022. Missing adjusted contracts represented 0.22–0.29% of contracts that traded on each sampled day; this is not an archive-wide rate. |
| Early closing-price verification | Before June 2014, options Inspect |
| Historical settlement labels | Some historical Check the delivery README for corrections, and use the matching manifest to verify downloaded files. |
| Index quote gaps | Some index series have missing quotes on 29 January, 30 April, 30 July and 29 October 2025, including affected Check each contract's bid and ask before calculating a mid price. Missing quotes can also leave IV and Greeks unavailable; they are not zero-valued observations. |
| Missing trading days | Some trading dates have no published file. The file manifest lists the available files and identifies absent dates in Check the manifest for your research window before joining daily files. A missing file does not mean the market was closed or that no contracts traded. |