使用Pyalgotrad导入yahoo条时出错

2024-06-16 15:35:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个问题,python在pyalgotrade的onBars函数中试图引用股票价格时抛出了一个KeyError。有趣的是,这取决于你想获得哪些股票。以下代码不工作并引发错误:

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模块下载它们。如果我注释掉以stocks=开头的行,并取消注释下面的一行以使用美国股票,这就完美地工作了。在

我的第一个想法是股票代码中的句号,但是如果你运行它,它会打印出酒吧.钥匙()这种情况一直在变化,这似乎是问题的原因。它最终在一个不存在的错误,但为什么每个酒吧的内容改变我不明白。在

有人能解释或帮助解决这种现象吗?我非常喜欢Pyalgotrade,并且一直在寻找Zipline作为另一种选择,但它太慢了。在


Tags: fromimportselfdeffeedpositionax股票
1条回答
网友
1楼 · 发布于 2024-06-16 15:35:07

我认为问题是你假设每个日期(每次调用onbar)你都有所有工具的价格,但事实可能并非如此。 尝试打印日期时间(bars.getDateTime())然后看一看那台仪器的价格文件。在

相关问题 更多 >