Example #1
0
from data.finance import PriceTable
from utility.finance import get_total_return
print(PriceTable)

total_return = get_total_return('NBIX', lookback=252)
print('Total Return: ', total_return) 
def get_betas_over_iterable(stock,
                            index,
                            lookback=252,
                            stock_ceiling_params=DEFAULT_STOCK_CEILING_PARAMS,
                            index_floor_params=DEFAULT_INDEX_FLOOR_PARAMS,
                            best_fit_param=BEST_FIT_PERCENTILE,
                            save_to_file=False):

    stock_ceiling_params = [stock_ceiling_params]
    index_floor_params = [index_floor_params]
    best_fit_param = [best_fit_param]

    param_combos = list(
        itertools.product(stock, index, lookback, stock_ceiling_params,
                          index_floor_params, best_fit_param))

    counter = range(len(param_combos))

    stocks = [i[0] for i in param_combos]
    indices = [i[1] for i in param_combos]
    lookbacks = [i[2] for i in param_combos]
    #scrub_params_all = [get_scrub_params(stock, index, lookback, stock_ceiling_params, index_floor_params, best_fit_param) for params in param_combos]
    scrub_params_all = [get_scrub_params(*params) for params in param_combos]

    scrub_param_combos = list(zip(stocks, indices, lookbacks,
                                  scrub_params_all))

    betas = [
        Beta(stocks[i], indices[i], lookbacks[i], scrub_params_all[i])
        for i in counter
    ]

    # OLS Info
    beta_values = [beta.beta_value for beta in betas]
    corrs = [beta.corr for beta in betas]

    # Scrubbing Info
    stock_cutoffs = [
        scrub_params.stock_cutoff for scrub_params in scrub_params_all
    ]
    index_cutoffs = [
        scrub_params.index_cutoff for scrub_params in scrub_params_all
    ]
    percentile_cutoffs = [
        scrub_params.percentile_cutoff for scrub_params in scrub_params_all
    ]
    percent_days_in_calc = [beta.percent_days_in_calculation for beta in betas]

    # Beta to SPY Info
    index_betas_to_SPY = [get_ETF_beta_to_SPY(index) for index in indices]
    betas_to_SPY = [index_betas_to_SPY[i] * beta_values[i] for i in counter]

    # Returns Info
    stock_returns = [
        get_total_return(stocks[i], lookbacks[i]) for i in counter
    ]
    index_returns = [
        get_total_return(indices[i], lookbacks[i]) for i in counter
    ]
    idio_returns = [
        (1 + stock_returns[i]) / (1 + index_returns[i] * beta_values[i]) - 1
        for i in counter
    ]

    # Unadjusted OLS Info
    unadjusted_betas = [
        Beta(stocks[i], indices[i], lookbacks[i],
             ScrubParams(False, False, False)) for i in counter
    ]
    unadjusted_beta_values = [beta.beta_value for beta in unadjusted_betas]
    unadjusted_corrs = [beta.corr for beta in unadjusted_betas]

    # Prepare Information for the DataFrame in an Ordered Dictionary
    table_info_dict = OrderedDict([
        #Unadjusted OLS Info
        ('Unadj. Beta', unadjusted_beta_values),
        ('Unadj. Corr', unadjusted_corrs),

        # OLS Info
        ('Beta', beta_values),
        ('Corr', corrs),

        # Beta to SPY Info
        ('Index_Beta_to_SPY', index_betas_to_SPY),
        ('Beta_to_SPY', betas_to_SPY),

        # Returns Info
        ('Stock_Return', stock_returns),
        ('Index_Return', index_returns),
        ('Idio_return', idio_returns),

        # Scrubbing Info
        ('Stock_Cutoff', stock_cutoffs),
        ('Index_Cutoff', index_cutoffs),
        ('Percentile_Cutoff', percentile_cutoffs),
        ('Percent_Days', percent_days_in_calc)
    ])

    parameters = [stock, index, lookback]
    for parameter in parameters:
        if len(parameter) > 1:
            iterable = parameter
        else:
            pass

    if iterable == stock:
        not_iterable = index[0]
    elif iterable == index:
        not_iterable = stock[0]
    elif iterable == lookback:
        not_iterable = 'Stock: {}, Index {}'.format(stock[0], index[0])
    else:
        raise ValueError

    # Create DataFrame
    column_labels = table_info_dict.keys()
    table_info = list(zip(*table_info_dict.values()))

    #index_row = pd.Index(indices, name = 'Index')
    index_row = pd.Index(iterable, name='Index')
    iterables_columns = [[not_iterable], column_labels]
    #iterables_columns = [[stock], column_labels]
    index_column = pd.MultiIndex.from_product(iterables_columns,
                                              names=['Stock', 'Beta_Info'])
    df = pd.DataFrame(table_info, index=index_row, columns=index_column)

    if save_to_file:
        to_pickle_and_CSV(df, file_name)

    return df
def get_betas_multiple_indices(
        stock,
        indices: 'iterable of indices',
        lookback=252,
        stock_ceiling_params=DEFAULT_STOCK_CEILING_PARAMS,
        index_floor_params=DEFAULT_INDEX_FLOOR_PARAMS,
        best_fit_param=BEST_FIT_PERCENTILE,
        save_to_file=False):

    scrub_params_all = [
        get_scrub_params(stock, index, lookback, stock_ceiling_params,
                         index_floor_params, best_fit_param)
        for index in indices
    ]

    betas = [
        Beta(stock, indices[i], lookback, scrub_params_all[i])
        for i in range(len(indices))
    ]

    # OLS Info
    beta_values = [beta.beta_value for beta in betas]
    corrs = [beta.corr for beta in betas]

    # Scrubbing Info
    stock_cutoffs = [
        scrub_params.stock_cutoff for scrub_params in scrub_params_all
    ]
    index_cutoffs = [
        scrub_params.index_cutoff for scrub_params in scrub_params_all
    ]
    percentile_cutoffs = [
        scrub_params.percentile_cutoff for scrub_params in scrub_params_all
    ]
    percent_days_in_calc = [beta.percent_days_in_calculation for beta in betas]

    # Beta to SPY Info
    index_betas_to_SPY = [get_ETF_beta_to_SPY(index) for index in indices]
    betas_to_SPY = [
        index_betas_to_SPY[i] * beta_values[i] for i in range(len(indices))
    ]

    # Returns Info
    returns = [get_total_return(stock, lookback) for _ in indices]
    index_returns = [get_total_return(index, lookback) for index in indices]
    idio_returns = [
        (1 + returns[i]) / (1 + index_returns[i] * beta_values[i]) - 1
        for i in range(len(indices))
    ]

    # Unadjusted OLS Info
    unadjusted_betas = [
        Beta(stock, indices[i], lookback, ScrubParams(False, False, False))
        for i in range(len(indices))
    ]
    unadjusted_beta_values = [beta.beta_value for beta in unadjusted_betas]
    unadjusted_corrs = [beta.corr for beta in unadjusted_betas]

    # Prepare Information for the DataFrame in an Ordered Dictionary
    table_info_dict = OrderedDict([
        #Unadjusted OLS Info
        ('Unadj. Beta', unadjusted_beta_values),
        ('Unadj. Corr', unadjusted_corrs),

        # OLS Info
        ('Beta', beta_values),
        ('Corr', corrs),

        # Beta to SPY Info
        ('Index_Beta_to_SPY', index_betas_to_SPY),
        ('Beta_to_SPY', betas_to_SPY),

        # Returns Info
        ('Stock_Return', returns),
        ('Index_Return', index_returns),
        ('Idio_return', idio_returns),

        # Scrubbing Info
        ('Stock_Cutoff', stock_cutoffs),
        ('Index_Cutoff', index_cutoffs),
        ('Percentile_Cutoff', percentile_cutoffs),
        ('Percent_Days', percent_days_in_calc)
    ])
    # Create DataFrame
    column_labels = table_info_dict.keys()
    table_info = list(zip(*table_info_dict.values()))

    index_row = pd.Index(indices, name='Index')
    iterables_columns = [[stock], column_labels]
    index_column = pd.MultiIndex.from_product(iterables_columns,
                                              names=['Stock', 'Beta_Info'])
    df = pd.DataFrame(table_info, index=index_row, columns=index_column)

    if save_to_file:
        to_pickle_and_CSV(df, file_name)

    return df
def get_betas_multiple_stocks(
        stocks: 'iterable of stocks',
        index: 'one index',
        lookback=252,
        stock_ceiling_params=DEFAULT_STOCK_CEILING_PARAMS,
        index_floor_params=DEFAULT_INDEX_FLOOR_PARAMS,
        best_fit_param=BEST_FIT_PERCENTILE,
        save_to_file=False):

    scrub_params_all = [
        get_scrub_params(stock, index, lookback, stock_ceiling_params,
                         index_floor_params, best_fit_param)
        for stock in stocks
    ]

    #betas = [create_beta_object_from_scrub_params(stocks[i], index, lookback, scrub_params_all[i]) for i in range(len(stocks))]
    betas = [
        Beta(stocks[i], index, lookback, scrub_params_all[i])
        for i in range(len(stocks))
    ]
    beta_values = [beta.beta_value for beta in betas]

    # Returns Info
    returns = [get_total_return(stock, lookback) for stock in stocks]
    index_returns = [
        get_total_return(index, lookback) for _ in range(len(stocks))
    ]
    idio_returns = [
        (1 + returns[i]) / (1 + index_returns[i] * beta_values[i]) - 1
        for i in range(len(stocks))
    ]

    # Beta to SPY Info
    index_betas_to_SPY = [get_ETF_beta_to_SPY(stock) for stock in stocks]
    betas_to_SPY = [
        index_betas_to_SPY[i] * beta_values[i] for i in range(len(stocks))
    ]

    # Prepare Information for the DataFrame in an Ordered Dictionary
    info = OrderedDict([
        # Index Symbol
        ('Index', [index for _ in range(len(stocks))]),

        # OLS Info
        ('Beta', beta_values),
        ('Corr', [beta.corr for beta in betas]),

        # Beta to SPY Info
        ('Index_Beta_to_SPY', index_betas_to_SPY),
        ('Beta_to_SPY', betas_to_SPY),

        # Returns Info
        ('Stock_Return', returns),
        ('Index_Return', index_returns),
        ('Idio_Return', idio_returns),

        # Scrubbing Info
        ('Stock_Cutoff',
         [scrub_params.stock_cutoff for scrub_params in scrub_params_all]),
        ('Index_Cutoff',
         [scrub_params.index_cutoff for scrub_params in scrub_params_all]),
        ('Percentile_Cutoff',
         [scrub_params.percentile_cutoff
          for scrub_params in scrub_params_all]),
        ('Percent_Days', [beta.percent_days_in_calculation for beta in betas])
    ])

    # Create DataFrame
    column_labels = info.keys()
    table_info = list(zip(info.values()))

    index_row = pd.Index(stocks, name='Stock')
    #iterables_columns = [[index], column_labels]
    iterables_columns = [['Index'], column_labels]
    index_column = pd.MultiIndex.from_product(iterables_columns,
                                              names=['Index', 'Beta_Info'])
    df = pd.DataFrame(table_info, index=index_row, columns=index_column)

    if save_to_file:
        to_pickle_and_CSV(df, file_name)

    return df
Example #5
0
def get_betas_multiple_stocks(stocks,
                              index,
                              lookback,
                              sd_cutoff_params=sd_cutoff_params,
                              percentile_cutoff=.85,
                              to_file=False,
                              file_name='default'):

    # Log
    #logger.info(stocks, index, lookback)

    # Calculate ScrubParams
    scrub_params_all = [
        get_scrub_params_from_sd_cutoff_params(stock, index, lookback,
                                               sd_cutoff_params,
                                               percentile_cutoff)
        for stock in stocks
    ]

    # Establish Table Info
    betas = [
        Beta_StepTwo(stock, index, lookback, scrub_params)
        for stock, scrub_params in zip(stocks, scrub_params_all)
    ]
    beta_values = [beta.beta_value for beta in betas]
    corrs = [beta.corr for beta in betas]
    stock_cutoffs = [
        scrub_params.stock_cutoff for scrub_params in scrub_params_all
    ]
    index_cutoffs = [
        scrub_params.index_cutoff for scrub_params in scrub_params_all
    ]
    percentile_cutoffs = [percentile_cutoff for stock in range(len(stocks))]
    index_betas_to_SPY = [
        get_ETF_beta_to_SPY(index) for stock in range(len(stocks))
    ]
    betas_to_SPY = [
        get_ETF_beta_to_SPY(index) * beta_values[i] for i in range(len(stocks))
    ]
    returns = [get_total_return(stock, lookback) for stock in stocks]
    index_returns = [get_total_return(index, lookback) for stock in stocks]
    idio_returns = [
        (1 + returns[i]) / (1 + index_returns[i] * beta_values[i]) - 1
        for i in range(len(stocks))
    ]
    percent_days_in_calc = [beta.percent_days_in_calculation for beta in betas]
    # Create DataFrame
    table_info = list(
        zip(beta_values, corrs, stock_cutoffs, index_cutoffs,
            percentile_cutoffs, index_betas_to_SPY, betas_to_SPY, returns,
            index_returns, idio_returns, percent_days_in_calc))
    InfoLabels = [
        'Beta', 'Corr', 'Stock_Cutoff', 'Index_Cutoff', 'Percentile_Cutoff',
        'Index_Beta_to_SPY', 'Beta_to_SPY', 'Return', 'Index_Return',
        'Idio_Return', 'Percent_Days'
    ]
    index_row = pd.Index(stocks, name='Stock')
    iterables_columns = [[index], InfoLabels]
    index_column = pd.MultiIndex.from_product(iterables_columns,
                                              names=['Index', 'Beta_Info'])
    df = pd.DataFrame(table_info, index=index_row, columns=index_column)

    if to_file:
        to_pickle_and_CSV(df, file_name)

    return df