Example #1
0
def get_scv_signals(**kwargs):

    ticker = kwargs['ticker']
    date_to = kwargs['date_to']

    con = msu.get_my_sql_connection(**kwargs)

    if 'futures_data_dictionary' in kwargs.keys():
        futures_data_dictionary = kwargs['futures_data_dictionary']
    else:
        futures_data_dictionary = {
            x: gfp.get_futures_price_preloaded(ticker_head=x)
            for x in [cmi.get_contract_specs(ticker)['ticker_head']]
        }

    aligned_indicators_output = ops.get_aligned_option_indicators(
        ticker_list=[ticker], settle_date=date_to, con=con)

    if not aligned_indicators_output['success']:
        return {
            'downside': np.NaN,
            'upside': np.NaN,
            'theta': np.NaN,
            'realized_vol_forecast': np.NaN,
            'real_vol20_current': np.NaN,
            'imp_vol': np.NaN,
            'imp_vol_premium': np.NaN,
            'q': np.NaN
        }

    hist = aligned_indicators_output['hist']
    current = aligned_indicators_output['current']

    vcs_output = vcs.generate_vcs_sheet_4date(date_to=date_to, con=con)

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

    clean_indx = hist['c1']['profit5'].notnull()
    clean_data = hist[clean_indx]

    if clean_data.empty:
        downside = np.NaN
        upside = np.NaN
    else:
        last_available_align_date = clean_data.index[-1]
        clean_data = clean_data[clean_data.index >= last_available_align_date -
                                dt.timedelta(5 * 365)]
        profit5 = clean_data['c1']['profit5']

        percentile_vector = stats.get_number_from_quantile(
            y=profit5.values,
            quantile_list=[1, 15, 85, 99],
            clean_num_obs=max(100, round(3 * len(profit5.values) / 4)))

        downside = (percentile_vector[0] + percentile_vector[1]) / 2
        upside = (percentile_vector[2] + percentile_vector[3]) / 2

    realized_vol_output = rvue.forecast_realized_vol_until_expiration(
        ticker=ticker,
        futures_data_dictionary=futures_data_dictionary,
        date_to=date_to)

    realized_vol_forecast = realized_vol_output['realized_vol_forecast']
    real_vol20_current = realized_vol_output['real_vol20_current']
    imp_vol = current['imp_vol'][0]

    imp_vol_premium = 100 * (imp_vol - realized_vol_forecast) / imp_vol

    q = np.NaN

    if vcs_output['success']:
        vcs_pairs = vcs_output['vcs_pairs']
        selected_pairs = vcs_pairs[vcs_pairs['ticker2'] == ticker]
        if not selected_pairs.empty:
            q = 100 - selected_pairs['Q'].mean()

    return {
        'downside': downside,
        'upside': upside,
        'theta': current['theta'][0],
        'realized_vol_forecast': realized_vol_forecast,
        'real_vol20_current': real_vol20_current,
        'imp_vol': imp_vol,
        'imp_vol_premium': imp_vol_premium,
        'q': q
    }
Example #2
0
def get_vcs_panel_plot(**kwargs):

    ticker_list = kwargs['ticker_list']

    if 'diagnostics_q' in kwargs.keys():
        diagnostics_q = kwargs['diagnostics_q']
    else:
        diagnostics_q = False

    #con = msu.get_my_sql_connection(**kwargs)

    option_indicator_output = ops.get_aligned_option_indicators(
        ticker_list=ticker_list, settle_date=kwargs['report_date'])
    hist = option_indicator_output['hist']

    new_index = list(range(len(hist.index)))
    contract_change_indx = (hist['c1']['ticker_year'] -
                            hist['c1']['ticker_year'].shift(1) != 0).values
    front_contract_year = hist['c1']['ticker_year'].astype('int') % 10

    contract_change_indx[0] = False

    x_tick_locations = [x for x in new_index if contract_change_indx[x]]

    x_tick_values = [
        cmi.letter_month_string[int(hist['c1']['ticker_month'].values[x]) - 1]
        + str(front_contract_year.values[x]) for x in new_index
        if contract_change_indx[x]
    ]

    plt.figure(figsize=(16, 7))
    plt.plot(range(len(hist.index)),
             hist['c1']['imp_vol'] / hist['c2']['imp_vol'])
    plt.xticks(x_tick_locations, x_tick_values)
    plt.ylabel('atmVolRatio')
    plt.grid()
    plt.show()

    fwd_var = hist['c2']['cal_dte'] * (hist['c2']['imp_vol']**
                                       2) - hist['c1']['cal_dte'] * (
                                           hist['c1']['imp_vol']**2)
    fwd_vol_sq = fwd_var / (hist['c2']['cal_dte'] - hist['c1']['cal_dte'])
    fwd_vol_adj = np.sign(fwd_vol_sq) * ((abs(fwd_vol_sq)).apply(np.sqrt))
    hist['fwd_vol_adj'] = fwd_vol_adj

    plt.figure(figsize=(16, 7))
    plt.plot(range(len(hist.index)), hist['fwd_vol_adj'])
    plt.xticks(x_tick_locations, x_tick_values)
    plt.ylabel('Fwd Vol')
    plt.grid()
    plt.show()

    plt.figure(figsize=(16, 7))
    plt.plot(range(len(hist.index)),
             hist['c1']['close2close_vol20'] / hist['c2']['close2close_vol20'])
    plt.xticks(x_tick_locations, x_tick_values)
    plt.ylabel('realVolRatio')
    plt.grid()
    plt.show()

    plt.figure(figsize=(16, 7))
    plt.plot(range(len(hist.index)),
             hist['c1']['imp_vol'] / hist['c1']['close2close_vol20'])
    plt.xticks(x_tick_locations, x_tick_values)
    plt.ylabel('atmRealVolRatio')
    plt.grid()
    plt.show()

    if diagnostics_q:
        plt.figure(figsize=(16, 7))
        plt.plot(range(len(hist.index)), hist['c1']['ticker_year'])
        plt.xticks(x_tick_locations, x_tick_values)
        plt.ylabel('ticker_year')
        plt.grid()
        plt.show()

        plt.figure(figsize=(16, 7))
        plt.plot(range(len(hist.index)),
                 hist['c1']['tr_dte'] - hist['c2']['tr_dte'])
        plt.xticks(x_tick_locations, x_tick_values)
        plt.ylabel('tr dte diff')
        plt.grid()
        plt.show()

        plt.figure(figsize=(16, 7))
        plt.plot(range(len(hist.index)), hist['c1']['tr_dte'])
        plt.xticks(x_tick_locations, x_tick_values)
        plt.ylabel('tr dte')
        plt.grid()
        plt.show()

        plt.figure(figsize=(16, 7))
        plt.plot(range(len(hist.index)), hist['c1']['ticker_month'])
        plt.xticks(x_tick_locations, x_tick_values)
        plt.ylabel('ticker_month')
        plt.grid()
        plt.show()
def get_scv_signals(**kwargs):

    ticker = kwargs['ticker']
    date_to = kwargs['date_to']

    con = msu.get_my_sql_connection(**kwargs)

    if 'futures_data_dictionary' in kwargs.keys():
        futures_data_dictionary = kwargs['futures_data_dictionary']
    else:
        futures_data_dictionary = {x: gfp.get_futures_price_preloaded(ticker_head=x) for x in [cmi.get_contract_specs(ticker)['ticker_head']]}

    aligned_indicators_output = ops.get_aligned_option_indicators(ticker_list=[ticker],
                                                                  settle_date=date_to, con=con)

    if not aligned_indicators_output['success']:
        return {'downside': np.NaN, 'upside': np.NaN, 'theta': np.NaN,
                'realized_vol_forecast': np.NaN,
                'real_vol20_current': np.NaN,
                'imp_vol': np.NaN,
                'imp_vol_premium': np.NaN,
                'q': np.NaN}

    hist = aligned_indicators_output['hist']
    current = aligned_indicators_output['current']

    vcs_output = vcs.generate_vcs_sheet_4date(date_to=date_to,con=con)

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

    clean_indx = hist['c1']['profit5'].notnull()
    clean_data = hist[clean_indx]

    if clean_data.empty:
        downside = np.NaN
        upside = np.NaN
    else:
        last_available_align_date = clean_data.index[-1]
        clean_data = clean_data[clean_data.index >= last_available_align_date-dt.timedelta(5*365)]
        profit5 = clean_data['c1']['profit5']

        percentile_vector = stats.get_number_from_quantile(y=profit5.values,
                                                       quantile_list=[1, 15, 85, 99],
                                                       clean_num_obs=max(100, round(3*len(profit5.values)/4)))

        downside = (percentile_vector[0]+percentile_vector[1])/2
        upside = (percentile_vector[2]+percentile_vector[3])/2

    realized_vol_output = rvue.forecast_realized_vol_until_expiration(ticker=ticker,
                                                futures_data_dictionary=futures_data_dictionary,
                                                date_to=date_to)

    realized_vol_forecast = realized_vol_output['realized_vol_forecast']
    real_vol20_current = realized_vol_output['real_vol20_current']
    imp_vol = current['imp_vol'][0]

    imp_vol_premium = 100*(imp_vol-realized_vol_forecast)/imp_vol

    q = np.NaN

    if vcs_output['success']:
        vcs_pairs = vcs_output['vcs_pairs']
        selected_pairs = vcs_pairs[vcs_pairs['ticker2'] == ticker]
        if not selected_pairs.empty:
            q = 100-selected_pairs['Q'].mean()

    return {'downside': downside, 'upside': upside, 'theta': current['theta'][0],
            'realized_vol_forecast': realized_vol_forecast,
            'real_vol20_current': real_vol20_current,
            'imp_vol': imp_vol,
            'imp_vol_premium': imp_vol_premium,
            'q': q}
def get_vcs_panel_plot(**kwargs):

    ticker_list = kwargs['ticker_list']

    if 'diagnostics_q' in kwargs.keys():
        diagnostics_q = kwargs['diagnostics_q']
    else:
        diagnostics_q = False

    #con = msu.get_my_sql_connection(**kwargs)

    option_indicator_output = ops.get_aligned_option_indicators(ticker_list=ticker_list,settle_date=kwargs['report_date'])
    hist = option_indicator_output['hist']

    new_index = list(range(len(hist.index)))
    contract_change_indx = (hist['c1']['ticker_year']-hist['c1']['ticker_year'].shift(1) != 0).values
    front_contract_year = hist['c1']['ticker_year'].astype('int') % 10

    contract_change_indx[0] = False

    x_tick_locations = [x for x in new_index if contract_change_indx[x]]

    x_tick_values = [cmi.letter_month_string[int(hist['c1']['ticker_month'].values[x])-1]+
                     str(front_contract_year.values[x]) for x in new_index if contract_change_indx[x]]

    plt.figure(figsize=(16, 7))
    plt.plot(hist['c1']['imp_vol']/hist['c2']['imp_vol'])
    plt.xticks(x_tick_locations,x_tick_values)
    plt.ylabel('atmVolRatio')
    plt.grid()
    plt.show()

    fwd_var = hist['c2']['cal_dte']*(hist['c2']['imp_vol']**2)-hist['c1']['cal_dte']*(hist['c1']['imp_vol']**2)
    fwd_vol_sq = fwd_var/(hist['c2']['cal_dte']-hist['c1']['cal_dte'])
    fwd_vol_adj = np.sign(fwd_vol_sq)*((abs(fwd_vol_sq)).apply(np.sqrt))
    hist['fwd_vol_adj'] = fwd_vol_adj

    plt.figure(figsize=(16, 7))
    plt.plot(hist['fwd_vol_adj'])
    plt.xticks(x_tick_locations,x_tick_values)
    plt.ylabel('Fwd Vol')
    plt.grid()
    plt.show()

    plt.figure(figsize=(16, 7))
    plt.plot(hist['c1']['close2close_vol20']/hist['c2']['close2close_vol20'])
    plt.xticks(x_tick_locations,x_tick_values)
    plt.ylabel('realVolRatio')
    plt.grid()
    plt.show()

    plt.figure(figsize=(16, 7))
    plt.plot(hist['c1']['imp_vol']/hist['c1']['close2close_vol20'])
    plt.xticks(x_tick_locations,x_tick_values)
    plt.ylabel('atmRealVolRatio')
    plt.grid()
    plt.show()

    if diagnostics_q:
        plt.figure(figsize=(16, 7))
        plt.plot(hist['c1']['ticker_year'])
        plt.xticks(x_tick_locations,x_tick_values)
        plt.ylabel('ticker_year')
        plt.grid()
        plt.show()

        plt.figure(figsize=(16, 7))
        plt.plot(hist['c1']['tr_dte']-hist['c2']['tr_dte'])
        plt.xticks(x_tick_locations,x_tick_values)
        plt.ylabel('tr dte diff')
        plt.grid()
        plt.show()

        plt.figure(figsize=(16, 7))
        plt.plot(hist['c1']['tr_dte'])
        plt.xticks(x_tick_locations,x_tick_values)
        plt.ylabel('tr dte')
        plt.grid()
        plt.show()

        plt.figure(figsize=(16, 7))
        plt.plot(hist['c1']['ticker_month'])
        plt.xticks(x_tick_locations,x_tick_values)
        plt.ylabel('ticker_month')
        plt.grid()
        plt.show()