def generate_futures_butterfly_formatted_output(**kwargs):

    if 'report_date' in kwargs.keys():
        report_date = kwargs['report_date']
    else:
        report_date = exp.doubledate_shift_bus_days()

    output_dir = ts.create_strategy_output_dir(
        strategy_class='futures_butterfly', report_date=report_date)

    butterfly_output = fb.generate_futures_butterfly_sheet_4date(
        date_to=report_date)
    butterflies = butterfly_output['butterflies']

    filter_out = ff.get_futures_butterfly_filters(
        data_frame_input=butterflies, filter_list=['long7', 'short7'])
    good_butterflies = filter_out['selected_frame']

    good_butterflies = good_butterflies[
        (good_butterflies['second_spread_weight_1'] <= 2.5)
        & (good_butterflies['second_spread_weight_1'] >= 0.4)]

    butterflies_w_selected_columns = butterflies[[
        'ticker1', 'ticker2', 'ticker3', 'tickerHead', 'trDte1', 'trDte2',
        'trDte3', 'Q', 'QF', 'z1', 'z2', 'z3', 'z4', 'theo_pnl', 'r1', 'r2',
        'bf_price', 'RC', 'seasonality', 'second_spread_weight_1', 'upside',
        'downside', 'recent_vol_ratio', 'recent_5day_pnl', 'bf_sell_limit',
        'bf_buy_limit'
    ]]

    good_butterflies_w_selected_columns = good_butterflies[[
        'ticker1', 'ticker2', 'ticker3', 'tickerHead', 'trDte1', 'trDte2',
        'trDte3', 'Q', 'QF', 'z1', 'z2', 'z3', 'z4', 'theo_pnl', 'r1', 'r2',
        'bf_price', 'RC', 'seasonality', 'second_spread_weight_1', 'upside',
        'downside', 'recent_vol_ratio', 'recent_5day_pnl', 'bf_sell_limit',
        'bf_buy_limit'
    ]]

    writer = pd.ExcelWriter(
        output_dir + '/' + futil.xls_file_names['futures_butterfly'] + '.xlsx',
        engine='xlsxwriter')

    butterflies_w_selected_columns.to_excel(writer, sheet_name='all')
    good_butterflies_w_selected_columns.to_excel(writer, sheet_name='good')

    worksheet_good = writer.sheets['good']
    worksheet_all = writer.sheets['all']

    worksheet_good.freeze_panes(1, 0)
    worksheet_all.freeze_panes(1, 0)

    worksheet_good.autofilter(0, 0,
                              len(good_butterflies_w_selected_columns.index),
                              len(good_butterflies_w_selected_columns.columns))

    worksheet_all.autofilter(0, 0, len(butterflies_w_selected_columns.index),
                             len(butterflies_w_selected_columns.columns))

    writer.save()
Example #2
0
def construct_futures_butterfly_portfolio(**kwargs):

    rule_no = kwargs['rule_no']
    backtest_output = kwargs['backtest_output']
    pnl_field = kwargs['pnl_field']

    if rule_no in [1, 3, 4, 5, 6, 7, 8, 9]:
        stop_loss = -100000000000
    elif rule_no == 2:
        stop_loss = -1000

    backtest_results_folder = dn.get_directory_name(ext='backtest_results')

    if os.path.isfile(backtest_results_folder +
                      '/futures_butterfly/portfolio' + str(rule_no) + '.pkl'):
        return pd.read_pickle(backtest_results_folder +
                              '/futures_butterfly/portfolio' + str(rule_no) +
                              '.pkl')
    elif not os.path.exists(backtest_results_folder + '/futures_butterfly'):
        os.makedirs(backtest_results_folder + '/futures_butterfly')

    date_list = kwargs['date_list']
    ticker_head_list = cmi.futures_butterfly_strategy_tickerhead_list

    total_pnl_frame = pd.DataFrame({'report_date': date_list})
    total_pnl_frame['portfolio'] = 0

    for i in range(len(ticker_head_list)):
        total_pnl_frame[ticker_head_list[i]] = 0

    for i in range(len(date_list)):
        pnl_tickerhead_frame = pd.DataFrame({'ticker_head': ticker_head_list})
        pnl_tickerhead_frame['buy_mean_pnl'] = 0
        pnl_tickerhead_frame['sell_mean_pnl'] = 0
        pnl_tickerhead_frame['total_pnl'] = 0
        daily_sheet = backtest_output[i]

        for j in range(len(ticker_head_list)):

            ticker_head_results = daily_sheet[daily_sheet['tickerHead'] ==
                                              ticker_head_list[j]]

            filter_output_long = sf.get_futures_butterfly_filters(
                data_frame_input=ticker_head_results,
                filter_list=['long' + str(rule_no)])
            filter_output_short = sf.get_futures_butterfly_filters(
                data_frame_input=ticker_head_results,
                filter_list=['short' + str(rule_no)])

            selected_short_trades = ticker_head_results[
                filter_output_short['selection_indx']
                & (np.isfinite(ticker_head_results[pnl_field]))]

            selected_long_trades = ticker_head_results[
                filter_output_long['selection_indx']
                & (np.isfinite(ticker_head_results[pnl_field]))]

            if len(selected_short_trades.index) > 0:
                selected_short_trades.loc[selected_short_trades['hold_pnl1short'] < stop_loss, pnl_field]= \
                    selected_short_trades.loc[selected_short_trades['hold_pnl1short'] < stop_loss, 'hold_pnl2short']

                pnl_tickerhead_frame['sell_mean_pnl'][
                    j] = selected_short_trades[pnl_field].mean()

            if len(selected_long_trades.index) > 0:

                selected_long_trades.loc[selected_long_trades['hold_pnl1long'] <stop_loss, pnl_field] = \
                    selected_long_trades.loc[selected_long_trades['hold_pnl1long'] <stop_loss, 'hold_pnl2long']

                pnl_tickerhead_frame['buy_mean_pnl'][j] = selected_long_trades[
                    pnl_field].mean()

            pnl_tickerhead_frame['total_pnl'][j] = pnl_tickerhead_frame[
                'buy_mean_pnl'][j] + pnl_tickerhead_frame['sell_mean_pnl'][j]
            total_pnl_frame[
                ticker_head_list[j]][i] = pnl_tickerhead_frame['total_pnl'][j]

        total_pnl_frame['portfolio'][i] = pnl_tickerhead_frame[
            'total_pnl'].sum()
    total_pnl_frame.to_pickle(backtest_results_folder +
                              '/futures_butterfly/portfolio' + str(rule_no) +
                              '.pkl')

    return total_pnl_frame
def construct_futures_butterfly_portfolio(**kwargs):

    rule_no = kwargs['rule_no']
    backtest_output = kwargs['backtest_output']
    pnl_field = kwargs['pnl_field']

    if rule_no in [1, 3, 4, 5, 6]:
        stop_loss = -100000000000
    elif rule_no == 2:
        stop_loss = -1000

    backtest_results_folder = dn.get_directory_name(ext='backtest_results')

    if os.path.isfile(backtest_results_folder + '/futures_butterfly/portfolio' + str(rule_no) + '.pkl'):
        return pd.read_pickle(backtest_results_folder + '/futures_butterfly/portfolio' + str(rule_no) + '.pkl')
    elif not os.path.exists(backtest_results_folder + '/futures_butterfly'):
        os.makedirs(backtest_results_folder + '/futures_butterfly')

    date_list = kwargs['date_list']
    ticker_head_list = cmi.futures_butterfly_strategy_tickerhead_list

    total_pnl_frame = pd.DataFrame({'report_date': date_list})
    total_pnl_frame['portfolio'] = 0

    for i in range(len(ticker_head_list)):
        total_pnl_frame[ticker_head_list[i]] = 0

    for i in range(len(date_list)):
        pnl_tickerhead_frame = pd.DataFrame({'ticker_head': ticker_head_list})
        pnl_tickerhead_frame['buy_mean_pnl'] = 0
        pnl_tickerhead_frame['sell_mean_pnl'] = 0
        pnl_tickerhead_frame['total_pnl'] = 0
        daily_sheet = backtest_output[i]

        for j in range(len(ticker_head_list)):

            ticker_head_results = daily_sheet[daily_sheet['tickerHead'] == ticker_head_list[j]]

            filter_output_long = sf.get_futures_butterfly_filters(data_frame_input=ticker_head_results, filter_list=['long'+str(rule_no)])
            filter_output_short = sf.get_futures_butterfly_filters(data_frame_input=ticker_head_results, filter_list=['short'+str(rule_no)])

            selected_short_trades = ticker_head_results[filter_output_short['selection_indx'] &
                                             (np.isfinite(ticker_head_results[pnl_field]))]

            selected_long_trades = ticker_head_results[filter_output_long['selection_indx'] &
                                           (np.isfinite(ticker_head_results[pnl_field]))]

            if len(selected_short_trades.index) > 0:
                selected_short_trades.loc[selected_short_trades['hold_pnl1short'] < stop_loss, pnl_field]= \
                    selected_short_trades.loc[selected_short_trades['hold_pnl1short'] < stop_loss, 'hold_pnl2short']

                pnl_tickerhead_frame['sell_mean_pnl'][j] = selected_short_trades[pnl_field].mean()

            if len(selected_long_trades.index) > 0:

                selected_long_trades.loc[selected_long_trades['hold_pnl1long'] <stop_loss, pnl_field] = \
                    selected_long_trades.loc[selected_long_trades['hold_pnl1long'] <stop_loss, 'hold_pnl2long']

                pnl_tickerhead_frame['buy_mean_pnl'][j] = selected_long_trades[pnl_field].mean()

            pnl_tickerhead_frame['total_pnl'][j] = pnl_tickerhead_frame['buy_mean_pnl'][j] + pnl_tickerhead_frame['sell_mean_pnl'][j]
            total_pnl_frame[ticker_head_list[j]][i] = pnl_tickerhead_frame['total_pnl'][j]

        total_pnl_frame['portfolio'][i] = pnl_tickerhead_frame['total_pnl'].sum()
    total_pnl_frame.to_pickle(backtest_results_folder + '/futures_butterfly/portfolio' + str(rule_no) + '.pkl')

    return total_pnl_frame
def generate_futures_butterfly_formatted_output(**kwargs):

    if "report_date" in kwargs.keys():
        report_date = kwargs["report_date"]
    else:
        report_date = exp.doubledate_shift_bus_days()

    output_dir = ts.create_strategy_output_dir(strategy_class="futures_butterfly", report_date=report_date)

    butterfly_output = fb.generate_futures_butterfly_sheet_4date(date_to=report_date)
    butterflies = butterfly_output["butterflies"]

    filter_out = ff.get_futures_butterfly_filters(data_frame_input=butterflies, filter_list=["long1", "short1"])
    good_butterflies = filter_out["selected_frame"]

    butterflies_w_selected_columns = butterflies[
        [
            "ticker1",
            "ticker2",
            "ticker3",
            "tickerHead",
            "trDte1",
            "trDte2",
            "trDte3",
            "Q",
            "QF",
            "z1",
            "z2",
            "z3",
            "z4",
            "theo_pnl",
            "r1",
            "r2",
            "bf_price",
            "RC",
            "seasonality",
            "second_spread_weight_1",
            "upside",
            "downside",
            "recent_vol_ratio",
            "recent_5day_pnl",
            "bf_sell_limit",
            "bf_buy_limit",
        ]
    ]

    good_butterflies_w_selected_columns = good_butterflies[
        [
            "ticker1",
            "ticker2",
            "ticker3",
            "tickerHead",
            "trDte1",
            "trDte2",
            "trDte3",
            "Q",
            "QF",
            "z1",
            "z2",
            "z3",
            "z4",
            "theo_pnl",
            "r1",
            "r2",
            "bf_price",
            "RC",
            "seasonality",
            "second_spread_weight_1",
            "upside",
            "downside",
            "recent_vol_ratio",
            "recent_5day_pnl",
            "bf_sell_limit",
            "bf_buy_limit",
        ]
    ]

    writer = pd.ExcelWriter(output_dir + "/" + futil.xls_file_names["futures_butterfly"] + ".xlsx", engine="xlsxwriter")

    butterflies_w_selected_columns.to_excel(writer, sheet_name="all")
    good_butterflies_w_selected_columns.to_excel(writer, sheet_name="good")

    worksheet_good = writer.sheets["good"]
    worksheet_all = writer.sheets["all"]

    worksheet_good.freeze_panes(1, 0)
    worksheet_all.freeze_panes(1, 0)

    worksheet_good.autofilter(
        0, 0, len(good_butterflies_w_selected_columns.index), len(good_butterflies_w_selected_columns.columns)
    )

    worksheet_all.autofilter(
        0, 0, len(butterflies_w_selected_columns.index), len(butterflies_w_selected_columns.columns)
    )