Answers for "get unadjusted stock data"

0

get unadjusted stock data

from datetime import datetime
import json
from urllib.parse import urlencode
from urllib.request import urlopen
def gethistory(symbol, start=None, end=None):
    # Return 3 tuples (quotes, dividends and splits) with data from start
    # to end datetimes for the given symbol.
    if start is None:
        start = datetime(1980, 1, 1)
    if end is None:
        end = datetime.now()
    url = 'https://query1.finance.yahoo.com/v7/finance/chart/{}?{}'
    qs = dict(
        period1=int(start.timestamp())
        , period2=int(end.timestamp())
        , interval='1d'
        , indicators='quote'
        , includeTimestamps='true'
        , events='div|split'
    )
    with urlopen(url.format(symbol, urlencode(qs))) as rs:
        result = json.load(rs)['chart']['result'][0]
    # Data for quote fields (o, h, l, c, v) are stored in separate lists
    # with indexes that correspond to a list of timestamps. Iterate over
    # the timestamps list to map quote values, converting the timestamps to
    # datetimes along the way.
    quotes = result['indicators']['unadjquote'][0]
    o = quotes['unadjopen']
    h = quotes['unadjhigh']
    l = quotes['unadjlow']
    c = quotes['unadjclose']
    quotes = result['indicators']['quote'][0]
    v = quotes['volume']
    quotes = tuple((
        datetime.fromtimestamp(tm).date()
        , o[t], h[t], l[t], c[t], v[t]
    ) for t, tm in enumerate(result['timestamp']))
    # Remove duplicate dates
    quotes = tuple(sorted(
        dict((q[0], q) for q in quotes).values()
        , key=lambda q: q[0]
    ))
    # Both dividends and splits are stored under 'events' as objects with
    # timestamps for keys.
    dividends = ()
    splits = ()
    events = result.get('events')
    if events:
        e = events.get('dividends')
        dividends = e and tuple((
            datetime.fromtimestamp(i['date']).date()
            , i.get('amount')
        ) for tm, i in e.items())
        dividends = sorted(dividends, key=lambda d: d[0])
        e = events.get('splits')
        splits = e and tuple((
            datetime.fromtimestamp(i['date']).date()
            , i.get('denominator')
            , i.get('numerator')
        ) for tm, i in e.items())
        splits = sorted(splits, key=lambda s: s[0])
    return quotes, dividends, splits
Posted by: Guest on July-16-2021

Browse Popular Code Answers by Language