2015-04-08 41 views
0

我遇到了一個問題,當python試圖引用pyalgotrade的onBars函數中的股票價格時拋出一個KeyError。有趣的是,這取決於你試圖訪問哪些股票。以下代碼不起作用並引發錯誤:KeyError導入雅虎酒吧與Pyalgotrade

from pyalgotrade import strategy 
from pyalgotrade.tools import yahoofinance 
from pyalgotrade.technical import ma 
from pyalgotrade.stratanalyzer import returns 
from pyalgotrade.stratanalyzer import sharpe 
from pyalgotrade.utils import stats 
from pyalgotrade.barfeed import yahoofeed 
import os 
import sys 

class MyStrategy(strategy.BacktestingStrategy): 
    def __init__(self, feed, instruments): 

     strategy.BacktestingStrategy.__init__(self, feed, 1000) 
     self.__position = {} 
     self.__instruments = instruments 
     self.__sma20 = {} 
     self.__sma200 = {} 

     for inst in instruments: 
      price = feed[inst].getCloseDataSeries() 
      self.__sma20[inst] = ma.SMA(price, 20) 
      self.__sma200[inst] = ma.SMA(price, 200) 

     # We'll use adjusted close values instead of regular close values. 
     self.setUseAdjustedValues(True) 

    def onEnterOk(self, position): 
     execInfo = position.getEntryOrder().getExecutionInfo() 
     self.info("BUY " + str(position.getEntryOrder().getInstrument()) +" at " +str((execInfo.getPrice()))) 

    def onEnterCanceled(self, position): 
     execInfo = position.getEntryOrder().getExecutionInfo() 
     self.info("onEnterCanceled " + str(position.getEntryOrder().getInstrument()) +" at " +str((execInfo.getPrice()))) 

    def onBars(self, bars): 
     #print bars['AAD'].getClose() 
     for key in bars.keys(): 
      print key 
     #sys.exit() 
     for inst in self.__instruments: 
      print inst 

      self.info(bars[inst].getClose()) 
      print self.__sma20[inst][-1] 
      if self.__sma20[inst][-1] > self.__sma200[inst][-1] : 
       print "go long" 


def run_strategy(): 
     # Load the yahoo feed from the CSV file 
     stocks = ["ABP.AX","AGL.AX","ALL.AX","ALQ.AX","AMC.AX","AMP.AX","ANN.AX","ANZ.AX","APA.AX","APN.AX"] 
     #stocks = ['AAPL', 'IBM', 'MSFT', 'DOW', 'AXP','BA','CSCO','CVX','DD','DIS','GE','GS','HD','INTC','JNJ'] 
     feed = yahoofinance.build_feed(stocks, 2003, 2014, "./DailyStockPrices") 

     # Evaluate the strategy with the feed. 
     myStrategy = MyStrategy(feed, stocks) 
     myStrategy.run() 
     print "Final portfolio value: $%.2f" % myStrategy.getBroker().getEquity() 

run_strategy() 

這些股票是澳大利亞股票,均爲有效。 yahoofeed模塊下載它們。如果我以股票開始評論這一行,並且取消註釋下面的行來使用美國股票,那麼它可以很好地工作。

我的第一個想法是股票代碼完全停止,但是如果你運行它,它會打印出bars.keys()的內容,並且這個問題不斷變化,這似乎是問題的原因。它最終會在一個不存在的錯誤上出現錯誤,但爲什麼每個欄上的內容改變都超出了我的想象。

任何人都可以解釋或幫助解決這個現象嗎?我非常喜歡Pyalgotrade,並一直將Zipline視爲另一種選擇,但速度太慢。

回答

0

我認爲問題在於,您認爲每個日期(在每次打電話給onBars時)都有所有工具的價格,而且情況可能並非如此。 嘗試打印日期時間(bars.getDateTime()),然後使用該儀器的價格查看該文件。

+0

你是說特價股報價文件缺少特定日期嗎?這當然是可能的。我不確定pyalgotrade是如何處理這種情況的,所以需要找出驗證方法。 – kbcool

+0

這正是我所說的。所以,而不是循環所有的儀器循環當前欄中可用的。 – Gabriel

+0

好的謝謝。顯然,這是使用雅虎或Google財務數據的常見數據完整性問題之一,也是將資金花在清潔數據上的一個很好理由。 – kbcool