Quantopian's community platform is shutting down. Please read this post for more information and download your code.
Back to Community
Can't find an error--new-ish to adding Custom Factors

Since I cannot attach source code of an algorithm, I copy/pasted it into a Notebook and attached that.

Was slapping together a quick algorithm with something I thought of without testing so that I could figure out how to use CustomFactors (have been here for a while but gotten around feasibly without using this).

Basically copied the format from the API docs and have it as a column in my Pipeline, however, I keep getting a syntax error on that line, and can't figure out what's causing it. I've gone back over a few days and looked at again to try to reduce my rigidness in thinking, but that hasn't helped, so I'm turning to some other eyes. I can only imagine it's something really simple that I'm overlooking. Thanks in advance.

3 responses

Hey Matthew,

I highly recommend iterating on your pipeline definition in Research before putting it in an algorithm. Developing a pipeline in research is easier and quicker to edit and debug. In this specific case, I found a couple of issues. The first syntax error that came up was on the 'price_disparity' = PriceDisparity(), line. When defining key/value pairs in the columns dictionary, you'll need to use a : instead of =. So the line should be price_disparity': PriceDisparity() (took me a couple minutes staring at the somewhat vague error message before I spotted it; it wasn't obvious!

I also noticed that compute was missing a couple of arguments (representing the bvps and close inputs). Also, the bvps/close expression raised an exception - did you mean to write bvps[-1]/close[-1]?

Attached is a clone of your notebook with the above issues fixed.

P.S. Have you had a chance to go through the Pipeline tutorial yet? In particular, lesson 10 introduces custom factors - it might be helpful in this case!

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.

I knew it was going a be "missing semi-colon" type error. The 'price_disparity'=PriceDisparity() needed to be a colon. Thanks

I usually try to go from a notebook to algorithm, but in this case, I just wanted to test this feature. I have gone through the tutorial briefly, but it's been months, and like I mentioned, this wasn't something I generally used. I got lazy/ messy and just used expressions in the Pipeline columns (ie, I'd have 'price_disparity':bvps/close as a Pipeline column). Thank you for pointing out the part concerning the missing args as well.

No problem, Matthew!

In response to your "lazy/messy" comment, I'd actually strongly recommend you do exactly as you said, and define expressions using the /, *, +, and - operators whenever possible. Custom factors are helpful, but I personally find it much easier to read and write pipeline code in the way you described. I only use CustomFactors when that becomes impossible. This occurs most commonly when I want to compute an expression over a lookback window greater than 1 day, and the computation I want to perform is not available as a pre-defined pipeline term.