Quantopian's community platform is shutting down. Please read this post for more information and download your code.
Back to Community
Help! Weird timezone error in notebook using alphalens

Hello all,

First error (seen below) has been resolved. See the update via my replies below.

I am relatively new to coding, and even newer to Quantopian. I am trying to conduct some research on alpha factors using alphalens, but am unable to even get the notebook working.

I've also tried re-writing the code to create the pipeline in initialization but the same error occurred. Any help would be greatly appreciated!

I know you all can view in the attached notebook, but I'll copy+paste below for good measure. Here's the code:

# Normal imports  
from quantopian.pipeline import Pipeline  
from quantopian.research import run_pipeline  
from quantopian.pipeline.filters.morningstar import Q1500US  
from quantopian.pipeline import CustomFactor  
from quantopian.pipeline.data.builtin import USEquityPricing  
import pandas as pd  
import numpy as np

# Testing factor imports  
from quantopian.pipeline.data.morningstar import operation_ratios  
from quantopian.pipeline.data.morningstar import valuation_ratios  
from quantopian.pipeline.data.morningstar import asset_classification  
from quantopian.pipeline.data.morningstar import valuation  
from quantopian.pipeline.data.morningstar import earnings_ratios

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# Single factor  
def custom_factor(CustomFactor):  
    inputs = [morningstar.valuation_ratios.ps_ratio]  
    window_length = 1  
    def compute(self, today, assets, out, ps):  
        table = pd.DataFrame(index=assets)  
        table ["ps"] = ps[-1]  
        out[:] = table.fillna(table.max()).mean(axis=1)  
# Factor requiring industry comparison  
#def custom_factor(CustomFactor):  
# Factor requiring multiple factors  
#def custom_factor(CustomFactor):

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

def make_pipeline():  
    testing_factor = custom_factor()  
    universe = (Q1500US() & testing_factor.notnull())  
    testing_factor = testing_factor.rank(ascending=true, mask=universe, method='average')  
    pipe = Pipeline(columns={'testing_factor':testing_factor}, screen = universe)  
    return pipe

result = run_pipeline(make_pipeline(), start_date='2014-01-01', end_date='2018-01-01')  
result.head()  

And here's the error:

TypeErrorTraceback (most recent call last)  
<ipython-input-18-fce5c027f49a> in <module>()  
     43     return pipe  
     44  
---> 45 result = run_pipeline(make_pipeline(), start_date='2014-01-01', end_date='2018-01-01')  
     46 result.head()

<ipython-input-18-fce5c027f49a> in make_pipeline()  
     37 def make_pipeline():  
     38  
---> 39     testing_factor = custom_factor()  
     40     universe = (Q1500US() & testing_factor.notnull())  
     41     testing_factor = testing_factor.rank(ascending=true, mask=universe, method='average')

TypeError: custom_factor() takes exactly 1 argument (0 given)  
4 responses

class instead of def

.... I have no idea how I overlooked that. I probably have over 50 custom factors used in various algorithms and somehow glossed right over that mistake.

Thanks Blue!

Update:

Moving forward with the notebook creation and I'm one step away from being done, at least I think, and being able to conduct alpha research.

The last hiccup, however, is an error I've not seen before and haven't seen much commentary on:

AttributeErrorTraceback (most recent call last)  
<ipython-input-4-25ec6be0d7e3> in <module>()  
      4                                                                    prices = pricing,  
      5                                                                    quantiles = 5,  
----> 6                                                                    periods = (1,5,10))  
      7  
      8 alphalens.tears.create_full_tear_sheet(factor_data, by_group=True)

/usr/local/lib/python2.7/dist-packages/alphalens/utils.pyc in get_clean_factor_and_forward_returns(factor, prices, groupby, by_group, quantiles, bins, periods, filter_zscore, groupby_labels)
    296     """  
    297  
--> 298     if factor.index.levels[0].tz != prices.index.tz:  
    299         raise NonMatchingTimezoneError("The timezone of 'factor' is not the "  
    300                                        "same as the timezone of 'prices'. See "

AttributeError: 'builtin_function_or_method' object has no attribute 'levels'  

The error is occurring between these two steps, apparently:

assets = result.index.levels[1].unique()

#start and end must be far enough back to collect data properly!!!  
pricing = get_pricing(assets, start_date='2014-12-01', end_date='2018-02-01', fields='close_price')  
len(assets)  
import alphalens  
factor_data = alphalens.utils.get_clean_factor_and_forward_returns(factor = 'testing_factor',  
                                                                   prices = pricing,  
                                                                   quantiles = 5,  
                                                                   periods = (1,5,10))

alphalens.tears.create_full_tear_sheet(factor_data, by_group=True)  

The error is that you are passing a string instead of the result of pipeline to alphalens.utils.get_clean_factor_and_forward_returns.

factor_data = alphalens.utils.get_clean_factor_and_forward_returns(factor = 'testing_factor', <-- ERROR  

Try:

factor_data = alphalens.utils.get_clean_factor_and_forward_returns(factor = result['testing_factor'],