Some Basic Stock Analysis with Mathematica 8
One of my favourite investment news sites is The Motley Fool which frequently run articles such as 10 Shares Trading Near 52 week lows and 15 Shares Trading Near 52 week Highs. The idea behind such filtering is to seek out shares that have done particularly badly (or well) over the last year and then subject them to further analysis in order to find opportunities. Thanks to Mathematica’s FinancialData command, it is rather easy to generate these lists yourself whenever you like.
15 Shares Trading Near 52 Week Highs
The original article selected the 15 largest cap shares from the FTSE All Share Index that were trading within 3% of their 52 week high at the time of publication. Let’s see how to do that using Mathematica.
The following code returns the tickers of all shares from the FTSE All Share Index that are trading within 3% of their 52 week high.
percentage = 3; all52weekHighs = Select[FinancialData["^FTAS", "Members"], Abs[FinancialData[#, "FractionalChangeHigh52Week"]] < (percentage/100.) &];
The variable all52weekHighs contains a list of stock tickers (e.g. LLOY.L) that meet our criteria. The next thing to do is to find the market cap of each one:
all52WeekHighsWithCaps = Map[{#, FinancialData[#, "MarketCap"]} &, all52weekHighs];
This works fine for most shares. LloydsTSB for example returns {“LLOY.L”, 2.7746*10^10} at the time of writing but the MarketCap query fails for some tickers. For example, the Market Cap for HSL.L is not available and we get {“HSL.L”, Missing[“NotAvailable”]}. Let’s discard these by insisting that we only consider stocks that have a numeric market cap.
Goodall52WeekHighsWithCaps = Select[all52WeekHighsWithCaps, NumberQ[#[[2]]] &];
We sort the list according to MarketCap:
sorted = Sort[Goodall52WeekHighsWithCaps, #1[[2]] > #2[[2]] &];
Let’s prettify the list a little by iterating over all tickers and replacing the ticker with the associated stock name. Also, let’s divide the market cap by 1 million to make it more readable
finallist = Map[{FinancialData[#[[1]], "Name"], #[[2]]/1000000} &, sorted];
Now, you may be wondering why I haven’t been showing you the output of these commands. This is simply because even this final list is rather large at 118 entries at the time of writing
Length[finallist] 118
The original article only considered the top 15 sorted by Market Cap so let’s show those. Market Caps are given in millions.
top15 = finallist[[1;;15]]//Grid HSBC Holdings PLC 94159. National Grid 24432. Prudential PLC 21775. Centrica PLC 17193. Rolls Royce Group 16363. WPP Plc 10743. Experian PLC 10197. Old Mutual PLC 8400. Legal & General Group PLC 8036. Wolseley PLC 7955. Standard Life 6662. J Sainsbury plc 6401. Aggreko PLC 6391. Land Securities Group PLC 6180. British Land Co PLC 4859.
and we are done.