如何在Pyalgotrade中使用多种工具创建复合策略?

时间:2016-12-07 00:32:55

标签: python yahoo-finance quantitative-finance ta-lib pyalgotrade

我使用 pyalgotrade 作为交易策略,我想在列表中使用多个代码。

现在设置它的方式,它为列表中的每个单独的自动收报机运行策略,但我希望它做的是将它们全部作为一个复合策略运行。

我该怎么做呢?

以下是代码:

    from pyalgotrade.tools     import yahoofinance
    from pyalgotrade           import strategy
    from pyalgotrade.barfeed   import yahoofeed
    from pyalgotrade.technical import stoch
    from pyalgotrade           import dataseries
    from pyalgotrade.technical import ma
    from pyalgotrade           import technical
    from pyalgotrade.technical import highlow
    from pyalgotrade           import talibext
    from pyalgotrade.talibext  import indicator
    import numpy as np
    import talib


    testlist = ['aapl', 'msft', 'z']

    class MyStrategy( strategy.BacktestingStrategy ):

        def __init__( self, feed, instrument ):
            strategy.BacktestingStrategy.__init__( self, feed )
            self.__position = []
            self.__instrument = instrument
            self.setUseAdjustedValues( True )
            self.__prices = feed[instrument].getPriceDataSeries()

            self.__stoch = stoch.StochasticOscillator( feed[instrument], 20, dSMAPeriod = 3, maxLen = 3 )

        def onBars( self, bars ):

            self.__PPO = talibext.indicator.PPO( self.__prices, len( self.__prices ), 12, 26, matype = 1 )

            try: slope = talib.LINEARREG_SLOPE( self.__PPO, 3 )[-1]
            except Exception: slope = np.nan


            bar = bars[self.__instrument]
            self.info( "%s,%s,%s" % ( bar.getClose(), self.__PPO[-1], slope ) )

            if self.__PPO[-1] is None:
                return

            for inst in self.__instrument:
                print inst
               #INSERT STRATEGY HERE

def run_strategy():
    # Load the yahoo feed from the CSV file
    instruments = ['aapl', 'msft', 'z']
    feed = yahoofinance.build_feed(instruments,2015,2016, ".")

    # Evaluate the strategy with the feed.
    myStrategy = MyStrategy(feed, instruments)
    myStrategy.run()
    print "Final portfolio value: $%.2f" % myStrategy.getBroker().getEquity()




run_strategy()

2 个答案:

答案 0 :(得分:0)

您可以将此示例用作交易多种工具的指南:http://gbeced.github.io/pyalgotrade/docs/v0.18/html/sample_statarb_erniechan.html

答案 1 :(得分:0)

feedpyalgotrade.feed.BaseFeed的实例。它包含一个或多个乐器' BarDataSeries定义了一系列价格。致电feed[instrument]时,您会收到此工具BarDataSeries。 您需要for loop来处理每个单独的工具。它将使您的代码干净,以添加专用的类来处理每个仪器。查看课程InstrumentManager。我修复了很多程序错误。

class InstrumentManager():
    def __init__(self, feed, instrument):
        self.instrument = instrument

        self.__prices = feed[instrument].getPriceDataSeries()

        self.__stoch = stoch.StochasticOscillator( feed[instrument], 20, dSMAPeriod = 3, maxLen = 3 )

        self.__signal = None

    def onBars(self, bars):
        bar = bars.getBar(self.instrument)
        if bar:
            self.__PPO = talibext.indicator.PPO( self.__prices, len( self.__prices ), 12, 26, matype = 1 )

            try: slope = talib.LINEARREG_SLOPE( self.__PPO, 3 )[-1]
            except Exception: slope = np.nan

            print( "%s,%s,%s" % ( bar.getClose(), self.__PPO[-1], slope ) )

            if self.__PPO[-1] is None:
                return

            # set signal in some conditions. eg self.__signal = 'buy'

    def signal():
        return self.__signal

class MyStrategy( strategy.BacktestingStrategy ):

    def __init__( self, feed, instruments ):
        strategy.BacktestingStrategy.__init__( self, feed )
        self.__position = []
        self.__feed = feed
        self.__instruments = instruments
        self.setUseAdjustedValues( True )
        self.instManagers = {}
        self.loadInstManagers()

    def loadInstManagers(self):
        for i in self.__instruments:
            im = InstrumentManager(self.__feed, i)

            self.instManagers[i] = im

    def updateInstManagers(self, bars):
        for im in self.instManagers.values():
            im.onBars(bars)

    def onBars( self, bars ):
        self.updateInstManagers(bars)

        for inst in self.__instruments:
            instManager = self.instManagers[inst]
            print inst

            # Do something by instManager.signal()
相关问题