예제 #1
0
파일: trading.py 프로젝트: nblib/tushare
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)
예제 #2
0
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.')
예제 #3
0
파일: data_pro.py 프로젝트: justpi/-
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.')