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.
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.
File hashes identify changed bytes; they are not a complete change-by-change revision history. The stock dated manifests' corrections list carries the last 90 days of corrections to event columns for dates outside the rolling download window. It is not a ledger of every historical price or file revision. Keep the manifest and file versions used for a reproducible analysis; see the stock README for the correction process and its limits.
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.
Raw options prices and contract adjustments
The options CSV does not provide stock-style adj_* columns. Its recorded quotes, strike and underlying_close must not all be rescaled using a stock split-and-dividend adjustment factor. Stock total-return adjusted prices are not substitutes for the observed underlying price when analysing an original options row.
Contract adjustments are separate from stock price adjustments. Ordinary cash dividends normally do not adjust option contracts; OCC determines adjustments case by case. For a split, special distribution or other corporate action, consult the applicable OCC notice for the effective date and contract terms, including deliverables and multipliers. See OCC's dividend adjustment guidance.
The CSV does not include contract deliverable or multiplier fields, so it alone cannot reconstruct every adjusted position. The historical adjusted-contract coverage gap also applies. See the options README for field definitions.
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.
r- Annual risk-free rate as a decimal;
0.05 means 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.
Options IV comparison, 2 January 2013: rows with both bid/ask IV values and a comparison IV from the source. Range widths and absolute IV differences use decimal volatility units.
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, and the independent source reconciliation below for comparisons with records HistoricalData.net did not produce.
Data Quality Reports
A comparison of two historical sample dates, with contract matching, field-level results, unresolved differences and downloadable evidence. These findings apply to the specified files and dates, not the entire archive. This is a supplier-authored comparison, not Cboe certification.
Daily and 19-security minute comparisons with a documented reconstruction of the 1 July 2026 sample, including quantity differences, a supplementary Cboe check, methods and downloadable evidence. Findings apply to the specified files and fields, not the entire archive. This is a supplier-authored comparison, not exchange certification.
Independent source reconciliation
File checks establish integrity and consistency with documented rules. Independent comparisons check selected market values against outside records. Each result below states its dates, comparison population and remaining disagreements; it does not certify every value in the full archive.
verify.py establishes that the files you hold are exactly what HistoricalData.net published. Reconciliation asks a separate question: whether the published values agree with records that HistoricalData.net did not produce. The supplied reconcile.py compares local stock and options files with public third-party records and lists every disagreement with its date and both values. Python 3.8 or later is required; no additional packages are needed.
| Reference | What is compared |
| Cboe official index closes | The underlying_close carried by index option rows is compared with the official daily closing level published by Cboe for the indices it calculates, including SPX, VIX, RUT, XSP, OEX, XEO and DJX. Weekly and other root aliases such as SPXW are compared with the index they reference. NDX and the Nasdaq and PHLX index families have no free official history and are reported as having no reference. |
| Public secondary quote source | Stock and ETF raw close, volume, dividend and split records, and the underlying_close of stock and ETF option rows, are compared with Yahoo Finance's public daily records. That source restates earlier values after a split; the tool undoes the restatement using the source's own split records before comparing. It is a secondary source, so agreement corroborates the files and disagreement identifies rows to check. Automated access is subject to that provider's terms; --sources cboe skips it. |
Prices agree when they match within publication precision (0.005, scaled where a split restatement applies). Volumes are reported by relative-difference band, because late trade reports and session-window differences between providers make an exact test uninformative. Cumulative adjustment ratios are reported but not judged: the archive retains adjustments up to its own as-of date, while a live source includes every distribution up to the day of the query.
Results for the 2022 free samples
1,016 of 1,021 exact-precision comparisons agree (99.5%), counting every price and corporate-action check below; volume differences are reported by band and are not counted.
Run on 17 September 2026 against the published stock and options samples (July–December 2022, 127 trading days) with python reconcile.py --root . --cache refs --json report.json. The figures on this site are written from that report by a build step and checked at build time, so they cannot be edited by hand. Each population is stated with its result; a later sample or archive rebuild requires a new run.
| Check | Result |
| Stock close: KO, SPY, TSLA | 381 daily rows compared; 381 agree exactly. TSLA's 38 rows before its 25 August 2022 split agree after undoing the source's 3-for-1 restatement. |
| Stock volume: KO, SPY, TSLA | 381 rows compared: 374 within 1% (311 within 0.1%), 7 within 5%, none beyond 5%. Largest relative difference 2.17% (SPY, 2 December 2022). |
| Dividend and split events | 5 of 5 agree: KO's two dividends, SPY's two distributions and TSLA's split match in date and amount; the source records SPY's amounts to three decimals. |
Options underlying_close: KO, SPY, TSLA | 381 underlying-days compared; 381 agree. |
Options underlying_close: SPX | 127 days compared with the Cboe official close; 127 agree. |
Options underlying_close: SPXW | 127 days compared with the Cboe official SPX close; 122 agree and 5 disagree by 0.02 to 3.05 index points (19 September, 16 and 17 November, 5 and 21 December 2022). See the open item below. |
| TWTR | Not compared: the source publishes no history for the delisted security. |
| Adjustment ratios on 30 December 2022 | SPY: archive 0.956184, source 0.956184. TSLA: both 1.000000. KO: archive 0.901666, source 0.896318. The KO archive ratio reproduces the product of the 14 distribution factors recorded at the source through 4 September 2026, the archive's as-of date; the source's own ratio additionally includes a distribution dated 15 September 2026. |
Daily session check
After each US close, the standing end-of-day quotes for a fixed panel of 15 option underlyings and 14 stocks and ETFs are captured from Cboe delayed quotes and compared with the archive files published the next morning. Counted, contract by contract: open interest, trade prices, last trade date and the official close of each index; for stocks, high, low and close. Prices must agree to the cent. Reported but not counted: the standing bid and ask, which the two feeds sample at different moments in the final minutes of the session and which differ by a few cents in either direction; volume, implied volatility and delta, reported by band; the stock opening price, because opening-print conventions differ between feeds. Quote sizes are not compared, because Cboe reports its own book size rather than the consolidated size. The capture is taken after the curb session and before the SPX and VIX overnight session opens. The evening capture is kept with its checksums as the record of what was compared.
Latest session, 23 October 2026: 507,238 of 509,672 exact checks agree (99.5%). Options: 93,920 contracts matched, 507,196 of 509,630 counted checks agree (99.5%); standing quotes identical on 60.5% and within 1% on 71.7% of 187,840 bid and ask values. Stocks: closes agree for 14 of 14 symbols, 42 of 42 price checks agree (100.0%). Sessions in the rolling window: 20, from 2026-09-28; 99.6% of all checks agree; options 99.6%, stocks 99.9%.
Open item: SPXW underlying_close in historical records. The official-close substitution keys on the underlying field. Historical index option rows whose underlying is a root alias such as SPXW therefore retain the historical record's quote-time index value instead of the official close; SPX rows on the same dates carry the official close. In the 2022 sample this affects 5 of 127 SPXW days by at most 3.05 points (0.08%). The condition is recorded here until a corrected rebuild is published, and it is not listed in the options field notes' three quote-time groups.
Agreement with a secondary source is corroboration, not an exchange-source audit, and six months of four securities do not establish archive-wide agreement. A disagreement identifies a row to investigate; it does not by itself establish which side is wrong. Reference downloads are for your own comparison and should not be redistributed.
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.
Product dates and security-specific coverage
A product's overall date span does not establish the first or last available date for every security, lifecycle, option root or frequency. Stock daily-file date bounds do not establish minute-file bounds or uninterrupted coverage. The latest-session options lookup does not establish historical coverage for a root. Check the exact securities, frequency and dates your analysis needs; if that evidence is unavailable, coverage remains unconfirmed.
Update sizes and local analysis
A full archive's average daily size is not a measurement of recent update files. To size an options update workflow, use the actual uncompressed CSV sizes for a stated recent date window and report the range as well as the average. Compressed transfer size and database storage, including indexes, are different quantities. No verified recent daily-size series is provided here.
update.py downloads and synchronizes entitled files and maintains the documented stock library. mcp.py queries downloaded local CSV files within its scan limits; read_csv returns up to 100 matching rows from one file per call. Neither provides a general remote export of an arbitrary symbol subset from the whole archive. See local analysis tools.
Stock coverage notes
| Topic | Meaning & use |
| Historical dividend labels | dividend_type is not a complete record of special distributions. Classification does not determine the price adjustment: cash distributions are included regardless of their type label.
Compare payment amounts and neighbouring distributions when identifying specials; do not rely on CD or SC alone. 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; volume and vwap cover the full trading day, including extended hours. VWAP can therefore fall outside the daily low–high range. Account for these different time windows when validating prices. Use minute session labels to inspect regular and extended hours separately. 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 PFE1. These contracts are included when available in daily capture from 6 August 2026. 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 close cannot be cross-checked against an independent trading record. A small number of stale trade prices may remain. Inspect volume and last_trade_date alongside early options closing prices; do not assume every reported price reflects a fresh trade. |
| Historical settlement labels | Some historical BKXPM, OSXPM and SOXPM rows have a blank settlement_time even though these series settle PM. Identified rows retain the correct exercise style and IV/Greeks calculations; the omission concerns the settlement label. 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 NDXP and XEO contracts. Other contracts on these dates remain available. 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 trading_days_missing. 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. |