def get_features(security_id=u"300634.XSHE", start_date='20191202', end_date='20191206', min_unit="1", tick=False,
                 bc='', win_len=20):
    df = DataAPI.TradeCalGet(exchangeCD=u"XSHG,XSHE", beginDate=start_date.replace('-', ''),
                             endDate=end_date.replace('-', ''), isOpen=u"1",
                             field=u"calendarDate", pandas="1")
    t_dates = list(set(df['calendarDate']))
    df_min = DataAPI.MktBarHistDateRangeGet(securityID=security_id, startDate=start_date.replace('-', ''),
                                            endDate=end_date.replace('-', ''),
                                            unit=min_unit, field=u"", pandas="1")
    df_bc_min = DataAPI.MktBarHistDateRangeGet(securityID=bc, startDate=start_date.replace('-', ''),
                                               endDate=end_date.replace('-', ''),
                                               unit=min_unit, field=u"", pandas="1")
    lst = []
    for date in t_dates:
        _df_min = df_min[df_min.dataDate == date]
        _df_bc_min = df_bc_min[df_bc_min.dataDate == date]
        _df = get_features_by_date(security_id=security_id, date=date, min_unit=min_unit, tick=tick, df_min=_df_min,
                                   df_bc_min=_df_bc_min, win_len=win_len)
        lst.append(_df)
    try:
        ret = pd.concat(lst, axis=0)
    except Exception as ex:
        logger.warn('concat the feautres for security id:{0} with error:{1}'.format(security_id, ex))
        ret = None
    return ret
Exemple #2
0
def get_features(security_id='', start_date='', end_date='', min_unit="5"):
    df = DataAPI.TradeCalGet(exchangeCD=u"XSHG,XSHE",
                             beginDate=start_date.replace('-', ''),
                             endDate=end_date.replace('-', ''),
                             isOpen=u"1",
                             field=u"calendarDate",
                             pandas="1")
    t_dates = list(df['calendarDate'])
    df_min = DataAPI.MktBarHistDateRangeGet(securityID=security_id,
                                            startDate=start_date.replace(
                                                '-', ''),
                                            endDate=end_date.replace('-', ''),
                                            unit=min_unit,
                                            field=u"",
                                            pandas="1")

    df_min['vwap'] = df_min['totalValue'] / df_min['totalVolume']
    # TODO normally it should be closePrice
    df_min['ret'] = df_min[['vwap'
                            ]].rolling(2).apply(lambda x: x[-1] / x[0] - 1)
    df_min['label'] = [
        1 if item >= 0.0 else 0 for item in (([0.0] + list(df_min['ret']))[1:])
    ]
    # df_min['dealPrice'] = (df_min['openPrice'] + df_min['vwap'])/2
    df_min['dealPrice'] = df_min['vwap']
    return df_min
Exemple #3
0
def get_transaction():
    df = DataAPI.MktBarHistDateRangeGet(securityID=u"002180.XSHE",
                                        startDate=u"20191205",
                                        endDate=u"20191231",
                                        unit="5",
                                        field=u"",
                                        pandas="1")
    df_agg = df.groupby('dataDate').agg({
        'totalVolume': ['max', 'min', '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['vol_diff'] = (df_agg['totalVolume_max'] - df_agg['totalVolume_min']
                          ) / df_agg['totalVolume_mean']
    df_agg.sort_values(by='vol_diff', ascending=False, inplace=True)
    print(df_agg)
Exemple #4
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)