# 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))
Example #2
0
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