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