Exemplo n.º 1
0
def cal_greeks_4option_maturity(**kwargs):

    option_prices = gop.get_options_price_from_db(**kwargs)

    if option_prices.empty:
        return pd.DataFrame()

    option_prices = option_prices[option_prices['strike'] > 0]
    option_prices.reset_index(drop=True, inplace=True)

    contract_specs_out = cmi.get_contract_specs(kwargs['ticker'])
    exercise_type = cmi.get_option_exercise_type(**contract_specs_out)

    underlying_ticker = oput.get_option_underlying(**kwargs)

    futures_price_output = gfp.get_futures_price_preloaded(
        ticker=underlying_ticker, settle_date=kwargs['settle_date'])

    if futures_price_output.empty:
        return pd.DataFrame()

    underlying_price = futures_price_output['close_price'].iloc[0]

    expiration_datetime = exp.get_expiration_from_db(instrument='options',
                                                     **kwargs)
    expiration_date = int(expiration_datetime.strftime('%Y%m%d'))

    interest_rate = grfs.get_simple_rate(
        as_of_date=kwargs['settle_date'],
        date_to=expiration_date)['rate_output']

    option_greeks = [
        qom.get_option_greeks(underlying=underlying_price,
                              option_price=float(
                                  option_prices['close_price'].iloc[x]),
                              strike=float(option_prices['strike'].iloc[x]),
                              risk_free_rate=interest_rate,
                              expiration_date=expiration_date,
                              calculation_date=kwargs['settle_date'],
                              option_type=option_prices['option_type'].iloc[x],
                              exercise_type=exercise_type)
        for x in range(len(option_prices.index))
    ]

    greek_frame = pd.DataFrame(option_greeks)

    return pd.concat([
        greek_frame[['delta', 'gamma', 'implied_vol', 'theta', 'vega']],
        option_prices
    ],
                     axis=1)
Exemplo n.º 2
0
def cal_greeks_4option_maturity(**kwargs):

    option_prices = gop.get_options_price_from_db(**kwargs)

    if option_prices.empty:
        return pd.DataFrame()

    contract_specs_out = cmi.get_contract_specs(kwargs['ticker'])
    exercise_type = cmi.get_option_exercise_type(**contract_specs_out)

    underlying_ticker = oput.get_option_underlying(**kwargs)

    futures_price_output = gfp.get_futures_price_preloaded(ticker=underlying_ticker, settle_date=kwargs['settle_date'])

    if futures_price_output.empty:
        return pd.DataFrame()

    underlying_price = futures_price_output['close_price'].iloc[0]

    expiration_datetime = exp.get_expiration_from_db(instrument='options', **kwargs)
    expiration_date = int(expiration_datetime.strftime('%Y%m%d'))

    interest_rate = grfs.get_simple_rate(as_of_date=kwargs['settle_date'], date_to=expiration_date)['rate_output']
    #print(kwargs['settle_date'])
    #print(expiration_date)

    option_greeks = [qom.get_option_greeks(underlying=underlying_price,
                                           option_price=float(option_prices['close_price'].iloc[x]),
                                           strike=float(option_prices['strike'].iloc[x]),
                                           risk_free_rate=interest_rate,
                                           expiration_date=expiration_date,
                                           calculation_date=kwargs['settle_date'],
                                           option_type=option_prices['option_type'].iloc[x],
                                           exercise_type=exercise_type) for x in range(len(option_prices.index))]

    greek_frame = pd.DataFrame(option_greeks)

    return pd.concat([greek_frame[['delta', 'gamma', 'implied_vol', 'theta', 'vega']], option_prices], axis=1)
Exemplo n.º 3
0
def main():
    app = algo.Algo()
    report_date = exp.doubledate_shift_bus_days()
    todays_date = cu.get_doubledate()
    con = msu.get_my_sql_connection()
    vcs_output = vcs.generate_vcs_sheet_4date(date_to=report_date)
    vcs_pairs = vcs_output['vcs_pairs']

    filter_out = of.get_vcs_filters(data_frame_input=vcs_pairs,
                                    filter_list=['long2', 'short2'])
    vcs_pairs = filter_out['selected_frame']

    vcs_pairs = vcs_pairs[vcs_pairs['downside'].notnull()
                          & vcs_pairs['upside'].notnull()]
    # &(vcs_pairs.tickerClass!='Energy')
    vcs_pairs = vcs_pairs[(vcs_pairs['trDte1'] >= 50)
                          & (vcs_pairs.tickerClass != 'Metal') &
                          (vcs_pairs.tickerClass != 'FX') &
                          (vcs_pairs.tickerClass != 'Energy')]
    vcs_pairs = vcs_pairs[((vcs_pairs['Q'] <= 30) &
                           (vcs_pairs['fwdVolQ'] >= 30)) |
                          ((vcs_pairs['Q'] >= 70) &
                           (vcs_pairs['fwdVolQ'] <= 70))]
    vcs_pairs.reset_index(drop=True, inplace=True)

    vcs_pairs['underlying_ticker1'] = [
        omu.get_option_underlying(ticker=x) for x in vcs_pairs['ticker1']
    ]
    vcs_pairs['underlying_ticker2'] = [
        omu.get_option_underlying(ticker=x) for x in vcs_pairs['ticker2']
    ]

    vcs_pairs['underlying_tickerhead'] = [
        cmi.get_contract_specs(x)['ticker_head']
        for x in vcs_pairs['underlying_ticker1']
    ]
    futures_data_dictionary = {
        x: gfp.get_futures_price_preloaded(ticker_head=x)
        for x in vcs_pairs['underlying_tickerhead'].unique()
    }

    proxy_output_list1 = [
        up.get_underlying_proxy_ticker(
            ticker=x,
            settle_date=report_date,
            futures_data_dictionary=futures_data_dictionary)
        for x in vcs_pairs['underlying_ticker1']
    ]
    vcs_pairs['proxy_ticker1'] = [x['ticker'] for x in proxy_output_list1]
    vcs_pairs['add_2_proxy1'] = [x['add_2_proxy'] for x in proxy_output_list1]

    proxy_output_list2 = [
        up.get_underlying_proxy_ticker(
            ticker=x,
            settle_date=report_date,
            futures_data_dictionary=futures_data_dictionary)
        for x in vcs_pairs['underlying_ticker2']
    ]
    vcs_pairs['proxy_ticker2'] = [x['ticker'] for x in proxy_output_list2]
    vcs_pairs['add_2_proxy2'] = [x['add_2_proxy'] for x in proxy_output_list2]

    vcs_pairs['expiration_date1'] = [
        int(
            exp.get_expiration_from_db(instrument='options', ticker=x,
                                       con=con).strftime('%Y%m%d'))
        for x in vcs_pairs['ticker1']
    ]
    vcs_pairs['expiration_date2'] = [
        int(
            exp.get_expiration_from_db(instrument='options', ticker=x,
                                       con=con).strftime('%Y%m%d'))
        for x in vcs_pairs['ticker2']
    ]

    vcs_pairs['interest_date1'] = [
        grfs.get_simple_rate(as_of_date=report_date, date_to=x)['rate_output']
        for x in vcs_pairs['expiration_date1']
    ]
    vcs_pairs['interest_date2'] = [
        grfs.get_simple_rate(as_of_date=report_date, date_to=x)['rate_output']
        for x in vcs_pairs['expiration_date2']
    ]
    vcs_pairs['exercise_type'] = [
        cmi.get_option_exercise_type(ticker_head=x)
        for x in vcs_pairs['tickerHead']
    ]

    admin_dir = dna.get_directory_name(ext='admin')
    risk_file_out = su.read_text_file(file_name=admin_dir +
                                      '/RiskParameter.txt')
    vcs_risk_parameter = 5 * 2 * float(risk_file_out[0])

    vcs_pairs['long_quantity'] = vcs_risk_parameter / abs(
        vcs_pairs['downside'])
    vcs_pairs['short_quantity'] = vcs_risk_parameter / vcs_pairs['upside']
    vcs_pairs['long_quantity'] = vcs_pairs['long_quantity'].round()
    vcs_pairs['short_quantity'] = vcs_pairs['short_quantity'].round()

    vcs_pairs['alias'] = [
        generate_vcs_alias(vcs_row=vcs_pairs.iloc[x])
        for x in range(len(vcs_pairs.index))
    ]

    vcs_pairs['call_mid_price1'] = np.nan
    vcs_pairs['put_mid_price1'] = np.nan
    vcs_pairs['call_mid_price2'] = np.nan
    vcs_pairs['put_mid_price2'] = np.nan
    vcs_pairs['call_iv1'] = np.nan
    vcs_pairs['put_iv1'] = np.nan
    vcs_pairs['call_iv2'] = np.nan
    vcs_pairs['put_iv2'] = np.nan
    vcs_pairs['underlying_mid_price1'] = np.nan
    vcs_pairs['underlying_mid_price2'] = np.nan
    vcs_pairs['proxy_mid_price1'] = np.nan
    vcs_pairs['proxy_mid_price2'] = np.nan
    vcs_pairs['current_strike1'] = np.nan
    vcs_pairs['current_strike2'] = np.nan

    ta_folder = dn.get_dated_directory_extension(folder_date=todays_date,
                                                 ext='ta')

    app.vcs_pairs = vcs_pairs
    app.con = con
    app.futures_data_dictionary = futures_data_dictionary
    app.report_date = report_date
    app.todays_date = todays_date
    app.log = lg.get_logger(file_identifier='vcs', log_level='INFO')
    app.trade_file = ta_folder + '/trade_dir.csv'
    app.vcs_risk_parameter = vcs_risk_parameter
    app.connect(client_id=3)
    app.run()
def get_hedge_4strategy(**kwargs):

    con = msu.get_my_sql_connection(**kwargs)
    current_date = cu.get_doubledate()
    settle_price_date = exp.doubledate_shift_bus_days(double_date=current_date, shift_in_days=1)

    position_frame = tas.get_net_position_4strategy_alias(alias=kwargs['alias'],as_of_date=current_date,con=con)

    intraday_price_frame = gip.get_cme_direct_prices()
    intraday_price_frame.rename(columns={'ticker': 'underlying_ticker'},inplace=True)

    intraday_price_frame['ticker_head'] = [cmi.get_contract_specs(x)['ticker_head'] for x in intraday_price_frame['underlying_ticker']]
    intraday_price_frame['mid_price'] = (intraday_price_frame['bid_price'] + intraday_price_frame['ask_price'])/2

    intraday_price_frame['mid_price'] = [tfl.convert_trade_price_from_cme_direct(ticker_head=intraday_price_frame['ticker_head'].iloc[x],
                                        price=intraday_price_frame['mid_price'].iloc[x]) for x in range(len(intraday_price_frame.index))]

    options_frame = position_frame[position_frame['instrument'] == 'O']
    futures_frame = position_frame[position_frame['instrument'] == 'F']

    if options_frame.empty:
        futures_frame.rename(columns={'ticker': 'underlying_ticker', 'qty': 'underlying_delta'},inplace=True)
        futures_frame = futures_frame[['underlying_ticker', 'underlying_delta']]
        net_position = pd.merge(futures_frame, intraday_price_frame, how='left', on='underlying_ticker')
        net_position['hedge_price'] = net_position['mid_price']
        net_position['hedge'] = -net_position['underlying_delta']
        return net_position

    imp_vol_list = [gop.get_options_price_from_db(ticker=options_frame['ticker'].iloc[x],
                                  settle_date=settle_price_date,
                                  strike=options_frame['strike_price'].iloc[x],
                                  column_names=['imp_vol'],
                                  con=con)['imp_vol'] for x in range(len(options_frame.index))]

    options_frame['imp_vol'] = [imp_vol_list[x][1] if (np.isnan(imp_vol_list[x][0]) and len(imp_vol_list[x]) > 1) else imp_vol_list[x][0]
                                for x in range(len(options_frame.index))]

    options_frame['underlying_ticker'] = [omu.get_option_underlying(ticker=x) for x in options_frame['ticker']]

    options_frame = pd.merge(options_frame, intraday_price_frame, how='left', on='underlying_ticker')

    options_frame['ticker_head'] = [cmi.get_contract_specs(x)['ticker_head'] for x in options_frame['ticker']]
    options_frame['exercise_type'] = [cmi.get_option_exercise_type(ticker_head=x) for x in options_frame['ticker_head']]
    options_frame['strike_price'] = options_frame['strike_price'].astype('float64')

    options_frame['delta'] = [omu.option_model_wrapper(ticker=options_frame['ticker'].iloc[x],
                             calculation_date=current_date,
                             interest_rate_date=settle_price_date,
                             underlying=options_frame['mid_price'].iloc[x],
                             strike=options_frame['strike_price'].iloc[x],
                             implied_vol=options_frame['imp_vol'].iloc[x],
                             option_type=options_frame['option_type'].iloc[x],
                             exercise_type=options_frame['exercise_type'].iloc[x],
                             con=con)['delta'] for x in range(len(options_frame.index))]

    options_frame['total_delta'] = options_frame['qty']*options_frame['delta']

    grouped = options_frame.groupby('underlying_ticker')

    net_position = pd.DataFrame()

    net_position['underlying_ticker'] = (grouped['underlying_ticker'].first()).values
    net_position['hedge_price'] = (grouped['mid_price'].first()).values
    net_position['option_delta'] = (grouped['total_delta'].sum()).values
    net_position['option_delta'] = net_position['option_delta'].round(2)

    if futures_frame.empty:
        net_position['total_delta'] = net_position['option_delta']
    else:
        futures_frame.rename(columns={'ticker': 'underlying_ticker', 'qty': 'underlying_delta'},inplace=True)
        futures_frame = futures_frame[['underlying_ticker', 'underlying_delta']]

        isinOptions = futures_frame['underlying_ticker'].isin(net_position['underlying_ticker'])
        futures_frame_w_options = futures_frame[isinOptions]
        futures_frame_wo_options = futures_frame[~isinOptions]

        if futures_frame_w_options.empty:
            net_position['underlying_delta'] = 0
            net_position['total_delta'] = net_position['option_delta']
        else:
            net_position = pd.merge(net_position, futures_frame_w_options, how='outer', on='underlying_ticker')
            net_position['total_delta'] = net_position['option_delta']+net_position['underlying_delta']

        if not futures_frame_wo_options.empty:
            net_position_futures = pd.merge(futures_frame_wo_options, intraday_price_frame, how='left', on='underlying_ticker')
            net_position_futures['hedge_price'] = net_position_futures['mid_price']
            net_position_futures['option_delta'] = 0
            net_position_futures['total_delta'] = net_position_futures['underlying_delta']
            net_position = pd.concat([net_position,net_position_futures[['underlying_ticker','hedge_price','option_delta','underlying_delta','total_delta']]])

    net_position['hedge'] = -net_position['total_delta']

    if 'con' not in kwargs.keys():
        con.close()

    return net_position
def generate_test_cases_from_aligned_option_data(**kwargs):

    test_data_dir = dn.get_directory_name(ext='option_model_test_data')

    if os.path.isfile(test_data_dir + '/option_model_test_data.pkl'):
        data_frame_test = pd.read_pickle(test_data_dir + '/option_model_test_data.pkl')
        return data_frame_test

    ticker_head_list = cmi.cme_option_tickerhead_list
    tr_dte_center_list = [10, 15, 20, 25, 30, 35, 40, 45, 50,
                          60, 70, 80, 90, 100, 120, 140, 180,
                          200, 220, 240, 260, 280, 300, 330, 360, 390]

    delta_list = [0.1, 0.15, 0.25, 0.35, 0.5, -0.1, -0.15, -0.25, -0.35, -0.5]

    data_frame_list = []

    aligned_column_names = ['TickerYear','TickerMonth','settleDates','calDTE','rate2OptExp', 'theoValue' , 'impVol', 'atmVol', 'delta',
                            'strike', 'underlying', 'dollarVega', 'dollarTheta','gamma','dollarGamma', 'optionPnL', 'deltaPnL', 'gammaPnL', 'thetaPnL']

    #ticker_head_list = ticker_head_list[3:5]

    for i in range(len(ticker_head_list)):

        if ticker_head_list[i] in ['ED', 'E0', 'E2', 'E3', 'E4', 'E5']:
            model = 'OU'
        else:
            model = 'BS'

        ticker_class = cmi.ticker_class[ticker_head_list[i]]
        contract_multiplier = cmi.contract_multiplier[ticker_head_list[i]]

        if ticker_class in ['Livestock', 'Ag'] or ticker_head_list[i] == 'NG':
            month_specificQ = True
            contract_month_list = cmi.get_option_contract_months(ticker_head=ticker_head_list[i])

        else:
            month_specificQ = False

        for j in range(len(tr_dte_center_list)):
            for k in range(len(delta_list)):

                if month_specificQ:

                    for contract_month in contract_month_list:

                        data_frame = gop.load_aligend_options_data_file(ticker_head=ticker_head_list[i],
                                                    tr_dte_center=tr_dte_center_list[j],
                                                    delta_center=delta_list[k],
                                                    contract_month_letter=contract_month,
                                                    model=model)
                        if data_frame.empty:
                            continue
                        else:

                            x1 = round(len(data_frame.index)/4)
                            x2 = round(2*len(data_frame.index)/4)
                            x3 = round(3*len(data_frame.index)/4)

                            data_frame_select = data_frame[aligned_column_names].iloc[[-x3, -x2, -x1, -1]]
                            data_frame_select['tickerHead'] = ticker_head_list[i]
                            data_frame_select['contractMultiplier'] = contract_multiplier
                            data_frame_select['exercise_type'] = cmi.get_option_exercise_type(ticker_head=ticker_head_list[i])

                            data_frame_list.append(data_frame_select)

                else:
                    data_frame = gop.load_aligend_options_data_file(ticker_head=ticker_head_list[i],
                                                    tr_dte_center=tr_dte_center_list[j],
                                                    delta_center=delta_list[k],
                                                    model=model)
                    if data_frame.empty:
                        continue
                    else:

                        x1 = round(len(data_frame.index)/4)
                        x2 = round(2*len(data_frame.index)/4)
                        x3 = round(3*len(data_frame.index)/4)

                        data_frame_select = data_frame[aligned_column_names].iloc[[-x3, -x2, -x1, -1]]
                        data_frame_select['tickerHead'] = ticker_head_list[i]
                        data_frame_select['contractMultiplier'] = contract_multiplier
                        data_frame_select['exercise_type'] = cmi.get_option_exercise_type(ticker_head=ticker_head_list[i])
                        data_frame_list.append(data_frame_select)

    data_frame_test = pd.concat(data_frame_list)
    data_frame_test['optionPnL'] = data_frame_test['optionPnL']*data_frame_test['contractMultiplier']
    data_frame_test['deltaPnL'] = data_frame_test['deltaPnL']*data_frame_test['contractMultiplier']

    data_frame_test['ticker'] = [data_frame_test['tickerHead'].iloc[x] +
                                 cmi.letter_month_string[int(data_frame_test['TickerMonth'].iloc[x]-1)] +
                                 str(int(data_frame_test['TickerYear'].iloc[x]))
                                 for x in range(len(data_frame_test.index))]

    data_frame_test['option_type'] = 'C'
    data_frame_test['option_type'][data_frame_test['delta'] < 0] = 'P'

    data_frame_test.to_pickle(test_data_dir + '/option_model_test_data.pkl')
    return data_frame_test
Exemplo n.º 6
0
def get_hedge_4strategy(**kwargs):

    con = msu.get_my_sql_connection(**kwargs)
    current_date = cu.get_doubledate()
    settle_price_date = exp.doubledate_shift_bus_days(double_date=current_date,
                                                      shift_in_days=1)

    position_frame = tas.get_net_position_4strategy_alias(
        alias=kwargs['alias'], as_of_date=current_date, con=con)

    if 'intraday_price_frame' in kwargs.keys():
        intraday_price_frame = kwargs['intraday_price_frame']
    else:
        intraday_price_frame = gip.get_cme_direct_prices()
        intraday_price_frame.rename(columns={'ticker': 'underlying_ticker'},
                                    inplace=True)

        intraday_price_frame['ticker_head'] = [
            cmi.get_contract_specs(x)['ticker_head']
            for x in intraday_price_frame['underlying_ticker']
        ]
        intraday_price_frame['mid_price'] = (
            intraday_price_frame['bid_price'] +
            intraday_price_frame['ask_price']) / 2

        intraday_price_frame['mid_price'] = [
            tfl.convert_trade_price_from_cme_direct(
                ticker_head=intraday_price_frame['ticker_head'].iloc[x],
                price=intraday_price_frame['mid_price'].iloc[x])
            for x in range(len(intraday_price_frame.index))
        ]

    options_frame = position_frame[position_frame['instrument'] == 'O']
    futures_frame = position_frame[position_frame['instrument'] == 'F']

    if options_frame.empty:
        futures_frame.rename(columns={
            'ticker': 'underlying_ticker',
            'qty': 'underlying_delta'
        },
                             inplace=True)
        futures_frame = futures_frame[[
            'underlying_ticker', 'underlying_delta'
        ]]
        net_position = pd.merge(futures_frame,
                                intraday_price_frame,
                                how='left',
                                on='underlying_ticker')
        net_position['hedge_price'] = net_position['mid_price']
        net_position['hedge'] = -net_position['underlying_delta']
        return net_position

    imp_vol_list = [
        gop.get_options_price_from_db(
            ticker=options_frame['ticker'].iloc[x],
            settle_date=settle_price_date,
            strike=options_frame['strike_price'].iloc[x],
            column_names=['imp_vol'],
            con=con)['imp_vol'] for x in range(len(options_frame.index))
    ]

    options_frame['imp_vol'] = [
        imp_vol_list[x][1] if
        (np.isnan(imp_vol_list[x][0])
         and len(imp_vol_list[x]) > 1) else imp_vol_list[x][0]
        for x in range(len(options_frame.index))
    ]

    options_frame['underlying_ticker'] = [
        omu.get_option_underlying(ticker=x) for x in options_frame['ticker']
    ]
    #print(intraday_price_frame)

    options_frame = pd.merge(options_frame,
                             intraday_price_frame,
                             how='left',
                             on='underlying_ticker')

    options_frame['ticker_head'] = [
        cmi.get_contract_specs(x)['ticker_head']
        for x in options_frame['ticker']
    ]
    options_frame['exercise_type'] = [
        cmi.get_option_exercise_type(ticker_head=x)
        for x in options_frame['ticker_head']
    ]
    options_frame['strike_price'] = options_frame['strike_price'].astype(
        'float64')

    options_frame['delta'] = [
        omu.option_model_wrapper(
            ticker=options_frame['ticker'].iloc[x],
            calculation_date=current_date,
            interest_rate_date=settle_price_date,
            underlying=options_frame['mid_price'].iloc[x],
            strike=options_frame['strike_price'].iloc[x],
            implied_vol=options_frame['imp_vol'].iloc[x],
            option_type=options_frame['option_type'].iloc[x],
            exercise_type=options_frame['exercise_type'].iloc[x],
            con=con)['delta'] for x in range(len(options_frame.index))
    ]

    options_frame[
        'total_delta'] = options_frame['qty'] * options_frame['delta']

    grouped = options_frame.groupby('underlying_ticker')

    net_position = pd.DataFrame()

    net_position['underlying_ticker'] = (
        grouped['underlying_ticker'].first()).values
    net_position['hedge_price'] = (grouped['mid_price'].first()).values
    net_position['option_delta'] = (grouped['total_delta'].sum()).values
    net_position['option_delta'] = net_position['option_delta'].round(2)

    if futures_frame.empty:
        net_position['total_delta'] = net_position['option_delta']
    else:
        futures_frame.rename(columns={
            'ticker': 'underlying_ticker',
            'qty': 'underlying_delta'
        },
                             inplace=True)
        futures_frame = futures_frame[[
            'underlying_ticker', 'underlying_delta'
        ]]

        isinOptions = futures_frame['underlying_ticker'].isin(
            net_position['underlying_ticker'])
        futures_frame_w_options = futures_frame[isinOptions]
        futures_frame_wo_options = futures_frame[~isinOptions]

        if futures_frame_w_options.empty:
            net_position['underlying_delta'] = 0
            net_position['total_delta'] = net_position['option_delta']
        else:
            net_position = pd.merge(net_position,
                                    futures_frame_w_options,
                                    how='outer',
                                    on='underlying_ticker')
            net_position[['underlying_delta'
                          ]] = net_position[['underlying_delta'
                                             ]].fillna(value=0, inplace=False)
            net_position['total_delta'] = net_position[
                'option_delta'] + net_position['underlying_delta']

        if not futures_frame_wo_options.empty:
            net_position_futures = pd.merge(futures_frame_wo_options,
                                            intraday_price_frame,
                                            how='left',
                                            on='underlying_ticker')
            net_position_futures['hedge_price'] = net_position_futures[
                'mid_price']
            net_position_futures['option_delta'] = 0
            net_position_futures['total_delta'] = net_position_futures[
                'underlying_delta']
            net_position = pd.concat([
                net_position, net_position_futures[[
                    'underlying_ticker', 'hedge_price', 'option_delta',
                    'underlying_delta', 'total_delta'
                ]]
            ])

    net_position['hedge'] = -net_position['total_delta']

    if 'con' not in kwargs.keys():
        con.close()

    return net_position