Pyalgotrade - TA-LIB - 指标返回“NONE" [英] Pyalgotrade - TA-LIB - Indicator Returns "NONE"

查看:34
本文介绍了Pyalgotrade - TA-LIB - 指标返回“NONE"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在与 Pyalgotrade 合作以在 Python 中测试交易策略.Pyalgotrade 允许使用名为 TA-LIB 的库,这是一个技术分析库.出于某种原因,当我使用 PPO 指标时,它返回无".该指标接受几个参数:(http://gbeced.github.io/pyalgotrade/docs/v0.12/html/talib.html)

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)

我提供了输出的片段,目前只是当天的收盘价,以及该指标的输出.DDD"是我一直在测试的代码.

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?

输出:

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

这是我的代码:

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()

推荐答案

你传递的参数有误.这是 PPO 函数签名:

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

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

ds 类型为 BarDataSeriescount 指定要计算从尾部多长的数据.如果计算成功,它将返回一个 numpy 数组.

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.

而且 talibext 指标只计算一次,当有新柱线时,它不会计算新的结果.

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

因此您需要在每个 onBars 调用中计算 PPO.

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]))

这篇关于Pyalgotrade - TA-LIB - 指标返回“NONE"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆