2016-08-27 7 views
2

こんにちは、10個のフィードを読み込み、10個のSMAを作成して毎日、 1つ(またはそれ以上)の機器で信号交差が発生したかどうかを確認します。PyAlgoTradeで複数の計測器を使用したバックテスト

私はこれに固執しています。また、プロッタはグラフを別々にプロットしていますが、私はすべての機器を1つのグラフにプロットします。

これは私のコードです:

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イベントが呼び出されると、実際には辞書のすべての楽器をループする必要があります。

関連する問題