Pyalgotrade - TA-LIB - Indicator Returns “NONE”

懵懂的女人 提交于 2019-12-08 13:04:18

问题


I'm working with Pyalgotrade to test a trading strategy in python. Pyalgotrade allows for the use of a library called TA-LIB,which is a technical analysis library. For some reason, when I use the PPO indicator it returns "None". The indicator takes in a few arguments:(http://gbeced.github.io/pyalgotrade/docs/v0.12/html/talib.html)

I provided a snippet of the output which for now is only the closing stock price of the day and what was supposed to be the output from this indicator. 'DDD' is the ticker I've been testing with.

I've been trying to get this to work for longer than I would like to admit. How can I fix this?

OUTPUT:

2016-11-08 00:00:00 strategy [INFO] 13.56,None
2016-11-09 00:00:00 strategy [INFO] 13.77,None
2016-11-10 00:00:00 strategy [INFO] 14.06,None
2016-11-11 00:00:00 strategy [INFO] 14.71,None
2016-11-14 00:00:00 strategy [INFO] 14.3,None
2016-11-15 00:00:00 strategy [INFO] 13.91,None

Here's my code:

from pyalgotrade import strategy
from pyalgotrade.tools import yahoofinance
from pyalgotrade import talibext
from pyalgotrade.talibext import indicator
import talib
import numpy

class MyStrategy(strategy.BacktestingStrategy):
    def __init__(self, feed, instrument):
        super(MyStrategy, self).__init__(feed, 1000)
        self.__position = None
        self.__instrument = instrument
        self.setUseAdjustedValues(True) 
        self.__prices = feed[instrument].getPriceDataSeries()

        self.__PPO = talibext.indicator.PPO(feed,0,12,26,9)

    def onEnterOk(self, position):
        execInfo = position.getEntryOrder().getExecutionInfo()
        self.info("BUY at $%.2f" % (execInfo.getPrice()))

    def onEnterCanceled(self, position):
        self.__position = None

    def onExitOk(self, position):
        execInfo = position.getExitOrder().getExecutionInfo()
        self.info("SELL at $%.2f" % (execInfo.getPrice()))
        self.__position = None

    def onExitCanceled(self, position):
        # If the exit was canceled, re-submit it.
        self.__position.exitMarket()

    def onBars(self, bars):

        bar = bars[self.__instrument]
        self.info("%s,%s" % (bar.getClose(),self.__PPO))

    def run_strategy(inst):
    # Load the yahoo feed from the CSV file

    feed = yahoofinance.build_feed([inst],2015,2016, ".")

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


def main():
    instruments = ['ddd']
    for inst in instruments:
            run_strategy(inst)


if __name__ == '__main__':
        main()

回答1:


The parameters you passed are wrong. This is PPO function signature:

def PPO(ds, count, fastperiod=-2**31, slowperiod=-2**31, matype=0):

ds type is BarDataSeries, count specify how long data from tail do you want to calculate. It will return a numpy array if calculation succeed.

And talibext indicators calculate only once, it won't calculate new result when new bar is fed.

So you need to calculate PPO in every onBars call.

def __init__(self, feed, instrument):
    ...

    self.__feed = feed

def onBars(self, bars):
    feed = self.__feed
    self.__PPO = talibext.indicator.PPO(feed[self.__instrument], len(feed[self.__instrument]),12,26, matype=0)
    bar = bars[self.__instrument]
    self.info("%s,%s" % (bar.getClose(),self.__PPO[-1]))


来源:https://stackoverflow.com/questions/40644122/pyalgotrade-ta-lib-indicator-returns-none

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!