2016-08-27 2 views
2

Привет, я хочу обобщить стратегию от 1 до 10 возможных инвестиций с помощью массива («инструменты»), чтобы упростить задачи загрузки 10 каналов, создав 10 SMA, а затем, каждый день, проверяя, произошло ли пересечение сигнала в одном (или более) инструментах.Backtesting с использованием нескольких инструментов в PyAlgoTrade

Я застрял в этом. Кроме того, плоттер рисует графики отдельно, но я хочу, чтобы все объекты отображались на одном графике.

Это мой код:

from pyalgotrade import strategy, plotter 
from pyalgotrade.barfeed import yahoofeed 
from pyalgotrade.technical import ma 
from pyalgotrade.tools import yahoofinance 

class MyStrategy(strategy.BacktestingStrategy): 
    def __init__(self, feed, instruments, smaPeriod): 
     strategy.BacktestingStrategy.__init__(self, feed, 1000) 
     self.__position = None 
     # We'll use adjusted close values instead of regular close values. 
     self.setUseAdjustedValues(True) 
     self.__sma = {} 
     self.__instruments = instruments 
     for instrument in instruments: 
      self.__sma[instrument] = ma.SMA(feed[instrument].getPriceDataSeries(), smaPeriod) 

    def onEnterOk(self, position): 
     execInfo = position.getEntryOrder().getExecutionInfo() 
     self.info("BUY at $%.2f" % (execInfo.getPrice())) 

    def onEnterCanceled(self, position): 
     execInfo = position.getEntryOrder().getExecutionInfo() 

    def onExitOk(self, position): 
     execInfo = position.getExitOrder().getExecutionInfo() 
     self.info("SELL at $%.2f" % (execInfo.getPrice())) 

    def onExitCanceled(self, position): 
     # If the exit was canceled, re-submit it. 
     self.__position[str(position.getEntryOrder().getInstrument())].exitMarket() 

    def onBars(self, bars): 
     # Wait for enough bars to be available to calculate a SMA. 
     if self.__sma[-1] is None: 
      return 

     bar = bars[self.__instrument] 
     # If a position was not opened, check if we should enter a long position. 
     if self.__position is None: 
      if bar.getPrice() > self.__sma[-1]: 
      # Enter a buy market order for 25 shares. The order is good till canceled. 
       self.__position = self.enterLong(self.__instrument, 25, True) 
     # Check if we have to exit the position. 
     elif bar.getPrice() < self.__sma[-1] and not self.__position.exitActive(): 
      self.__position.exitMarket() 

def run_strategy(smaPeriod): 

    # Load the yahoo feed from the CSV file 
    instruments = [ 
     "AMZN", 
     "ADBE", 
     "C" , 
     "BA" , 
     "HOG" , 
     "MMM" , 
     "MS" , 
     "MSFT" , 
     "CVS" , 
     "AXP" 
    ] 
    #Download and Load yahoo feed from CSV files 
    #Change year range 2000 to 2001 to your desired one 
    feed = yahoofinance.build_feed(instruments, 2000,2001, ".") 

    # Evaluate the strategy with the feed. 
    myStrategy = MyStrategy(feed, instruments, smaPeriod) 

    # Attach a plotter to the strategy 
    plt = plotter.StrategyPlotter(myStrategy) 


    # Run the strategy 
    myStrategy.run() 
    print "Final portfolio value: $%.2f" % myStrategy.getBroker().getEquity() 

    # Plot the strategy. 
    plt.plot() 


run_strategy(10) 
+0

Вам нужна петля в 'onBars', чтобы проверить сигнал прерывания и зафиксировать порядок для каждого инструмента. – gzc

+0

Может ли кто-нибудь привести пример? – RageAgainstheMachine

ответ

0

я только начал заниматься с pyalgotrade, но я думаю, что вы делаете довольно простую ошибку (как указано gzc): экземпляр класса Bars представляет собой набор баров из разных инструментов, которые имеют одну и ту же метку времени. Итак, когда вы вызываете свое событие onBars, вам действительно нужно перебирать все инструменты в словаре.

Смежные вопросы