예제 #1
0
    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)
예제 #2
0
    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]
예제 #3
0
    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)
예제 #4
0
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
예제 #5
0
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
예제 #6
0
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
예제 #7
0
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
예제 #8
0
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])
예제 #9
0
파일: simfactory.py 프로젝트: zixan/zipline
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
예제 #10
0
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])
예제 #11
0
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