Comparing Four Data Providers for Six Tickers Over Five Years

When evaluating alternative security trading strategies, you need valid and consistent stock price data.  To help you evaluate trading strategies of your own, this post examines four data providers for six tickers (AVGO, GOOG, PLTR, GE, ORCL, and SPY) over a five-year time span starting on October 7, 2020 and running through October 6, 2025. 

The four data sources compared in this post are

The post’s first substantive section highlights key findings about the differences in results by ticker across providers.  Data providers that return results that match other vendors are good candidates for using in your analyses in the same way that data providers returning results that do not match other providers are poor candidates for using in your analyses.   Another criterion for selecting a data vendor is whether the vendor is well known or used by the audience for your analyses.  Programmability may also be a consideration in that providers offering programmable solutions make it easier to work with a greater number of tickers and thus have more representative outcomes.  Finally, you can choose data vendors for your analyses based on your familiarity with tool.  The more you work with a data provider, the more productive you are likely to be with data from that provider.

In addition to comparing results across data vendors, this post also includes a mini-tutorial on data provider.  These mini-tutorials are meant to expose you to the basics of how to generate results from each data provider.

Result Differences Across Data Providers

Two tables summarize the comparisons.  The first table displays close prices from each data vendor for the start and end dates for the five-year time span analyzed in this post.   The second table  presents computed percentage changes for the close prices displayed in the first table.  The percentage change values are for the start date through the end date for each combination of data provider and ticker.

Here is the first table.

  • The first pair of rows shows the close prices for the start and end dates for the AVGO ticker.

    • Notice that the AVGO row for 10/7/2020 shows the start date close prices for each data provider.

    • The last four columns of the first AVGO row have a yellow background.  Notice that the Tiingo column in this row has a value that is about 10 times greater than the remaining three columns.  The yellow background is meant to highlight the four start prices because the Tiingo start price is so dramatically different than the start prices from the remaining three providers.

    • The second AVGO row is for the end date close prices.  The close values for this row are identical across all providers.

  •  The second pair of rows shows the close prices for the start and end dates for the GOOG ticker.

    • The first GOOG row also has a yellow background.  This background signals that the Tiingo close price is about twenty times greater than the close prices from Yahoo Finance, GOOGLEFINANCE, and Finviz, respectively.

    • The second GOOG row with end date close prices has very nearly identical values across all providers.

  • The third pair of rows shows the close prices for the start and end dates for the PLTR ticker.  The start close prices on the first of these rows  are identical across all four data providers.  There are also no differences for close prices across providers on the second PLTR rows.

  • The fourth pair of rows shows the close prices for the start and end dates for the GE ticker.

    •  Like the first row for the AVGO and GOOG tickers, the first GE row has a yellow background.  In this case, the Tiingo starting close price is about five times less than the starting close price for the remaining three data providers.

    •  On the other hand, the ending close price is identical across all four providers.

  • The fifth and sixth row pairs are, respectively, for the ORCL and SPY tickers.  Within each of these two tickers, the close prices for the starting and ending dates are identical or nearly identical across data providers.

 

 

Here is the second table.  This table displays computed values for the five-year percentage change from start-to-end close prices by ticker for each data vendor.  The main take-away from this table is that the percentage change values across all four data providers are nearly identical when the underlying values are nearly identical.  In contrast, the percentage change values can be substantially different across data providers when the underlying start and end close values are substantially different.

 

A yellow and black numbers on a white background

AI-generated content may be incorrect.

            

I was able to find a correlation between discrepancies from Tiingo relative to the other three providers whenever there was either a regular or reverse stock split in the analyzed time span.  These findings underscore the importance of understanding how each provider defines and adjusts close prices—especially when splits are involved.  I will have more to say about Tiingo substantial differences with the other data providers  in the Concluding Comments section of this post and another subsequent post that reviews a possible remedy for the issue.  However, it is clear from the analysis in the preceding two tables that it is possible to get inconsistent results from Tiingo relative to the other three data providers.  Therefore, if the time span for your own analyses includes one or more stock splits (either normal or reverse), then you might do well to consider using another vendor beside Tiingo, unless the audience for your analyses expects results from Tiingo.

A Yahoo Finance Mini-Tutorial on Downloading Historical Prices

Yahoo Finance was widely considered the most popular and go-to free source for historical stock ohlcv (Open, High, Low, Close, Volume) data, especially for individual investors, students, and researchers.  According to Wikipedia, Yahoo Finance initiated starting in 2001 free access to online stock quotes.  Over time, the service went through numerous transformations, eventually including the ability to download free csv files with historical ohlcv data for security tickers.  At Yahoo Finance, the ‘c’ in ohlcv may refer to either split-adjusted close or close adjusted for both splits and dividends.

This blog reported on September 11, 2024 that Yahoo Finance suspended free access to downloaded csv files with historical ohlcv data for security tickers.  Although Yahoo Finance discontinued the free distribution of csv files with close price data, the service still supports the display of close prices for security tickers.  In other words, you cannot download a free csv file with historical ticker prices, but you can display historical prices at the Yahoo Finance site.  In fact, you can display the historical prices with the same technique, except for the last step which sends a csv file to your internet-connected device.

I found this YouTube video, which gives a concise demonstration of how to download a csv file with ohlcv data for use in an Excel workbook.  It is accurate except for the final step of downloading a csv file to your computer, which is available only to Yahoo Finance Gold Plan members at the rate of $39.95 per month when billed annually or $49.95 per month when billed monthly.

This Yahoo Finance mini-tutorial walks you through the steps for displaying  close prices for the AVGO ticker by entering AVGO in the search box at the top of the Yahoo Finance home page (https://finance.yahoo.com).  Clicking the search icon opens the following excerpted page.

 

 The left-hand border includes a link named Historical Data.  Clicking the link opens the following excerpted screen.  Historical data for the current date and previous dates are automatically displayed from the most recent to the least recent dates in the historical data window.

 

 Towards the top of the above screen are three buttons for controlling

  •  the date range,

  •  the type of historical data to show – make sure Historical prices are selected), and

  •  whether to show data on a daily, weekly, or monthly basis

The next screenshot shows the date range button after it is clicked.  The Start Date and End Date fields are populated, respectively, with values of 10/07/2020 and 10/08/2020.  These start and end dates return ohlcv values for 10/07/2020 when the Done button is clicked.

 

A screenshot of a phone

AI-generated content may be incorrect.

Here is an excerpted view of the beginning date screen.  The first column is for the start date (10/07/2020).  There are two close values for the start date – namely, close and Adj Close.  If you open the description icon for each term, you get this feedback:

  •  close -- Close price adjusted for splits.

  •  Adj Close -- Adjusted Close price adjusted for splits and dividends and/or capital gain distributions.

 

A screenshot of a computer

AI-generated content may be incorrect.

Here are the date range settings for the most recent date (10/06/2025) in the preceding section’s analysis.

 

A screenshot of a phone

AI-generated content may be incorrect.

Here is an excerpted view of the ending date screen, which is for the most recent date.  The first column is for the start date (10/06/2025).

 

A screenshot of a computer

AI-generated content may be incorrect.

A GOOGLEFINANCE Mini-Tutorial on Downloading Historical Prices 

In response to Yahoo Finance’s halt to  the free distribution of csv files with ohlcv data, this site started researching and using alternative sources for the free distribution of csv files with ohlcv data.  The first update on the research (“GOOLEFINANCE Function in Google Sheets Can Download Historical Data via CSV Files”) appeared in a prior blog post that featured an introduction to the GOOGLEFINANCE function in Google Sheets. Other posts covering the feature set and the use cases for the GOOGLEFINANCE function include “Do Returns from the GOOGLEFINANCE Function In Google Sheets Match Returns from Yahoo Finance?”, “Backtesting an Automated Buy-Sell Model Based on Smoothing Factors for SPY and SPXL”, and “Historical Price Use Cases for the GOOGLEFINANCE Function in Google Sheets”.

The GOOGLEFINANCE function mini-tutorial in this section primarily focuses on how to derive the start and end prices displayed and analyzed in the “Result Differences Across Data Providers” section of the current post.  Before showing some screenshots and functional specifications, it may be useful to note that the GOOGLEFINANCE function derives ohlcv data from the Google Finance site.  In contrast, the Yahoo Finance historical data is derived from a collection of different feeder sites.

The following screenshot is for a Google workbook named For_Comps_with_Tiingo, YF_Finviz.  There are six tabs in the workbook – one for each of the tickers from AVGO through SPY.  The tab for the PLTR ticker is selected in the screenshot below.  The cursor rests in cell A1 of the PLLTR tab.

  • Cells A1 and B1 display column headers for date and price values for the start date based on the function expression in cell A1.  The column headers are automatically populated based on the GOOGLEFINANCE function.

  • The cursor resting in cell A1 allows the GOOGLEFINANCE function parameters to show =GOOGLEFINANCE("NASDAQ:PLTR", "close", "2020/10/07") in the function box next to the cursor position box just above the sheet cells.

    • The first parameter is for the ticker and optionally the exchange from which to obtain price data.  The exchange and ticker parameters are separated by a colon.

    • The second parameter denotes the ohlcv parameter name returned by the function.  The name of the parameter name is close, which is a split-adjusted close price value.  The close parameter value appears in cell B2.

    • The third parameter specifies the start date close value to be returned by the function.  The third parameter’s value appears in cell A2.

  •  If the cursor is resting in cell D1, you can populate the cell with the following GOOGLEFINANCE expression: =GOOGLEFINANCE("NASDAQ:PLTR", "close", "2025/10/06").  This, in turn, populates cells, D1, E1, D2, and E2.

  •  After entering the appropriate GOOGLEFINANCE function expressions in cells A1 and D1, you can copy the start and end date and price values with the Windows cut and paste capability to any desired locations, such as spreadsheet cells  for the first table in the “Result Differences Across Data Providers” section.

 

A screenshot of a computer

AI-generated content may be incorrect.

 The GOOGLEFINANCE expressions for each of the remaining five tabs can have the same design, except for the GOOGLEFINANCE expressions.

  •  Cell A1 in the AVGO tab has this expression: =GOOGLEFINANCE("NASDAQ:AVGO", "close", "2020/10/07"), and cell D1 in the tab has this expression: =GOOGLEFINANCE("NASDAQ:AVGO", "close", "2025/10/06").

  •  Cell A1 in the GOOG tab has this expression: =GOOGLEFINANCE("NASDAQ:GOOG", "close", "2020/10/07"), and cell D1 in the tab has this expression: =GOOGLEFINANCE("NASDAQ:GOOG", "close", "2025/10/06").

  •  Cells A1 in the GE tab has this expression: =GOOGLEFINANCE("GE", "close", "2020/10/07"), and cell D1 in the tab has this expression: =GOOGLEFINANCE("NASDAQ:GE", "close", "2025/10/06").

  •  Cells A1 in the ORCL tab has this expression: =GOOGLEFINANCE("ORCL", "close", "2020/10/07"), and cell D1 in the tab has this expression: =GOOGLEFINANCE("NASDAQ:ORCL", "close", "2025/10/06").

  • Cells A1 in the SPY tab has this expression: =GOOGLEFINANCE("SPY", "close", "2020/10/07"), and cell D1 in the tab has this expression: =GOOGLEFINANCE("NASDAQ:SPY", "close", "2025/10/06").

A Finviz Mini-Tutorial on Downloading Historical Prices

I started using the regular version of Finviz (finviz.com) around three years ago, but I have been an a paid member of the elite Finviz version (elite.finviz.com) for about two years.  Either version supports both charting and screening stock price trends.  Finviz does not offer downloadable historical data, but its charting interface allows manual inspection of close prices.  Finviz is my constant companion during most trading days, and I therefore find it convenient to look up historical prices in it.  This post section showed how I use the elite Finviz version to retrieve historical prices for this tip.

Start to display historical prices for a ticker by entering the ticker name at the top of the Finviz screen.  Then, press Enter on your keyboard to launch the presentation of a chart with candlesticks to depict the price action for individual trading days.  The following screenshot shows the entry of the AVGO ticker.

 

 

The chart initially opens by showing the most recent year of trading days. Scroll left, in necessary, to display a range of dates with the close price that you want to view.   The next screen shows the chart window scrolled left to display a candlestick for the October 7,2020 trading day.  The date October 7, 2020, points to the first trading day for which prices are tracked in this post.

There are two speech balloons on the screenshot below.  An extension from the lower speech ballon points at the trading day’s candlestick.  You can select the candlestick for any trading day by hovering your cursor over the candlestick.  The speech ballon towards the top left edge of the candlestick chart points at the close price for October 7, 2020.  Note that this close price (36.67) corresponds to the cell for Finviz column of the AVGO ticker on October 7, 2020 for the first table in the “Result Differences Across Data Providers” section.

 

 

You can derive the close prices for other dates and tickers by scrolling the chart window to display the candlesticks for which you require close prices.  Now is a good time to take a break from reading and try scrolling around Finviz charts to verify these instructions work for you.


A Tiingo Mini-Tutorial on Downloading Historical Prices

Tiingo is a highly regarded organization for the distribution, analysis, and news about financial securities, such as over 80,000 tickers for US Equities, ETFs, Mutual Funds, and Chinese A-SharesThe source data for these tickers is derived from an extensive collection of exchanges.  A list of the exchanges for end-of-day data is available from the Tiingo End of Day Stock Price Data API.  End-of-day data and ohlcv data are similar in structure and layout across data providers.  However, there are significant differences in how end-of-day data are derived and reported across end-of-day data providers.  Consider re-reading this post’s “Result Differences Across Data Providers” section to get a topline feel for how these differences can impact reported securities prices across vendors.

The Tiingo securities prices were reported for its unadjusted price data.  Similarly, the Yahoo Finance securities prices were also reported from its unadjusted data.  However, Tiingo and Yahoo Finance define unadjusted data differently.  Furthermore, ohlcv data from Finviz and the GOOGLEFINANCE function generally adhere to the Yahoo Finance definition of unadjusted data.  A future post from this blog will examine ways of managing differences between data providers for unadjusted financial security prices.

Tiingo credentials include a username, password, and API token. The token is your key for programmatic access—keep it secure.

  • Use the Tiingo user name to view your account, manage subscriptions, and access your API Token.  Look for the "Sign-up" button at https://api.tiingo.com to designate your desired user name.

  • Use your Tiingo password along with your user name to enable Tiingo website login to view your account and generate your API Token.

  • Your Tiingo API token is a secret key you specify that acts as your password for making programmatic data requests.  Copy this string and keep it private and safe.

Within this post, there are three distinct processes for reporting financial security prices from Tiingo.

  • The first process uses a Microsoft PowerShell script for extracting data from the Tiingo website to a directory on my office computer (C:\SecurityTradingAnalytics\FirstPowerShellCloses\).  PowerShell is an automation framework and scripting language from Microsoft that enables developers to automate tasks and configure management across various platforms.

  • The second process uses a T-SQL script for transferring files in the data directory populated by the PowerShell script to a SQL Server table ([SecurityTradingAnalytics].[dbo].[ticker_date_prices]).  T-SQL takes the foundational data manipulation and definition capabilities of standard SQL (like SELECT, INSERT, UPDATE, and CREATE TABLE) and adds procedural programming features.

  • The third process uses another T-SQL script for extracting prices from the SQL Server table and reporting start and end dates along with associated unadjusted prices for the six tickers tracked in this post.

The following PowerShell script automates the download of close prices for 37 tickers from the Tiingo website for end-of-day data.  There are six key steps in the process implemented by the script.  The code for each step is preceded by a comment which describes its role in the process implemented by the script.

 

# Step 1: Define API token and output folder

$token = "YOUR_TIINGO_API_TOKEN"  # Replace with your actual token

$folderPath = "C:\SecurityTradingAnalytics\FirstPowerShellCloses"

 

# Step 2: Create folder if it doesn't exist

if (!(Test-Path $folderPath)) {

New-Item -ItemType Directory -Path $folderPath

}

 

# Step 3: Define tickers

$tickers = @("ORCL", "NVDA", "MU", "INTC", "AVGO", "PLTR", "MS", "GS", "SCHW", "HOOD", "IBKR", "GOOG", "META", "NFLX", "WBD", "PSKY", "GE", "BA", "HWM", "AXON", "TQQQ", "SPXL", "FAS", "NUGT", "SIL", "IBIT", "XLC", "SOXL", "XME", "WULF", "MSTR", "BITX", "WGMI", "COIN", "ETHT", "SPY", "QQQ")

 

# Step 4: Loop through each ticker and download close prices

foreach ($ticker in $tickers) {

$startDate = "1900-01-01"

$endDate = (Get-Date).ToString("yyyy-MM-dd")

$url = "https://api.tiingo.com/tiingo/daily/$ticker/prices?startDate=$startDate&endDate=$endDate&token=$token"

 

try {

     $response = Invoke-WebRequest -Uri $url -UseBasicParsing

     $data = $response.Content | ConvertFrom-Json

 

     # Step 5: Extract date and close only

     $longFormat = $data | Select-Object @{Name="date";Expression={$_.date}}, @{Name="close";Expression={$_.close}}

 

     # Step 6: Export to CSV

     $outputPath = "$folderPath\$ticker-close.csv"

     $longFormat | Export-Csv $outputPath -NoTypeInformation

     Write-Host "Saved $ticker to $outputPath"

}

catch {

        Write-Warning "Failed to download data for $ticker"

}

}

 

Here is some output that appears in the PowerShell window as the code iterates through the tickers defined in step 3.

 

Saved ORCL to C:\SecurityTradingAnalytics\FirstPowerShellCloses\ORCL-close.csv

Saved NVDA to C:\SecurityTradingAnalytics\FirstPowerShellCloses\NVDA-close.csv

Saved MU to C:\SecurityTradingAnalytics\FirstPowerShellCloses\MU-close.csv

Saved INTC to C:\SecurityTradingAnalytics\FirstPowerShellCloses\INTC-close.csv

Saved AVGO to C:\SecurityTradingAnalytics\FirstPowerShellCloses\AVGO-close.csv

Saved PLTR to C:\SecurityTradingAnalytics\FirstPowerShellCloses\PLTR-close.csv

Saved MS to C:\SecurityTradingAnalytics\FirstPowerShellCloses\MS-close.csv

Saved GS to C:\SecurityTradingAnalytics\FirstPowerShellCloses\GS-close.csv

Saved SCHW to C:\SecurityTradingAnalytics\FirstPowerShellCloses\SCHW-close.csv

Saved HOOD to C:\SecurityTradingAnalytics\FirstPowerShellCloses\HOOD-close.csv

Saved IBKR to C:\SecurityTradingAnalytics\FirstPowerShellCloses\IBKR-close.csv

Saved GOOG to C:\SecurityTradingAnalytics\FirstPowerShellCloses\GOOG-close.csv

Saved META to C:\SecurityTradingAnalytics\FirstPowerShellCloses\META-close.csv

Saved NFLX to C:\SecurityTradingAnalytics\FirstPowerShellCloses\NFLX-close.csv

Saved WBD to C:\SecurityTradingAnalytics\FirstPowerShellCloses\WBD-close.csv

Saved PSKY to C:\SecurityTradingAnalytics\FirstPowerShellCloses\PSKY-close.csv

Saved GE to C:\SecurityTradingAnalytics\FirstPowerShellCloses\GE-close.csv

Saved BA to C:\SecurityTradingAnalytics\FirstPowerShellCloses\BA-close.csv

Saved HWM to C:\SecurityTradingAnalytics\FirstPowerShellCloses\HWM-close.csv

Saved AXON to C:\SecurityTradingAnalytics\FirstPowerShellCloses\AXON-close.csv

Saved TQQQ to C:\SecurityTradingAnalytics\FirstPowerShellCloses\TQQQ-close.csv

Saved SPXL to C:\SecurityTradingAnalytics\FirstPowerShellCloses\SPXL-close.csv

Saved FAS to C:\SecurityTradingAnalytics\FirstPowerShellCloses\FAS-close.csv

Saved NUGT to C:\SecurityTradingAnalytics\FirstPowerShellCloses\NUGT-close.csv

Saved SIL to C:\SecurityTradingAnalytics\FirstPowerShellCloses\SIL-close.csv

Saved IBIT to C:\SecurityTradingAnalytics\FirstPowerShellCloses\IBIT-close.csv

Saved XLC to C:\SecurityTradingAnalytics\FirstPowerShellCloses\XLC-close.csv

Saved SOXL to C:\SecurityTradingAnalytics\FirstPowerShellCloses\SOXL-close.csv

Saved XME to C:\SecurityTradingAnalytics\FirstPowerShellCloses\XME-close.csv

Saved WULF to C:\SecurityTradingAnalytics\FirstPowerShellCloses\WULF-close.csv

Saved MSTR to C:\SecurityTradingAnalytics\FirstPowerShellCloses\MSTR-close.csv

Saved BITX to C:\SecurityTradingAnalytics\FirstPowerShellCloses\BITX-close.csv

Saved WGMI to C:\SecurityTradingAnalytics\FirstPowerShellCloses\WGMI-close.csv

Saved COIN to C:\SecurityTradingAnalytics\FirstPowerShellCloses\COIN-close.csv

Saved ETHT to C:\SecurityTradingAnalytics\FirstPowerShellCloses\ETHT-close.csv

Saved SPY to C:\SecurityTradingAnalytics\FirstPowerShellCloses\SPY-close.csv

Saved QQQ to C:\SecurityTradingAnalytics\FirstPowerShellCloses\QQQ-close.csv

 

Here is a T-SQL script for ingesting to the [SecurityTradingAnalytics].[dbo].[ticker_date_prices]  table from the csv files exported by the preceding PowerShell script.  The code successively populates a fresh copy of the staging table (dbo.date_prices_stage) for each ticker.  Next, the code attempts to add the staging table contents to the dbo.ticker_date_prices table.   The code maintains a log of the outcomes for attempts to add staging table contents for a single ticker to the dbo.ticker_date_prices table with contents from all tickers.

 

use [SecurityTradingAnalytics];

go

 

-- TSQL script to gather ticker close prices by trading date into dbo.ticker_date_prices

 

-- Destination table

if object_id('dbo.ticker_date_prices', 'U') is not null

drop table dbo.ticker_date_prices;

go

 

create table dbo.ticker_date_prices (

ticker varchar(10),

[date] date,

[close] decimal(10, 6)

);

go

 

-- Staging table

if object_id('dbo.date_prices_stage', 'U') is not null

drop table dbo.date_prices_stage;

go

 

create table dbo.date_prices_stage (

date_str varchar(30),

close_str varchar(50) -- increased from 10 to 50 to handle Tiingo release format

);

go

 

-- Logging table

if object_id('dbo.ingestion_log', 'U') is not null

drop table dbo.ingestion_log;

go

 

create table dbo.ingestion_log (

ticker varchar(10),

status varchar(20),

error_message nvarchar(max),

timestamp datetime default getdate()

);

go

 

-- Declare tickers to ingest

declare @tickers table (seq int identity(1,1), ticker varchar(10));

insert into @tickers (ticker) values

('AVGO'), ('AXON'), ('BA'), ('BITX'), ('COIN'), ('ETHT'),

('FAS'), ('GE'), ('GOOG'), ('GS'), ('HOOD'), ('HWM'),

('IBIT'), ('IBKR'), ('INTC'), ('META'), ('MS'), ('MSTR'),

('MU'), ('NFLX'), ('NUGT'), ('NVDA'), ('ORCL'), ('PLTR'),

('PSKY'), ('QQQ'), ('SCHW'), ('SIL'), ('SOXL'), ('SPXL'),

('SPY'), ('TQQQ'), ('WBD'), ('WGMI'), ('WULF'), ('XLC'), ('XME');

-- Loop through tickers

declare @i int = 1;

declare @max int = (select count(*) from @tickers);

declare @ticker varchar(10);

declare @bulk_sql nvarchar(max);

declare @insert_sql nvarchar(max);

 

while @i <= @max

begin

select @ticker = ticker from @tickers where seq = @i;

 

truncate table dbo.date_prices_stage;

 

set @bulk_sql = '

BULK INSERT dbo.date_prices_stage

FROM ''C:\SecurityTradingAnalytics\FirstPowerShellCloses\' + @ticker + '-close.csv''

WITH (

        FIELDTERMINATOR = '','',

        ROWTERMINATOR = ''\n'',

     FIRSTROW = 2,

        DATAFILETYPE = ''char''

);';

 

begin try

     exec sp_executesql @bulk_sql;

 

     set @insert_sql = '

     insert into dbo.ticker_date_prices (ticker, [date], [close])

     select ''' + @ticker + ''',

            TRY_CONVERT(date, REPLACE(date_str, ''"'', ''''), 126),

            CONVERT(decimal(10, 6), REPLACE(close_str, ''"'', ''''))

     from dbo.date_prices_stage;';

 

     exec sp_executesql @insert_sql;

 

     insert into dbo.ingestion_log (ticker, status) values (@ticker, 'Success');

end try

begin catch

     insert into dbo.ingestion_log (ticker, status, error_message)

     values (@ticker, 'Failed', error_message());

end catch

 

set @i += 1;

end

go

 

-- View failed ingestions

select * from dbo.ingestion_log where status = 'Failed';

 

Here is a T-SQL script for generating the Tiingo column values in the first table of the “Result Differences Across Data Providers” section.  As you can see, the code extracts data from the dbo.ticker_date_prices table based on data extracted from Tiingo.

 

use [SecurityTradingAnalytics];

go

 

-- Define the tickers and dates of interest

declare @tickers table (ticker varchar(10));

insert into @tickers (ticker) values

('AVGO'), ('GOOG'), ('PLTR'), ('GE'), ('ORCL'), ('SPY');

 

declare @dates table (target_date date);

insert into @dates (target_date) values

('2020-10-07'), ('2025-10-06');

 

-- Extract Tiingo prices from dbo.ticker_date_prices

select

t.ticker,

d.target_date as [Date],

p.[close] as [Tiingo]

from @tickers t

join @dates d on 1=1

left join dbo.ticker_date_prices p

on p.ticker = t.ticker and p.[date] = d.target_date

order by t.ticker, d.target_date;

 

Concluding Comments

This post compares and contrasts four ohlcv data providers for their return values across six tickers.  It was discovered that Yahoo Finance, the GOOGLEFINANCE function in Google Sheets, and Finviz return highly consistent results across all six tickers (AVGO, GE, GOOG, ORCL, PLTR, and SPY).  Tiingo results based on the code in this post also returned consistent results with the other data providers when there was no regular or reverse stock split over the evaluation time span.  However, when there was a stock split in the evaluation time span, Tiingo return values diverged from the other three data providers.

Additional literature research and conversations with Google Genesis confirmed that Tiingo and Yahoo Finance used different definitions of unadjusted close values.  Yahoo Finance modifies raw end-of-day close prices based on stock splits going back in time when a stock split occurs.  What Yahoo Finance calls adj close values are adjusted for both splits and dividends.  The PowerShell code (developed in coordination with Microsoft Copilot) extracts unadjusted close values that do not reflect stock splits.  A follow-up post to this one will further examine this issue of different definitions for unadjusted close values between Yahoo Finance and Tiingo as well as use cases for adjusted and unadjusted close values generally.  In the interim, you may derive value from the following YouTube video in which Dave Keller explains his opinions about when and why to use different kinds of close values.

Aside from close value definitions between data providers, Tiingo clearly targets programmer analysts.  Programmatic solutions are generally faster at returning larger datasets than non-programmatic solutions.  In contrast, Yahoo Finance, the GOOGLEFINANCE function in Google Sheets, and Finviz may be preferable for financial analysts who prefer a non-programmatic solution for deriving close values.  Also, when it is important for your analyses to concur with any of these three widely followed data providers, then it may be advisable not to use a programmatic solution even if it is faster than a non-programmatic solution.

Whether you’re a programmer analyst or a spreadsheet strategist, understanding how your data provider defines close prices is essential to building consistent, trustworthy models.

Comments

Popular posts from this blog