def mean_reversion_signal(data, hl, window): if 'mid_price' not in data.columns: add_mid_price(data) ema = pd.ewma(data['mid_price'], halflife=hl) std = pd.rolling_std(data['mid_price'], window=window, min_periods=0) data['mean_reversion_signal_{}_{}'.format(hl, window)] = (data['mid_price'] - ema) / std return ['mean_reversion_signal_{}_{}'.format(hl, window)]
def dema(data, window, do_raise=True): if 'mid_price' not in data.columns: add_mid_price(data) colname = 'dema_{}'.format(window) ma = pd.ewma(data['mid_price'], halflife=window) data[colname] = np.concatenate([[0], np.diff(ma)]) return [colname]
def dma(data, window, do_raise=True): if 'mid_price' not in data.columns: add_mid_price(data) colname = 'dma_{}'.format(window) ma = pd.rolling_mean(data['mid_price'], window=window, min_periods=0) data[colname] = np.concatenate([[0], np.diff(ma)]) return [colname]
def future_profit_std(data, window, do_raise=True): if 'mid_price' not in data.columns: add_mid_price(data) dprice = np.concatenate([[0], np.diff(data['mid_price'].values)]) data['profit_std_{}w+'.format(window)] = np.concatenate([ pd.rolling_std(dprice[::-1], window=window, min_periods=0)[:0:-1], [0] ]) return ['profit_std_{}w+'.format(window)]
def dema_diffs(data, windows, do_raise=True): names = [] if 'mid_price' not in data.columns: add_mid_price(data) for window in windows: ma = pd.ewma(data['mid_price'], halflife=window) data['dema_{}'.format(window)] = np.concatenate([[0], np.diff(ma)]) for w1 in windows: for w2 in windows: if w1 > w2: feat_name = 'dema_diff_{}-{}'.format(w1, w2) data[feat_name] = data['dema_{}'.format(w1)] - data['dema_{}'.format(w2)] names.append(feat_name) return names
def dma_diffs(data, windows, do_raise=True): names = [] if 'mid_price' not in data.columns: add_mid_price(data) for window in windows: ma = pd.rolling_mean(data['mid_price'], window=window, min_periods=0) data['dma_{}'.format(window)] = np.concatenate([[0], np.diff(ma)]) for w1 in windows: for w2 in windows: if w1 > w2: feat_name = 'dma_diff_{}-{}'.format(w1, w2) data[feat_name] = data['dma_{}'.format(w1)] - data['dma_{}'.format(w2)] names.append(feat_name) return names
def ema_diff(data, hl): if 'mid_price' not in data.columns: add_mid_price(data) ema = pd.ewma(data['mid_price'], halflife=hl) data['ema_diff_{}'.format(hl)] = data['mid_price'] - ema return ['ema_diff_{}'.format(hl)]