def test_trading_with_Machine_Learning(self): test_funcs = BacktestingTutorialWithML data = EURUSD.copy() close = data.Close.values sma10 = SMA(data.Close, 10) sma20 = SMA(data.Close, 20) sma50 = SMA(data.Close, 50) sma100 = SMA(data.Close, 100) upper, lower = test_funcs.BBANDS(data, 20, 2) # Design matrix / independent features: # Price-derived features data['X_SMA10'] = (close - sma10) / close data['X_SMA20'] = (close - sma20) / close data['X_SMA50'] = (close - sma50) / close data['X_SMA100'] = (close - sma100) / close data['X_DELTA_SMA10'] = (sma10 - sma20) / close data['X_DELTA_SMA20'] = (sma20 - sma50) / close data['X_DELTA_SMA50'] = (sma50 - sma100) / close # Indicator features data['X_MOM'] = data.Close.pct_change(periods=2) data['X_BB_upper'] = (upper - close) / close data['X_BB_lower'] = (lower - close) / close data['X_BB_width'] = (upper - lower) / close data['X_Sentiment'] = ~data.index.to_series().between( '2017-09-27', '2017-12-14') # Some datetime features for good measure data['X_day'] = data.index.dayofweek data['X_hour'] = data.index.hour data = data.dropna().astype(float) X, y = test_funcs.get_clean_Xy(data) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5, random_state=0) clf = KNeighborsClassifier( 7) # Model the output based on 7 "nearest" examples clf.fit(X_train, y_train) y_pred = clf.predict(X_test) _ = pd.DataFrame({ 'y_true': y_test, 'y_pred': y_pred }).plot(figsize=(15, 2), alpha=.7) print('Classification accuracy: ', np.mean(y_test == y_pred)) bt = Backtest(data, MLTrainOnceStrategy, commission=.0002, margin=.05) bt.run()
def resets_index(*args): return pd.Series(SMA(*args).values)
# In our example, we'll try to map several price-derived features and common technical indicators to the price point two days in the future. # We construct [model design matrix](https://en.wikipedia.org/wiki/Design_matrix) $X$ below: # + def BBANDS(data, n_lookback, n_std): """Bollinger bands indicator""" hlc3 = (data.High + data.Low + data.Close) / 3 mean, std = hlc3.rolling(n_lookback).mean(), hlc3.rolling(n_lookback).std() upper = mean + n_std * std lower = mean - n_std * std return upper, lower close = data.Close.values sma10 = SMA(data.Close, 10) sma20 = SMA(data.Close, 20) sma50 = SMA(data.Close, 50) sma100 = SMA(data.Close, 100) upper, lower = BBANDS(data, 20, 2) # Design matrix / independent features: # Price-derived features data['X_SMA10'] = (close - sma10) / close data['X_SMA20'] = (close - sma20) / close data['X_SMA50'] = (close - sma50) / close data['X_SMA100'] = (close - sma100) / close data['X_DELTA_SMA10'] = (sma10 - sma20) / close data['X_DELTA_SMA20'] = (sma20 - sma50) / close