# Import Price Table as Pandas DataFrame from Pickle File for S&P500 + Discretionary Symbols price_table = pickle.load(open('sp500_price_table.pkl', 'rb')).head(2000)[['AAPL', 'SPY']] daily_returns = price_table / price_table.shift(-1) - 1 model = sm.OLS(daily_returns['AAPL'], daily_returns['SPY'], missing='drop') results = model.fit() # Calculate Adjusted Returns stock = 'SPY' index = 'CL' lookback = 2000 rolling_window = 10 scrub_params = ScrubParams(.1, .0125, .8) beta_lookback = 2000 beta_object = Beta(stock, index, beta_lookback, scrub_params) beta = beta_object.beta beta = 0 adj_stock_line = StockLineBetaAdjusted(stock, lookback, beta, index) adjusted_returns = adj_stock_line.adjusted_returns adjusted_returns_scrubbed = adj_stock_line.adjusted_returns_scrubbed(.1) adjusted_returns_scrubbed_rolling = adjusted_returns_scrubbed[::-1].rolling( rolling_window).sum() adjusted_returns_scrubbed_rolling = adjusted_returns_scrubbed[::-1].rolling( 1).sum() print(adjusted_returns_scrubbed[::-1].head()) print(adjusted_returns_scrubbed_rolling.head()) # Calculate n-Day Rolling HVs. rolling_HVs = adjusted_returns_scrubbed.iloc[::-1].rolling( window=rolling_window).std() * math.sqrt(252) #print(rolling_HVs[::-1].head(500))
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