Comparing Kibot Data to Other Sources

Many customers compare Kibot data against Yahoo Finance, Bloomberg, or another vendor before placing an order, and a fair number compare again after delivery. Kibot supports the practice: data that has not been cross-checked cannot be trusted in backtesting or production. This page explains the differences customers most often see, why they exist, and how to reconcile them. The four recurring causes are adjustment-column confusion at Yahoo, regular-session-only opens and closes, after-hours prints leaking into other vendors' daily highs and lows, and spike filtering that removes obvious bad ticks. Most reported discrepancies fall into one of these four buckets.

Map the Columns First

Yahoo Finance publishes two close columns per daily row: Close and Adj Close. The first is the unadjusted close as printed at the time of trade; the second is the same value after splits and dividends are applied retroactively. Kibot's standard delivery format is the adjusted version. The correct comparison is therefore:

Kibot columnYahoo column
Adjusted CloseAdj Close
Unadjusted CloseClose

Most reported "Kibot does not match Yahoo" cases turn out to be Kibot adjusted compared against Yahoo's unadjusted Close, or vice versa. Once both sides are pulled from the matching column, the prices line up to within the much smaller differences explained in the rest of this page.

Yahoo has at various times published the unadjusted price under the Adj Close header on the main US site; this was a Yahoo bug, not a data difference. The Singapore Yahoo Finance site has historically been the reliable mirror. The fix is column-by-column: pull Date, Open, High, Low, Close, Adj Close, Volume, then transform Yahoo's row into adjusted form using a single multiplier derived from the unadjusted and adjusted close.

Adjusting Yahoo Prices for Splits and Dividends

If you only have Yahoo's unadjusted columns, you can still produce comparable adjusted values without re-downloading. The multiplier is the ratio of Adj Close to Close; multiply that into Open, High, and Low to get the adjusted open, high, and low. The adjusted close is just Adj Close directly.

multiplier = AdjClose / Close
Adjusted Open = Open * multiplier
Adjusted High = High * multiplier
Adjusted Low = Low * multiplier
Adjusted Close = AdjClose
Volume = Volume (already adjusted on Yahoo)

Worked example, Baidu (BIDU) on July 25, 2007:

Open, High, Low, Close = 178.90, 185.30, 173.43, 183.23
Adj Close = 18.32
multiplier = 18.32 / 183.23 = 0.09998

Adjusted Open = 178.90 * 0.09998 = 17.89
Adjusted High = 185.30 * 0.09998 = 18.53
Adjusted Low = 173.43 * 0.09998 = 17.34
Adjusted Close = 183.23 * 0.09998 = 18.32

Note on volume: Yahoo's volume column is already split-adjusted, so it is directly comparable to Kibot's volume without any further transformation. Small differences (a few percent) typically reflect a handful of trades reported outside the regular session, not adjustment-method drift.

Why Daily Opens and Closes Can Differ

Kibot daily bars are built from the regular session only. The daily open is the first regular-session print and the daily close is the last regular-session print. Other vendors, including Yahoo, sometimes use the exchange's official open or official close, which can be:

  • The opening cross or auction price, which is a single derived value, not a printed trade.
  • A delayed-open price published by an NYSE specialist after order-imbalance resolution, which can be minutes or even hours after 9:30 AM ET.
  • A closing cross or auction price published after the 4:00 PM bell, derived from on-close orders rather than from a regular-session trade.
  • An after-hours print designated as the official close by the listing exchange.

All four cases produce a daily open or close that does not appear in regular-session tick or minute data. Kibot's convention prioritizes consistency between the daily file and the intraday file: a daily bar's open is always present as the first minute or first tick of that day's intraday file, and the same is true of the close. A customer who wants to match the exchange's official open and close instead can rebuild the daily file from intraday plus the exchange's official auction prints, but the default is regular-session boundaries.

The most volatile periods of the day are the open and the close, so differences in convention are most visible at exactly those bars. A 30-cent gap between Kibot's regular-session open and Yahoo's official-open quote is normal for a stock that traded actively in the first thirty seconds after 9:30 AM.

Why Daily Highs and Lows Can Differ

If Kibot's daily High or Low does not match another source, the most common cause is a bad tick that Kibot filtered out and the other source kept. Exchanges occasionally distribute trades that are obvious errors: a single share crossing at a price ten percent away from the surrounding market, an off-exchange print at a stale price, a TRF report submitted with the wrong decimal. These show up in raw feeds as a one-bar spike, and they propagate into daily highs and lows on vendors that do not filter.

Kibot applies conservative spike filtering: only the most obvious errors are removed, judged against the surrounding bars. A real flash-crash print is kept. A late-reported off-exchange trade at a price three standard deviations from the regular-session range, with no continuation, is removed.

The customer-side test is direct: compare the disputed High or Low against the regular-session minute or tick file. If the price exists in regular-session intraday data, Kibot kept it. If it does not, Kibot filtered it. The same single-bar prints can also show up at Yahoo as the daily High or Low when the print was an after-hours trade outside the regular session; those will not appear in any Kibot file because Kibot's daily is regular-session only.

A Real Example: BGP on Nov 24, 2008

Borders Group (BGP) on November 24, 2008 is a recurring reference case. Yahoo's daily High and daily Close for that date were both set by a late after-hours print well outside the regular session. The print is real, but it was a single off-hours trade with no continuation. The Kibot daily file for BGP on the same date uses regular-session prices only, so the High and Close are visibly different from Yahoo's. Plotting the intraday data side by side makes the cause obvious: the disputed Yahoo bar is a single isolated tick after 4 PM, while Kibot's daily values reflect the regular-session activity actually visible in the minute file.

The implication for backtesting: a strategy that exits on the daily High is testing two different things on the two data sets. On Yahoo, it is testing an exit on an isolated after-hours print that was almost impossible to fill at the time. On Kibot, it is testing an exit on the highest regular-session price, which is what most live traders can actually transact at. The Kibot value is the more realistic one for trade simulation.

Adjusted vs Unadjusted: Which to Compare

For raw price-level checks ("did the stock really print 47.20 on this date?") use unadjusted on both sides. Kibot's unadjusted column is the actual transaction price recorded at the time of trade, with no retroactive adjustment. Yahoo's Close column is the same shape.

For return calculations, indicator inputs, and any time-series statistic, use adjusted on both sides. Kibot's adjusted column applies splits and dividends back through the history; Yahoo's Adj Close applies splits and dividends back through the history. They will not always match to the cent because the dividend timing and ex-date conventions vary slightly between vendors, but the trend, returns, and volatility characteristics will align closely.

One trap to be aware of: some vendors adjust only for splits, not for dividends. Kibot's adjusted column always includes both. If you are comparing against a vendor that does splits-only, the dividend portion of the adjustment will show as a systematic drift between the two adjusted close series. The Adjusted vs unadjusted data page covers the full mechanics.

What to Do When the Numbers Still Do Not Match

After columns are aligned, sessions are matched, and adjustment conventions agree, residual differences usually fall into a small set of causes. The shortlist:

  • Composite vs primary listing. Some vendors report consolidated/composite prices that include trades reported via TRFs and dark pools; Kibot reports primary exchange. Identical share counts on different prints.
  • Round-lot vs odd-lot inclusion. Older history sometimes excluded odd-lot prints from official high/low. Vendor conventions differ.
  • Time-stamp alignment in intraday. A minute bar dated 09:31 on one vendor and 09:30 on another describes the same window but with different labelling conventions.
  • Different bad-tick filters. Even between vendors that filter, the thresholds differ. The same single-tick error survives one filter and not another.
  • Survivorship and corporate-action backfill. Some vendors edit historical files to apply corporate actions retroactively (e.g. ticker changes), and others do not.

If you have a specific symbol-and-date discrepancy that none of the above explains, contact Kibot support with the symbol, date, your other source, and the disagreeing values. Real data errors do exist; Kibot's monitoring pipeline finds and repairs them on an ongoing basis, but a reported case from a user often surfaces an issue that automated checks missed.

Key Takeaways

  • Most reported mismatches between Kibot and Yahoo are column-mapping errors. Kibot adjusted maps to Yahoo's Adj Close; Kibot unadjusted maps to Yahoo's Close.
  • Kibot daily values are built from the regular session only. Other vendors often use the exchange's official open or close, which can come from auctions or after-hours prints.
  • Daily highs and lows differ most often because Kibot filters obvious bad ticks while many other sources do not. A real flash-crash print is preserved; an isolated off-exchange spike is removed.
  • Yahoo's volume column is already split-adjusted, so volumes are directly comparable without further transformation.
  • For return calculations and indicators, compare adjusted-to-adjusted. For raw price audits, compare unadjusted-to-unadjusted.
  • Some vendors adjust only for splits, not for dividends. Kibot does both; this can produce systematic drift in adjusted-vs-adjusted comparisons against splits-only vendors.