Retrieving a stock quote using Python?
Robin Becker
robin at jessikat.fsnet.co.uk
Thu May 22 03:54:50 EDT 2003
I used something like this in the past
import urllib, string, normalDate, math, sys, os
class _YahooData:
def __init__(self,ticker,date,Open,High,Low,Close,Volume):
self.ticker=ticker
self.start=date[0]
self.finish=date[-1]
self.date=date
self.Open=Open
self.High=High
self.Low=Low
self.Close=Close
if Volume!=[]:
self.Volume=Volume
def fetchRangeAsCSV(ticker, first, last):
'''fetch a range historical stock data as a CSV file, 'first' and 'last' are normalDates'''
url = 'http://chart.yahoo.com/table.csv?s=%s' \
'&a=%d&b=%d&c=%d&d=%d&e=%d&f=%d&g=d&q=q&y=0&z=%s' \
'&x=.csv' % (ticker,
first.month(), first.day(), first.year(),
last.month(), last.day(), last.year(),
ticker)
return urllib.URLopener().open(url).readlines()
def fetchQuoteAsCSV(ticker):
'fetch a quote as a CSV file'
url = 'http://quote.yahoo.com/d/quotes.csv?s=%s&f=sl1d1t1c1ohgv&e=.csv' % ticker
return urllib.URLopener().open(url).readlines()
def fetchQuoteAsHTML(ticker):
'fetch a quote as an HTML file'
url = 'http://quote.yahoo.com/q?s=%s&d=t&o=t' % ticker
return urllib.URLopener().open(url).readlines()
def _yahoo_to_normalDate(date):
date = string.split(date, '-')
date[0] = eval(date[0])
date[2] = eval(date[2])
if date[2] > 90: year = date[2] + 1900
else: year = date[2] + 2000
month = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep',
'Oct','Nov','Dec'].index(date[1]) + 1
return normalDate.ND(year * 10000 + month * 100 + date[0])
def _fetchRange(ticker, CSV):
date = []
Open = []
Low = []
High = []
Close = []
Volume = []
for x in CSV[1:]:
F = string.split(x, ',')
date.append(_yahoo_to_normalDate(F[0]))
Open.append(float(eval(F[1])))
High.append(float(eval(F[2])))
Low.append(float(eval(F[3])))
Close.append(float(eval(F[4])))
try:
Volume.append(float(eval(F[5])))
except IndexError:
pass
if len(date) == 0:
raise 'No data for '+ticker
# Yahoo gives reverse time order
date.reverse()
Open.reverse()
High.reverse()
Low.reverse()
Close.reverse()
Volume.reverse()
return _YahooData(ticker,date,Open,High,Low,Close,Volume)
def fetchRange(ticker, first, last):
return _fetchRange(ticker, fetchRangeAsCSV(ticker,first,last))
masterList = [
# Indices
'^IXIC', '^DJI', '^SPC',
# tech stocks
'LNUX', 'MSFT', 'AMZN', 'INTC', 'RHAT', 'DELL', 'GTW',
'CSCO', 'AAPL', 'AOL', 'COMS', 'CPQ', 'LCOS', 'LU',
'ORCL', 'SUNW', 'TXN', 'YHOO',
# single-letters and blue chips
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'J', 'K', 'L', 'N', 'O', 'P', 'R',
'U', 'W', 'X', 'Y', 'Z',
# Dow Jones stocks
'AA', 'AXP', 'T', 'BA', 'CAT', 'CHV', 'KO',
'DIS', 'DD', 'EK', 'GE', 'GM', 'GT', 'HWP',
'IBM', 'IP', 'JNJ', 'MCD', 'MRK', 'MMM', 'JPM',
'MO', 'PG', 'S', 'TRV', 'UK', 'WMT',
# biotech
'AFFX', 'BIOM', 'CRA', 'ENMD', 'HGSI',
'MATX', 'MLNM', 'RGEN', 'SAFS', 'DNA', 'GENE',
'INCY', 'GLGC', 'PFE',
'AVXT', 'CTIC', 'CRXA', 'GZMO', 'IDPH',
'ILXO', 'ISIP', 'RZYM', 'SUPG', 'TGEN', 'VICL',
# retailers, general interest
'BBY', 'COST', 'UPS', 'HD',
]
def fetchListRange(tickerList,start=normalDate.ND(19950101),finish=normalDate.ND()):
d = {}
for t in tickerList:
d[t]=fetchRange(t, start, finish)
print "data for %s obtained start=%d(%f) finish=%d(%f)" % \
(t,d[t].start,d[t].Close[0],d[t].finish,d[t].Close[-1])
return d
def saveListHTMLQuotes(tickerList,filename):
f=open(filename,'w')
for t in tickerList:
for l in fetchQuoteAsHTML(t):
f.write(l)
f.write('\n')
def _findTitleAndQuoter(lines,ticker):
title=""
quoter=""
ticker=string.upper(ticker)
for l in lines:
if string.find(l,'More Info')>=0 and string.find(string.upper(l),ticker)>=0:
s=string.find(l,'<b>')
f=string.find(l,'</b>')
if s<0 or f<0: break
title = string.strip(l[s+3:f])
s=string.find(l,'(',f+4)
if s<0: break
s=s+1
f=string.find(l,':',s)
if f>0: quoter = string.strip(l[s:f])
return title,quoter
def findTitleAndQuoter(ticker):
return _findTitleAndQuoter(fetchQuoteAsHTML(ticker),ticker)
if __name__==\
'__main__': #to fool runtests.py
d=fetchListRange(masterList[:21])
--
Robin Becker
More information about the Python-list
mailing list