예제 #1
0
    def get_stock_return(self, begin_date, end_date, freq='month'):
        if freq == 'week':
            stock_return = DataAPI.MktEquwGet(
                beginDate=begin_date,
                endDate=end_date,
                field=['secID', 'endDate', 'chgPct'])
            stock_return = stock_return.pivot(index='endDate',
                                              columns='secID',
                                              values='chgPct')
            stock_return.index = stock_return.index.str.replace('-', '')
        elif freq == 'month':
            stock_return = DataAPI.MktEqumGet(
                beginDate=begin_date,
                endDate=end_date,
                field=['secID', 'endDate', 'chgPct'])
            stock_return = stock_return.pivot(index='endDate',
                                              columns='secID',
                                              values='chgPct')
            stock_return.index = stock_return.index.str.replace('-', '')
        elif freq == 'day':
            stock_return = DataAPI.MktEqudGet(
                beginDate=begin_date,
                endDate=end_date,
                field=['secID', 'tradeDate', 'chgPct'])
            stock_return = stock_return.pivot(index='tradeDate',
                                              columns='secID',
                                              values='chgPct')
            stock_return.index = stock_return.index.str.replace('-', '')
        else:
            raise InputParameterError('不支持的频率格式')

        return stock_return
예제 #2
0
 def get_float_mkt_cap(self, trading_day_list, sec_ids):
     float_mkt_cap_dict = {}
     for date in trading_day_list:
         df = DataAPI.MktEqudGet(secID=sec_ids,
                                 tradeDate=date,
                                 field=u"secID,negMarketValue",
                                 pandas="1")
         df.set_index('secID', inplace=True)
         float_mkt_cap_dict[date] = df['negMarketValue']
     return float_mkt_cap_dict
예제 #3
0
 def get_open_price(self, trading_day_list, sec_ids):
     open_price_dict = {}
     for date in trading_day_list:
         df = DataAPI.MktEqudGet(secID=sec_ids,
                                 tradeDate=date,
                                 field=u"secID,openPrice",
                                 pandas="1")
         df.set_index('secID', inplace=True)
         open_price_dict[date] = df['openPrice']
     return open_price_dict
예제 #4
0
def update_uqer_market(ds, **kwargs):
    ref_date, _ = process_date(ds)

    table = 'market'

    df = api.MktEqudGet(tradeDate=ref_date)
    df.rename(columns={'tradeDate': 'Date', 'ticker': 'Code'}, inplace=True)
    df.Code = df.Code.astype(int)
    del df['secID']
    engine2.execute("delete from {0} where Date = '{1}';".format(table, ref_date))
    df.to_sql(table, engine2, index=False, if_exists='append')
예제 #5
0
 def get_equity_overnight_return(self, trading_day_list, sec_ids):
     equity_overnight_return_dict = {}
     for date in trading_day_list:
         df = DataAPI.MktEqudGet(secID=sec_ids,
                                 tradeDate=date,
                                 field=u"secID,openPrice,preClosePrice",
                                 pandas="1")
         df['overnight_return'] = df['openPrice'] / df['preClosePrice'] - 1
         df.set_index('secID', inplace=True)
         equity_overnight_return_dict[date] = df['overnight_return']
     return equity_overnight_return_dict
예제 #6
0
 def get_equity_close_price_daily(self, universe_list, begin_date,
                                  end_date):
     df = DataAPI.MktEqudGet(secID=universe_list,
                             beginDate=begin_date,
                             endDate=end_date)
     df['tradeDate'] = df['tradeDate'].apply(
         lambda x: str(x).replace('-', ''))
     trading_day_list = sorted(df['tradeDate'].unique())
     close_price_series_dict = {}
     for trading_day in trading_day_list:
         close_price_series_dict[trading_day] = df[
             df['tradeDate'] == trading_day].set_index(
                 'secID')['closePrice']
     return close_price_series_dict
예제 #7
0
 def get_sigle_stock_info(stock_code):
     stock_ticker = stock_code
     stock_infoRaw = DataAPI.MktEqudGet(secID=u"",
                                        ticker=stock_ticker,
                                        tradeDate=u"20200427",
                                        beginDate=u"",
                                        endDate=u"",
                                        isOpen="",
                                        field=u"",
                                        pandas="1")
     # T日交易参考价使用的是昨收
     stock_info = stock_infoRaw.loc[:, [
         'secID', 'ticker', 'secShortName', 'tradeDate', 'preClosePrice'
     ]]
     single_stock_info = stock_info.loc[:, "preClosePrice"]
     return single_stock_info
예제 #8
0
 def get_sigle_stock_price(self, stock_code, beginDate, endDate):
     '''
     Args:
         stock_code: str,交易代码
     Returns:
         float变量,一支股票当日的昨收
     '''
     stock_infoRaw = DataAPI.MktEqudGet(secID=u"",
                                        ticker=stock_code,
                                        tradeDate=u"",
                                        beginDate=beginDate,
                                        endDate=endDate,
                                        isOpen="",
                                        field=u"",
                                        pandas="1")
     # T日交易参考价使用的是昨收
     return stock_infoRaw.loc[:, "preClosePrice"]
예제 #9
0
def getIC(path, today, n_days):
    print('calculate IC')
    filename = os.listdir(path)

    filename1 = pd.Series(filename)
    filename1 = filename1.apply(lambda x: x.split('.')[0])

    filename1 = filename1[(filename1 > n_days) & (filename1 < today)]

    trade_day = filename1.values.tolist()

    col = [
        'BETA', 'MOMENTUM', 'SIZE', 'EARNYILD', 'RESVOL', 'GROWTH', 'BTOP',
        'LEVERAGE', 'LIQUIDTY', 'SIZENL'
    ]

    df = pd.DataFrame([])

    i = 0
    for i in range(len(trade_day) - 1):
        #        print(i)
        t = trade_day[i]
        t1 = trade_day[i + 1]

        ret = DataAPI.MktEqudGet(tradeDate=t1,secID=u"",ticker=u"",\
            beginDate=u"",endDate=u"",isOpen="",field=['secID','chgPct'],pandas="1")

        ret['secID'] = ret['secID'].apply(replaceCode)

        factor = pd.read_csv(path + t + '.csv', encoding='gb18030')
        factor = factor[['secID'] + col]

        df_merge = pd.merge(ret, factor, on='secID')
        df_merge = df_merge.set_index('secID')
        df_corr = df_merge.corr('spearman')
        df_corr = df_corr.iloc[0][col]
        df_corr = pd.DataFrame(df_corr)
        df_corr.columns = [t]
        df = pd.concat([df, df_corr], axis=1)

    df = df.T
    df.to_csv('data/IC.csv')
    print('calculate IC  Done!')
예제 #10
0
def update_uqer_market(ds, **kwargs):
    ref_date, this_date = process_date(ds)
    flag = check_holiday(this_date)

    if not flag:
        return

    df = api.MktEqudGet(tradeDate=ref_date)
    df.rename(columns={
        'tradeDate': 'trade_date',
        'ticker': 'code'
    },
              inplace=True)
    df.code = df.code.astype(int)
    del df['secID']

    query = delete(Market).where(Market.trade_date == this_date)
    engine.execute(query)

    data_info_log(df, Market)
    format_data(df, format='%Y-%m-%d')
    df.to_sql(Market.__table__.name, engine, index=False, if_exists='append')
예제 #11
0
def use_case_sim(security_id='002180.XSHE',
                 participant_ratio=0.2,
                 start_date='20191101',
                 end_date='20191231',
                 trade_date='2019-12-05',
                 passive_ratio=0.5,
                 mode=1):
    '''
    mode = 1: all execute by passive(twap/vwap); mode = 2: all execute by liquididy; mode=3: ratio of passive execute is
    passive_ratio, others by liquidity
    '''
    prev_trade_date = '2019-12-04'
    df = DataAPI.MktEqudGet(
        secID=security_id,
        tradeDate=u"",
        beginDate=start_date,
        endDate=end_date,
        isOpen="",
        field=["tradeDate", "chgPct", "closePrice", "turnoverVol"],
        pandas="1")
    df['ret_std'] = df[['chgPct']].rolling(20).apply(lambda x: x.std())
    df['vol_sum'] = df[['turnoverVol']].rolling(5).apply(lambda x: x.sum())

    trade_row = df[df.tradeDate == trade_date]
    prev_row = df[df.tradeDate == prev_trade_date]
    daily_vol = list(trade_row['ret_std'])[0]
    total_vol = list(prev_row['vol_sum'])[0]
    passive_ratio = 1.0 if mode == 1 else (0.0 if mode == 2 else passive_ratio)
    passive_vol = total_vol * passive_ratio
    liquid_vol = total_vol - passive_vol

    df = DataAPI.MktBarHistDateRangeGet(securityID=security_id,
                                        startDate=trade_date.replace('-', ''),
                                        endDate=trade_date.replace('-', ''),
                                        unit="1",
                                        field=u"",
                                        pandas="1")
    # df.sort_values(by='totalVolume', ascending=True, inplace=True)
    df['vwap'] = df['totalValue'] / df['totalVolume']
    s = passive_vol * participant_ratio / 240
    adv = total_vol
    sigma = daily_vol * math.sqrt(245)

    df_tick = get_features_by_date(security_id=u"002180.XSHE",
                                   date='20191205',
                                   min_unit="1",
                                   tick=True)
    ask_vol_sum = {}
    bid_vol_sum = {}
    df_tick = df_tick[df_tick.barTime <= "14:57"]
    df_tick = df_tick[df_tick.barTime > '09:30']
    for row in (df_tick[['barTime', 'totalAskVolume',
                         'totalBidVolume']].values):
        _ask_tmp = ask_vol_sum.get(row[0]) or 0.0
        _bid_tmp = bid_vol_sum.get(row[0]) or 0.0
        ask_vol_sum.update({row[0]: _ask_tmp + row[1]})
        bid_vol_sum.update({row[0]: _bid_tmp + row[2]})
    q_dict = {}
    for k, v in bid_vol_sum.items():
        q_dict.update({k: abs(v - ask_vol_sum.get(k))})

    df = df[df.barTime <= "14:57"]
    df = df[df.barTime > '09:30']
    mkt_vols = list(df['totalVolume'])
    _tmp = [s / item for item in mkt_vols]
    participant_min = dict(zip(df['barTime'], _tmp))
    vt_dict = dict(zip(df['barTime'], df['totalVolume']))
    total_value = 0.0
    total_vol = 0
    # TODO get the TWAP/VWAP simulate results (with and without market impact), check market impact results
    if passive_ratio > 0:
        istar, tmp_dict, perm_dict = get_market_impact(s, adv, sigma, vt_dict,
                                                       q_dict)
        ret_rows = []
        for bar_time, item in df[['barTime', 'vwap']].values:
            total_vol += s
            # _tmp_impact = tmp_dict.get(bar_time)
            _tmp_impact = istar
            total_value += item * s * (1 - _tmp_impact / 10000)
            ret_rows.append([
                bar_time, istar,
                tmp_dict.get(bar_time),
                perm_dict.get(bar_time)
            ])
        mi_df = pd.DataFrame(ret_rows,
                             columns=['barTime', 'istar', 'tmp', 'perm'])
        mi_df.to_csv('mi_report_mode_{0}_{1}.csv'.format(mode, passive_ratio))

    if passive_ratio < 1.0:
        print('liquid target_vol is: ', liquid_vol * participant_ratio)
        liquid_trade_value, liquid_trade_vol, finish_time = get_liquid_results(
            df_tick,
            liquid_vol * participant_ratio,
            ratio=0.13,
            level=1,
            price_rule=1)
        print(liquid_trade_value, liquid_trade_vol,
              liquid_trade_value / liquid_trade_vol, finish_time)
        total_value += liquid_trade_value
        total_vol += liquid_trade_vol
        # liquid_value, liquid_vol, finish_time = get_liquid_results(df_tick, liquid_vol * participant_ratio, ratio=0.20,
        #                                                            level=2, price_rule=1)
        # print(liquid_value, liquid_value, liquid_value / liquid_vol, finish_time)

    print(total_value, total_vol, total_value / total_vol)
예제 #12
0
def get_samples(mode=0, *arge, **kwargs):
    ''' mode 对应的测试集
        0. 每种规模分别取前N,默认000300-沪深300,000001-上证综指,000905-中证500,399005-深证中小板指,399006-创业板指
        1. 每个行业龙头,主要市值排行
        2. 流动性看:成交量活跃度,按换手率,和成交量日间日内波动, 现为换手率,对设置的市场
        3.  异动股,日间(短期)、日内
        4.  风格: 动量、反转
        5. 对每种指数,300,500
    '''
    total_num = kwargs.get('total_num') or 100
    start_date = kwargs.get('start_date') or "20191201"
    end_date = kwargs.get('end_date') or "20191231"
    # ['000300', '000001', '000905', '399005', '399006', '399001'] #sh and sz market
    # ['399005', '399006', '399001'] #sz market
    tickers = kwargs.get('mkt_tickers') or ['399005', '399006', '399001']
    ticker_to_exchangecd = {
        '000300': 'XSHG',
        '000001': 'XSHG',
        '000905': 'XSHG',
        '399005': 'XSHE',
        '399006': 'XSHE',
        '399001': 'XSHE'
    }
    if mode == 0:
        ret = {}
        _num = int(total_num / len(tickers))
        for _ticker in tickers:
            df = DataAPI.mIdxCloseWeightGet(secID=u"",
                                            ticker=_ticker,
                                            beginDate=start_date,
                                            endDate=end_date,
                                            field=["consID", "weight"],
                                            pandas="1").sort_values(
                                                by='weight', ascending=False)
            # TODO choose the top weights coons, then the correlations with the becnchmark is high, change to sample num
            # randomly
            sec_ids = df['consID'][:_num]
            ret.update({
                '{0}.{1}'.format(_ticker, ticker_to_exchangecd.get(_ticker)):
                sec_ids
            })
    elif mode == 2:
        ret = {}
        _num = int(total_num / len(tickers))
        for _ticker in tickers:
            df = DataAPI.mIdxCloseWeightGet(secID=u"",
                                            ticker=_ticker,
                                            beginDate=start_date,
                                            endDate=end_date,
                                            field=["consID", "weight"],
                                            pandas="1").sort_values(
                                                by='weight', ascending=False)
            # TODO choose the top weights coons, then the correlations with the becnchmark is high, change to sample num
            # randomly
            cons_ids = df['consID']
            mkt_df = DataAPI.MktEqudGet(secID=cons_ids,
                                        beginDate=start_date,
                                        endDate=end_date,
                                        isOpen=1,
                                        pandas="1")
            df_agg = mkt_df.groupby('secID').agg({'turnoverRate': ['mean']})
            flatten_columns = [
                '{0}_{1}'.format(item[0], item[1]) for item in df_agg.columns
            ]
            df_agg.columns = flatten_columns
            df_agg = df_agg.reset_index()
            df_agg.sort_values(by='turnoverRate_mean', ascending=False)
            sec_ids = df_agg['secID'][:_num]
            ret.update({
                '{0}.{1}'.format(_ticker, ticker_to_exchangecd.get(_ticker)):
                sec_ids
            })
        return ret
예제 #13
0
 def get_mkt_equd(self, security_ids=(), fields=None, start_date=None, end_date=None, asset_type='stock'):
     ret = DataAPI.MktEqudGet(secID='603612.XSHG', field='closePrice', beginDate="20181103", endDate="20181130")
     return ret