8

Я использую 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() 
+0

Я бы предложил вести с 'из импорта pyalgotrade *, потому что это кажется немного исчерпывающим для отдельных лиц, если в классе не существует переменного противоречия. – GreenHawk1220

+0

@ GreenHawk1220 Спасибо, сделаю! Любая идея, как это работает с несколькими инструментами? – RageAgainstheMachine

+0

Вам нужно найти способ объединить их все вместе. Я не знаком с библиотекой 'pyalgotrade', но я думаю, что проблема заключается в том, что вы выполняете каждый элемент в массиве по отдельности. Хотя я могу ошибаться. Я бы предложил найти способ комбинировать массив с тем, где вы все еще можете работать с ним, но я вполне мог ошибаться, потому что я действительно не знаком с 'pyalgotrade'. – GreenHawk1220

ответ

0

Вы можете использовать этот пример в качестве руководства для торговли на нескольких инструментах: http://gbeced.github.io/pyalgotrade/docs/v0.18/html/sample_statarb_erniechan.html

+0

Спасибо за комментарий, я изменил мой код выше, но я получаю сообщение об ошибке .__ prices line (TypeError: unhashable type: 'list'), любая идея, как это исправить? Благодарю. – RageAgainstheMachine

+0

Кроме того, мой список из 3 тикеров действительно будет 100+, на всякий случай, что имеет значение. – RageAgainstheMachine

0

feed является экземпляром pyalgotrade.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()