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
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
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')
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
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
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
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
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