Quantopian's community platform is shutting down. Please read this post for more information and download your code.
Back to Community
Help- Argument has incorrect type error

The following code returns the error: TypeError: Argument 'real' has incorrect type (expected numpy.ndarray, got BoundColumn)

#rsi is calculated for 14 days and takes into account the close price  
    rsi = talib.RSI(USEquityPricing.close, timeperiod=14)[-1]  
    #change rsi to np so it is numpy array instead of bound column  
    rsi_np = np.asarray(rsi, dtype=np.float32)  

How do I fix this? Thanks!

1 response

It probably helps to first understand a bit about pipelines and 'BoundColumns'. 'Pipelines' are the primary method to fetch daily data on the Quantopian platform. Pipelines are optimized for speed and memory usage. They also run asynchronously to user code and are allotted their own CPU time. They can be thought of as a dataframe of data with the rows being the assets one wants to consider and the columns being whatever data, signals, factors, or calculated values one wishes. Each day the pipeline gets new data and makes it available to the user's code.

First one defines a pipeline. This is really just defining what the rows and columns of the dataframe should be. This is done exactly once in the initialize function. It's actually a good practice to break out this definition into a separate function and simply call it in `intialize'. The second step is to 'attach' the pipeline to the algo. As mentioned above, pipelines run separate from the algo code. 'Attaching' the pipeline basically associates a reference to the pipeline which the algo can then run.

Where do BoundColumns fit in? In defining a pipeline one isn't actually fetching the data yet. One is simply telling pipeline what data to get. A BoundColumn object contains instructions for where and how to get this data. It's not the actual data. Therefore, one cannot coerce it using astype or some other method.

The first thing I would recommend is to define a pipeline to get data. In this case get the RSI data. It just so happens that there is a built in factor for RSI (see https://www.quantopian.com/docs/api-reference/pipeline-api-reference#quantopian.pipeline.factors.RSI) so no need for talib. See the attached algo for a basic algo going long when rsi < 20 and short when rsi > 70.

All that said, one could use the talib function without pipeline and get data using the data.history method. Maybe take a look at this post for how to do that.
https://www.quantopian.com/posts/how-do-you-code-a-simple-rsi-algo

Disclaimer

The material on this website is provided for informational purposes only and does not constitute an offer to sell, a solicitation to buy, or a recommendation or endorsement for any security or strategy, nor does it constitute an offer to provide investment advisory services by Quantopian. In addition, the material offers no opinion with respect to the suitability of any security or specific investment. No information contained herein should be regarded as a suggestion to engage in or refrain from any investment-related course of action as none of Quantopian nor any of its affiliates is undertaking to provide investment advice, act as an adviser to any plan or entity subject to the Employee Retirement Income Security Act of 1974, as amended, individual retirement account or individual retirement annuity, or give advice in a fiduciary capacity with respect to the materials presented herein. If you are an individual retirement or other investor, contact your financial advisor or other fiduciary unrelated to Quantopian about whether any given investment idea, strategy, product or service described herein may be appropriate for your circumstances. All investments involve risk, including loss of principal. Quantopian makes no guarantees as to the accuracy or completeness of the views expressed in the website. The views are subject to change, and may have become unreliable for various reasons, including changes in market conditions or economic circumstances.