def QA_fetch_get_index_day(code, start_date, end_date, frequence='day', ip=best_ip['stock']['ip'], port=best_ip['stock']['port']): '指数日线' api = TdxHq_API() if frequence in ['day', 'd', 'D', 'DAY', 'Day']: frequence = 9 elif frequence in ['w', 'W', 'Week', 'week']: frequence = 5 elif frequence in ['month', 'M', 'm', 'Month']: frequence = 6 elif frequence in ['Q', 'Quarter', 'q']: frequence = 10 elif frequence in ['y', 'Y', 'year', 'Year']: frequence = 11 with api.connect(ip, port): start_date = str(start_date)[0:10] today_ = datetime.date.today() lens = QA_util_get_trade_gap(start_date, today_) if str(code)[0] in ['5', '1']: # ETF data = pd.concat([api.to_df(api.get_security_bars( frequence, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (int(lens / 800) - i) * 800, 800)) for i in range(int(lens / 800) + 1)], axis=0) else: data = pd.concat([api.to_df(api.get_index_bars( frequence, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (int(lens / 800) - i) * 800, 800)) for i in range(int(lens / 800) + 1)], axis=0) data = data.assign(date=data['datetime'].apply(lambda x: str(x[0:10]))).assign(code=str(code))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(str(x)[0:10])))\ .set_index('date', drop=False, inplace=False)\ .assign(code=code)\ .drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1)[start_date:end_date] return data.assign(date=data['date'].apply(lambda x: str(x)[0:10]))
def QA_fetch_get_index_day(code, start_date, end_date, level='day', ip=best_ip, port=7709): '指数日线' api = TdxHq_API() if level in ['day', 'd', 'D', 'DAY', 'Day']: level = 9 elif level in ['w', 'W', 'Week', 'week']: level = 5 elif level in ['month', 'M', 'm', 'Month']: level = 6 elif level in ['Q', 'Quarter', 'q']: level = 10 elif level in ['y', 'Y', 'year', 'Year']: level = 11 with api.connect(ip, port): if str(code)[0] in ['5', '1']: # ETF data = pd.concat([api.to_df(api.get_security_bars( level, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (25 - i) * 800, 800)) for i in range(26)], axis=0) else: data = pd.concat([api.to_df(api.get_index_bars( level, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (25 - i) * 800, 800)) for i in range(26)], axis=0) data = data.assign(date=data['datetime'].apply(lambda x: str(x[0:10]))).assign(code=str(code))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(str(x)[0:10])))\ .set_index('date', drop=False, inplace=False)\ .drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1)[start_date:end_date] return data.assign(date=data['date'].apply(lambda x: str(x)[0:10]))
def QA_fetch_get_index_min(code, start, end, level='1min', ip=best_ip, port=7709): api = TdxHq_API() type_ = '' if str(level) in ['5', '5m', '5min', 'five']: level, type_ = 0, '5min' elif str(level) in ['1', '1m', '1min', 'one']: level, type_ = 8, '1min' elif str(level) in ['15', '15m', '15min', 'fifteen']: level, type_ = 1, '15min' elif str(level) in ['30', '30m', '30min', 'half']: level, type_ = 2, '30min' elif str(level) in ['60', '60m', '60min', '1h']: level, type_ = 3, '60min' with api.connect(ip, port): if str(code)[0] in ['5', '1']: # ETF data = pd.concat([api.to_df(api.get_security_bars( level, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (25 - i) * 800, 800)) for i in range(26)], axis=0) else: data = pd.concat([api.to_df(api.get_index_bars( level, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (25 - i) * 800, 800)) for i in range(26)], axis=0) data = data\ .assign(datetime=pd.to_datetime(data['datetime']), code=str(code))\ .drop(['year', 'month', 'day', 'hour', 'minute'], axis=1, inplace=False)\ .assign(date=data['datetime'].apply(lambda x: str(x)[0:10]))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(x)))\ .assign(time_stamp=data['datetime'].apply(lambda x: QA_util_time_stamp(x)))\ .assign(type=type_).set_index('datetime', drop=False, inplace=False)[start:end] # data return data.assign(datetime=data['datetime'].apply(lambda x: str(x)))
def QA_fetch_get_stock_block(ip=None, port=None): '板块数据' global best_ip if ip is None and port is None and best_ip['stock']['ip'] is None and best_ip['stock']['port'] is None: best_ip = select_best_ip() ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] elif ip is None and port is None and best_ip['stock']['ip'] is not None and best_ip['stock']['port'] is not None: ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] else: pass api = TdxHq_API() with api.connect(ip, port): data = pd.concat([api.to_df(api.get_and_parse_block_info("block_gn.dat")).assign(type='gn'), api.to_df(api.get_and_parse_block_info( "block.dat")).assign(type='yb'), api.to_df(api.get_and_parse_block_info( "block_zs.dat")).assign(type='zs'), api.to_df(api.get_and_parse_block_info("block_fg.dat")).assign(type='fg')]) if len(data) > 10: return data.assign(source='tdx').drop(['block_type', 'code_index'], axis=1).set_index('code', drop=False, inplace=False).drop_duplicates() else: QA_util_log_info('Wrong with fetch block ')
def QA_fetch_get_index_min(code, start, end, level='1min', ip=best_ip, port=7709): '指数分钟线' api = TdxHq_API() type_ = '' if str(level) in ['5', '5m', '5min', 'five']: level, type_ = 0, '5min' elif str(level) in ['1', '1m', '1min', 'one']: level, type_ = 8, '1min' elif str(level) in ['15', '15m', '15min', 'fifteen']: level, type_ = 1, '15min' elif str(level) in ['30', '30m', '30min', 'half']: level, type_ = 2, '30min' elif str(level) in ['60', '60m', '60min', '1h']: level, type_ = 3, '60min' with api.connect(ip, port): if str(code)[0] in ['5', '1']: # ETF data = pd.concat([api.to_df(api.get_security_bars( level, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (25 - i) * 800, 800)) for i in range(26)], axis=0) else: data = pd.concat([api.to_df(api.get_index_bars( level, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (25 - i) * 800, 800)) for i in range(26)], axis=0) data = data\ .assign(datetime=pd.to_datetime(data['datetime']), code=str(code))\ .drop(['year', 'month', 'day', 'hour', 'minute'], axis=1, inplace=False)\ .assign(date=data['datetime'].apply(lambda x: str(x)[0:10]))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(x)))\ .assign(time_stamp=data['datetime'].apply(lambda x: QA_util_time_stamp(x)))\ .assign(type=type_).set_index('datetime', drop=False, inplace=False)[start:end] # data return data.assign(datetime=data['datetime'].apply(lambda x: str(x)))
def get_a_quote_by_tdx(code_list): """ 获取A股市场行情,该接口只获取A股市场行情 其他的行情使用拓展行情接口 code_list:数字或者字符串格式的list,调用def standard_tdx_code(code_list)来格式化市场信息及code """ if len(code_list) == 0: return pd.DataFrame(columns=stock_tdx_columns) # 一次最多获取50只股票的实时行情,如果code_list 多于50只,则50只股票取一次行情,然后进行拼接 tdx_api = TdxHq_API() if len(code_list) >= 50: tmp = div_list(code_list, 50) df_tmp = pd.DataFrame(columns=stock_tdx_columns) if tdx_api.connect('119.147.212.81', 7709): for tmp_list in tmp: tmp_list = standard_tdx_code(tmp_list) tdx_data = tdx_api.to_df(tdx_api.get_security_quotes(tmp_list)) df_tmp = pd.concat([df_tmp, tdx_data]) df_tmp = df_tmp[stock_tdx_columns] else: tmp = standard_tdx_code(code_list) if tdx_api.connect('119.147.212.81', 7709): tdx_data = tdx_api.to_df(tdx_api.get_security_quotes(tmp)) df_tmp = tdx_data[stock_tdx_columns] tdx_api.disconnect() return process_tdx_price(df_tmp)
def QA_fetch_get_index_min(code, start, end, frequence='1min', ip=None, port=None): '指数分钟线' global best_ip if ip is None and port is None and best_ip['stock']['ip'] is None and best_ip['stock']['port'] is None: best_ip = select_best_ip() ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] elif ip is None and port is None and best_ip['stock']['ip'] is not None and best_ip['stock']['port'] is not None: ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] else: pass api = TdxHq_API() type_ = '' start_date = str(start)[0:10] today_ = datetime.date.today() lens = QA_util_get_trade_gap(start_date, today_) if str(frequence) in ['5', '5m', '5min', 'five']: frequence, type_ = 0, '5min' lens = 48 * lens elif str(frequence) in ['1', '1m', '1min', 'one']: frequence, type_ = 8, '1min' lens = 240 * lens elif str(frequence) in ['15', '15m', '15min', 'fifteen']: frequence, type_ = 1, '15min' lens = 16 * lens elif str(frequence) in ['30', '30m', '30min', 'half']: frequence, type_ = 2, '30min' lens = 8 * lens elif str(frequence) in ['60', '60m', '60min', '1h']: frequence, type_ = 3, '60min' lens = 4 * lens if lens > 20800: lens = 20800 with api.connect(ip, port): if str(code)[0] in ['5', '1']: # ETF data = pd.concat([api.to_df(api.get_security_bars( frequence, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (int(lens / 800) - i) * 800, 800)) for i in range(int(lens / 800) + 1)], axis=0) else: data = pd.concat([api.to_df(api.get_index_bars( frequence, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (int(lens / 800) - i) * 800, 800)) for i in range(int(lens / 800) + 1)], axis=0) data = data\ .assign(datetime=pd.to_datetime(data['datetime']), code=str(code))\ .drop(['year', 'month', 'day', 'hour', 'minute'], axis=1, inplace=False)\ .assign(code=code)\ .assign(date=data['datetime'].apply(lambda x: str(x)[0:10]))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(x)))\ .assign(time_stamp=data['datetime'].apply(lambda x: QA_util_time_stamp(x)))\ .assign(type=type_).set_index('datetime', drop=False, inplace=False)[start:end] # data return data.assign(datetime=data['datetime'].apply(lambda x: str(x)))
def QA_fetch_get_index_day(code, start_date, end_date, frequence='day', ip=None, port=None): """指数日线 1- sh 0 -sz Arguments: code {[type]} -- [description] start_date {[type]} -- [description] end_date {[type]} -- [description] Keyword Arguments: frequence {str} -- [description] (default: {'day'}) ip {[type]} -- [description] (default: {None}) port {[type]} -- [description] (default: {None}) Returns: [type] -- [description] """ ip, port = get_mainmarket_ip(ip, port) api = TdxHq_API() if frequence in ['day', 'd', 'D', 'DAY', 'Day']: frequence = 9 elif frequence in ['w', 'W', 'Week', 'week']: frequence = 5 elif frequence in ['month', 'M', 'm', 'Month']: frequence = 6 elif frequence in ['Q', 'Quarter', 'q']: frequence = 10 elif frequence in ['y', 'Y', 'year', 'Year']: frequence = 11 with api.connect(ip, port): start_date = str(start_date)[0:10] today_ = datetime.date.today() lens = QA_util_get_trade_gap(start_date, today_) if str(code)[0] in ['5', '1']: # ETF data = pd.concat([api.to_df(api.get_security_bars( frequence, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (int(lens / 800) - i) * 800, 800)) for i in range(int(lens / 800) + 1)], axis=0) else: data = pd.concat([api.to_df(api.get_index_bars( frequence, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (int(lens / 800) - i) * 800, 800)) for i in range(int(lens / 800) + 1)], axis=0) data = data.assign(date=data['datetime'].apply(lambda x: str(x[0:10]))).assign(code=str(code))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(str(x)[0:10])))\ .set_index('date', drop=False, inplace=False)\ .assign(code=code)\ .drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1)[start_date:end_date] return data.assign(date=data['date'].apply(lambda x: str(x)[0:10]))
def QA_fetch_get_stock_block(ip=best_ip, port=7709): '板块数据' api = TdxHq_API() with api.connect(ip, port): data = pd.concat([api.to_df(api.get_and_parse_block_info("block_gn.dat")), api.to_df(api.get_and_parse_block_info("block.dat")), api.to_df(api.get_and_parse_block_info( "block_zs.dat")), api.to_df(api.get_and_parse_block_info("block_fg.dat"))]) if len(data) > 10: return data.assign(source='tdx').set_index('code', drop=False, inplace=False) else: QA_util_log_info('Wrong with fetch block ')
def QA_fetch_get_stock_day(code, start_date, end_date, if_fq='00', frequence='day', ip=None, port=None): """获取日线及以上级别的数据 Arguments: code {str:6} -- code 是一个单独的code 6位长度的str start_date {str:10} -- 10位长度的日期 比如'2017-01-01' end_date {str:10} -- 10位长度的日期 比如'2018-01-01' Keyword Arguments: if_fq {str} -- '00'/'bfq' -- 不复权 '01'/'qfq' -- 前复权 '02'/'hfq' -- 后复权 '03'/'ddqfq' -- 定点前复权 '04'/'ddhfq' --定点后复权 frequency {str} -- day/week/month/quarter/year 也可以是简写 D/W/M/Q/Y ip {str} -- [description] (default: None) ip可以通过select_best_ip()函数重新获取 port {int} -- [description] (default: {None}) Returns: pd.DataFrame/None -- 返回的是dataframe,如果出错比如只获取了一天,而当天停牌,返回None Exception: 如果出现网络问题/服务器拒绝, 会出现socket:time out 尝试再次获取/更换ip即可, 本函数不做处理 """ ip, port = get_mainmarket_ip(ip, port) api = TdxHq_API() with api.connect(ip, port, time_out=0.7): if frequence in ['day', 'd', 'D', 'DAY', 'Day']: frequence = 9 elif frequence in ['w', 'W', 'Week', 'week']: frequence = 5 elif frequence in ['month', 'M', 'm', 'Month']: frequence = 6 elif frequence in ['quarter', 'Q', 'Quarter', 'q']: frequence = 10 elif frequence in ['y', 'Y', 'year', 'Year']: frequence = 11 start_date = str(start_date)[0:10] today_ = datetime.date.today() lens = QA_util_get_trade_gap(start_date, today_) data = pd.concat([api.to_df(api.get_security_bars(frequence, _select_market_code( code), code, (int(lens / 800) - i) * 800, 800)) for i in range(int(lens / 800) + 1)], axis=0) # 这里的问题是: 如果只取了一天的股票,而当天停牌, 那么就直接返回None了 if len(data) < 1: return None data = data[data['open'] != 0] data = data.assign(date=data['datetime'].apply(lambda x: str(x[0:10])), code=str(code),\ date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(str(x)[0:10])))\ .set_index('date', drop=False, inplace=False) data = data.drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1)[start_date:end_date] if if_fq in ['00','bfq']: return data else: print('CURRENTLY NOT SUPPORT REALTIME FUQUAN') return None
def QA_fetch_get_stock_xdxr(code, ip=None, port=None): '除权除息' global best_ip if ip is None and port is None and best_ip['stock']['ip'] is None and best_ip['stock']['port'] is None: best_ip = select_best_ip() ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] elif ip is None and port is None and best_ip['stock']['ip'] is not None and best_ip['stock']['port'] is not None: ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] else: pass api = TdxHq_API() market_code = _select_market_code(code) with api.connect(ip, port): category = { '1': '除权除息', '2': '送配股上市', '3': '非流通股上市', '4': '未知股本变动', '5': '股本变化', '6': '增发新股', '7': '股份回购', '8': '增发新股上市', '9': '转配股上市', '10': '可转债上市', '11': '扩缩股', '12': '非流通股缩股', '13': '送认购权证', '14': '送认沽权证'} data = api.to_df(api.get_xdxr_info(market_code, code)) if len(data) >= 1: data = data\ .assign(date=pd.to_datetime(data[['year', 'month', 'day']]))\ .drop(['year', 'month', 'day'], axis=1)\ .assign(category_meaning=data['category'].apply(lambda x: category[str(x)]))\ .assign(code=str(code))\ .rename(index=str, columns={'panhouliutong': 'liquidity_after', 'panqianliutong': 'liquidity_before', 'houzongguben': 'shares_after', 'qianzongguben': 'shares_before'})\ .set_index('date', drop=False, inplace=False) return data.assign(date=data['date'].apply(lambda x: str(x)[0:10])) else: return None
def QA_fetch_get_stock_min(code, start, end, level, ip='221.231.141.60', port=7709): api = TdxHq_API() market_code = __select_market_code(code) if str(level) in ['5', '5m', '5min', 'five']: level = 0 elif str(level) in ['1', '1m', '1min', 'one']: level = 8 elif str(level) in ['15', '15m', '15min', 'fifteen']: level = 1 elif str(level) in ['30', '30m', '30min', 'half']: level = 2 elif str(level) in ['60', '60m', '60min', '1h']: level = 3 with api.connect(ip, port): data = [] for i in range(26): data += api.get_security_bars(level, market_code, code, (25 - i) * 800, 800) data = api.to_df(data) data['datetime'] = pd.to_datetime(data['datetime']) data['code'] = code data = data.set_index('datetime', drop=False) data = data.drop(['year', 'month', 'day', 'hour', 'minute'], axis=1) data['datetime'] = data['datetime'].apply(lambda x: str(x)[0:19]) data['date'] = data['datetime'].apply(lambda x: str(x)[0:10]) data['date_stamp'] = data['date'].apply( lambda x: QA_util_date_stamp(x)) data['time_stamp'] = data['datetime'].apply( lambda x: QA_util_time_stamp(x)) return data[start:end]
def fetch_get_stock_min(code, start, end, level='1min', ip=ac.TDX_BEST_IP, port=7709): api = TdxHq_API() type_ = '' if str(level) in ['5', '5m', '5min', 'five']: level, type_ = 0, '5min' elif str(level) in ['1', '1m', '1min', 'one']: level, type_ = 8, '1min' elif str(level) in ['15', '15m', '15min', 'fifteen']: level, type_ = 1, '15min' elif str(level) in ['30', '30m', '30min', 'half']: level, type_ = 2, '30min' elif str(level) in ['60', '60m', '60min', '1h']: level, type_ = 3, '60min' with api.connect(ip, port): data = pd.concat([api.to_df(api.get_security_bars(level, __select_market_code( str(code)), str(code), (25 - i) * 800, 800)) for i in range(26)], axis=0) data = data\ .assign(datetime=pd.to_datetime(data['datetime']), code=str(code))\ .drop(['year', 'month', 'day', 'hour', 'minute'], axis=1, inplace=False)\ .assign(date=data['datetime'].apply(lambda x: str(x)[0:10]))\ .assign(date_stamp=data['datetime'].apply(lambda x: util_date_stamp(x)))\ .assign(time_stamp=data['datetime'].apply(lambda x: util_time_stamp(x)))\ .assign(type=type_).set_index('datetime', drop=False, inplace=False)[start:end] return data.assign(datetime=data['datetime'].apply(lambda x: str(x)))
def QA_fetch_get_stock_transaction_realtime(code, ip=None, port=None): '实时分笔成交 包含集合竞价 buyorsell 1--sell 0--buy 2--盘前' global best_ip if ip is None and port is None and best_ip['stock']['ip'] is None and best_ip['stock']['port'] is None: best_ip = select_best_ip() ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] elif ip is None and port is None and best_ip['stock']['ip'] is not None and best_ip['stock']['port'] is not None: ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] else: pass api = TdxHq_API() try: with api.connect(ip, port): data = pd.DataFrame() data = pd.concat([api.to_df(api.get_transaction_data( _select_market_code(str(code)), code, (2 - i) * 2000, 2000)) for i in range(3)], axis=0) if 'value' in data.columns: data = data.drop(['value'], axis=1) data = data.dropna() day = datetime.date.today() return data.assign(date=str(day)).assign(datetime=pd.to_datetime(data['time'].apply(lambda x: str(day) + ' ' + str(x))))\ .assign(code=str(code)).assign(order=range(len(data.index))).set_index('datetime', drop=False, inplace=False) except: return None
def __init__(self, code): self.code = str(code) self.market = 2 if code.startswith('002') or code.startswith('300') or code.startswith( '000'): self.market = TDXParams.MARKET_SZ elif code.startswith('60'): self.market = TDXParams.MARKET_SH if self.market == 2: raise Exception('code should be stock code') api = TdxHq_API() stock_path = Path.home().joinpath('stocks').joinpath(self.code) if not Path.exists(stock_path): Path.mkdir(stock_path) xdxr_path = stock_path.joinpath('xdxr_' + str(datetime.datetime.now().date()) + '.csv') if not Path.exists(xdxr_path): with api.connect('119.147.212.81', 7709): xdxr = api.to_df(api.get_xdxr_info(self.market, self.code)) xdxr.to_csv(xdxr_path) self.xdxr = pd.read_csv(xdxr_path) pg = self.xdxr.loc[self.xdxr['peigu'] > 0]
def QA_fetch_get_stock_min(code, start, end, frequence='1min', ip=best_ip['stock'], port=7709): api = TdxHq_API() type_ = '' start_date = str(start)[0:10] today_ = datetime.date.today() lens = QA_util_get_trade_gap(start_date, today_) if str(frequence) in ['5', '5m', '5min', 'five']: frequence, type_ = 0, '5min' lens = 48 * lens elif str(frequence) in ['1', '1m', '1min', 'one']: frequence, type_ = 8, '1min' lens = 240 * lens elif str(frequence) in ['15', '15m', '15min', 'fifteen']: frequence, type_ = 1, '15min' lens = 16 * lens elif str(frequence) in ['30', '30m', '30min', 'half']: frequence, type_ = 2, '30min' lens = 8 * lens elif str(frequence) in ['60', '60m', '60min', '1h']: frequence, type_ = 3, '60min' lens = 4 * lens if lens > 20800: lens = 20800 with api.connect(ip, port): data = pd.concat([api.to_df(api.get_security_bars(frequence, _select_market_code( str(code)), str(code), (int(lens / 800) - i) * 800, 800)) for i in range(int(lens / 800) + 1)], axis=0) data = data\ .assign(datetime=pd.to_datetime(data['datetime']), code=str(code))\ .drop(['year', 'month', 'day', 'hour', 'minute'], axis=1, inplace=False)\ .assign(date=data['datetime'].apply(lambda x: str(x)[0:10]))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(x)))\ .assign(time_stamp=data['datetime'].apply(lambda x: QA_util_time_stamp(x)))\ .assign(type=type_).set_index('datetime', drop=False, inplace=False)[start:end] return data.assign(datetime=data['datetime'].apply(lambda x: str(x)))
def QA_fetch_get_stock_xdxr(code, ip=best_ip, port=7709): '除权除息' api = TdxHq_API() market_code = __select_market_code(code) with api.connect(ip, port): category = { '1': '除权除息', '2': '送配股上市', '3': '非流通股上市', '4': '未知股本变动', '5': '股本变化', '6': '增发新股', '7': '股份回购', '8': '增发新股上市', '9': '转配股上市', '10': '可转债上市', '11': '扩缩股', '12': '非流通股缩股', '13': '送认购权证', '14': '送认沽权证' } data = api.to_df(api.get_xdxr_info(market_code, code)) data = data\ .assign(date=pd.to_datetime(data[['year', 'month', 'day']]))\ .drop(['year', 'month', 'day'], axis=1)\ .assign(category_meaning=data['category'].apply(lambda x: category[str(x)]))\ .assign(code=str(code))\ .rename(index=str, columns={'panhouliutong': 'liquidity_after', 'panqianliutong': 'liquidity_before', 'houzongguben': 'shares_after', 'qianzongguben': 'shares_before'})\ .set_index('date', drop=False, inplace=False) return data.assign(date=data['date'].apply(lambda x: str(x)[0:10]))
def QA_fetch_get_stock_block(ip=best_ip['stock'], port=7709): '板块数据' api = TdxHq_API() with api.connect(ip, port): data = pd.concat([api.to_df(api.get_and_parse_block_info("block_gn.dat")).assign(type='gn'), api.to_df(api.get_and_parse_block_info( "block.dat")).assign(type='yb'), api.to_df(api.get_and_parse_block_info( "block_zs.dat")).assign(type='zs'), api.to_df(api.get_and_parse_block_info("block_fg.dat")).assign(type='fg')]) if len(data) > 10: return data.assign(source='tdx').drop(['block_type', 'code_index'], axis=1).set_index('code', drop=False, inplace=False).drop_duplicates() else: QA_util_log_info('Wrong with fetch block ')
def QA_fetch_get_stock_list(type_='stock', ip=best_ip['stock'], port=7709): api = TdxHq_API() with api.connect(ip, port): data = pd.concat([pd.concat([api.to_df(api.get_security_list(j, i * 1000)).assign(sse='sz' if j == 0 else 'sh').set_index( ['code', 'sse'], drop=False) for i in range(int(api.get_security_count(j) / 1000) + 1)], axis=0) for j in range(2)], axis=0) #data.code = data.code.apply(int) sz = data.query('sse=="sz"') sh = data.query('sse=="sh"') sz = sz.assign(sec=sz.code.apply(for_sz)) sh = sh.assign(sec=sh.code.apply(for_sh)) if type_ in ['stock', 'gp']: return pd.concat([sz, sh]).query('sec=="stock_cn"').sort_index().assign(name=data['name'].apply(lambda x: str(x)[0:6])) elif type_ in ['index', 'zs']: return pd.concat([sz, sh]).query('sec=="index_cn"').sort_index().assign(name=data['name'].apply(lambda x: str(x)[0:6])) #.assign(szm=data['name'].apply(lambda x: ''.join([y[0] for y in lazy_pinyin(x)])))\ #.assign(quanpin=data['name'].apply(lambda x: ''.join(lazy_pinyin(x)))) elif type_ in ['etf', 'ETF']: return pd.concat([sz, sh]).query('sec=="etf_cn"').sort_index().assign(name=data['name'].apply(lambda x: str(x)[0:6])) else: return data.assign(code=data['code'].apply(lambda x: str(x))).assign(name=data['name'].apply(lambda x: str(x)[0:6]))
def QA_fetch_get_stock_list(type_='stock', ip=best_ip, port=7709): api = TdxHq_API() with api.connect(ip, port): data = pd.concat([pd.concat([api.to_df(api.get_security_list(j, i * 1000)).assign(sse='sz' if j == 0 else 'sh').set_index( ['code', 'sse'], drop=False) for i in range(int(api.get_security_count(j) / 1000) + 1)], axis=0) for j in range(2)], axis=0) if type_ in ['stock', 'gp']: return pd.concat([data[data['sse'] == 'sz'][data.assign(code=data['code'].apply(lambda x: int(x)))['code'] // 10000 <= 30][data.assign(code=data['code'].apply(lambda x: int(x)))['code'] // 100000 != 2], data[data['sse'] == 'sh'][data.assign(code=data['code'].apply(lambda x: int(x)))['code'] // 100000 == 6]]).assign(code=data['code'].apply(lambda x: str(x))) #.assign(szm=data['name'].apply(lambda x: ''.join([y[0] for y in lazy_pinyin(x)])))\ #.assign(quanpin=data['name'].apply(lambda x: ''.join(lazy_pinyin(x)))) elif type_ in ['index', 'zs']: return pd.concat([data[data['sse'] == 'sz'][data.assign(code=data['code'].apply(lambda x: int(x)))['code'] // 1000 >= 399], data[data['sse'] == 'sh'][data.assign(code=data['code'].apply(lambda x: int(x)))['code'] // 1000 == 0]]) \ .sort_index()\ .assign(code=data['code'].apply(lambda x: str(x))) #.assign(szm=data['name'].apply(lambda x: ''.join([y[0] for y in lazy_pinyin(x)])))\ #.assign(quanpin=data['name'].apply(lambda x: ''.join(lazy_pinyin(x)))) elif type_ in ['etf', 'ETF']: return pd.concat([data[data['sse'] == 'sz'][data.assign(code=data['code'].apply(lambda x: int(x)))['code'] // 10000 == 15], data[data['sse'] == 'sh'][data.assign(code=data['code'].apply(lambda x: int(x)))['code'] // 10000 == 51]]).sort_index().assign(code=data['code'].apply(lambda x: str(x)))\ #.assign(szm=data['name'].apply(lambda x: ''.join([y[0] for y in lazy_pinyin(x)])))\ #.assign(quanpin=data['name'].apply(lambda x: ''.join(lazy_pinyin(x)))) else: return data.assign(code=data['code'].apply(lambda x: str(x)))
def QA_fetch_get_security_bars(code, _type, lens, ip=best_ip['stock'], port=7709): """按bar长度推算数据 Arguments: code {[type]} -- [description] _type {[type]} -- [description] lens {[type]} -- [description] Keyword Arguments: ip {[type]} -- [description] (default: {best_ip}) port {[type]} -- [description] (default: {7709}) Returns: [type] -- [description] """ api = TdxHq_API() with api.connect(ip, port): data = pd.concat([api.to_df(api.get_security_bars(_select_type(_type), _select_market_code( code), code, (i - 1) * 800, 800)) for i in range(1, int(lens / 800) + 2)], axis=0) data = data\ .assign(datetime=pd.to_datetime(data['datetime']), code=str(code))\ .drop(['year', 'month', 'day', 'hour', 'minute'], axis=1, inplace=False)\ .assign(date=data['datetime'].apply(lambda x: str(x)[0:10]))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(x)))\ .assign(time_stamp=data['datetime'].apply(lambda x: QA_util_time_stamp(x)))\ .assign(type=_type).set_index('datetime', drop=False, inplace=False).tail(lens) if data is not None: return data else: return None
def QA_fetch_get_stock_min(code, start, end, level, ip='221.231.141.60', port=7709): api = TdxHq_API() market_code = __select_market_code(code) if str(level) in ['5', '5m', '5min', 'five']: level = 0 elif str(level) in ['1', '1m', '1min', 'one']: level = 8 elif str(level) in ['15', '15m', '15min', 'fifteen']: level = 1 elif str(level) in ['30', '30m', '30min', 'half']: level = 2 elif str(level) in ['60', '60m', '60min', '1h']: level = 3 with api.connect(ip, port): data = [] for i in range(26): data += api.get_security_bars(level, market_code, code, (25 - i) * 800, 800) data = api.to_df(data) data['datetime'] = pd.to_datetime(data['datetime']) data['code'] = code data = data.set_index('datetime') return data[start:end]
def QA_fetch_get_stock_info(code, ip=None, port=None): '股票基本信息' ip, port = get_mainmarket_ip(ip, port) api = TdxHq_API() market_code = _select_market_code(code) with api.connect(ip, port): return api.to_df(api.get_finance_info(market_code, code))
def get_xdxr_info(stock_code, market): api = TdxHq_API() xdxr_df = None with api.connect('119.147.212.81', 7709): xdxr_df = api.get_xdxr_info(market, stock_code) xdxr_df = api.to_df(xdxr_df) return xdxr_df
def QA_fetch_get_stock_info(code, ip=best_ip['stock']['ip'], port=best_ip['stock']['port']): '股票基本信息' api = TdxHq_API() market_code = _select_market_code(code) with api.connect(ip, port): return api.to_df(api.get_finance_info(market_code, code))
def get_stock_count(): api = TdxHq_API() if api.connect('119.147.212.81', 7709): print(api.get_security_count(0)) #参数为市场代码 print(api.get_security_list(0, 0)) #第一个参数为市场代码,第二个参数为起始位置 print(api.get_security_count(1)) print(api.to_df(api.get_security_list(1, 0))) api.disconnect()
def _getKLineData(self): api = TdxHq_API(auto_retry=True) if api.connect('119.147.212.81', 7709): self._KLineData = api.to_df( api.get_index_bars(9, 1, self._stockCode, 0, self._stockOberCount)) # 返回DataFrame # print(self._KLineData) api.disconnect()
def fetch_bars(self, typ: SeType, code, start, end, freq): try: tdxApi = TdxHq_API() ex_nbr = map_exchange_to_tdx_number[Exchange.from_type_and_code(typ, code)] if typ == SeType.Stock or typ == SeType.ETF: tdx_fetch_func = tdxApi.get_security_bars elif typ == SeType.Index: tdx_fetch_func = tdxApi.get_index_bars else: raise Exception('Unsupported se type') #timeout is in seconds. with tdxApi.connect(self.server['ip'], self.server['port'], time_out=3): frequence = map_freq_to_tdx_number[freq][0] days_between = date_time_utils.Date.from_str(end).delta_to(start).days + 1 if days_between > MAX_DAYS: days_between = MAX_DAYS max_count = int(map_freq_to_tdx_number[freq][1] * days_between) tmp_list = [] n_start = 0 while n_start < max_count: fetch_size = min(max_count - n_start, BATCH_SIZE) tmp_res = tdx_fetch_func( frequence, ex_nbr, code, n_start, fetch_size ) if tmp_res is None or len(tmp_res) < 1: break n_start += len(tmp_res) tmp_list.extend(tmp_res) if n_start == 0: print('No rows fetched for {}'.format(code)) # print('total fetched rows for {}: {}'.format(code, n_start)) data = tdxApi.to_df(tmp_list) if len(data) < 1: return None data = data[data['open'] != 0] cols_to_drop = ['year', 'month', 'day'] if freq.is_minutes(): data = data.assign(datetime=data['datetime'].apply(lambda x: str(x[0:19])), date=data['datetime'].apply(lambda x: str(x[0:10])), code=str(code)) \ .set_index('datetime', drop=True, inplace=False) \ .drop(cols_to_drop, axis=1) else: cols_to_drop.extend(['datetime', 'hour', 'minute']) data = data.assign(datetime=data['datetime'], date=data['datetime'].apply(lambda x: str(x[0:10])), code=str(code)) \ .set_index('date', drop=True, inplace=False) \ .drop(cols_to_drop, axis=1) return data except Exception as e: print('exception caught: {}'.format(e))
def fetch_security_bars(code, _type, lens, ip=ac.TDX_BEST_IP, port=7709): api = TdxHq_API() with api.connect(ip, port): data = pd.concat([api.to_df(api.get_security_bars(__select_type(_type), __select_market_code( code), code, (i - 1) * 800, 800)) for i in range(1, int(lens / 800) + 2)], axis=0) if data is not None: return data else: return None
def __hq_tick(self, code): api = TdxHq_API() ip, port = self.__hq.get() with api.connect(ip, port): df = api.get_security_quotes(code) if df is not None: df = api.to_df(df) api.disconnect() self.__hq.put((ip, port)) return df
def QA_fetch_get_index_day(code, start_date, end_date, frequence='day', ip=None, port=None): '指数日线' global best_ip if ip is None and port is None and best_ip['stock']['ip'] is None and best_ip['stock']['port'] is None: best_ip = select_best_ip() ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] elif ip is None and port is None and best_ip['stock']['ip'] is not None and best_ip['stock']['port'] is not None: ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] else: pass api = TdxHq_API() if frequence in ['day', 'd', 'D', 'DAY', 'Day']: frequence = 9 elif frequence in ['w', 'W', 'Week', 'week']: frequence = 5 elif frequence in ['month', 'M', 'm', 'Month']: frequence = 6 elif frequence in ['Q', 'Quarter', 'q']: frequence = 10 elif frequence in ['y', 'Y', 'year', 'Year']: frequence = 11 with api.connect(ip, port): start_date = str(start_date)[0:10] today_ = datetime.date.today() lens = QA_util_get_trade_gap(start_date, today_) if str(code)[0] in ['5', '1']: # ETF data = pd.concat([api.to_df(api.get_security_bars( frequence, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (int(lens / 800) - i) * 800, 800)) for i in range(int(lens / 800) + 1)], axis=0) else: data = pd.concat([api.to_df(api.get_index_bars( frequence, 1 if str(code)[0] in ['0', '8', '9', '5'] else 0, code, (int(lens / 800) - i) * 800, 800)) for i in range(int(lens / 800) + 1)], axis=0) data = data.assign(date=data['datetime'].apply(lambda x: str(x[0:10]))).assign(code=str(code))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(str(x)[0:10])))\ .set_index('date', drop=False, inplace=False)\ .assign(code=code)\ .drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1)[start_date:end_date] return data.assign(date=data['date'].apply(lambda x: str(x)[0:10]))
def QA_fetch_get_stock_realtime(code=['000001', '000002'], ip=best_ip, port=7709): api = TdxHq_API() __data = pd.DataFrame() with api.connect(ip, port): code = [code] if type(code) is str else code for id_ in range(int(len(code) / 80) + 1): __data = __data.append(api.to_df(api.get_security_quotes( [(__select_market_code(x), x) for x in code[80 * id_:80 * (id_ + 1)]]))) __data['datetime'] = datetime.datetime.now() data = __data[['datetime', 'code', 'open', 'high', 'low', 'price']] return data.set_index('code', drop=False, inplace=False)
def get_block_info(): api = TdxHq_API() if api.connect('119.147.212.81', 7709): data = api.get_and_parse_block_info("block.dat") #一般板块 #print(api.get_and_parse_block_info("block_zs.dat")) #指数板块 #print(api.get_and_parse_block_info("block_fg.dat")) #风格板块 #print(api.get_and_parse_block_info("block_gn.dat")) #概念板块 datadf = api.to_df(data) print(datadf) api.disconnect()
def QA_fetch_get_stock_latest(code, ip=best_ip, port=7709): code = [code] if isinstance(code, str) else code api = TdxHq_API(multithread=True) with api.connect(ip, port): data = pd.concat([api.to_df(api.get_security_bars( 9, __select_market_code(item), item, 0, 1)).assign(code=item) for item in code], axis=0) return data\ .assign(date=pd.to_datetime(data['datetime'] .apply(lambda x: x[0:10])), date_stamp=data['datetime'] .apply(lambda x: QA_util_date_stamp(str(x[0:10]))))\ .set_index('date', drop=False)\ .drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1)
def QA_fetch_get_stock_info(code, ip=None, port=None): '股票基本信息' global best_ip if ip is None and port is None and best_ip['stock']['ip'] is None and best_ip['stock']['port'] is None: best_ip = select_best_ip() ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] elif ip is None and port is None and best_ip['stock']['ip'] is not None and best_ip['stock']['port'] is not None: ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] else: pass api = TdxHq_API() market_code = _select_market_code(code) with api.connect(ip, port): return api.to_df(api.get_finance_info(market_code, code))
def QA_fetch_get_stock_list(type_='stock', ip=best_ip, port=7709): api = TdxHq_API() with api.connect(ip, port): data = pd.concat([pd.concat([api.to_df(api.get_security_list(j, i * 1000)).assign(sse='sz' if j == 0 else 'sh').set_index( ['code', 'sse'], drop=False) for i in range(int(api.get_security_count(j) / 1000) + 1)], axis=0) for j in range(2)], axis=0) if type_ in ['stock', 'gp']: return pd.concat([data[data['sse'] == 'sz'][data.assign(code=data['code'].apply(lambda x: int(x)))['code'] // 10000 <= 30][data.assign(code=data['code'].apply(lambda x: int(x)))['code'] // 100000 != 2], data[data['sse'] == 'sh'][data.assign(code=data['code'].apply(lambda x: int(x)))['code'] // 100000 == 6]]).assign(code=data['code'].apply(lambda x: str(x))) elif type_ in ['index', 'zs']: return pd.concat([data[data['sse'] == 'sz'][data.assign(code=data['code'].apply(lambda x: int(x)))['code'] // 1000 >= 399], data[data['sse'] == 'sh'][data.assign(code=data['code'].apply(lambda x: int(x)))['code'] // 1000 == 0]]).sort_index().assign(code=data['code'].apply(lambda x: str(x))) elif type_ in ['etf', 'ETF']: return pd.concat([data[data['sse'] == 'sz'][data.assign(code=data['code'].apply(lambda x: int(x)))['code'] // 10000 == 15], data[data['sse'] == 'sh'][data.assign(code=data['code'].apply(lambda x: int(x)))['code'] // 10000 == 51]]).sort_index().assign(code=data['code'].apply(lambda x: str(x))) else: return data.assign(code=data['code'].apply(lambda x: str(x)))
def QA_fetch_get_security_bars(code, _type, lens, ip=None, port=None): """按bar长度推算数据 Arguments: code {[type]} -- [description] _type {[type]} -- [description] lens {[type]} -- [description] Keyword Arguments: ip {[type]} -- [description] (default: {best_ip}) port {[type]} -- [description] (default: {7709}) Returns: [type] -- [description] """ global best_ip if ip is None and port is None and best_ip['stock']['ip'] is None and best_ip['stock']['port'] is None: best_ip = select_best_ip() ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] elif ip is None and port is None and best_ip['stock']['ip'] is not None and best_ip['stock']['port'] is not None: ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] else: pass api = TdxHq_API() with api.connect(ip, port): data = pd.concat([api.to_df(api.get_security_bars(_select_type(_type), _select_market_code( code), code, (i - 1) * 800, 800)) for i in range(1, int(lens / 800) + 2)], axis=0) data = data\ .assign(datetime=pd.to_datetime(data['datetime']), code=str(code))\ .drop(['year', 'month', 'day', 'hour', 'minute'], axis=1, inplace=False)\ .assign(date=data['datetime'].apply(lambda x: str(x)[0:10]))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(x)))\ .assign(time_stamp=data['datetime'].apply(lambda x: QA_util_time_stamp(x)))\ .assign(type=_type).set_index('datetime', drop=False, inplace=False).tail(lens) if data is not None: return data else: return None
def QA_fetch_get_stock_latest(code, ip=None, port=None): global best_ip if ip is None and port is None and best_ip['stock']['ip'] is None and best_ip['stock']['port'] is None: best_ip = select_best_ip() ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] elif ip is None and port is None and best_ip['stock']['ip'] is not None and best_ip['stock']['port'] is not None: ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] else: pass code = [code] if isinstance(code, str) else code api = TdxHq_API(multithread=True) with api.connect(ip, port): data = pd.concat([api.to_df(api.get_security_bars( 9, _select_market_code(item), item, 0, 1)).assign(code=item) for item in code], axis=0) return data\ .assign(date=pd.to_datetime(data['datetime'] .apply(lambda x: x[0:10])), date_stamp=data['datetime'] .apply(lambda x: QA_util_date_stamp(str(x[0:10]))))\ .set_index('date', drop=False)\ .drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1)
def QA_fetch_depth_market_data(code=['000001', '000002'], ip=None, port=None): global best_ip if ip is None and port is None and best_ip['stock']['ip'] is None and best_ip['stock']['port'] is None: best_ip = select_best_ip() ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] elif ip is None and port is None and best_ip['stock']['ip'] is not None and best_ip['stock']['port'] is not None: ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] else: pass api = TdxHq_API() __data = pd.DataFrame() with api.connect(ip, port): code = [code] if type(code) is str else code for id_ in range(int(len(code) / 80) + 1): __data = __data.append(api.to_df(api.get_security_quotes( [(_select_market_code(x), x) for x in code[80 * id_:80 * (id_ + 1)]]))) __data['datetime'] = datetime.datetime.now() data = __data[['datetime', 'active1', 'active2', 'last_close', 'code', 'open', 'high', 'low', 'price', 'cur_vol', 's_vol', 'b_vol', 'vol', 'ask1', 'ask_vol1', 'bid1', 'bid_vol1', 'ask2', 'ask_vol2', 'bid2', 'bid_vol2', 'ask3', 'ask_vol3', 'bid3', 'bid_vol3', 'ask4', 'ask_vol4', 'bid4', 'bid_vol4', 'ask5', 'ask_vol5', 'bid5', 'bid_vol5']] return data.set_index(['datetime', 'code'], drop=False, inplace=False)
def QA_fetch_get_stock_list(type_='stock', ip=None, port=None): global best_ip if ip is None and port is None and best_ip['stock']['ip'] is None and best_ip['stock']['port'] is None: best_ip = select_best_ip() ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] elif ip is None and port is None and best_ip['stock']['ip'] is not None and best_ip['stock']['port'] is not None: ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] else: pass api = TdxHq_API() with api.connect(ip, port): data = pd.concat([pd.concat([api.to_df(api.get_security_list(j, i * 1000)).assign(sse='sz' if j == 0 else 'sh').set_index( ['code', 'sse'], drop=False) for i in range(int(api.get_security_count(j) / 1000) + 1)], axis=0) for j in range(2)], axis=0) #data.code = data.code.apply(int) sz = data.query('sse=="sz"') sh = data.query('sse=="sh"') sz = sz.assign(sec=sz.code.apply(for_sz)) sh = sh.assign(sec=sh.code.apply(for_sh)) if type_ in ['stock', 'gp']: return pd.concat([sz, sh]).query('sec=="stock_cn"').sort_index().assign(name=data['name'].apply(lambda x: str(x)[0:6])) elif type_ in ['index', 'zs']: return pd.concat([sz, sh]).query('sec=="index_cn"').sort_index().assign(name=data['name'].apply(lambda x: str(x)[0:6])) #.assign(szm=data['name'].apply(lambda x: ''.join([y[0] for y in lazy_pinyin(x)])))\ #.assign(quanpin=data['name'].apply(lambda x: ''.join(lazy_pinyin(x)))) elif type_ in ['etf', 'ETF']: return pd.concat([sz, sh]).query('sec=="etf_cn"').sort_index().assign(name=data['name'].apply(lambda x: str(x)[0:6])) else: return data.assign(code=data['code'].apply(lambda x: str(x))).assign(name=data['name'].apply(lambda x: str(x)[0:6]))
one_chunk = 0x7530 chuncks = size // one_chunk if size % one_chunk != 0: chuncks += 1 file_content = bytearray() for seg in range(chuncks): start = seg * one_chunk piece_data = client.get_block_info(blockfile, start, size) file_content.extend(piece_data) return BlockReader().get_data(file_content, BlockReader_TYPE_FLAT) if __name__ == '__main__': from pytdx.hq import TdxHq_API api = TdxHq_API() with api.connect(): # ret = api.get_block_info("block_zs.dat", 0, 100) # print(len(ret)) # ret = api.get_and_parse_block_info("block_fg.dat") # ret = api.get_and_parse_block_info("block_zs.dat") # ret = api.get_and_parse_block_info("block_gn.dat") # ret = api.get_and_parse_block_info("block.dat") ret = api.get_and_parse_block_info("block.dat") print(api.to_df(ret))
# \x80\x03 = 14:56 hour, minute, pos = get_time(body_buf, pos) price_raw, pos = get_price(body_buf, pos) vol, pos = get_price(body_buf, pos) buyorsell, pos = get_price(body_buf, pos) _, pos = get_price(body_buf, pos) last_price = last_price + price_raw tick = OrderedDict( [ ("time", "%02d:%02d" % (hour, minute)), ("price", float(last_price)/100), ("vol", vol), ("buyorsell", buyorsell), ] ) ticks.append(tick) return ticks if __name__ == '__main__': from pytdx.hq import TdxHq_API api = TdxHq_API() with api.connect(): print(api.to_df(api.get_history_transaction_data(0, '000001', 0, 10, 20170811)))
def QA_fetch_get_stock_day(code, start_date, end_date, if_fq='00', level='day', ip=best_ip, port=7709): api = TdxHq_API() with api.connect(ip, port): if level in ['day', 'd', 'D', 'DAY', 'Day']: level = 9 elif level in ['w', 'W', 'Week', 'week']: level = 5 elif level in ['month', 'M', 'm', 'Month']: level = 6 elif level in ['Q', 'Quarter', 'q']: level = 10 elif level in ['y', 'Y', 'year', 'Year']: level = 11 data = pd.concat([api.to_df(api.get_security_bars(level, __select_market_code( code), code, (9 - i) * 800, 800)) for i in range(10)], axis=0) if if_fq in ['00', 'bfq']: data = data.assign(date=data['datetime'].apply(lambda x: str(x[0:10]))).assign(code=str(code))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(str(x)[0:10])))\ .set_index('date', drop=False, inplace=False)\ .drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1)[start_date:end_date] return data.assign(date=data['date'].apply(lambda x: str(x)[0:10])) elif if_fq in ['01', 'qfq']: xdxr_data = QA_fetch_get_stock_xdxr(code) info = xdxr_data[xdxr_data['category'] == 1] bfq_data = data\ .assign(date=pd.to_datetime(data['datetime'].apply(lambda x: x[0:10])))\ .assign(code=str(code))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(str(x)[0:10])))\ .set_index('date', drop=False, inplace=False)\ .drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1) bfq_data['if_trade']=True data = pd.concat([bfq_data, info[['category']] [bfq_data.index[0]:]], axis=1) data['date'] = data.index data['if_trade'].fillna(value=False, inplace=True) data = data.fillna(method='ffill') data = pd.concat([data, info[['fenhong', 'peigu', 'peigujia', 'songzhuangu']][bfq_data.index[0]:]], axis=1) data = data.fillna(0) data['preclose'] = (data['close'].shift(1) * 10 - data['fenhong'] + data['peigu'] * data['peigujia']) / (10 + data['peigu'] + data['songzhuangu']) data['adj'] = (data['preclose'].shift(-1) / data['close']).fillna(1)[::-1].cumprod() data['open'] = data['open'] * data['adj'] data['high'] = data['high'] * data['adj'] data['low'] = data['low'] * data['adj'] data['close'] = data['close'] * data['adj'] data['preclose'] = data['preclose'] * data['adj'] data = data[data['if_trade']] return data.drop(['fenhong', 'peigu', 'peigujia', 'songzhuangu', 'if_trade', 'category'], axis=1)[data['open'] != 0].assign(date=data['date'].apply(lambda x: str(x)[0:10]))[start_date:end_date] elif if_fq in ['03', 'ddqfq']: xdxr_data = QA_fetch_get_stock_xdxr(code) info = xdxr_data[xdxr_data['category'] == 1] bfq_data = data\ .assign(date=pd.to_datetime(data['datetime'].apply(lambda x: x[0:10])))\ .assign(code=str(code))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(str(x)[0:10])))\ .set_index('date', drop=False, inplace=False)\ .drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1) bfq_data['if_trade']=True data = pd.concat([bfq_data, info[['category']] [bfq_data.index[0]:end_date]], axis=1) data['date'] = data.index data['if_trade'].fillna(value=False, inplace=True) data = data.fillna(method='ffill') data = pd.concat([data, info[['fenhong', 'peigu', 'peigujia', 'songzhuangu']][bfq_data.index[0]:end_date]], axis=1) data = data.fillna(0) data['preclose'] = (data['close'].shift(1) * 10 - data['fenhong'] + data['peigu'] * data['peigujia']) / (10 + data['peigu'] + data['songzhuangu']) data['adj'] = (data['preclose'].shift(-1) / data['close']).fillna(1)[::-1].cumprod() data['open'] = data['open'] * data['adj'] data['high'] = data['high'] * data['adj'] data['low'] = data['low'] * data['adj'] data['close'] = data['close'] * data['adj'] data['preclose'] = data['preclose'] * data['adj'] data = data[data['if_trade']] return data.drop(['fenhong', 'peigu', 'peigujia', 'songzhuangu', 'if_trade', 'category'], axis=1)[data['open'] != 0].assign(date=data['date'].apply(lambda x: str(x)[0:10]))[start_date:end_date] elif if_fq in ['02', 'hfq']: xdxr_data = QA_fetch_get_stock_xdxr(code) info = xdxr_data[xdxr_data['category'] == 1] bfq_data = data\ .assign(date=pd.to_datetime(data['datetime'].apply(lambda x: x[0:10])))\ .assign(code=str(code))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(str(x)[0:10])))\ .set_index('date', drop=False, inplace=False)\ .drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1) bfq_data['if_trade']=True data = pd.concat([bfq_data, info[['category']] [bfq_data.index[0]:]], axis=1) data['date'] = data.index data['if_trade'].fillna(value=False, inplace=True) data = data.fillna(method='ffill') data = pd.concat([data, info[['fenhong', 'peigu', 'peigujia', 'songzhuangu']][bfq_data.index[0]:]], axis=1) data = data.fillna(0) data['preclose'] = (data['close'].shift(1) * 10 - data['fenhong'] + data['peigu'] * data['peigujia']) / (10 + data['peigu'] + data['songzhuangu']) data['adj'] = (data['preclose'].shift(-1) / data['close']).fillna(1).cumprod() data['open'] = data['open'] / data['adj'] data['high'] = data['high'] / data['adj'] data['low'] = data['low'] / data['adj'] data['close'] = data['close'] / data['adj'] data['preclose'] = data['preclose'] / data['adj'] data = data[data['if_trade']] return data.drop(['fenhong', 'peigu', 'peigujia', 'songzhuangu', 'if_trade', 'category'], axis=1)[data['open'] != 0].assign(date=data['date'].apply(lambda x: str(x)[0:10]))[start_date:end_date] elif if_fq in ['04', 'ddhfq']: xdxr_data = QA_fetch_get_stock_xdxr(code) info = xdxr_data[xdxr_data['category'] == 1] bfq_data = data\ .assign(date=pd.to_datetime(data['datetime'].apply(lambda x: x[0:10])))\ .assign(code=str(code))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(str(x)[0:10])))\ .set_index('date', drop=False, inplace=False)\ .drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1) bfq_data['if_trade']=True data = pd.concat([bfq_data, info[['category']] [bfq_data.index[0]:end_date]], axis=1) data['date'] = data.index data['if_trade'].fillna(value=False, inplace=True) data = data.fillna(method='ffill') data = pd.concat([data, info[['fenhong', 'peigu', 'peigujia', 'songzhuangu']][bfq_data.index[0]:end_date]], axis=1) data = data.fillna(0) data['preclose'] = (data['close'].shift(1) * 10 - data['fenhong'] + data['peigu'] * data['peigujia']) / (10 + data['peigu'] + data['songzhuangu']) data['adj'] = (data['preclose'].shift(-1) / data['close']).fillna(1).cumprod() data['open'] = data['open'] / data['adj'] data['high'] = data['high'] / data['adj'] data['low'] = data['low'] / data['adj'] data['close'] = data['close'] / data['adj'] data['preclose'] = data['preclose'] / data['adj'] data = data[data['if_trade']] return data.drop(['fenhong', 'peigu', 'peigujia', 'songzhuangu', 'if_trade', 'category'], axis=1)[data['open'] != 0].assign(date=data['date'].apply(lambda x: str(x)[0:10]))[start_date:end_date]
def QA_fetch_get_stock_day(code, start_date, end_date, if_fq='00', frequence='day', ip=None, port=None): """获取日线及以上级别的数据 Arguments: code {str:6} -- code 是一个单独的code 6位长度的str start_date {str:10} -- 10位长度的日期 比如'2017-01-01' end_date {str:10} -- 10位长度的日期 比如'2018-01-01' Keyword Arguments: if_fq {str} -- '00'/'bfq' -- 不复权 '01'/'qfq' -- 前复权 '02'/'hfq' -- 后复权 '03'/'ddqfq' -- 定点前复权 '04'/'ddhfq' --定点后复权 frequency {str} -- day/week/month/quarter/year 也可以是简写 D/W/M/Q/Y ip {str} -- [description] (default: None) ip可以通过select_best_ip()函数重新获取 port {int} -- [description] (default: {None}) Returns: pd.DataFrame/None -- 返回的是dataframe,如果出错比如只获取了一天,而当天停牌,返回None Exception: 如果出现网络问题/服务器拒绝, 会出现socket:time out 尝试再次获取/更换ip即可, 本函数不做处理 """ global best_ip if ip is None and port is None and best_ip['stock']['ip'] is None and best_ip['stock']['port'] is None: best_ip = select_best_ip() ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] elif ip is None and port is None and best_ip['stock']['ip'] is not None and best_ip['stock']['port'] is not None: ip = best_ip['stock']['ip'] port = best_ip['stock']['port'] else: pass api = TdxHq_API() with api.connect(ip, port, time_out=0.7): if frequence in ['day', 'd', 'D', 'DAY', 'Day']: frequence = 9 elif frequence in ['w', 'W', 'Week', 'week']: frequence = 5 elif frequence in ['month', 'M', 'm', 'Month']: frequence = 6 elif frequence in ['quarter', 'Q', 'Quarter', 'q']: frequence = 10 elif frequence in ['y', 'Y', 'year', 'Year']: frequence = 11 start_date = str(start_date)[0:10] today_ = datetime.date.today() lens = QA_util_get_trade_gap(start_date, today_) data = pd.concat([api.to_df(api.get_security_bars(frequence, _select_market_code( code), code, (int(lens / 800) - i) * 800, 800)) for i in range(int(lens / 800) + 1)], axis=0) # 这里的问题是: 如果只取了一天的股票,而当天停牌, 那么就直接返回None了 if len(data) < 1: return None data = data[data['open'] != 0] if if_fq in ['00', 'bfq']: data = data.assign(date=data['datetime'].apply(lambda x: str(x[0:10]))).assign(code=str(code))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(str(x)[0:10]))).set_index('date', drop=False, inplace=False) return data.drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1)[start_date:end_date].assign(date=data['date'].apply(lambda x: str(x)[0:10])) elif if_fq in ['01', 'qfq']: xdxr_data = QA_fetch_get_stock_xdxr(code) bfq_data = data.assign(date=pd.to_datetime(data['datetime'].apply(lambda x: str(x[0:10])))).assign(code=str(code))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(str(x)[0:10]))).set_index('date', drop=False, inplace=False) bfq_data = bfq_data.drop( ['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1) # if xdxr_data is not None: info = xdxr_data[xdxr_data['category'] == 1] bfq_data['if_trade'] = True data = pd.concat([bfq_data, info[['category']] [bfq_data.index[0]:]], axis=1) data['date'] = data.index data['if_trade'].fillna(value=False, inplace=True) data = data.fillna(method='ffill') data = pd.concat([data, info[['fenhong', 'peigu', 'peigujia', 'songzhuangu']][bfq_data.index[0]:]], axis=1) data = data.fillna(0) data['preclose'] = (data['close'].shift(1) * 10 - data['fenhong'] + data['peigu'] * data['peigujia']) / (10 + data['peigu'] + data['songzhuangu']) data['adj'] = (data['preclose'].shift(-1) / data['close']).fillna(1)[::-1].cumprod() data['open'] = data['open'] * data['adj'] data['high'] = data['high'] * data['adj'] data['low'] = data['low'] * data['adj'] data['close'] = data['close'] * data['adj'] data['preclose'] = data['preclose'] * data['adj'] data = data[data['if_trade']] return data.drop(['fenhong', 'peigu', 'peigujia', 'songzhuangu', 'if_trade', 'category'], axis=1)[data['open'] != 0].assign(date=data['date'].apply(lambda x: str(x)[0:10]))[start_date:end_date] else: bfq_data['preclose'] = bfq_data['close'].shift(1) bfq_data['adj'] = 1 return bfq_data[start_date:end_date] elif if_fq in ['03', 'ddqfq']: xdxr_data = QA_fetch_get_stock_xdxr(code) info = xdxr_data[xdxr_data['category'] == 1] bfq_data = data\ .assign(date=pd.to_datetime(data['datetime'].apply(lambda x: x[0:10])))\ .assign(code=str(code))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(str(x)[0:10])))\ .set_index('date', drop=False, inplace=False)\ .drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1) bfq_data['if_trade'] = True data = pd.concat([bfq_data, info[['category']] [bfq_data.index[0]:end_date]], axis=1) data['date'] = data.index data['if_trade'].fillna(value=False, inplace=True) data = data.fillna(method='ffill') data = pd.concat([data, info[['fenhong', 'peigu', 'peigujia', 'songzhuangu']][bfq_data.index[0]:end_date]], axis=1) data = data.fillna(0) data['preclose'] = (data['close'].shift(1) * 10 - data['fenhong'] + data['peigu'] * data['peigujia']) / (10 + data['peigu'] + data['songzhuangu']) data['adj'] = (data['preclose'].shift(-1) / data['close']).fillna(1)[::-1].cumprod() data['open'] = data['open'] * data['adj'] data['high'] = data['high'] * data['adj'] data['low'] = data['low'] * data['adj'] data['close'] = data['close'] * data['adj'] data['preclose'] = data['preclose'] * data['adj'] data = data[data['if_trade']] return data.drop(['fenhong', 'peigu', 'peigujia', 'songzhuangu', 'if_trade', 'category'], axis=1)[data['open'] != 0].assign(date=data['date'].apply(lambda x: str(x)[0:10]))[start_date:end_date] elif if_fq in ['02', 'hfq']: xdxr_data = QA_fetch_get_stock_xdxr(code) info = xdxr_data[xdxr_data['category'] == 1] bfq_data = data\ .assign(date=pd.to_datetime(data['datetime'].apply(lambda x: x[0:10])))\ .assign(code=str(code))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(str(x)[0:10])))\ .set_index('date', drop=False, inplace=False)\ .drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1) bfq_data['if_trade'] = True data = pd.concat([bfq_data, info[['category']] [bfq_data.index[0]:]], axis=1) data['date'] = data.index data['if_trade'].fillna(value=False, inplace=True) data = data.fillna(method='ffill') data = pd.concat([data, info[['fenhong', 'peigu', 'peigujia', 'songzhuangu']][bfq_data.index[0]:]], axis=1) data = data.fillna(0) data['preclose'] = (data['close'].shift(1) * 10 - data['fenhong'] + data['peigu'] * data['peigujia']) / (10 + data['peigu'] + data['songzhuangu']) data['adj'] = (data['preclose'].shift(-1) / data['close']).fillna(1).cumprod() data['open'] = data['open'] / data['adj'] data['high'] = data['high'] / data['adj'] data['low'] = data['low'] / data['adj'] data['close'] = data['close'] / data['adj'] data['preclose'] = data['preclose'] / data['adj'] data = data[data['if_trade']] return data.drop(['fenhong', 'peigu', 'peigujia', 'songzhuangu', 'if_trade', 'category'], axis=1)[data['open'] != 0].assign(date=data['date'].apply(lambda x: str(x)[0:10]))[start_date:end_date] elif if_fq in ['04', 'ddhfq']: xdxr_data = QA_fetch_get_stock_xdxr(code) info = xdxr_data[xdxr_data['category'] == 1] bfq_data = data\ .assign(date=pd.to_datetime(data['datetime'].apply(lambda x: x[0:10])))\ .assign(code=str(code))\ .assign(date_stamp=data['datetime'].apply(lambda x: QA_util_date_stamp(str(x)[0:10])))\ .set_index('date', drop=False, inplace=False)\ .drop(['year', 'month', 'day', 'hour', 'minute', 'datetime'], axis=1) bfq_data['if_trade'] = True data = pd.concat([bfq_data, info[['category']] [bfq_data.index[0]:end_date]], axis=1) data['date'] = data.index data['if_trade'].fillna(value=False, inplace=True) data = data.fillna(method='ffill') data = pd.concat([data, info[['fenhong', 'peigu', 'peigujia', 'songzhuangu']][bfq_data.index[0]:end_date]], axis=1) data = data.fillna(0) data['preclose'] = (data['close'].shift(1) * 10 - data['fenhong'] + data['peigu'] * data['peigujia']) / (10 + data['peigu'] + data['songzhuangu']) data['adj'] = (data['preclose'].shift(-1) / data['close']).fillna(1).cumprod() data['open'] = data['open'] / data['adj'] data['high'] = data['high'] / data['adj'] data['low'] = data['low'] / data['adj'] data['close'] = data['close'] / data['adj'] data['preclose'] = data['preclose'] / data['adj'] data = data[data['if_trade']] return data.drop(['fenhong', 'peigu', 'peigujia', 'songzhuangu', 'if_trade', 'category'], axis=1)[data['open'] != 0].assign(date=data['date'].apply(lambda x: str(x)[0:10]))[start_date:end_date]
class QA_Tdx_Executor(): def __init__(self, thread_num=2, timeout=1, *args, **kwargs): self.thread_num = thread_num self._queue = queue.Queue(maxsize=200) self.api_no_connection = TdxHq_API() self._api_worker = Thread( target=self.api_worker, args=(), name='API Worker') self._api_worker.start() self.timeout = timeout self.executor = ThreadPoolExecutor(self.thread_num) def __getattr__(self, item): try: api = self.get_available() func = api.__getattribute__(item) def wrapper(*args, **kwargs): res = self.executor.submit(func, *args, **kwargs) self._queue.put(api) return res return wrapper except: return self.__getattr__(item) def _queue_clean(self): self._queue = queue.Queue(maxsize=200) def _test_speed(self, ip, port=7709): api = TdxHq_API(raise_exception=True, auto_retry=False) _time = datetime.datetime.now() # print(self.timeout) try: with api.connect(ip, port, time_out=1): res = api.get_security_list(0, 1) # print(res) # print(len(res)) if len(api.get_security_list(0, 1)) > 800: return (datetime.datetime.now() - _time).total_seconds() else: return datetime.timedelta(9, 9, 0).total_seconds() except Exception as e: return datetime.timedelta(9, 9, 0).total_seconds() def get_market(self, code): code = str(code) if code[0] in ['5', '6', '9'] or code[:3] in ["009", "126", "110", "201", "202", "203", "204"]: return 1 return 0 def get_frequence(self, frequence): if frequence in ['day', 'd', 'D', 'DAY', 'Day']: frequence = 9 elif frequence in ['w', 'W', 'Week', 'week']: frequence = 5 elif frequence in ['month', 'M', 'm', 'Month']: frequence = 6 elif frequence in ['Q', 'Quarter', 'q']: frequence = 10 elif frequence in ['y', 'Y', 'year', 'Year']: frequence = 11 elif str(frequence) in ['5', '5m', '5min', 'five']: frequence = 0 elif str(frequence) in ['1', '1m', '1min', 'one']: frequence = 8 elif str(frequence) in ['15', '15m', '15min', 'fifteen']: frequence = 1 elif str(frequence) in ['30', '30m', '30min', 'half']: frequence = 2 elif str(frequence) in ['60', '60m', '60min', '1h']: frequence = 3 return frequence @property def ipsize(self): return len(self._queue.qsize()) @property def api(self): return self.get_available() def get_available(self): if self._queue.empty() is False: return self._queue.get_nowait() else: Timer(0, self.api_worker).start() return self._queue.get() def api_worker(self): data = [] if self._queue.qsize() < 80: for item in stock_ip_list: if self._queue.full(): break _sec = self._test_speed(ip=item['ip'], port=item['port']) if _sec < self.timeout*3: try: self._queue.put(TdxHq_API(heartbeat=False).connect( ip=item['ip'], port=item['port'], time_out=self.timeout*2)) except: pass else: self._queue_clean() Timer(0, self.api_worker).start() Timer(300, self.api_worker).start() def _singal_job(self, context, id_, time_out=0.7): try: _api = self.get_available() __data = context.append(self.api_no_connection.to_df(_api.get_security_quotes( [(self._select_market_code(x), x) for x in code[80 * id_:80 * (id_ + 1)]]))) __data['datetime'] = datetime.datetime.now() self._queue.put(_api) # 加入注销 return __data except: return self.singal_job(context, id_) def get_realtime(self, code): context = pd.DataFrame() code = [code] if isinstance(code, str) is str else code try: for id_ in range(int(len(code) / 80) + 1): context = self._singal_job(context, id_) data = context[['datetime', 'last_close', 'code', 'open', 'high', 'low', 'price', 'cur_vol', 's_vol', 'b_vol', 'vol', 'ask1', 'ask_vol1', 'bid1', 'bid_vol1', 'ask2', 'ask_vol2', 'bid2', 'bid_vol2', 'ask3', 'ask_vol3', 'bid3', 'bid_vol3', 'ask4', 'ask_vol4', 'bid4', 'bid_vol4', 'ask5', 'ask_vol5', 'bid5', 'bid_vol5']] data['datetime'] = data['datetime'].apply(lambda x: str(x)) return data.set_index('code', drop=False, inplace=False) except: return None def get_realtime_concurrent(self, code): code = [code] if isinstance(code, str) is str else code try: data = {self.get_security_quotes([(self.get_market( x), x) for x in code[80 * pos:80 * (pos + 1)]]) for pos in range(int(len(code) / 80) + 1)} return (pd.concat([self.api_no_connection.to_df(i.result()) for i in data]), datetime.datetime.now()) except: pass def get_security_bar_concurrent(self, code, _type, lens): try: data = {self.get_security_bars(self.get_frequence(_type), self.get_market( str(code)), str(code), 0, lens) for code in code} return [i.result() for i in data] except: raise Exception def _get_security_bars(self, context, code, _type, lens): try: _api = self.get_available() for i in range(1, int(lens / 800) + 2): context.extend(_api.get_security_bars(self.get_frequence( _type), self.get_market(str(code)), str(code), (i - 1) * 800, 800)) print(context) self._queue.put(_api) return context except Exception as e: return self._get_security_bars(context, code, _type, lens) def get_security_bar(self, code, _type, lens): code = [code] if isinstance(code, str) is str else code context = [] try: for item in code: context = self._get_security_bars(context, item, _type, lens) return context except Exception as e: raise e def save_mongo(self, data, client=DATABASE): database = DATABASE.get_collection( 'realtime_{}'.format(datetime.date.today())) database.insert_many(QA_util_to_json_from_pandas(data))
) rows.append(row) return rows def get_category_name(self, category_id): if category_id in XDXR_CATEGORY_MAPPING: return XDXR_CATEGORY_MAPPING[category_id] else: return str(category_id) if __name__ == '__main__': from pytdx.util.best_ip import select_best_ip from pytdx.hq import TdxHq_API api = TdxHq_API() with api.connect(): # 11 扩缩股 print(api.to_df(api.get_xdxr_info(1, '600381'))) # 12 非流通股缩股 #print(api.to_df(api.get_xdxr_info(1, '600339'))) # 13 送认购权证 #print(api.to_df(api.get_xdxr_info(1, '600008'))) # 14 送认沽权证 #print(api.to_df(api.get_xdxr_info(0, '000932')))