Back to Community
Getting NaN from TALib Stochastic

I'm getting NaN from some of my stocks, but not all of them? What gives? I'm trying to compute the top 50 market capitalizations of the day and buy when stochastic crosses a certain level.

"""
Buys top market capitalization stocks that are listed as "oversold" and are exiting their oversold region.  Sell when they enter or exit their oversold region.  
"""
from quantopian.algorithm import attach_pipeline, pipeline_output  
from quantopian.pipeline import Pipeline  
from quantopian.pipeline import CustomFactor  
from quantopian.pipeline.data import morningstar  
from quantopian.pipeline.data.builtin import USEquityPricing  
from quantopian.pipeline.factors import AverageDollarVolume  
import random  
import talib  
import numpy as np  
import pandas as pd  
import datetime  
from sqlalchemy import or_

#How many stocks?  
numstock = 10  
stochl = 37  
stochd = 3  
stochk = 3  
bars=(stochl+stochd+stochk)*2

osold = 10  
obought = 90

class MarketCap(CustomFactor):  
    # Pre-declare inputs and window_length  
    inputs = [USEquityPricing.close, morningstar.valuation.shares_outstanding]  
    window_length = 1  
    # Compute market cap value  
    def compute(self, today, assets, out, close, shares):  
        out[:] = close[-1] * shares[-1]

def initialize(context):  
    # Create a variable to track the date change  
    context.date = None  
    pipe=Pipeline()  
    # Construct the custom factor  
    mkt_cap = MarketCap()  
    pipe.add(mkt_cap, 'mkt_cap')  
    pipe.add(mkt_cap.rank(ascending=False), 'mkt_cap_rank')

    # Use screen to narrow the universe  
    pipe.set_screen(mkt_cap.top(50))  
    # Attach to the pipeline  
    attach_pipeline(pipe, 'my_pipeline')  
    # Set the buy rules.  
    schedule_function(my_buy, date_rules.every_day(), time_rules.market_open(minutes=1))

def before_trading_start(context, data):  
    context.stocks = pipeline_output('my_pipeline').index.tolist()  
    update_universe(context.stocks)  
def my_buy(context,data):  
    todays_date = get_datetime().date()  
    # Do nothing unless the date has changed  
    if todays_date == context.date:  
        return  
    # Set the new date  
    context.date = todays_date  
    print "Cash: " + str(context.portfolio.cash)  
    #Iterate and look for oversold  
    stockcnt = 0  
    for stock in context.stocks:  
        stockcnt = stockcnt + 1  
        # Load historical data for the stocks  
        #data.history(sid(3149), 'open', 10, '1d')  
        high = data.history(stock, 'high', bars, '1d')  
        low = data.history(stock, 'low', bars, '1d')  
        close = data.history(stock, 'close', bars, '1d')  
        #Get out current position on the stock in question  
        current_position = context.portfolio.positions[stock].amount  
        #Look for oversold region  
        slowk, slowd = talib.STOCH(high,low,close,  
                                   fastk_period=stochl,  
                                   slowk_period=stochk,  
                                   slowk_matype=0,  
                                   slowd_period=stochd,  
                                   slowd_matype=0)

        print "Stock#: " + str(stockcnt) + " StochK: " + str(slowk[-1])  
        #Get from two periods ago  
        slowk2 = slowk[-2]  
        slowd2 = slowd[-2]  
        #Get the most recent value  
        slowk = slowk[-1]  
        slowd = slowd[-1]  
        # Open the order on oversold crossover  
        if (slowd > osold and slowd2<=osold and slowk > slowd) and current_position <= 0:  
            order_target_percent(stock, 1.0/numstock)  
        elif current_position > 0 and (slowd < obought and slowk < slowd and slowd2>=obought):  
            order_target(stock, 0)  

I'm new, but I'd love some help!

This is what I'm seeing in the logs:

2005-02-16 09:31 PRINT Cash: 399276.927299 2005-02-16 09:31 PRINT
Stock#: 1 StochK: 89.8345153664 2005-02-16 09:31 PRINT Stock#: 2
StochK: nan 2005-02-16 09:31 PRINT Stock#: 3 StochK: nan 2005-02-16
09:31 PRINT Stock#: 4 StochK: 40.203562341 2005-02-16 09:31 PRINT
Stock#: 5 StochK: 24.255952381 2005-02-16 09:31 PRINT Stock#: 6
StochK: 67.4501273491 2005-02-16 09:31 PRINT Stock#: 7 StochK: nan
2005-02-16 09:31 PRINT Stock#: 8 StochK: 36.9827774144 2005-02-16
09:31 PRINT Stock#: 9 StochK: 93.4289486681 2005-02-16 09:31 PRINT
Stock#: 10 StochK: nan 2005-02-16 09:31 PRINT Stock#: 11 StochK:
90.7552083333 2005-02-16 09:31 PRINT Stock#: 12 StochK: 69.3137324865 2005-02-16 09:31 PRINT Stock#: 13 StochK: 23.6225731993 2005-02-16
09:31 PRINT Stock#: 14 StochK: nan 2005-02-16 09:31 PRINT Stock#: 15
StochK: nan 2005-02-16 09:31 PRINT Stock#: 16 StochK: 35.2607709751
2005-02-16 09:31 PRINT Stock#: 17 StochK: nan 2005-02-16 09:31 PRINT
Stock#: 18 StochK: nan 2005-02-16 09:31 PRINT Stock#: 19 StochK: nan
2005-02-16 09:31 PRINT Stock#: 20 StochK: nan 2005-02-16 09:31 PRINT
Stock#: 21 StochK: 92.9268292683

1 response

For best response, run a full backtest and attach.