https://www.interactivebrokers.com/en/index.php?f=1562
Quick google of exchanges but these would be the lit exchanges. You'd still have darkpools and other venues.
Stock data is a nightmare. I'd say a good chunk of your time, if trying to get a good data set is scrubbing and maintaining the data you got. Many tick data vendors and data providers provide raw data. Meaning they send all the data and you have to manage it. When I used IQFeed, if I used tick data, I'd have to use a ATR filter in Amibroker to help filter the "bad ticks" out. Yahoo or many EOD providers filter these out or should say the exchanges filter them out with closing data.
I know in Amibroker, theirs a simple utility to help with bad ticks that's based off "Average True Range". You can turn it up or down to your liking and it just picks up those ticks that are way out of line with average. Simple concept to help out.
I've kind of come to the conclusion that the perfect stock database is just really hard to maintain. On one hand you want raw tick data as it paints the whole story but then you want to filter out those bad ticks from some off exchange block trade that you couldn't participate in if you wanted too. Then you have de-listings, stock splits, mergers, name changes, re-listings etc.
Then you got dividends to deal with. Simple solution is to just back adjust your prices on ex-dividend but then your price levels aren't reflecting trading prices in the preceding bars.
Throw in the fact that the daily open and close prices we all see daily don't reflect opening auction and closing prices as their just the first trade after 9:30 and last trade at 4:00.
You start getting into it and it's half the battle getting a database that's been scanned for holes, missed splits, etc. Once you get that done you get that sucker on a back up hardrive because you don't want to do that again.
If your lucky you just want EOD data and use something like Norgate data and Amibroker and let their plugin features do the hard work for you. Get a de-listed database and let their plugin handle monthly historical constituent lists and watch Amibroker's backtester handle historical index constituents with a simple line of code .
"NorgateIndexConstituentTimeSeries("S&P 500")"
Futures guys just have to worry about how to stitch some contracts together. Forex guys just need to figure out what their data is and where its from lol.