Пример #1
0
def merge_quotes(quotes):
    first = quotes[0]
    last = quotes[-1]

    pre_close = first.pre_close
    open = first.open
    high = max(q.high for q in quotes)
    low = min(q.low for q in quotes)
    close = last.close
    volume = sum(q.volume for q in quotes)
    amount = sum(q.amount for q in quotes)
    change = last.close - first.pre_close
    percent = change_percent(close, pre_close)

    merged = Quote(
        code=first.code,
        datetime=first.datetime,
        period='TBD',
        open=open,
        close=close,
        low=low,
        high=high,
        pre_close=pre_close,
        change=change,
        percent=percent,
        volume=volume,
        amount=amount
    )

    if last.turnover:
        estimate_shares = int(last.volume / last.turnover * 100)
        merged.turnover = round(float(volume) / estimate_shares * 100, 3)

    return merged
Пример #2
0
def merge_quotes(quotes):
    first = quotes[0]
    last = quotes[-1]

    pre_close = first.pre_close
    open = first.open
    high = max(q.high for q in quotes)
    low = min(q.low for q in quotes)
    close = last.close
    volume = sum(q.volume for q in quotes)
    amount = sum(q.amount for q in quotes)
    change = last.close - first.pre_close
    percent = change_percent(close, pre_close)

    merged = Quote(code=first.code,
                   datetime=first.datetime,
                   period='TBD',
                   open=open,
                   close=close,
                   low=low,
                   high=high,
                   pre_close=pre_close,
                   change=change,
                   percent=percent,
                   volume=volume,
                   amount=amount)

    if last.turnover:
        estimate_shares = int(last.volume / last.turnover * 100)
        merged.turnover = round(float(volume) / estimate_shares * 100, 3)

    return merged
Пример #3
0
def pull_history_hq_of_index(index, start_date=None, end_date=None):
    if not start_date:
        start_date = index.listing_date
    hqs = ts.get_h_data(index.code,
                        start=str(start_date),
                        end=str(end_date),
                        index=True,
                        autype='',
                        pause=0.01)
    iterator = reversed(hqs.index)
    first_index = next(iterator)
    first_day_hq = hqs.loc[first_index]
    pre_close = first_day_hq['open']
    sess = Session()

    for timestamp in reversed(hqs.index):
        dt = timestamp.to_datetime()
        datetime_ = date(dt.year, dt.month, dt.day)
        row = hqs.loc[timestamp]

        open_price = row['open']
        close = row['close']
        low = row['low']
        high = row['high']
        volume = row['volume']
        amount = row['amount']
        change = close - pre_close
        change_pct = change_percent(close, pre_close)

        hq_day = Quote(code=index.code,
                       datetime=datetime_,
                       period='d1',
                       open=open_price,
                       close=close,
                       low=low,
                       high=high,
                       pre_close=pre_close,
                       change=change,
                       percent=change_pct,
                       volume=volume,
                       amount=amount)

        sess.merge(hq_day)

        pre_close = close

        logging.info('[%s][%s]' % (str(index.code), str(datetime_)))

    sess.commit()
    logging.info(str(index.code) + ' db session commited')
def pull_history_hq_of_index(index, start_date=None, end_date=None):
    if not start_date:
        start_date = index.listing_date
    hqs = ts.get_h_data(index.code, start=str(start_date), end=str(end_date),
                        index=True, autype='', pause=0.01)
    iterator = reversed(hqs.index)
    first_index = next(iterator)
    first_day_hq = hqs.loc[first_index]
    pre_close = first_day_hq['open']
    sess = Session()

    for timestamp in reversed(hqs.index):
        dt = timestamp.to_datetime()
        datetime_ = date(dt.year, dt.month, dt.day)
        row = hqs.loc[timestamp]

        open_price = row['open']
        close = row['close']
        low = row['low']
        high = row['high']
        volume = row['volume']
        amount = row['amount']
        change = close - pre_close
        change_pct = change_percent(close, pre_close)

        hq_day = Quote(
            code=index.code,
            datetime=datetime_,
            period='d1',
            open=open_price,
            close=close,
            low=low,
            high=high,
            pre_close=pre_close,
            change=change,
            percent=change_pct,
            volume=volume,
            amount=amount
        )

        sess.merge(hq_day)

        pre_close = close

        logging.info('[%s][%s]' %(str(index.code), str(datetime_)))

    sess.commit()
    logging.info(str(index.code) + ' db session commited')
Пример #5
0
def pull_last_quote(security, is_index):
    hq = hq_last(security.market, security.code, is_index)

    open = hq.get('open', 0)
    # SUSPEND TODAY
    if open == 0:
        high, low, close, pre_close, volume, amount, change, percent = 0, 0, 0, 0, 0, 0, 0, 0
        return None
    else:
        close = hq.get('close', 0)
        low = hq.get('low', 0)
        high = hq.get('high', 0)
        pre_close = hq.get('pre_close', 0)
        volume = hq.get('volume', 0)
        amount = hq.get('amount', 0)
        change = hq.get('change', 0) or hq.get('close', 0) - hq.get('pre_close', 0)
        percent = hq.get('change_percent') or change_percent(close, pre_close) if pre_close else 0

    quote = Quote(
        code=security.code,
        datetime=date.today(),
        period='d1',
        open=open,
        close=close,
        low=low,
        high=high,
        pre_close=pre_close,
        change=change,
        percent=percent,
        volume=volume,
        amount=amount
    )

    if is_index:
        if security.alias:
            quote.code = security.alias
    else:
        turnover = volume / security.tradable_shares * 100 if security.tradable_shares > 0 else 0
        quote.turnover = round(turnover, 2)

    return quote
Пример #6
0
def pull_last_quote(security, is_index):
    hq = hq_last(security.market, security.code, is_index)

    open = hq.get('open', 0)
    # SUSPEND TODAY
    if open == 0:
        high, low, close, pre_close, volume, amount, change, percent = 0, 0, 0, 0, 0, 0, 0, 0
        return None
    else:
        close = hq.get('close', 0)
        low = hq.get('low', 0)
        high = hq.get('high', 0)
        pre_close = hq.get('pre_close', 0)
        volume = hq.get('volume', 0)
        amount = hq.get('amount', 0)
        change = hq.get('change',
                        0) or hq.get('close', 0) - hq.get('pre_close', 0)
        percent = hq.get('change_percent') or change_percent(
            close, pre_close) if pre_close else 0

    quote = Quote(code=security.code,
                  datetime=date.today(),
                  period='d1',
                  open=open,
                  close=close,
                  low=low,
                  high=high,
                  pre_close=pre_close,
                  change=change,
                  percent=percent,
                  volume=volume,
                  amount=amount)

    if is_index:
        if security.alias:
            quote.code = security.alias
    else:
        turnover = volume / security.tradable_shares * 100 if security.tradable_shares > 0 else 0
        quote.turnover = round(turnover, 2)

    return quote
Пример #7
0
def index():
    index_codes = [
        '000001', '399102', '399006', '000300'
    ]
    for code in index_codes:
        market = util.index_market(code)
        hq = hq_last(market, code)

        now = datetime.now()
        this_date = date(now.year, now.month, now.day)
        this_minute = time(now.hour, now.minute, 0)

        change = hq['price'] - hq['pre_close']
        change_pct = change_percent(hq['price'], hq['pre_close'])

        snapshot = HQSnapshot(
            market=market,
            code=code,
            name=hq['name'],
            date=this_date,
            time=this_minute,
            price=hq['price'],
            pre_close=hq['pre_close'],
            open=hq['open'],
            low=hq['low'],
            high=hq['high'],
            change=change,
            percent=change_pct,
            volume=hq['volume'],
            money=hq['volume_money']
        )

        session = Session()
        session.merge(snapshot)
        session.commit()

        print 'sync: ', code

    return 'ok'
def pull_history_quotes(security, is_index, start_date=None, end_date=None):
    if not start_date or start_date < security.listing_date:
        start_date = security.listing_date

    try:
        quotes_df = ts.get_h_data(security.code,
                                  start=str(start_date),
                                  end=str(end_date),
                                  index=is_index,
                                  pause=0.01)
    except:
        logging.error('Pull tushare history quotes failed.')
        return

    index_riter = reversed(quotes_df.index)
    first = next(index_riter)
    first_hq = quotes_df.loc[first]
    pre_close = first_hq['open']
    sess = Session()

    for timestamp in reversed(quotes_df.index):
        dt = timestamp.to_datetime()
        datetime_ = date(dt.year, dt.month, dt.day)

        row = quotes_df.loc[timestamp]

        open = row['open']
        high = row['high']
        low = row['low']
        close = row['close']
        volume = row['volume']
        amount = row['amount']

        change = close - pre_close
        change_pct = change_percent(close, pre_close)
        '''
        turnover = None
        if security.tradable_shares != 0:
            turnover = volume / security.tradable_shares * 100
        '''

        quote = Quote(code=security.code,
                      datetime=datetime_,
                      period='d1',
                      open=open,
                      close=close,
                      low=low,
                      high=high,
                      pre_close=pre_close,
                      change=change,
                      percent=change_pct,
                      volume=volume,
                      amount=amount)

        sess.merge(quote)
        pre_close = close

    try:
        sess.commit()
        logging.info(str(security.code) + ' db session commited')
    except:
        logging.error('Session commit failed.')
        return
Пример #9
0
def get_quotes(start, end, codes=None):
    sess = Session()
    criterion = Stock.status == 'L'
    if isinstance(codes, list):
        criterion = and_(criterion, Stock.code.in_(codes))
    stocks = sess.query(Stock).filter(criterion).all()

    for stock in stocks:
        try:
            begin_date = start if start else stock.listing_date
            end_date = end if end else date.today()
            payload = {
                'field': '',
                'beginDate': begin_date.strftime('%Y%m%d'),
                'endDate': end_date.strftime('%Y%m%d'),
                'secID': '',
                'ticker': stock.code,
                'tradeDate': ''
            }

            resp = requests.get(equd_adj_quote_history, headers=headers, params=payload)
            json_res = resp.json()
            if json_res['retCode'] != 1:
                logging.error('Request failed: [%s] %s' % (stock.code, json_res['retMsg']))
                continue

            quotes_data = json_res['data']
            quote_records = []
            for data in quotes_data:
                if not data['isOpen']:
                    continue

                adj_factor = data['accumAdjFactor']
                open = Decimal(data['openPrice'] / adj_factor).quantize(Decimal('.001'))
                close = Decimal(data['closePrice'] / adj_factor).quantize(Decimal('.001'))
                low = Decimal(data['lowestPrice'] / adj_factor).quantize(Decimal('.001'))
                high = Decimal(data['highestPrice'] / adj_factor).quantize(Decimal('.001'))
                pre_close = Decimal(data['actPreClosePrice']).quantize(Decimal('.001'))

                quote = Quote(
                    code=stock.code,
                    datetime=data['tradeDate'],
                    period='d1',
                    open=open,
                    close=close,
                    low=low,
                    high=high,
                    pre_close=pre_close,
                    change=close - pre_close,
                    percent=change_percent(close, pre_close),
                    volume=data['turnoverVol'],
                    amount=data['turnoverValue'],
                    turnover=data['turnoverRate'] * 100
                )

                quote_records.append(quote)

            sess.add_all(quote_records)
            sess.commit()

        except Exception as e:
            logging.error('Exception: [%s]' % stock.code)
            logging.error(e)
            continue
def pull_history_quotes(security, is_index, start_date=None, end_date=None):
    if not start_date or start_date < security.listing_date:
        start_date = security.listing_date

    try:
        quotes_df = ts.get_h_data(security.code, start=str(start_date), end=str(end_date), index=is_index, pause=0.01)
    except:
        logging.error('Pull tushare history quotes failed.')
        return

    index_riter = reversed(quotes_df.index)
    first = next(index_riter)
    first_hq = quotes_df.loc[first]
    pre_close = first_hq['open']
    sess = Session()

    for timestamp in reversed(quotes_df.index):
        dt = timestamp.to_datetime()
        datetime_ = date(dt.year, dt.month, dt.day)

        row = quotes_df.loc[timestamp]

        open = row['open']
        high = row['high']
        low = row['low']
        close = row['close']
        volume = row['volume']
        amount = row['amount']

        change = close - pre_close
        change_pct = change_percent(close, pre_close)

        '''
        turnover = None
        if security.tradable_shares != 0:
            turnover = volume / security.tradable_shares * 100
        '''

        quote = Quote(
            code=security.code,
            datetime=datetime_,
            period='d1',
            open=open,
            close=close,
            low=low,
            high=high,
            pre_close=pre_close,
            change=change,
            percent=change_pct,
            volume=volume,
            amount=amount
        )

        sess.merge(quote)
        pre_close = close

    try:
        sess.commit()
        logging.info(str(security.code) + ' db session commited')
    except:
        logging.error('Session commit failed.')
        return
Пример #11
0
def get_quotes(start, end, codes=None):
    sess = Session()
    criterion = Stock.status == 'L'
    if isinstance(codes, list):
        criterion = and_(criterion, Stock.code.in_(codes))
    stocks = sess.query(Stock).filter(criterion).all()

    for stock in stocks:
        try:
            begin_date = start if start else stock.listing_date
            end_date = end if end else date.today()
            payload = {
                'field': '',
                'beginDate': begin_date.strftime('%Y%m%d'),
                'endDate': end_date.strftime('%Y%m%d'),
                'secID': '',
                'ticker': stock.code,
                'tradeDate': ''
            }

            resp = requests.get(equd_adj_quote_history,
                                headers=headers,
                                params=payload)
            json_res = resp.json()
            if json_res['retCode'] != 1:
                logging.error('Request failed: [%s] %s' %
                              (stock.code, json_res['retMsg']))
                continue

            quotes_data = json_res['data']
            quote_records = []
            for data in quotes_data:
                if not data['isOpen']:
                    continue

                adj_factor = data['accumAdjFactor']
                open = Decimal(data['openPrice'] / adj_factor).quantize(
                    Decimal('.001'))
                close = Decimal(data['closePrice'] / adj_factor).quantize(
                    Decimal('.001'))
                low = Decimal(data['lowestPrice'] / adj_factor).quantize(
                    Decimal('.001'))
                high = Decimal(data['highestPrice'] / adj_factor).quantize(
                    Decimal('.001'))
                pre_close = Decimal(data['actPreClosePrice']).quantize(
                    Decimal('.001'))

                quote = Quote(code=stock.code,
                              datetime=data['tradeDate'],
                              period='d1',
                              open=open,
                              close=close,
                              low=low,
                              high=high,
                              pre_close=pre_close,
                              change=close - pre_close,
                              percent=change_percent(close, pre_close),
                              volume=data['turnoverVol'],
                              amount=data['turnoverValue'],
                              turnover=data['turnoverRate'] * 100)

                quote_records.append(quote)

            sess.add_all(quote_records)
            sess.commit()

        except Exception as e:
            logging.error('Exception: [%s]' % stock.code)
            logging.error(e)
            continue