TypeError в Python при использовании Pyalgotrade
Я пытался написать Осциллятор Stochcastic на python, используя функцию списка в библиотеке Pyalgotrade.
Мой код ниже:
from pyalgotrade.tools import yahoofinance
from pyalgotrade import strategy
from pyalgotrade.barfeed import yahoofeed
from pyalgotrade.technical import stoch
from pyalgotrade import dataseries
from pyalgotrade.technical import ma
from pyalgotrade import technical
from pyalgotrade.technical import highlow
from pyalgotrade import bar
from pyalgotrade.talibext import indicator
import numpy
import talib
class MyStrategy(strategy.BacktestingStrategy):
def __init__(self, feed, instrument):
strategy.BacktestingStrategy.__init__(self, feed)
self.__instrument = instrument
def onBars(self, bars):
barDs = self.getFeed().getDataSeries("002389.SZ")
self.__stoch = indicator.STOCH(barDs, 20, 3, 3)
bar = bars[self.__instrument]
self.info("%0.2f, %0.2f" % (bar.getClose(), self.__stoch[-1]))
# Downdload then Load the yahoo feed from the CSV file
yahoofinance.download_daily_bars('002389.SZ', 2013, '002389.csv')
feed = yahoofeed.Feed()
feed.addBarsFromCSV("002389.SZ", "002389.csv")
# Evaluate the strategy with the feed's bars.
myStrategy = MyStrategy(feed, "002389.SZ")
myStrategy.run()
И я получил ошибку, как это:
File "/Users/johnhenry/Desktop/simple_strategy.py", line 46, in onBars
self.info("%0.2f, %0.2f" % (bar.getClose(), self.__stoch[-1]))
TypeError: float argument required, not numpy.ndarray
Стохастический:
pyalgotrade.talibext.indicator.STOCH (barDs, count, fastk_period = -2147483648, slowk_period = -2147483648, slowk_matype = 0, slowd_period = -2147483648, slowd_matype = 0)
3 ответа
Или bar.getClose()
или же self.__stoch[-1]
возвращает numpy.ndarray
в то время как оба должны возвращаться float
s.
Это операция форматирования строки, %
, на линии
self.info("%0.2f, %0.2f" % (bar.getClose(), self.__stoch[-1]))
%0.2f
многообещающий скаляр, но один из обоих (bar.getClose()
или же self.__stoch[-1]
) вместо матрицы.
Вы можете изменить форматированную строку так, чтобы она ожидала строки, которая будет принимать любой объект Python, если он имеет печатную форму:
self.info("%s, %s" % (bar.getClose(), self.__stoch[-1]))
Проблема в том, что вы пытаетесь использовать индикаторы талибекста в качестве наборов данных, а это не так.
Я думаю, что вы должны использовать:
self.__stoch[0][-1]
чтобы получить последнее значение%K, и:
self.__stoch[1][-1]
чтобы получить последнее значение%D.
Я бы порекомендовал вам вместо этого использовать pyalgotrade.technical.stoch.StochasticOscillator, который на самом деле ведет себя как набор данных, и вы сможете сделать:
self.__stoch[-1]
или же
self.__stoch.getD()[-1]
Помните, что в этом случае вам придется создавать StochasticOscillator только один раз.