Quantopian's community platform is shutting down. Please read this post for more information and download your code.
Back to Community
Market Returns within Pipeline

I'm struggling with Python again. I'm attempting to compare each asset's returns over a certain window to SPY's returns over the same period, and ideally I need to do this within pipeline, but I can't figure out how to do that.

Getting the asset's returns is no problem:

def make_pipeline():  
    window_length = 60  
    m = QTradableStocksUS()  
    asset_returns = Returns(window_length=window_length, mask=m)  
    market_returns = ??????  
    ...  

But how do I get SPY's returns?

6 responses

The answer depends a bit on how you'd like to compare them. A good starting point would be to review this post that covers a Pipeline API feature called 'slicing': https://www.quantopian.com/posts/new-pipeline-features-slicing-and-correlation-slash-regression-methods.

In general, you can take a slice and subtract it from a factor, resulting in a factor. Like this:

def make_pipeline():  
    window_length = 60  
    m = QTradableStocksUS()  
    asset_returns = Returns(window_length=window_length, mask=m)  
    market_returns = asset_returns[symbols('SPY')]  
    asset_returns_less_market_returns = asset_returns - market_returns  
    ...  

Does this help?

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.

Thanks, Jamie. This is along the lines of what I was trying, but I keep getting:

TypeError: zipline.pipeline.term.__getitem__() expected a value of type zipline.assets._assets.Asset for argument 'key', but got list instead.  

I'll clean up my code and post what I'm trying...

I made an incorrect assumption that you were working in the Research environment. You just need to change symbols('SPY') --> symbol('SPY') in the IDE to get it to work.

That said, knowing that you're looking for the alpha, I'd recommend using the Factor.linear_regression method instead of SimpleBeta. SimpleBeta is optimized for the use case where you only want the beta. If you want other metrics from the linear regression, you should use Factor.linear_regression.

Take a look at the post I linked to in my last comment. In particular, look at the part of the notebook that does this:

returns_regr = returns.linear_regression(  
    target=returns_spy,  
    regression_length=100,  
    mask=adv.top(500),  
)

alpha = returns_regr.alpha  
beta = returns_regr.beta  
corr = returns_regr.r_value  

I was playing around with your code, and figured out that if you do:

 alpha = asset_returns - market_returns * (beta  + 0)  
 momAlpha = asset_returns - market_returns * (momRisk  + 0)  

you avoid the error. I think the addition operation changes the type of the risk objects to be compatible with the multiplication operation.

Also, in regards to the returns mask you're asking about, give

from quantopian.pipeline.filters import StaticAssets

asset_returns = Returns(window_length=window, mask=(universe | StaticAssets([symbols('SPY')])))  

a shot.

alpha = asset_returns - market_returns * (beta + 0)

Not to judge but I can't help categorizing that:
Amazing + smart

Haha! I gave it a shot after the alpha = asset_returns - ((beta + momRisk + stRevRisk + sizeRisk + valueRisk + vltlyRisk) * market_returns) was valid code. The only difference was the presence of addition. :)