def adjusted_returns(self): index_prices = PriceTable.head(self.lookback)[self.index] index_returns = daily_returns(index_prices).to_frame() df = (1 + self.daily_returns[self.stock]) / ( 1 + index_returns[self.index] * self.beta) - 1 df.name = 'Adj. Returns' return df
def __init__(self, stock: 'str', lookback: 'int'): self.stock = stock self.lookback = lookback self.price_table = PriceTable.head(self.lookback)[[self.stock]] self.daily_returns = daily_returns(self.price_table).head( self.lookback)
def adjusted_returns(self): index_prices = PriceTable.head(self.lookback)[self.index] index_returns = daily_returns(index_prices).to_frame() adj_returns_df = (1 + self.daily_returns[self.stock]) / ( 1 + index_returns[self.index] * self.beta) - 1 adj_returns_df.name = self.adjusted_returns_df_column_name adj_returns_df = adj_returns_df.to_frame() return adj_returns_df
def __init__(self, stock: 'str', index: 'str', lookback: 'int', ScrubParams: 'obj'): self.stock = stock self.index = index self.lookback = lookback self.ScrubParams = ScrubParams self.price_table = PriceTable.head(self.lookback)[[self.stock, self.index]] self.daily_returns = daily_returns(self.price_table)
def __init__(self, stock: 'str', index: 'str', lookback: 'int', ScrubParams: 'obj'): self.stock = stock self.index = index self.lookback = lookback self.ScrubParams = ScrubParams #self.price_table = pickle.load(open('sp500_price_table.pkl', 'rb')).head(self.lookback)[[self.stock, self.index]] self.price_table = My_Data.PriceTable.head(self.lookback)[[self.stock, self.index]] #self.daily_returns = self.price_table / self.price_table.shift(-1) - 1 self.daily_returns = daily_returns(self.price_table)
def __init__(self, stock: 'str', lookback: 'int', base = None): self.stock = stock self.lookback = lookback if base is None: self.base = self.stock else: self.base = base self.price_table = PriceTable.head(self.lookback)[[self.stock]] self.daily_returns = daily_returns(self.price_table).head(self.lookback)
def __init__(self, stock: 'str', index: 'str', beta: 'float', to_graph: 'str', base: 'str', lookback: 'int'): self.stock = stock self.index = index self.beta = beta self.to_graph = to_graph self.base = base self.lookback = lookback self.price_table = PriceTable.head( self.lookback)[[self.stock, self.index]] self.daily_returns = daily_returns(self.price_table).head( self.lookback) self.daily_returns['adj_returns'] = (1 + self.daily_returns[ self.stock]) / (1 + self.daily_returns[self.index] * self.beta) - 1 print(self.daily_returns.head(5))
def alpha_df(df: 'df of prices', lookback): prices_df = df.head(lookback) #returns_df = daily_returns(prices_df).dropna(axis=0, how='any') returns_df = daily_returns(prices_df) #print(prices_df.isnull().values.ravel().sum()) stocks = df.columns.values.tolist() #for stock in stocks: # result = prices_df[prices_df[stock].isnull()].index.tolist() # print(stock, ": ", result, sep='') total_returns = [] HVs = [] alpha_ratios = [] adj_alpha_ratios = [] sample_sizes = [] for stock in stocks: prices_df_stock = prices_df[stock].dropna(axis=0, how='any').to_frame() #print(prices_df_stock.head(2)) daily_returns_df_stock = daily_returns(prices_df_stock).dropna( axis=0, how='any') # Calculate Adjusted Returns index = 'SPY' beta = Beta(stock, index, lookback, ScrubParams(.075, .0125, .8)).beta_value beta = 0 adj_stock_line = StockLineBetaAdjusted(stock, lookback, beta, index) prices_df_stock = adj_stock_line.prices_df daily_returns_df_stock = adj_stock_line.adjusted_returns #total_return = prices_df_stock.head(1).iloc[0] / prices_df_stock.tail(1).iloc[0] - 1 #print('HEREEE', total_move) #total_return = prices_df_stock.head(1).iloc[0, 0] / prices_df_stock.tail(1).iloc[0, 0] - 1 #total_returns.append(total_return) total_return = get_total_return(prices_df_stock) total_returns.append(total_return) #HV = daily_returns_df_stock.dropna(axis=0, how='any').std(ddof=0)*math.sqrt(252) #HVs.append(HV) HV = calc_HV(daily_returns_df_stock) HVs.append(HV) sample_size = daily_returns_df_stock.shape[0] sample_sizes.append(sample_size) alpha_ratio = total_return / HV alpha_ratios.append(alpha_ratio) adj_alpha_ratio = total_return * math.sqrt(252 / lookback) / HV adj_alpha_ratios.append(adj_alpha_ratio) alpha_df_info = { 'Stock': stocks, 'Total_Return': total_returns, 'HV': HVs, 'Alpha_Ratio': alpha_ratios, 'Adj_Alpha_Ratio': adj_alpha_ratios, 'Sample_Size': sample_sizes } alpha_df = pd.DataFrame(alpha_df_info) alpha_df = pd.DataFrame( list( zip(stocks, total_returns, HVs, alpha_ratios, adj_alpha_ratios, sample_sizes))).round(3) alpha_df.rename(index=str, columns={ 0: 'Stock', 1: 'Total_Return', 2: 'HV', 3: 'Alpha_Ratio', 4: 'Adj_Alpha_Ratio', 5: 'Sample_Size' }, inplace=True) alpha_df.set_index('Stock', inplace=True) return alpha_df
def alpha_df(df: 'df of prices', lookback): prices_df = df.head(lookback) #returns_df = daily_returns(prices_df).dropna(axis=0, how='any') returns_df = daily_returns(prices_df) #print(prices_df.isnull().values.ravel().sum()) stocks = df.columns.values.tolist() total_returns = [] HVs = [] alpha_ratios = [] adj_alpha_ratios = [] sample_sizes = [] betas = [] times = [] #correlations = [] #for stock in stocks: # result = prices_df[prices_df[stock].isnull()].index.tolist() # print(stock, ": ", result, sep='') for stock in stocks: prices_df_stock = prices_df[stock].dropna(axis=0, how='any').to_frame() daily_returns_df_stock = daily_returns(prices_df_stock).dropna( axis=0, how='any') # Calculate Adjusted Returns index = 'IBB' if stock == 'SPY': index = 'IWM' beta_object = Beta(stock, index, 500, ScrubParams(.075, .0125, .8)) beta = beta_object.beta_value #beta_value = 0 if stock == 'SPY': beta = 0 adj_stock_line = StockLineBetaAdjusted(stock, lookback, beta, index) prices_df_stock = adj_stock_line.prices_df daily_returns_df_stock = adj_stock_line.adjusted_returns num_observations = len(daily_returns_df_stock.values.tolist()) #total_return = prices_df_stock.head(1).iloc[0] / prices_df_stock.tail(1).iloc[0] - 1 #print('HEREEE', total_move) #total_return = get_total_return(prices_df_stock) total_return = adj_stock_line.total_return total_returns.append(total_return) HV = calc_HV(daily_returns_df_stock) HVs.append(HV) sample_size = get_sample_size(daily_returns_df_stock) sample_sizes.append(sample_size) alpha_ratio = total_return / HV alpha_ratios.append(alpha_ratio) # Should the Time Adjustment be sqrt(time)? adj_alpha_ratio = alpha_ratio * math.sqrt(252 / num_observations) adj_alpha_ratio = alpha_ratio * (252 / num_observations) std_dev_over_time_period = HV * math.sqrt(num_observations / 252) adj_alpha_ratio = total_return / std_dev_over_time_period adj_alpha_ratios.append(adj_alpha_ratio) betas.append(beta) #correlation = beta_object.corr #correlations.append(correlation) time = num_observations / 252 times.append(time) alpha_df_info = { 'Stock': stocks, 'Total_Return': total_returns, 'HV': HVs, 'Alpha_Ratio': alpha_ratios, 'Adj_Alpha_Ratio': adj_alpha_ratios, 'Sample_Size': sample_sizes, 'Beta': betas, #'Correlation': correlations, 'Time': times } alpha_df = pd.DataFrame(alpha_df_info).set_index('Stock').loc[:, [ 'Total_Return', 'HV', 'Alpha_Ratio', 'Adj_Alpha_Ratio', 'Sample_Size', 'Beta', 'Time' ]].round(3) return alpha_df
def get_daily_returns(stock, lookback): price_table = get_stock_prices(stock, lookback) return daily_returns(price_table)