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
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
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)
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)