10

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

2 回答 2

1

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

于 2016-12-09T05:12:55.933 回答
1

feed是 的实例pyalgotrade.feed.BaseFeedBarDataSeries它包含定义一系列价格的一个或多个工具。打电话时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()
于 2016-12-10T06:57:14.453 回答