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視爲另一種選擇,但速度太慢。
你是說特價股報價文件缺少特定日期嗎?這當然是可能的。我不確定pyalgotrade是如何處理這種情況的,所以需要找出驗證方法。 – kbcool
這正是我所說的。所以,而不是循環所有的儀器循環當前欄中可用的。 – Gabriel
好的謝謝。顯然,這是使用雅虎或Google財務數據的常見數據完整性問題之一,也是將資金花在清潔數據上的一個很好理由。 – kbcool