def QA_fetch_stock_min_adv(code, start, end, type_='1min', if_drop_index=False, collections=QA_Setting.client.quantaxis.stock_min): '获取股票分钟线' if type_ in ['1min', '1m']: type_ = '1min' elif type_ in ['5min', '5m']: type_ = '5min' elif type_ in ['15min', '15m']: type_ = '15min' elif type_ in ['30min', '30m']: type_ = '30min' elif type_ in ['60min', '60m']: type_ = '60min' __data = [] if isinstance(code, str): for item in collections.find({ 'code': str(code), "time_stamp": { "$gte": QA_util_time_stamp(start), "$lte": QA_util_time_stamp(end) }, 'type': type_ }): __data.append([ str(item['code']), float(item['open']), float(item['high']), float(item['low']), float(item['close']), float(item['vol']), item['datetime'], item['time_stamp'], item['date'] ]) __data = DataFrame(__data, columns=[ 'code', 'open', 'high', 'low', 'close', 'volume', 'datetime', 'time_stamp', 'date' ]) __data['datetime'] = pd.to_datetime(__data['datetime']) return QA_DataStruct_Stock_min( __data.query('volume>1').set_index(['datetime', 'code'], drop=if_drop_index)) elif isinstance(code, list): '新增codelist的代码' return QA_DataStruct_Stock_min( pd.concat([ QA_fetch_stock_min_adv(code_, start, end, type_, if_drop_index).data for code_ in code ]).set_index(['datetime', 'code'], drop=if_drop_index))
def QA_fetch_stock_min_adv( code, start, end=None, frequence='1min', if_drop_index=True, # 🛠 todo collections 参数没有用到, 且数据库是固定的, 这个变量后期去掉 collections=DATABASE.stock_min): ''' '获取股票分钟线' :param code: 字符串str eg 600085 :param start: 字符串str 开始日期 eg 2011-01-01 :param end: 字符串str 结束日期 eg 2011-05-01 :param frequence: 字符串str 分钟线的类型 支持 1min 1m 5min 5m 15min 15m 30min 30m 60min 60m 类型 :param if_drop_index: Ture False , dataframe drop index or not :param collections: mongodb 数据库 :return: QA_DataStruct_Stock_min 类型 ''' if frequence in ['1min', '1m']: frequence = '1min' elif frequence in ['5min', '5m']: frequence = '5min' elif frequence in ['15min', '15m']: frequence = '15min' elif frequence in ['30min', '30m']: frequence = '30min' elif frequence in ['60min', '60m']: frequence = '60min' else: print("QA Error QA_fetch_stock_min_adv parameter frequence=%s is none of 1min 1m 5min 5m 15min 15m 30min 30m 60min 60m" % frequence) return None # __data = [] 未使用 end = start if end is None else end if len(start) == 10: start = '{} 09:30:00'.format(start) if len(end) == 10: end = '{} 15:00:00'.format(end) if start == end: # 🛠 todo 如果相等,根据 frequence 获取开始时间的 时间段 QA_fetch_stock_min, 不支持start end是相等的 print("QA Error QA_fetch_stock_min_adv parameter code=%s , start=%s, end=%s is equal, should have time span! " % ( code, start, end)) return None # 🛠 todo 报告错误 如果开始时间 在 结束时间之后 res = QA_fetch_stock_min( code, start, end, format='pd', frequence=frequence) if res is None: print("QA Error QA_fetch_stock_min_adv parameter code=%s , start=%s, end=%s frequence=%s call QA_fetch_stock_min return None" % ( code, start, end, frequence)) return None else: res_set_index = res.set_index(['datetime', 'code'], drop=if_drop_index) # if res_set_index is None: # print("QA Error QA_fetch_stock_min_adv set index 'datetime, code' return None") # return None return QA_DataStruct_Stock_min(res_set_index)
def QA_fetch_stock_min_adv(code, start, end=None, frequence='1min', if_drop_index=False, collections=DATABASE.stock_min): '获取股票分钟线' if frequence in ['1min', '1m']: frequence = '1min' elif frequence in ['5min', '5m']: frequence = '5min' elif frequence in ['15min', '15m']: frequence = '15min' elif frequence in ['30min', '30m']: frequence = '30min' elif frequence in ['60min', '60m']: frequence = '60min' __data = [] end = start if end is None else end if len(start) == 10: start = '{} 09:30:00'.format(start) if len(end) == 10: end = '{} 15:00:00'.format(end) return QA_DataStruct_Stock_min( QA_fetch_stock_min(code, start, end, format='pd', frequence=frequence).set_index(['datetime', 'code'], drop=if_drop_index))
def to_qfq(self, res): u = res.data.reset_index() u = u.assign(date=u.datetime.apply(lambda x: x.date())) u = u.set_index(['date', 'code'], drop=False) codelist = u.index.levels[1].unique().tolist() start = u.index.levels[0][0] end = u.index.levels[0][-1] adjx = self.get_stock_adj(codelist, start, end) if adjx is None: data = u.set_index(['datetime', 'code']) else: adjx = adjx.reset_index() adjx = adjx.assign(code=adjx.order_book_id).set_index( ['date', 'code']).adj data = u.join(adjx).set_index(['datetime', 'code']).fillna(1) for col in ['open', 'high', 'low', 'close']: data[col] = data[col] * data['adj'] try: data['high_limit'] = data['high_limit'] * data['adj'] data['low_limit'] = data['high_limit'] * data['adj'] except: pass return QA_DataStruct_Stock_min(data.sort_index(), if_fq='qfq')
def QA_fetch_stock_min_adv( code, start, end=None, frequence='1min', if_drop_index=False, collections=DATABASE.stock_min): '获取股票分钟线' if frequence in ['1min', '1m']: frequence = '1min' elif frequence in ['5min', '5m']: frequence = '5min' elif frequence in ['15min', '15m']: frequence = '15min' elif frequence in ['30min', '30m']: frequence = '30min' elif frequence in ['60min', '60m']: frequence = '60min' __data = [] end = start if end is None else end if len(start) == 10: start = '{} 09:30:00'.format(start) if len(end) == 10: end = '{} 15:00:00'.format(end) if isinstance(code, str): for item in collections.find({ 'code': str(code), "time_stamp": { "$gte": QA_util_time_stamp(start), "$lte": QA_util_time_stamp(end) }, 'type': frequence }): __data.append([str(item['code']), float(item['open']), float(item['high']), float( item['low']), float(item['close']), float(item['vol']), item['datetime'], item['time_stamp'], item['date']]) __data = DataFrame(__data, columns=[ 'code', 'open', 'high', 'low', 'close', 'volume', 'datetime', 'time_stamp', 'date']) __data['datetime'] = pd.to_datetime(__data['datetime']) return QA_DataStruct_Stock_min(__data.query('volume>1').set_index(['datetime', 'code'], drop=if_drop_index)) elif isinstance(code, list): '新增codelist的代码' return QA_DataStruct_Stock_min(pd.concat([QA_fetch_stock_min_adv(code_, start, end, frequence, if_drop_index).data for code_ in code]).set_index(['datetime', 'code'], drop=if_drop_index).sort_index())
def QA_fetch_stocklist_min_adv(code, start, end=None, frequence='1min', if_drop_index=False, collections=DATABASE.stock_min): return QA_DataStruct_Stock_min( pd.concat(QA_fetch_stocklist_min( code, [start, end], frequence)).query('volume>1').set_index( ['datetime', 'code'], drop=if_drop_index).sort_index())
def QA_fetch_stocklist_min_adv( code, start, end, type_='1min', if_drop_index=False, collections=QA_Setting.client.quantaxis.stock_min): return QA_DataStruct_Stock_min( pd.concat(QA_fetch_stocklist_min(code, [start, end], type_)).query('volume>1').set_index( ['datetime', 'code'], drop=if_drop_index))
def test_data_struct_min_stock(self): code = '000001' days = 10 * 1.2 start = datetime.datetime.now() - datetime.timedelta(days) end = datetime.datetime.now() - datetime.timedelta(0) df = qm.get(code, start, end, frequence='1min') if df is not None and len(df.index.names) == 1: df = df.set_index(['date', 'code'], drop=True) ds = qd(frequence=8).dataStruct(df) ds2 = QA_DataStruct_Stock_min(df) self.assertIsInstance(ds, QA_DataStruct_Stock_min) self.assertIsInstance(ds2, QA_DataStruct_Stock_min)
def get_stock_min(self, codelist, start, end): codelist = promise_list(codelist) if 'XS' not in codelist[0]: codelist = pd.Series(codelist).apply(lambda x: x + '.XSHE' if x[ 0] != '6' else x + '.XSHG').tolist() columns_raw = [ 'datetime', 'order_book_id', 'open', 'high', 'low', 'close', 'volume', 'total_turnover' ] res = self.client.query_dataframe( "SELECT * FROM quantaxis.stock_cn_1min WHERE ((`datetime` >= '{}')) \ AND (`datetime` <= '{}') AND (`order_book_id` IN ({}))" .format(start, end, "'{}'".format( "','".join(codelist)))).loc[:, columns_raw].drop_duplicates( ['datetime', 'order_book_id']) return QA_DataStruct_Stock_min( res.assign( datetime=pd.to_datetime(res.datetime), code=res.order_book_id, amount=res.total_turnover, type='1min', ).set_index(['datetime', 'code']).sort_index())