2016-11-16 3 views
0

Я работаю с Pyalgotrade, чтобы проверить торговую стратегию на python. Pyalgotrade позволяет использовать библиотеку TA-LIB, которая является библиотекой технического анализа. По какой-то причине, когда я использую индикатор PPO, он возвращает «None». Индикатор принимает несколько аргументов :(http://gbeced.github.io/pyalgotrade/docs/v0.12/html/talib.html)Pyalgotrade - TA-LIB - Индикатор возвращает «NONE»

Я предоставил фрагмент вывода, который на данный момент является только ценой закрытия акций дня и тем, что должно было быть результатом этого индикатора. «DDD» - это тикер, с которым я тестировал.

Я пытался заставить это работать дольше, чем я хотел бы признать. Как я могу это исправить?

ВЫВОД:

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

ответ

1

Параметры, которые прошли неверны. Это ППО функция подписи:

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

ds тип BarDataSeries, count указать, сколько времени данные от хвоста вы хотите вычислить. Он вернет numpy array, если расчет будет выполнен успешно.

И индикаторы talibext вычисляются только один раз, он не будет вычислять новый результат при подаче новой полосы.

Так что вам нужно рассчитать PPO в каждом звонке onBars.

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

это говорит глобальное имя «корм» не определен ... – RageAgainstheMachine

+0

я заменил канал [сам .__ инструмента] с самостоятельной .__ цен, теперь его выплевывая данные. Однако я понятия не имею, что такое данные. Я пытаюсь получить 3-дневный уклон гистограммы PPO. http://stockcharts.com/articles/chartwatchers/2011/04/using-the-ppo-indicator.html – RageAgainstheMachine

+0

См. Обновление. Вы хотите сохранить 'feed' в' __init__' и использовать его в 'onBars'. – gzc

Смежные вопросы