Many programmers work for publicly traded companies, and probably spend more time than they realize watching their (or their friends) company's stock prices. To make that easier, I wanted to implement a simple wrapper to retrieve prices from Yahoo! Finance.
Quotes
You can use a "quotes.csv" interface to retrieve current price information. The way it works is to perform an HTTP request to a specially formatted URL that looks like:
http://finance.yahoo.com/d/quotes.csv?s=SYMBOLS&f=FIELDS
In the URL, SYMBOLS
is a list of symbols separated by "+
" and FIELDS
is a list of letters and numbers (from the following table) representing fields to be requested.
a Ask a2 Average Daily Volume a5 Ask Size b Bid b2 Ask (Real-time) b3 Bid (Real-time) b4 Book Value b6 Bid Size c Change & Percent Change c1 Change c3 Commission c6 Change (Real-time) c8 After Hours Change (Real-time) d Dividend/Share d1 Last Trade Date d2 Trade Date e Earnings/Share e1 Error Indication (returned for symbol changed / invalid) e7 EPS Estimate Current Year e8 EPS Estimate Next Year e9 EPS Estimate Next Quarter f6 Float Shares g Day’s Low h Day’s High j 52-week Low k 52-week High g1 Holdings Gain Percent g3 Annualized Gain g4 Holdings Gain g5 Holdings Gain Percent (Real-time) g6 Holdings Gain (Real-time) i More Info i5 Order Book (Real-time) j1 Market Capitalization j3 Market Cap (Real-time) j4 EBITDA j5 Change From 52-week Low j6 Percent Change From 52-week Low k1 Last Trade (Real-time) With Time k2 Change Percent (Real-time) k3 Last Trade Size k4 Change From 52-week High k5 Percent Change From 52-week High l Last Trade (With Time) l1 Last Trade (Price Only) l2 High Limit l3 Low Limit m Day’s Range m2 Day’s Range (Real-time) m3 50-day Moving Average m4 200-day Moving Average m5 Change From 200-day Moving Average m6 Percent Change From 200-day Moving Average m7 Change From 50-day Moving Average m8 Percent Change From 50-day Moving Average n Name n4 Notes o Open p Previous Close p1 Price Paid p2 Change in Percent p5 Price/Sales p6 Price/Book q Ex-Dividend Date r P/E Ratio r1 Dividend Pay Date r2 P/E Ratio (Real-time) r5 PEG Ratio r6 Price/EPS Estimate Current Year r7 Price/EPS Estimate Next Year s Symbol s1 Shares Owned s7 Short Ratio t1 Last Trade Time t6 Trade Links t7 Ticker Trend t8 1 yr Target Price v Volume v1 Holdings Value v7 Holdings Value (Real-time) w 52-week Range w1 Day’s Value Change w4 Day’s Value Change (Real-time) x Stock Exchange y Dividend Yield
Using this URL format, we can build a word that retrieves current quotes for a list of symbols:
: quotes ( symbols -- csv ) "http://finance.yahoo.com/d/quotes.csv" >url swap "+" join "s" set-query-param "sbal1v" "f" set-query-param http-get nip >string string>csv { "Symbol" "Bid" "Ask" "Last" "Volume" } prefix ;
With the strings.table vocabulary, we can format the response as a table:
( scratchpad ) { "MSFT" "GOOG" "AAPL" } quotes format-table [ print ] each Symbol Bid Ask Last Volume MSFT 23.64 23.69 23.705 49327104 GOOG 505.00 509.05 509.505 2440475 AAPL N/A 334.80 325.90 15504200
Historical Prices
You can also retrieve historical prices using a "table.csv" interface. Similar to retrieving quotes, you make an HTTP request to a special URL:
http://ichart.finance.yahoo.com/table.csv?s=SYMBOL
In the URL, SYMBOL
is the symbol that you are requesting prices for, and you can further limit the response using additional parameters:
Start date for historical prices:
- a - Month number, starting with 0 for January.
- b - Day number, eg, 1 for the first of the month.
- c - Year.
End date for historical prices (default is the most current available closing price):
- d - Month number, starting with 0 for January.
- e - Day number, eg, 1 for the first of the month.
- f - Year.
And finally, the frequency of historical prices:
- g - Possible values are 'd' for daily (the default), 'w' for weekly, and 'm' for monthly.
With this knowledge, we can build a word to retrieve historical prices from January 1, 2009 until the current day.
: historical-prices ( symbol -- csv ) "http://ichart.finance.yahoo.com/table.csv" >url swap "s" set-query-param "0" "a" set-query-param "1" "b" set-query-param "2009" "c" set-query-param http-get nip string>csv ;
To use it, and demonstrate the impact that AAPL has had over the last few years, we can chart the daily closing prices (remembering to reverse the order of the prices, oldest to newest):
The code for this is on my Github.
You can use the wget command with Yahoo! Finance to download directly to CSV --
ReplyDeletehttp://albertech.blogspot.com/2011/09/download-historical-stock-prices-in-csv.html
I like this since it can be batched.
This is really helpful thanks!:) I have been looking up financial advise for my home business as an import export trader selling goods online.
ReplyDelete