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
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