我遇到了一个问题,在pyalgotrade的KeyError函数中试图引用股票价格时,python正在抛出一个onBars。有趣的是,这取决于你想要访问哪些股票。以下代码无法工作,并引发错误:
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模块下载它们。如果我注释掉以stock=开头的行,并取消下面的注释来使用美国股票,它就会工作得很好。
我的第一个想法是在股票代码中完全停止,但是如果您运行它,它会打印出bars.keys()的内容,并且这种情况一直在改变,这似乎是问题的原因。它最终错误的一个不存在,但为什么内容变化在每个栏是我无法理解的。
有人能解释或帮助解决这一现象吗?我非常喜欢Pyalgotrade,并且一直把Zipline作为替代方案,但是它太慢了。
发布于 2015-04-09 00:52:24
我认为问题在于,您假设每个日期(每次打电话到onBars)都有所有工具的价格,但情况可能并非如此。尝试打印日期时间(bars.getDateTime()),然后查看该仪器的价格文件。
https://stackoverflow.com/questions/29505493
复制相似问题