def bar(code, conn=None, start_date=None, end_date=None, freq='D', asset='E', market='', adj=None, ma=[], factors=[], retry_count=3): """ BAR数据 Parameters: ------------ code:证券代码,支持股票,ETF/LOF,期货/期权,港股 con:服务器连接 ,通过ts.api()或者ts.xpi()获得 start_date:开始日期 YYYY-MM-DD/YYYYMMDD end_date:结束日期 YYYY-MM-DD/YYYYMMDD freq:支持1/5/15/30/60分钟,周/月/季/年 asset:证券类型 E:股票和交易所基金,INDEX:沪深指数,X:期货/期权/港股/中概美国/中证指数/国际指数 market:市场代码,通过ts.get_markets()获取 adj:复权类型,None不复权,qfq:前复权,hfq:后复权 ma:均线,支持自定义均线频度,如:ma5/ma10/ma20/ma60/maN factors因子数据,目前支持以下两种: vr:量比,默认不返回,返回需指定:factor=['vr'] tor:换手率,默认不返回,返回需指定:factor=['tor'] 以上两种都需要:factor=['vr', 'tor'] retry_count:网络重试次数 Return ---------- DataFrame code:代码 open:开盘close/high/low/vol成交量/amount成交额/maN均价/vr量比/tor换手率 期货(asset='X') code/open/close/high/low/avg_price:均价 position:持仓量 vol:成交总量 """ code = code.strip().upper() for _ in range(retry_count): try: if conn is None: print(ct.MSG_NOT_CONNECTED) return None api, xapi = conn ktype = freq.strip().upper() asset = asset.strip().upper() mkcode = _get_mkcode(code, asset=asset, xapi=xapi) if market == '' else market if asset in ['E', 'INDEX']: func = getattr(api, ct.ASSET[asset]) else: ktype = 'XD' if ktype == 'D' else ktype func = getattr(xapi, ct.ASSET['X']) if ktype in ct.KTYPE_LOW_COLS: data = pd.DataFrame() for i in range(100): ds = func(ct.KTYPE[ktype], mkcode, code, i * 800, 800) df = api.to_df(ds) data = data.append(df) if i == 0 else df.append( data, ignore_index=True) if len(ds) < 800: break data['datetime'] = data['datetime'].apply( lambda x: str(x[0:10])) if ktype in ct.KTYPE_ARR: data = pd.DataFrame() for i in range(100): ds = func(ct.KTYPE[ktype], mkcode, code, i * 800, 800) df = api.to_df(ds) data = data.append(df) if i == 0 else df.append( data, ignore_index=True) if len(ds) < 800: break data['datetime'] = pd.to_datetime(data['datetime']) data = data.assign(code=str(code)) \ .set_index('datetime', drop=True, inplace=False) \ .drop(ct.T_DROP_COLS, axis=1)[ None if start_date == '' else start_date : None if end_date == '' else end_date] data = data.sort_index(ascending=False) if asset in ['E', 'INDEX']: data = data[ct.BAR_E_COLS] if ktype in ct.KTYPE_ARR: data['vol'] = data['vol'] / 100 else: data = data[ct.BAR_X_COLS] if mkcode in [28, 29, 30, 47, 60]: data.columns = ct.BAR_X_FUTURE_COLS data = data[ct.BAR_X_FUTURE_RL_COLS] else: data = data.drop(['price', 'position'], axis=1) data.columns = ct.BAR_X_OTHER_COLS if asset == 'E': if adj is not None: df = factor_adj(code) if ktype in ct.KTYPE_LOW_COLS: data = data.merge(df, left_index=True, right_index=True) data['adj_factor'] = data['adj_factor'].fillna( method='bfill') else: def get_val(day): return df.ix[day]['adj_factor'] data['adj_factor'] = data.index.map( lambda x: get_val(str(x)[0:10])) for col in ct.BAR_E_COLS[1:5]: if adj == 'hfq': data[col] = data[col] * data['adj_factor'] else: data[col] = data[col] * data['adj_factor'] / float( df['adj_factor'][0]) data[col] = data[col].map(ct.FORMAT) data = data.drop('adj_factor', axis=1) if factors is not None and len(factors) > 0: if 'tor' in factors: df = factor_shares(code) if ktype in ct.KTYPE_LOW_COLS: data = data.merge(df, left_index=True, right_index=True) data['floats'] = data['floats'].fillna( method='bfill') else: def get_val(day): return df.ix[day]['floats'] data['floats'] = data.index.map( lambda x: get_val(str(x)[0:10])) data['tor'] = data['vol'] / data['floats'] data['tor'] = data['tor'].map(ct.FORMAT) data['tor'] = data['tor'].astype(float) data = data.drop('floats', axis=1) if 'vr' in factors: data['vol5'] = MA(data['vol'], 5) data['mean'] = data['vol5'].shift(-5) data['vr'] = (data['vol'] / data['mean']).map( ct.FORMAT) data['vr'] = data['vr'].astype(float) data = data.drop(['vol5', 'mean'], axis=1) if ma is not None and len(ma) > 0: for a in ma: if isinstance(a, int): data['ma%s' % a] = MA(data['close'], a).map(ct.FORMAT).shift(-(a - 1)) data['ma%s' % a] = data['ma%s' % a].astype(float) for col in ['open', 'high', 'low', 'close']: data[col] = data[col].astype(float) data['p_change'] = data['close'].pct_change(-1) * 100 data['p_change'] = data['p_change'].map(ct.FORMAT).astype(float) return data except: return None else: data['p_change'] = data['close'].pct_change(-1) * 100 data['p_change'] = data['p_change'].map(ct.FORMAT).astype(float) return data raise IOError(ct.NETWORK_URL_ERROR_MSG)
def pro_bar(ts_code='', api=None, start_date='', end_date='', freq='D', asset='E', exchange='', adj=None, ma=[], factors=None, adjfactor=False, contract_type='', retry_count=3): """ BAR数据 Parameters: ------------ ts_code:证券代码,支持股票,ETF/LOF,期货/期权,港股,数字货币 start_date:开始日期 YYYYMMDD end_date:结束日期 YYYYMMDD freq:支持1/5/15/30/60分钟,周/月/季/年 asset:证券类型 E:股票和交易所基金,I:沪深指数,C:数字货币,FT:期货 FD:基金/O期权/H港股/中概美国/中证指数/国际指数 exchange:市场代码,用户数字货币行情 adj:复权类型,None不复权,qfq:前复权,hfq:后复权 ma:均线,支持自定义均线频度,如:ma5/ma10/ma20/ma60/maN factors因子数据,目前支持以下两种: vr:量比,默认不返回,返回需指定:factor=['vr'] tor:换手率,默认不返回,返回需指定:factor=['tor'] 以上两种都需要:factor=['vr', 'tor'] retry_count:网络重试次数 Return ---------- DataFrame code:代码 open:开盘close/high/low/vol成交量/amount成交额/maN均价/vr量比/tor换手率 期货(asset='X') code/open/close/high/low/avg_price:均价 position:持仓量 vol:成交总量 """ today = datetime.datetime.today().date() today = str(today)[0:10] start_date = '' if start_date is None else start_date end_date = today if end_date == '' or end_date is None else end_date ts_code = ts_code.strip().upper() if asset != 'C' else ts_code.strip( ).lower() start_date = start_date.replace('-', '') end_date = end_date.replace('-', '') if len(freq.strip()) >= 3: freq = freq.strip().lower() else: freq = freq.strip().upper() if asset != 'C' else freq.strip().lower() asset = asset.strip().upper() api = api if api is not None else pro_api() for _ in range(retry_count): try: if asset == 'E': if freq == 'D': data = api.daily(ts_code=ts_code, start_date=start_date, end_date=end_date) if factors is not None and len(factors) > 0: ds = api.daily_basic(ts_code=ts_code, start_date=start_date, end_date=end_date)[[ 'trade_date', 'turnover_rate', 'volume_ratio' ]] ds = ds.set_index('trade_date') data = data.set_index('trade_date') data = data.merge(ds, left_index=True, right_index=True) data = data.reset_index() if ('tor' in factors) and ('vr' not in factors): data = data.drop('volume_ratio', axis=1) if ('vr' in factors) and ('tor' not in factors): data = data.drop('turnover_rate', axis=1) if freq == 'W': data = api.weekly(ts_code=ts_code, start_date=start_date, end_date=end_date) if freq == 'M': data = api.monthly(ts_code=ts_code, start_date=start_date, end_date=end_date) if 'min' in freq: data = api.mins(ts_code=ts_code, start_time=start_date, end_time=end_date, freq=freq) data['trade_date'] = data['trade_time'].map( lambda x: x.replace('-', '')[0:8]) data['pre_close'] = data['close'].shift(-1) if adj is not None: fcts = api.adj_factor( ts_code=ts_code, start_date=start_date, end_date=end_date)[['trade_date', 'adj_factor']] data = data.set_index('trade_date', drop=False).merge( fcts.set_index('trade_date'), left_index=True, right_index=True, how='left') if 'min' in freq: data = data.sort_values('trade_time', ascending=False) data['adj_factor'] = data['adj_factor'].fillna( method='bfill') for col in PRICE_COLS: if adj == 'hfq': data[col] = data[col] * data['adj_factor'] if adj == 'qfq': data[col] = data[col] * data['adj_factor'] / float( fcts['adj_factor'][0]) data[col] = data[col].map(FORMAT) for col in PRICE_COLS: data[col] = data[col].astype(float) if adjfactor is False: data = data.drop('adj_factor', axis=1) if 'min' not in freq: data['change'] = data['close'] - data['pre_close'] data['pct_chg'] = data['change'] / data[ 'pre_close'] * 100 data['pct_chg'] = data['pct_chg'].map( lambda x: FORMAT(x)).astype(float) else: data = data.drop(['trade_date', 'pre_close'], axis=1) elif asset == 'I': if freq == 'D': data = api.index_daily(ts_code=ts_code, start_date=start_date, end_date=end_date) if freq == 'W': data = api.index_weekly(ts_code=ts_code, start_date=start_date, end_date=end_date) if freq == 'M': data = api.index_monthly(ts_code=ts_code, start_date=start_date, end_date=end_date) if 'min' in freq: data = api.mins(ts_code=ts_code, start_time=start_date, end_time=end_date, freq=freq) elif asset == 'FT': if freq == 'D': data = api.fut_daily(ts_code=ts_code, start_date=start_date, end_date=end_date, exchange=exchange) if 'min' in freq: data = api.mins(ts_code=ts_code, start_time=start_date, end_time=end_date, freq=freq) elif asset == 'O': if freq == 'D': data = api.opt_daily(ts_code=ts_code, start_date=start_date, end_date=end_date, exchange=exchange) if 'min' in freq: data = api.mins(ts_code=ts_code, start_time=start_date, end_time=end_date, freq=freq) elif asset == 'FD': if freq == 'D': data = api.fund_daily(ts_code=ts_code, start_date=start_date, end_date=end_date) if 'min' in freq: data = api.mins(ts_code=ts_code, start_time=start_date, end_time=end_date, freq=freq) if asset == 'C': if freq == 'd': freq = 'daily' elif freq == 'w': freq = 'week' data = api.coinbar(exchange=exchange, symbol=ts_code, freq=freq, start_dae=start_date, end_date=end_date, contract_type=contract_type) if ma is not None and len(ma) > 0: for a in ma: if isinstance(a, int): data['ma%s' % a] = MA(data['close'], a).map(FORMAT).shift(-(a - 1)) data['ma%s' % a] = data['ma%s' % a].astype(float) data['ma_v_%s' % a] = MA(data['vol'], a).map(FORMAT).shift(-(a - 1)) data['ma_v_%s' % a] = data['ma_v_%s' % a].astype(float) data = data.reset_index(drop=True) except Exception as e: return None else: return data raise IOError('ERROR.')
def pro_bar(ts_code='', pro_api=None, start_date=None, end_date=None, freq='D', asset='E', market='', adj=None, ma=[], retry_count=3): """ BAR数据 Parameters: ------------ ts_code:证券代码,支持股票,ETF/LOF,期货/期权,港股,数字货币 start_date:开始日期 YYYYMMDD end_date:结束日期 YYYYMMDD freq:支持1/5/15/30/60分钟,周/月/季/年 asset:证券类型 E:股票和交易所基金,I:沪深指数,C:数字货币,FT:期货 FD:基金/O期权/H港股/中概美国/中证指数/国际指数 market:市场代码,通过ts.get_markets()获取 adj:复权类型,None不复权,qfq:前复权,hfq:后复权 ma:均线,支持自定义均线频度,如:ma5/ma10/ma20/ma60/maN factors因子数据,目前支持以下两种: vr:量比,默认不返回,返回需指定:factor=['vr'] tor:换手率,默认不返回,返回需指定:factor=['tor'] 以上两种都需要:factor=['vr', 'tor'] retry_count:网络重试次数 Return ---------- DataFrame code:代码 open:开盘close/high/low/vol成交量/amount成交额/maN均价/vr量比/tor换手率 期货(asset='X') code/open/close/high/low/avg_price:均价 position:持仓量 vol:成交总量 """ ts_code = ts_code.strip().upper() api = pro_api if pro_api is not None else pro_api() for _ in range(retry_count): try: freq = freq.strip().upper() asset = asset.strip().upper() if asset == 'E': if freq == 'D': df = api.daily(ts_code=ts_code, start_date=start_date, end_date=end_date) if adj is not None: fcts = api.adj_factor( ts_code=ts_code, start_date=start_date, end_date=end_date)[['trade_date', 'adj_factor']] data = df.set_index('trade_date', drop=False).merge( fcts.set_index('trade_date'), left_index=True, right_index=True, how='left') data['adj_factor'] = data['adj_factor'].fillna( method='bfill') for col in PRICE_COLS: if adj == 'hfq': data[col] = data[col] * data['adj_factor'] else: data[col] = data[col] * data[ 'adj_factor'] / float( fcts['adj_factor'][0]) data[col] = data[col].map(FORMAT) for col in PRICE_COLS: data[col] = data[col].astype(float) data = data.drop('adj_factor', axis=1) else: data = df elif asset == 'I': if freq == 'D': data = api.index_daily(ts_code=ts_code, start_date=start_date, end_date=end_date) elif asset == 'FT': if freq == 'D': data = api.fut_daily(ts_code=ts_code, start_dae=start_date, end_date=end_date, exchange=market) elif asset == 'FD': if freq == 'D': data = api.fund_daily(ts_code=ts_code, start_dae=start_date, end_date=end_date) if asset == 'C': #//////////////////////// well soon pass if ma is not None and len(ma) > 0: for a in ma: if isinstance(a, int): data['ma%s' % a] = MA(data['close'], a).map(FORMAT).shift(-(a - 1)) data['ma%s' % a] = data['ma%s' % a].astype(float) data['ma_v_%s' % a] = MA(data['vol'], a).map(FORMAT).shift(-(a - 1)) data['ma_v_%s' % a] = data['ma_v_%s' % a].astype(float) return data except Exception as e: print(e) return None else: return raise IOError('ERROR.')