def test_close_position_equity(self): metadata = {1: {'symbol': 'TEST', 'asset_type': 'equity', 'end_date': self.days[3]}} self.algo = TestAlgorithm(sid=1, amount=1, order_count=1, instant_fill=True, commission=PerShare(0), asset_metadata=metadata) self.data = DataPanelSource(self.panel) # Check results expected_positions = [1, 1, 0] expected_pnl = [0, 1, 2] results = self.run_algo() self.check_algo_pnl(results, expected_pnl) self.check_algo_positions(results, expected_positions)
def setUp(self): days = TradingEnvironment().trading_days self.index = [days[0], days[1], days[2]] pan = pd.Panel({1: pd.DataFrame({ 'price': [1, 2, 4], 'volume': [1e9, 0, 0], 'type': [DATASOURCE_TYPE.TRADE, DATASOURCE_TYPE.TRADE, DATASOURCE_TYPE.CLOSE_POSITION]}, index=self.index) }) self.data = DataPanelSource(pan) self.algo = TestAlgorithm(sid=1, amount=1, order_count=1, instant_fill=True, commission=PerShare(0)) self.results = self.run_algo() self.expected_positions = [1, 1, 0] self.expected_pnl = [0, 1, 2]
def test_auto_close_future(self): metadata = {1: {'symbol': 'TEST', 'asset_type': 'future', 'notice_date': self.days[3], 'expiration_date': self.days[4]}} self.algo = TestAlgorithm(sid=1, amount=1, order_count=1, instant_fill=True, commission=PerShare(0), asset_metadata=metadata) self.data = DataPanelSource(self.no_close_panel) # Check results results = self.run_algo() expected_pnl = [0, 1, 2] self.check_algo_pnl(results, expected_pnl) expected_positions = [1, 1, 0] self.check_algo_positions(results, expected_positions)
class TestClosePosAlgo(TestCase): def setUp(self): days = TradingEnvironment().trading_days self.index = [days[0], days[1], days[2]] pan = pd.Panel({1: pd.DataFrame({ 'price': [1, 2, 4], 'volume': [1e9, 0, 0], 'type': [DATASOURCE_TYPE.TRADE, DATASOURCE_TYPE.TRADE, DATASOURCE_TYPE.CLOSE_POSITION]}, index=self.index) }) self.data = DataPanelSource(pan) self.algo = TestAlgorithm(sid=1, amount=1, order_count=1, instant_fill=True, commission=PerShare(0)) self.results = self.run_algo() self.expected_positions = [1, 1, 0] self.expected_pnl = [0, 1, 2] def run_algo(self): results = self.algo.run(self.data) return results def test_algo_pnl(self): for i, pnl in enumerate(self.results.pnl): self.assertEqual(pnl, self.expected_pnl[i]) def test_algo_positions(self): for i, amount in enumerate(self.results.positions): if amount: actual_position = amount[0]['amount'] else: actual_position = 0 self.assertEqual(actual_position, self.expected_positions[i]) def tearDown(self): pass self.algo = None trading.environment = None
def create_test_zipline(**config): """ :param config: A configuration object that is a dict with: - environment - a \ :py:class:`zipline.finance.trading.TradingEnvironment` - sid - an integer, which will be used as the security ID. - order_count - the number of orders the test algo will place, defaults to 100 - order_amount - the number of shares per order, defaults to 100 - trade_count - the number of trades to simulate, defaults to 101 to ensure all orders are processed. - algorithm - optional parameter providing an algorithm. defaults to :py:class:`zipline.test.algorithms.TestAlgorithm` - trade_source - optional parameter to specify trades, if present. If not present :py:class:`zipline.sources.SpecificEquityTrades` is the source, with daily frequency in trades. - slippage: optional parameter that configures the :py:class:`zipline.gens.tradingsimulation.TransactionSimulator`. Expects an object with a simulate mehod, such as :py:class:`zipline.gens.tradingsimulation.FixedSlippage`. :py:mod:`zipline.finance.trading` - transforms: optional parameter that provides a list of StatefulTransform objects. """ assert isinstance(config, dict) sid_list = config.get('sid_list') if not sid_list: sid = config.get('sid') sid_list = [sid] concurrent_trades = config.get('concurrent_trades', False) #-------------------- # Trading Environment #-------------------- if 'environment' in config: trading_environment = config['environment'] else: trading_environment = factory.create_trading_environment() if 'order_count' in config: order_count = config['order_count'] else: order_count = 100 if 'order_amount' in config: order_amount = config['order_amount'] else: order_amount = 100 if 'trade_count' in config: trade_count = config['trade_count'] else: # to ensure all orders are filled, we provide one more # trade than order trade_count = 101 #------------------- # Create the Algo #------------------- if 'algorithm' in config: test_algo = config['algorithm'] else: test_algo = TestAlgorithm( sid, order_amount, order_count ) #------------------- # Trade Source #------------------- if 'trade_source' in config: trade_source = config['trade_source'] else: trade_source = factory.create_daily_trade_source( sid_list, trade_count, trading_environment, concurrent=concurrent_trades ) test_algo.set_sources([trade_source]) #------------------- # Transforms #------------------- transforms = config.get('transforms', None) if transforms is not None: test_algo.set_transforms(transforms) #------------------- # Slippage # ------------------ slippage = config.get('slippage', None) if slippage is not None: test_algo.set_slippage(slippage) # ------------------ # generator/simulator sim = test_algo.get_generator(trading_environment) return sim
def create_test_zipline(**config): """ :param config: A configuration object that is a dict with: - sid - an integer, which will be used as the asset ID. - order_count - the number of orders the test algo will place, defaults to 100 - order_amount - the number of shares per order, defaults to 100 - trade_count - the number of trades to simulate, defaults to 101 to ensure all orders are processed. - algorithm - optional parameter providing an algorithm. defaults to :py:class:`zipline.test.algorithms.TestAlgorithm` - trade_source - optional parameter to specify trades, if present. If not present :py:class:`zipline.sources.SpecificEquityTrades` is the source, with daily frequency in trades. - slippage: optional parameter that configures the :py:class:`zipline.gens.tradingsimulation.TransactionSimulator`. Expects an object with a simulate mehod, such as :py:class:`zipline.gens.tradingsimulation.FixedSlippage`. :py:mod:`zipline.finance.trading` """ assert isinstance(config, dict) try: sid_list = config['sid_list'] except KeyError: try: sid_list = [config['sid']] except KeyError: raise Exception("simfactory create_test_zipline() requires " "argument 'sid_list' or 'sid'") concurrent_trades = config.get('concurrent_trades', False) if 'order_count' in config: order_count = config['order_count'] else: order_count = 100 if 'order_amount' in config: order_amount = config['order_amount'] else: order_amount = 100 # ------------------- # Create the Algo # ------------------- if 'algorithm' in config: test_algo = config['algorithm'] else: test_algo = TestAlgorithm(sid_list[0], order_amount, order_count, sim_params=config.get( 'sim_params', factory.create_simulation_parameters()), slippage=config.get('slippage'), identifiers=sid_list) # ------------------- # Trade Source # ------------------- if 'trade_source' in config: trade_source = config['trade_source'] else: trade_source = factory.create_daily_trade_source( sid_list, test_algo.sim_params, concurrent=concurrent_trades) if trade_source: test_algo.set_sources([trade_source]) # ------------------- # Benchmark source # ------------------- test_algo.benchmark_return_source = config.get('benchmark_source', None) # ------------------ # generator/simulator sim = test_algo.get_generator() return sim
def create_test_zipline(**config): """ :param config: A configuration object that is a dict with: - sid - an integer, which will be used as the asset ID. - order_count - the number of orders the test algo will place, defaults to 100 - order_amount - the number of shares per order, defaults to 100 - trade_count - the number of trades to simulate, defaults to 101 to ensure all orders are processed. - algorithm - optional parameter providing an algorithm. defaults to :py:class:`zipline.test.algorithms.TestAlgorithm` - trade_source - optional parameter to specify trades, if present. If not present :py:class:`zipline.sources.SpecificEquityTrades` is the source, with daily frequency in trades. - slippage: optional parameter that configures the :py:class:`zipline.gens.tradingsimulation.TransactionSimulator`. Expects an object with a simulate mehod, such as :py:class:`zipline.gens.tradingsimulation.FixedSlippage`. :py:mod:`zipline.finance.trading` """ assert isinstance(config, dict) try: sid_list = config['sid_list'] except KeyError: try: sid_list = [config['sid']] except KeyError: raise Exception("simfactory create_test_zipline() requires " "argument 'sid_list' or 'sid'") concurrent_trades = config.get('concurrent_trades', False) if 'order_count' in config: order_count = config['order_count'] else: order_count = 100 if 'order_amount' in config: order_amount = config['order_amount'] else: order_amount = 100 # ------------------- # Create the Algo # ------------------- if 'algorithm' in config: test_algo = config['algorithm'] else: test_algo = TestAlgorithm( sid_list[0], order_amount, order_count, sim_params=config.get('sim_params', factory.create_simulation_parameters()), slippage=config.get('slippage'), identifiers=sid_list ) # ------------------- # Trade Source # ------------------- if 'trade_source' in config: trade_source = config['trade_source'] else: trade_source = factory.create_daily_trade_source( sid_list, test_algo.sim_params, test_algo.trading_environment, concurrent=concurrent_trades, ) if trade_source: test_algo.set_sources([trade_source]) # ------------------- # Benchmark source # ------------------- test_algo.benchmark_return_source = config.get('benchmark_source', None) # ------------------ # generator/simulator sim = test_algo.get_generator() return sim
class TestClosePosAlgo(TestCase): def setUp(self): self.days = TradingEnvironment().trading_days self.index = [self.days[0], self.days[1], self.days[2]] self.panel = pd.Panel({ 1: pd.DataFrame( { 'price': [1, 2, 4], 'volume': [1e9, 0, 0], 'type': [ DATASOURCE_TYPE.TRADE, DATASOURCE_TYPE.TRADE, DATASOURCE_TYPE.CLOSE_POSITION ] }, index=self.index) }) def test_close_position_equity(self): metadata = { 1: { 'symbol': 'TEST', 'asset_type': 'equity', 'end_date': self.days[3] } } self.algo = TestAlgorithm(sid=1, amount=1, order_count=1, instant_fill=True, commission=PerShare(0), asset_metadata=metadata) self.data = DataPanelSource(self.panel) # Check results expected_positions = [1, 1, 0] expected_pnl = [0, 1, 2] results = self.run_algo() self.check_algo_pnl(results, expected_pnl) self.check_algo_positions(results, expected_positions) def test_close_position_future(self): metadata = { 1: { 'symbol': 'TEST', 'asset_type': 'future', 'notice_date': self.days[2], 'expiration_date': self.days[3] } } self.algo = TestAlgorithm(sid=1, amount=1, order_count=1, instant_fill=True, commission=PerShare(0), asset_metadata=metadata) self.data = DataPanelSource(self.panel) # Check results expected_positions = [1, 1, 0] expected_pnl = [0, 1, 2] results = self.run_algo() self.check_algo_pnl(results, expected_pnl) self.check_algo_positions(results, expected_positions) def run_algo(self): results = self.algo.run(self.data) return results def check_algo_pnl(self, results, expected_pnl): for i, pnl in enumerate(results.pnl): self.assertEqual(pnl, expected_pnl[i]) def check_algo_positions(self, results, expected_positions): for i, amount in enumerate(results.positions): if amount: actual_position = amount[0]['amount'] else: actual_position = 0 self.assertEqual(actual_position, expected_positions[i])
def create_test_zipline(**config): """ :param config: A configuration object that is a dict with: - sid - an integer, which will be used as the security ID. - order_count - the number of orders the test algo will place, defaults to 100 - order_amount - the number of shares per order, defaults to 100 - trade_count - the number of trades to simulate, defaults to 101 to ensure all orders are processed. - algorithm - optional parameter providing an algorithm. defaults to :py:class:`zipline.test.algorithms.TestAlgorithm` - trade_source - optional parameter to specify trades, if present. If not present :py:class:`zipline.sources.SpecificEquityTrades` is the source, with daily frequency in trades. - slippage: optional parameter that configures the :py:class:`zipline.gens.tradingsimulation.TransactionSimulator`. Expects an object with a simulate mehod, such as :py:class:`zipline.gens.tradingsimulation.FixedSlippage`. :py:mod:`zipline.finance.trading` - transforms: optional parameter that provides a list of StatefulTransform objects. """ assert isinstance(config, dict) sid_list = config.get('sid_list') if not sid_list: sid = config.get('sid') sid_list = [sid] concurrent_trades = config.get('concurrent_trades', False) if 'order_count' in config: order_count = config['order_count'] else: order_count = 100 if 'order_amount' in config: order_amount = config['order_amount'] else: order_amount = 100 if 'trade_count' in config: trade_count = config['trade_count'] else: # to ensure all orders are filled, we provide one more # trade than order trade_count = 101 #------------------- # Create the Algo #------------------- if 'algorithm' in config: test_algo = config['algorithm'] else: test_algo = TestAlgorithm(sid, order_amount, order_count, sim_params=config.get( 'sim_params', factory.create_simulation_parameters())) #------------------- # Trade Source #------------------- if 'trade_source' in config: trade_source = config['trade_source'] else: trade_source = factory.create_daily_trade_source( sid_list, trade_count, test_algo.sim_params, concurrent=concurrent_trades) if trade_source: test_algo.set_sources([trade_source]) #------------------- # Benchmark source #------------------- test_algo.benchmark_return_source = config.get('benchmark_source', None) #------------------- # Transforms #------------------- transforms = config.get('transforms', None) if transforms is not None: test_algo.set_transforms(transforms) #------------------- # Slippage # ------------------ slippage = config.get('slippage', None) if slippage is not None: test_algo.set_slippage(slippage) # ------------------ # generator/simulator sim = test_algo.get_generator() return sim
class TestClosePosAlgo(TestCase): def setUp(self): self.days = TradingEnvironment().trading_days self.index = [self.days[0], self.days[1], self.days[2]] self.panel = pd.Panel({1: pd.DataFrame({ 'price': [1, 2, 4], 'volume': [1e9, 0, 0], 'type': [DATASOURCE_TYPE.TRADE, DATASOURCE_TYPE.TRADE, DATASOURCE_TYPE.CLOSE_POSITION]}, index=self.index) }) def test_close_position_equity(self): metadata = {1: {'symbol': 'TEST', 'asset_type': 'equity', 'end_date': self.days[3]}} self.algo = TestAlgorithm(sid=1, amount=1, order_count=1, instant_fill=True, commission=PerShare(0), asset_metadata=metadata) self.data = DataPanelSource(self.panel) # Check results expected_positions = [1, 1, 0] expected_pnl = [0, 1, 2] results = self.run_algo() self.check_algo_pnl(results, expected_pnl) self.check_algo_positions(results, expected_positions) def test_close_position_future(self): metadata = {1: {'symbol': 'TEST', 'asset_type': 'future', 'notice_date': self.days[2], 'expiration_date': self.days[3]}} self.algo = TestAlgorithm(sid=1, amount=1, order_count=1, instant_fill=True, commission=PerShare(0), asset_metadata=metadata) self.data = DataPanelSource(self.panel) # Check results expected_positions = [1, 1, 0] expected_pnl = [0, 1, 2] results = self.run_algo() self.check_algo_pnl(results, expected_pnl) self.check_algo_positions(results, expected_positions) def run_algo(self): results = self.algo.run(self.data) return results def check_algo_pnl(self, results, expected_pnl): for i, pnl in enumerate(results.pnl): self.assertEqual(pnl, expected_pnl[i]) def check_algo_positions(self, results, expected_positions): for i, amount in enumerate(results.positions): if amount: actual_position = amount[0]['amount'] else: actual_position = 0 self.assertEqual(actual_position, expected_positions[i])
def create_test_zipline(**config): """ :param config: A configuration object that is a dict with: - sid - an integer, which will be used as the asset ID. - order_count - the number of orders the test algo will place, defaults to 100 - order_amount - the number of shares per order, defaults to 100 - trade_count - the number of trades to simulate, defaults to 101 to ensure all orders are processed. - algorithm - optional parameter providing an algorithm. defaults to :py:class:`zipline.test.algorithms.TestAlgorithm` - trade_source - optional parameter to specify trades, if present. If not present :py:class:`zipline.sources.SpecificEquityTrades` is the source, with daily frequency in trades. - slippage: optional parameter that configures the :py:class:`zipline.gens.tradingsimulation.TransactionSimulator`. Expects an object with a simulate mehod, such as :py:class:`zipline.gens.tradingsimulation.FixedSlippage`. :py:mod:`zipline.finance.trading` """ assert isinstance(config, dict) try: sid_list = config['sid_list'] except KeyError: try: sid_list = [config['sid']] except KeyError: raise Exception("simfactory create_test_zipline() requires " "argument 'sid_list' or 'sid'") concurrent_trades = config.get('concurrent_trades', False) order_count = config.get('order_count', 100) order_amount = config.get('order_amount', 100) # # 更改为A股交易日历 trading_calendar = config.get('trading_calendar', get_calendar()) # ------------------- # Create the Algo # ------------------- if 'algorithm' in config: test_algo = config['algorithm'] else: test_algo = TestAlgorithm(sid_list[0], order_amount, order_count, sim_params=config.get( 'sim_params', factory.create_simulation_parameters()), trading_calendar=trading_calendar, slippage=config.get('slippage'), identifiers=sid_list) # ------------------- # Trade Source # ------------------- if 'skip_data' not in config: if 'trade_source' in config: trade_source = config['trade_source'] else: trade_source = factory.create_daily_trade_source( sid_list, test_algo.sim_params, test_algo.trading_environment, trading_calendar, concurrent=concurrent_trades, ) trades_by_sid = {} for trade in trade_source: if trade.sid not in trades_by_sid: trades_by_sid[trade.sid] = [] trades_by_sid[trade.sid].append(trade) data_portal = create_data_portal_from_trade_history( config['env'].asset_finder, trading_calendar, config['tempdir'], config['sim_params'], trades_by_sid) test_algo.data_portal = data_portal # ------------------- # Benchmark source # ------------------- test_algo.benchmark_return_source = config.get('benchmark_source', None) # ------------------ # generator/simulator sim = test_algo.get_generator() return sim