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)
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
    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)
Exemplo n.º 5
0
    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)
Exemplo n.º 7
0
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))