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

2024-05-14 01:04:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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()

Tags: thefromimportselfdeffeed策略prices
2条回答

你可以用这个例子来指导多种工具的交易:http://gbeced.github.io/pyalgotrade/docs/v0.18/html/sample_statarb_erniechan.html

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()

相关问题 更多 >