def test_with_sma(self): sigma = 0.3 x0 = 100 dt = 1. / 252 dW = np.random.normal(0, math.sqrt(dt), TestCompareWithFunctionalBacktest.num_days) asset = [] asset.append(x0) for i in xrange(1, TestCompareWithFunctionalBacktest.num_days): xprev = asset[-1] x = xprev + xprev * 0.02 * dt + sigma * xprev * dW[i] asset.append(x) instrument = 0 lot_size = 10000 symbols=['SPY', 'VXX', 'XLV', 'XIV'] dict_df = {} self.df = self.get_df(asset=asset) for symbol in symbols: dict_df[symbol] = self.df config = BacktestingConfig(id = None, stg_id='sma', portfolio_id='test2', instrument_ids=[instrument], subscription_types=[BarSubscriptionType(bar_type=BarType.Time, bar_size=BarSize.D1)], from_date=TestCompareWithFunctionalBacktest.dates[0], to_date=TestCompareWithFunctionalBacktest.dates[-1], broker_id=Broker.Simulator, feed_id=Feed.PandasMemory, stg_configs={'qty': lot_size}, ref_data_mgr_type= None, persistence_config= None, provider_configs = PandasMemoryDataFeedConfig(dict_df=dict_df)) self.init_context(symbols=symbols, asset=asset, app_config=config) close = self.app_context.inst_data_mgr.get_series("Bar.%s.Time.86400" % instrument) close.start(self.app_context) strategy = SMAStrategy("sma", config.stg_configs) strategy.start(self.app_context) rets = strategy.get_portfolio().get_return() bt_result = strategy.get_portfolio().get_result() sma10 = talib.SMA(self.df.Close.values, 10) sma25 = talib.SMA(self.df.Close.values, 25) signal = pd.Series(1 * (sma10 > sma25), index=self.df.index) cash = [] stock_value = [] cash.append(TestCompareWithFunctionalBacktest.init_cash) stock_value.append(0) for i in xrange(1, signal.shape[0]): cash.append(cash[-1] - lot_size * (signal[i] - signal[i - 1]) * self.df['Close'][i]) stock_value.append(lot_size * signal[i] * self.df['Close'][i]) target_port = pd.DataFrame({"cash": cash, "stock_value": stock_value}) target_port["total_equity"] = target_port["cash"] + target_port["stock_value"] target_port["return"] = target_port["total_equity"].pct_change() try: np.testing.assert_almost_equal(target_port["return"].values[1:], rets.values, 5) except AssertionError as e: self.fail(e.message) finally: strategy.stop()
def test_with_sma(self): sigma = 0.3 x0 = 100 dt = 1. / 252 dW = np.random.normal(0, math.sqrt(dt), TestCompareWithFunctionalBacktest.num_days) asset = [] asset.append(x0) for i in range(1, TestCompareWithFunctionalBacktest.num_days): xprev = asset[-1] x = xprev + xprev * 0.02 * dt + sigma * xprev * dW[i] asset.append(x) instrument = 0 lot_size = 10000 symbols = ['SPY', 'VXX', 'XLV', 'XIV'] dict_df = {} self.df = self.get_df(asset=asset) for symbol in symbols: dict_df[symbol] = self.df config = Config({ "Application": { "type": "BackTesting", "clockId": "Simulation", "dataStoreId": "InMemory", "persistenceMode": "Disable", "createDBAtStart": True, "deleteDBAtStop": False, "feedId": "PandasMemory", "brokerId": "Simulator", "portfolioId": "test2", "stg": "down2%", "stgCls": "algotrader.strategy.down_2pct_strategy.Down2PctStrategy", "instrumentIds": ["0"], "subscriptionTypes": ["Bar.Yahoo.Time.D1"], "fromDate": TestCompareWithFunctionalBacktest.dates[0], "toDate": TestCompareWithFunctionalBacktest.dates[-1], "plot": False }, "DataStore": {"InMemory": { "file": "../data/algotrader_db.p", "instCSV": "../data/refdata/instrument.csv", "ccyCSV": "../data/refdata/ccy.csv", "exchCSV": "../data/refdata/exch.csv" } }, "Strategy": { "down2%": { "qty": lot_size } } }) self.init_context(symbols=symbols, asset=asset, config=config) feed = self.app_context.get_feed() feed.set_data_frame(dict_df) close = self.app_context.inst_data_mgr.get_series("Bar.%s.Time.86400" % instrument) close.start(self.app_context) strategy = SMAStrategy("sma") strategy.start(self.app_context) rets = strategy.get_portfolio().get_return() bt_result = strategy.get_portfolio().get_result() sma10 = talib.SMA(self.df.Close.values, 10) sma25 = talib.SMA(self.df.Close.values, 25) signal = pd.Series(1 * (sma10 > sma25), index=self.df.index) cash = [] stock_value = [] cash.append(TestCompareWithFunctionalBacktest.init_cash) stock_value.append(0) for i in range(1, signal.shape[0]): cash.append(cash[-1] - lot_size * (signal[i] - signal[i - 1]) * self.df['Close'][i]) stock_value.append(lot_size * signal[i] * self.df['Close'][i]) target_port = pd.DataFrame({"cash": cash, "stock_value": stock_value}) target_port["total_equity"] = target_port["cash"] + target_port["stock_value"] target_port["return"] = target_port["total_equity"].pct_change() try: np.testing.assert_almost_equal(target_port["return"].values[1:], rets.values, 5) except AssertionError as e: self.fail(e.message) finally: strategy.stop()
def test_with_sma(self): sigma = 0.3 x0 = 100 dt = 1. / 252 dW = np.random.normal(0, math.sqrt(dt), TestCompareWithFunctionalBacktest.num_days) asset = [] asset.append(x0) for i in xrange(1, TestCompareWithFunctionalBacktest.num_days): xprev = asset[-1] x = xprev + xprev * 0.02 * dt + sigma * xprev * dW[i] asset.append(x) instrument = 0 lot_size = 10000 symbols = ['SPY', 'VXX', 'XLV', 'XIV'] dict_df = {} self.df = self.get_df(asset=asset) for symbol in symbols: dict_df[symbol] = self.df config = BacktestingConfig( id=None, stg_id='sma', portfolio_id='test2', instrument_ids=[instrument], subscription_types=[ BarSubscriptionType(bar_type=BarType.Time, bar_size=BarSize.D1) ], from_date=TestCompareWithFunctionalBacktest.dates[0], to_date=TestCompareWithFunctionalBacktest.dates[-1], broker_id=Broker.Simulator, feed_id=Feed.PandasMemory, stg_configs={'qty': lot_size}, ref_data_mgr_type=None, persistence_config=None, provider_configs=PandasMemoryDataFeedConfig(dict_df=dict_df)) self.init_context(symbols=symbols, asset=asset, app_config=config) close = self.app_context.inst_data_mgr.get_series("Bar.%s.Time.86400" % instrument) close.start(self.app_context) strategy = SMAStrategy("sma", config.stg_configs) strategy.start(self.app_context) rets = strategy.get_portfolio().get_return() bt_result = strategy.get_portfolio().get_result() sma10 = talib.SMA(self.df.Close.values, 10) sma25 = talib.SMA(self.df.Close.values, 25) signal = pd.Series(1 * (sma10 > sma25), index=self.df.index) cash = [] stock_value = [] cash.append(TestCompareWithFunctionalBacktest.init_cash) stock_value.append(0) for i in xrange(1, signal.shape[0]): cash.append(cash[-1] - lot_size * (signal[i] - signal[i - 1]) * self.df['Close'][i]) stock_value.append(lot_size * signal[i] * self.df['Close'][i]) target_port = pd.DataFrame({"cash": cash, "stock_value": stock_value}) target_port[ "total_equity"] = target_port["cash"] + target_port["stock_value"] target_port["return"] = target_port["total_equity"].pct_change() try: np.testing.assert_almost_equal(target_port["return"].values[1:], rets.values, 5) except AssertionError as e: self.fail(e.message) finally: strategy.stop()