def account_position_repair_job(server_name, alarm_num=5): server_model = server_constant.get_server_model(server_name) session_portfolio = server_model.get_db_session('portfolio') position_date, account_dict, real_position_list = query_real_position_data( session_portfolio) pf_position_date, pf_account_dict, pf_position_list = query_pf_position_data( session_portfolio) server_model.close() if not real_position_list and not pf_position_list: return compare_result_list = compare_position(real_position_list, pf_position_list) phone_trade_list = __build_phone_trades(server_name, compare_result_list, pf_account_dict, pf_position_list) # 低于alarm_num直接发送至服务器,否则保存至文件 if 0 < len(phone_trade_list) <= alarm_num: send_phone_trade(server_name, phone_trade_list) elif len(phone_trade_list) > alarm_num: server_save_path = os.path.join(PHONE_TRADE_FOLDER, server_name) if not os.path.exists(server_save_path): os.mkdir(server_save_path) phone_trade_file_path = '%s/position_repair_%s.csv' % ( server_save_path, date_utils.get_today_str('%Y%m%d')) save_phone_trade_file(phone_trade_file_path, phone_trade_list)
def abnormal_stock_repair_index(self): """ 策略异常股票仓位处理 """ self.__load_data_from_aggregator() # 处理Multifactor零股至default multifactor_phone_trades = self.__multifactor_stock_repair() self.__phone_trade_list.extend(multifactor_phone_trades) # 处理日内策略剩余股票 intraday_phone_trades = self.__intraday_strategy_repair() self.__phone_trade_list.extend(intraday_phone_trades) # 未超过设置的条目,直接发送phone_trade;超过了则保存文件,人工检查后再发送 need_check_flag = False if len(self.__phone_trade_list) <= self.__alarm_num: send_phone_trade(self.__server_name, self.__phone_trade_list) else: server_save_path = os.path.join(PHONE_TRADE_FOLDER, self.__server_name) if not os.path.exists(server_save_path): os.mkdir(server_save_path) phone_trade_file_path = '%s/abnormal_stock_repair_%s.csv' % ( server_save_path, self.__filter_date_str) save_phone_trade_file(phone_trade_file_path, self.__phone_trade_list) need_check_flag = True return need_check_flag
def send_by_file(file_path): phone_trade_list = [] with open(file_path, 'rb') as fr: for line in fr.readlines(): line_item = line.replace('\r\n', '').split(',') if len(line_item) != 11: continue phone_trade_info = PhoneTradeInfo() phone_trade_info.fund = line_item[0] if line_item[1] == 'manual.default': phone_trade_info.strategy1 = '' else: phone_trade_info.strategy1 = line_item[1] phone_trade_info.symbol = line_item[2] phone_trade_info.direction = direction_dict[line_item[3]] phone_trade_info.tradetype = trade_type_dict[line_item[4]] phone_trade_info.hedgeflag = hedge_flag_dict[line_item[5]] phone_trade_info.exprice = float(line_item[6]) phone_trade_info.exqty = int(line_item[7]) phone_trade_info.iotype = io_type_dict[line_item[8]] if line_item[9] == 'manual.default': phone_trade_info.strategy2 = '' else: phone_trade_info.strategy2 = line_item[9] phone_trade_info.server_name = line_item[10] phone_trade_list.append(phone_trade_info) send_phone_trade(server_name, phone_trade_list)
def __default_short_volume_repair(self): phone_trade_list = [] pf_position_df = pd.merge(self.pf_position_df, self.__pf_account_df, how='left', on=['Strategy_Name']) filter_position_df = pf_position_df[ (pf_position_df['Strategy_Name'].str.find( self.__default_strategy_key) >= 0) & (pf_position_df['Volume'] < 0)] if len(filter_position_df) == 0: return for index, row in filter_position_df.iterrows(): default_fund, default_symbol = row['Fund'], row['Symbol'] default_need_volume = calculation_target_volume(abs(row['Volume'])) symbol_position_df = pf_position_df[ (pf_position_df['Strategy_Name'].str.find( self.__multifactor_strategy_key) >= 0) & (pf_position_df['Fund'] == default_fund) & (pf_position_df['Symbol'] == default_symbol) & (pf_position_df['Volume'] > 0)] for sub_index, sub_row in symbol_position_df.iterrows(): if default_need_volume <= 0: break trade_volume = default_need_volume if int( sub_row['Volume']) > default_need_volume else int( sub_row['Volume']) phone_trade_info = PhoneTradeInfo() phone_trade_info.fund = sub_row['Fund'] phone_trade_info.strategy1 = '%s.%s' % (sub_row['Group_Name'], sub_row['Name']) phone_trade_info.symbol = sub_row['Symbol'] phone_trade_info.hedgeflag = Hedge_Flag_Type_Enums.Speculation phone_trade_info.tradetype = Trade_Type_Enums.Normal phone_trade_info.iotype = IO_Type_Enums.Inner2 phone_trade_info.strategy2 = '%s.%s' % ( sub_row['Default_Group_Name'], sub_row['Default_Name']) phone_trade_info.server_name = self.__server_name phone_trade_info.exprice = sub_row['Prev_Close'] phone_trade_info.direction = Direction_Enums.Sell phone_trade_info.exqty = trade_volume phone_trade_list.append(phone_trade_info) default_need_volume -= trade_volume if phone_trade_list: send_phone_trade(self.__server_name, phone_trade_list) self.__phone_trade_list.extend(phone_trade_list)
def __default_long_volume_repair(self): phone_trade_list = [] pf_position_df = pd.merge(self.pf_position_df, self.__pf_account_df, how='left', on=['Strategy_Name']) filter_position_df = pf_position_df[ (pf_position_df['Strategy_Name'].str.find( self.__default_strategy_key) >= 0) & (pf_position_df['Volume'] >= 100)] if len(filter_position_df) == 0: return for index, row in filter_position_df.iterrows(): default_fund, default_symbol = row['Fund'], row['Symbol'] symbol_position_df = pf_position_df[ (pf_position_df['Fund'] == default_fund) & (pf_position_df['Strategy_Name'].str.find( self.__multifactor_strategy_key) >= 0) & (pf_position_df['Symbol'] == default_symbol)] if symbol_position_df.empty: continue default_sell_volume = round_down(row['Volume']) for sub_index, sub_row in symbol_position_df.iterrows(): phone_trade_info = PhoneTradeInfo() phone_trade_info.fund = sub_row['Fund'] phone_trade_info.strategy1 = '%s.%s' % (sub_row['Group_Name'], sub_row['Name']) phone_trade_info.symbol = sub_row['Symbol'] phone_trade_info.hedgeflag = Hedge_Flag_Type_Enums.Speculation phone_trade_info.tradetype = Trade_Type_Enums.Normal phone_trade_info.iotype = IO_Type_Enums.Inner2 phone_trade_info.strategy2 = '%s.%s' % ( sub_row['Default_Group_Name'], sub_row['Default_Name']) phone_trade_info.server_name = self.__server_name phone_trade_info.exprice = sub_row['Prev_Close'] phone_trade_info.direction = Direction_Enums.Buy phone_trade_info.exqty = default_sell_volume phone_trade_list.append(phone_trade_info) break if phone_trade_list: send_phone_trade(self.__server_name, phone_trade_list) self.__phone_trade_list.extend(phone_trade_list)
def __main_contract_position_change(server_name, future_main_contract_db, pf_position_list): pre_main_symbol = future_main_contract_db.pre_main_symbol main_symbol = future_main_contract_db.main_symbol if future_main_contract_db.ticker_type in const.Index_Future_List: target_strategy_filter = 'SU-CalendarSpread' else: target_strategy_filter = 'Transfer-CalendarMA' pf_account_dict = dict() target_strategy_account_dict = dict() server_model = server_constant.get_server_model(server_name) session_portfolio = server_model.get_db_session('portfolio') query_pf_account = session_portfolio.query(PfAccount) for pf_account_db in query_pf_account: if target_strategy_filter in pf_account_db.fund_name: fund_name_items = pf_account_db.fund_name.split('-') if len(fund_name_items) >= 3: target_strategy_account_dict[ fund_name_items[2]] = pf_account_db continue elif 'PutCallParity' in pf_account_db.fund_name: continue elif 'MarketMaking1' in pf_account_db.fund_name: continue pf_account_dict[pf_account_db.fund_name] = pf_account_db phone_trade_list = [] for pf_position_item in pf_position_list: base_strategy_name, qty = pf_position_item if base_strategy_name not in pf_account_dict: continue pf_account_db = pf_account_dict[base_strategy_name] fund_name_items = pf_account_db.fund_name.split('-') if len(fund_name_items) < 3: custom_log.log_error_job('Error Fund_Name:%s' % pf_account_db.fund_name) continue fund = pf_account_db.fund_name.split('-')[2] transfer_account_db = target_strategy_account_dict[fund] close_phone_trade = PhoneTradeInfo() close_phone_trade.fund = fund close_phone_trade.strategy1 = '%s.%s' % (pf_account_db.group_name, pf_account_db.name) close_phone_trade.symbol = pre_main_symbol if qty == 0: continue elif qty > 0: close_phone_trade.direction = Direction_Enums.Sell close_phone_trade.exqty = qty else: close_phone_trade.direction = Direction_Enums.Buy close_phone_trade.exqty = abs(qty) close_phone_trade.tradetype = Trade_Type_Enums.Close close_phone_trade.hedgeflag = Hedge_Flag_Type_Enums.Speculation close_phone_trade.iotype = IO_Type_Enums.Inner2 close_phone_trade.server_name = server_name close_phone_trade.exprice = instrument_db_dict[pre_main_symbol].close close_phone_trade.strategy2 = '%s.%s' % ( transfer_account_db.group_name, transfer_account_db.name) phone_trade_list.append(close_phone_trade) open_phone_trade = PhoneTradeInfo() open_phone_trade.fund = fund open_phone_trade.strategy1 = '%s.%s' % (pf_account_db.group_name, pf_account_db.name) open_phone_trade.symbol = main_symbol if qty > 0: open_phone_trade.direction = Direction_Enums.Buy open_phone_trade.exqty = qty else: open_phone_trade.direction = Direction_Enums.Sell open_phone_trade.exqty = abs(qty) open_phone_trade.tradetype = Trade_Type_Enums.Open open_phone_trade.hedgeflag = Hedge_Flag_Type_Enums.Speculation open_phone_trade.iotype = IO_Type_Enums.Inner2 open_phone_trade.server_name = server_name open_phone_trade.exprice = instrument_db_dict[main_symbol].close open_phone_trade.strategy2 = '%s.%s' % (transfer_account_db.group_name, transfer_account_db.name) phone_trade_list.append(open_phone_trade) if len(phone_trade_list) > 0: send_phone_trade(server_name, phone_trade_list)
def phone_trade_by_change_file(server_name, base_folder, result_type=1): original_dateframe = [] for file_name in os.listdir(base_folder): if not file_name.endswith('.txt'): continue file_name_items = file_name.split('-') fund_name = file_name_items[2] with open(os.path.join(base_folder, file_name), 'rb') as fr: for line in fr.readlines(): line_item = line.replace('\r\n', '').split(',') if len(line_item) != 2: continue trade_ticker = line_item[0] item_volume = int(line_item[1]) original_dateframe.append( [fund_name, file_name, trade_ticker, item_volume]) change_trade_list = [] phone_trade_list = [] original_df = pd.DataFrame( original_dateframe, columns=['Fund', 'FileName', 'Ticker', 'Volume']) for group_key, group in original_df.groupby(['Fund', 'Ticker']): if len(group) >= 2: pf_trade_list = np.array( group[['Fund', 'FileName', 'Ticker', 'Volume']]).tolist() temp_change_trade_list, temp_phone_trade_list = build_phone_trade( pf_trade_list) change_trade_list.extend(temp_change_trade_list) phone_trade_list.extend(temp_phone_trade_list) # 无可自撮合的条目 if len(phone_trade_list) == 0: return instrument_dict = __get_prev_close_dict() for phone_trade_info in phone_trade_list: phone_trade_info.server_name = server_name instrument_db = instrument_dict[phone_trade_info.symbol] phone_trade_info.exprice = instrument_db.prev_close if result_type == 1: phone_trade_file_name = 'phone_trade.csv' phone_trade_file_path = '%s/%s' % (base_folder, phone_trade_file_name) save_phone_trade_file(phone_trade_file_path, phone_trade_list) elif result_type == 2: send_phone_trade(server_name, phone_trade_list) change_df = pd.DataFrame(change_trade_list, columns=['Fund', 'FileName', 'Ticker', 'Volume']) sum_change_list = [] for group_key, group in change_df.groupby(['Fund', 'FileName', 'Ticker']): vol_sum = group['Volume'].sum() temp = group.head(1) temp.loc[:, 'Volume'] = vol_sum sum_change_list.append(temp) change_df = pd.concat(sum_change_list) merge_df = pd.merge(original_df, change_df, on=['Fund', 'FileName', 'Ticker'], how='left').fillna(0) merge_df['Volume'] = merge_df['Volume_x'] + merge_df['Volume_y'] merge_result = merge_df[merge_df['Volume'] != 0] merge_list = np.array(merge_result[['FileName', 'Ticker', 'Volume']]).tolist() merge_dict = dict() for merge_info in merge_list: temp_message = '%s,%s' % (merge_info[1], int(merge_info[2])) if merge_info[0] in merge_dict: merge_dict[merge_info[0]].append(temp_message) else: merge_dict[merge_info[0]] = [temp_message] for (change_file_name, message_info_list) in merge_dict.items(): file_save_path = '%s/%s' % (base_folder, change_file_name) with open(file_save_path, 'w') as fr: fr.write('\n'.join(message_info_list))