List all financial Assets data conditionally

I would like to get all the Financial Data that Mathematica respecting those constraints :

The assets for which there are at least 20 years of daily price quotations. Or that have s price for each day the market has been open for at least 20 years.

or

The assets that have prices time resolution of 15 min available for at least 1 year. That is I wil have 4 Price in each hour that the market has been open for at least 1 year.

Is it possible?

-
I'm not sure what the first constraint is asking for, could you clarify? – rcollyer Feb 22 '12 at 4:25
Do any of them have 15-minute data? PS congratulations on a very auspicious reputation level (888). – Verbeia Feb 22 '12 at 4:27
AUSPICIOUS, not suspicious. 888 is a lucky number in some cultures. – Verbeia Feb 22 '12 at 5:01
@verbeia ahaha, thank you very much it all make sense now wow, I had never heard/seen that word. 888 i my reputations :-) I took a screen shot, for my colleague from China ! – 500 Feb 22 '12 at 6:08
I think that MMA gets its data (for stocks) from Yahoo!Finance, and they don't provided historical tick data as far as I know. To get all stocks that have 20 years of daily quotes, I think you'd have to check the length of the returned values for all symbols. – Tim Mayes Feb 22 '12 at 6:21

As far as I know, FinancialData does not provide a way to query the length of data available for a particular stock. The only way of knowing it is to query the data and select those that have data for 20 years. First, let's get a list of all NYSE stocks with:

stocks = FinancialData["NYSE:*", "Lookup"];


Now, I have multiple interpretations for your 20 year constraint, so I'll address them below.

1. The stock existed 20 years ago

This does not take into account if the stock exists at present. So, first we get the exact date 20 years ago with

date20yAgo = DatePlus[DatePlus[0], {-20, "Year"}];


and select those stocks that have data on that day. To account for that day being a Saturday/Sunday or any other public holiday, we retrieve data for the entire week:

existed20yAgo := ! FinancialData[#, {date20yAgo, DatePlus[date20yAgo, 7]}] ===
Missing["NotAvailable"] &;

Select[stocks[[ ;; 20]], existed20yAgo] // Quiet
(*
Out[1]= {"NYSE:AA", "NYSE:AAI", "NYSE:AAN", "NYSE:AAR", "NYSE:AB",
"NYSE:ABA", "NYSE:ABK", "NYSE:ABK-PZ", "NYSE:ABM", "NYSE:ABN-PE"}
*)


I've just retrieved for the first 20 so that it runs in a reasonable time when you're checking. For the full list, remove the call to Part.

2. The stock has existed for the past 20 years

You can simply modify the above example a little as:

existedForPast20y[stock_] :=
FreeQ[! (FinancialData[stock, {#, DatePlus[#, 7]}] ===
Missing["NotAvailable"]) & /@ {date20yAgo, DatePlus[-7]}, False]


You can do a quick check of the above with:

existedForPast20y /@ {"AAPL", "GOOG"}
(* Out[2]= {True, False} *)


You can use Select[...] as before and use this function to test.

3: The stock has 20 years of historical data (any date range)

This will unfortunately require pulling all the data for each stock, and will definitely be slower.

has20yData := DateDifference[Sequence @@ (First /@
Through[{First, Last}[FinancialData[#, All]]]), "Year"][[1]] >= 20 &


Again, replace the test function in Select with has20yData. I'll leave the rest of the constraints for you to work on.

-