Notebook
In [132]:
from time import time
from quantopian.pipeline import Pipeline
from quantopian.research import run_pipeline
from quantopian.pipeline import CustomFactor
from quantopian.pipeline.factors import AverageDollarVolume
from quantopian.pipeline.filters.fundamentals import IsPrimaryShare
from quantopian.pipeline.classifiers.fundamentals import Sector
from quantopian.pipeline.filters import StaticAssets

from quantopian.pipeline.data import Fundamentals, morningstar as mstar

import pandas as pd
import numpy as np
        
class Previous(CustomFactor):  
    # Returns value of input x trading days ago where x is the window_length  
    # Both the inputs and window_length must be specified as there are no defaults

    def compute(self, today, assets, out, inputs):  
            out[:] = inputs[0]
            
            
class PreviousAsOf(CustomFactor):  
    # Returns value of input x trading days ago where x is the window_length  
    # Both the inputs and window_length must be specified as there are no defaults

    dtype = np.dtype('datetime64[ns]')
    def compute(self, today, assets, out, inputs):
        out[:] = inputs[0]
        
        
class LastFourQuarters(CustomFactor):
    # Get the last 4 reported values of the given asof_date + field.
    outputs = ['q1', 'q2', 'q3', 'q4']
    window_length = 195 + 65

    def compute(self, today, assets, out, asof_date, values):
        for column_ix in range(asof_date.shape[1]):
            _, unique_indices = np.unique(asof_date[:, column_ix], return_index=True)
            quarterly_values = values[unique_indices, column_ix]
            if len(quarterly_values) < 4:
                quarterly_values = np.hstack([
                    np.repeat([np.nan], 4 - len(quarterly_values)),
                    quarterly_values,
                ])
            quarterly_values = quarterly_values[-4:]
            out[column_ix] = quarterly_values


class LastFourQuartersAsOfDates(CustomFactor):
    # Get the last 4 unique values of a given asof_date.
    outputs = ['q1_asof', 'q2_asof', 'q3_asof', 'q4_asof']
    window_length = 195 + 65
    dtype = np.dtype('datetime64[ns]')

    def compute(self, today, assets, out, asof_date):
        for column_ix in range(asof_date.shape[1]):
            unique_dates, _ = np.unique(asof_date[:, column_ix], return_index=True)
            if len(unique_dates) < 4:
                unique_dates = np.hstack([
                    np.repeat([np.datetime64('NaT')], 4 - len(unique_dates)),
                    unique_dates,
                ])
            unique_dates = unique_dates[-4:]
            out[column_ix] = unique_dates       
            
class FormType(CustomFactor):
    # Get the Formtype of a given asof_date.
    outputs = ['q1_form', 'q2_form', 'q3_form', 'q4_form']
    window_length = 195 + 65
    
    def compute(self, today, assets, out, asof_date, form_type):
        for column_ix in range(asof_date.shape[1]):
            _, unique_indices = np.unique(asof_date[:, column_ix], return_index=True)
            form_types = form_type[unique_indices, column_ix]
            types_to_num = {'6-K': 1., '10-Q/A': 2., 'Quarterly': 3. , '10-Q': 10. , 'Quarterly': 4.  }
            result = np.zeros(form_types.shape)
            i = 0
            for key in form_types: 
                val = types_to_num.get(key, -1.)                
                result[i] = val
                i = i + 1
            if len(result) < 4:
                result = np.hstack([
                    np.repeat([0], 4 - len(result)),
                    result,
                ])
            result = result[-4:]
            out[column_ix] = result       
In [133]:
pipe=Pipeline()
stocks = StaticAssets(symbols(['DDC', 'ABX', 'AEM', 'AU', 'GE']))

quarters = LastFourQuarters(inputs = [Fundamentals.ebit_asof_date, Fundamentals.ebit], mask=stocks)
quarters_asof_dates = LastFourQuartersAsOfDates(inputs = [Fundamentals.ebit_asof_date], mask=stocks)
types = FormType(inputs = [Fundamentals.ebit_asof_date, Fundamentals.form_type], mask=stocks)
EBIT_Q1_NEW = quarters.q1
EBIT_Q2_NEW = quarters.q2
EBIT_Q3_NEW = quarters.q3
EBIT_Q4_NEW = quarters.q4

EBIT_Q1_NEW_asof = quarters_asof_dates.q1_asof
EBIT_Q2_NEW_asof = quarters_asof_dates.q2_asof
EBIT_Q3_NEW_asof = quarters_asof_dates.q3_asof
EBIT_Q4_NEW_asof = quarters_asof_dates.q4_asof

EBIT_Q1_Form = types.q1_form
EBIT_Q2_Form = types.q2_form
EBIT_Q3_Form = types.q3_form
EBIT_Q4_Form = types.q4_form

pipe.add(EBIT_Q1_NEW,'EBIT_Q1 NEW')
pipe.add(EBIT_Q2_NEW,'EBIT_Q2 NEW')
pipe.add(EBIT_Q3_NEW,'EBIT_Q3 NEW')
pipe.add(EBIT_Q4_NEW,'EBIT_Q4 NEW')

pipe.add(EBIT_Q1_NEW_asof,'EBIT_Q1 NEW asof')
pipe.add(EBIT_Q2_NEW_asof,'EBIT_Q2 NEW asof')
pipe.add(EBIT_Q3_NEW_asof,'EBIT_Q3 NEW asof')
pipe.add(EBIT_Q4_NEW_asof,'EBIT_Q4 NEW asof')

pipe.add(EBIT_Q1_Form,'EBIT_Q1_Form')
pipe.add(EBIT_Q2_Form,'EBIT_Q2_Form')
pipe.add(EBIT_Q3_Form,'EBIT_Q3_Form')
pipe.add(EBIT_Q4_Form,'EBIT_Q4_Form')

pipe.set_screen(stocks)
In [134]:
result = run_pipeline(pipe,'2017-01-01','2017-02-01')
result
Out[134]:
EBIT_Q1 NEW EBIT_Q1 NEW asof EBIT_Q1_Form EBIT_Q2 NEW EBIT_Q2 NEW asof EBIT_Q2_Form EBIT_Q3 NEW EBIT_Q3 NEW asof EBIT_Q3_Form EBIT_Q4 NEW EBIT_Q4 NEW asof EBIT_Q4_Form
2017-01-03 00:00:00+00:00 Equity(39 [DDC]) -2.665900e+07 2016-01-31 1.0 -3.342400e+07 2016-04-30 1.0 -3.542800e+07 2016-07-31 1.0 3.835900e+07 2016-10-31 1.0
Equity(64 [ABX]) -3.131000e+09 2015-12-31 1.0 2.720000e+08 2016-03-30 1.0 4.960000e+08 2016-06-30 1.0 7.260000e+08 2016-09-30 1.0
Equity(154 [AEM]) 3.690800e+07 2015-12-31 1.0 4.499800e+07 2016-03-30 1.0 5.530100e+07 2016-06-30 1.0 1.075950e+08 2016-09-30 1.0
Equity(629 [AU]) NaN NaT 0.0 NaN NaT 0.0 3.900000e+07 2015-09-30 1.0 2.190000e+08 2015-12-31 1.0
Equity(3149 [GE]) 3.138000e+09 2015-12-31 2.0 2.876000e+09 2016-03-30 10.0 5.150000e+09 2016-06-30 10.0 3.035000e+09 2016-09-30 2.0
2017-01-04 00:00:00+00:00 Equity(39 [DDC]) -2.665900e+07 2016-01-31 1.0 -3.342400e+07 2016-04-30 1.0 -3.542800e+07 2016-07-31 1.0 3.835900e+07 2016-10-31 1.0
Equity(64 [ABX]) -3.131000e+09 2015-12-31 1.0 2.720000e+08 2016-03-30 1.0 4.960000e+08 2016-06-30 1.0 7.260000e+08 2016-09-30 1.0
Equity(154 [AEM]) 3.690800e+07 2015-12-31 1.0 4.499800e+07 2016-03-30 1.0 5.530100e+07 2016-06-30 1.0 1.075950e+08 2016-09-30 1.0
Equity(629 [AU]) NaN NaT 0.0 NaN NaT 0.0 3.900000e+07 2015-09-30 1.0 2.190000e+08 2015-12-31 1.0
Equity(3149 [GE]) 3.138000e+09 2015-12-31 2.0 2.876000e+09 2016-03-30 10.0 5.150000e+09 2016-06-30 10.0 3.035000e+09 2016-09-30 2.0
2017-01-05 00:00:00+00:00 Equity(39 [DDC]) -2.665900e+07 2016-01-31 1.0 -3.342400e+07 2016-04-30 1.0 -3.542800e+07 2016-07-31 1.0 3.835900e+07 2016-10-31 1.0
Equity(64 [ABX]) -3.131000e+09 2015-12-31 1.0 2.720000e+08 2016-03-30 1.0 4.960000e+08 2016-06-30 1.0 7.260000e+08 2016-09-30 1.0
Equity(154 [AEM]) 3.690800e+07 2015-12-31 1.0 4.499800e+07 2016-03-30 1.0 5.530100e+07 2016-06-30 1.0 1.075950e+08 2016-09-30 1.0
Equity(629 [AU]) NaN NaT 0.0 NaN NaT 0.0 3.900000e+07 2015-09-30 1.0 2.190000e+08 2015-12-31 1.0
Equity(3149 [GE]) 3.138000e+09 2015-12-31 2.0 2.876000e+09 2016-03-30 10.0 5.150000e+09 2016-06-30 10.0 3.035000e+09 2016-09-30 2.0
2017-01-06 00:00:00+00:00 Equity(39 [DDC]) -2.665900e+07 2016-01-31 1.0 -3.342400e+07 2016-04-30 1.0 -3.542800e+07 2016-07-31 1.0 3.835900e+07 2016-10-31 1.0
Equity(64 [ABX]) -3.131000e+09 2015-12-31 1.0 2.720000e+08 2016-03-30 1.0 4.960000e+08 2016-06-30 1.0 7.260000e+08 2016-09-30 1.0
Equity(154 [AEM]) 3.690800e+07 2015-12-31 1.0 4.499800e+07 2016-03-30 1.0 5.530100e+07 2016-06-30 1.0 1.075950e+08 2016-09-30 1.0
Equity(629 [AU]) NaN NaT 0.0 NaN NaT 0.0 3.900000e+07 2015-09-30 1.0 2.190000e+08 2015-12-31 1.0
Equity(3149 [GE]) 3.138000e+09 2015-12-31 2.0 2.876000e+09 2016-03-30 10.0 5.150000e+09 2016-06-30 10.0 3.035000e+09 2016-09-30 2.0
2017-01-09 00:00:00+00:00 Equity(39 [DDC]) -2.665900e+07 2016-01-31 1.0 -3.342400e+07 2016-04-30 1.0 -3.542800e+07 2016-07-31 1.0 3.835900e+07 2016-10-31 1.0
Equity(64 [ABX]) -3.131000e+09 2015-12-31 1.0 2.720000e+08 2016-03-30 1.0 4.960000e+08 2016-06-30 1.0 7.260000e+08 2016-09-30 1.0
Equity(154 [AEM]) 3.690800e+07 2015-12-31 1.0 4.499800e+07 2016-03-30 1.0 5.530100e+07 2016-06-30 1.0 1.075950e+08 2016-09-30 1.0
Equity(629 [AU]) NaN NaT 0.0 NaN NaT 0.0 3.900000e+07 2015-09-30 1.0 2.190000e+08 2015-12-31 1.0
Equity(3149 [GE]) 3.138000e+09 2015-12-31 2.0 2.876000e+09 2016-03-30 10.0 5.150000e+09 2016-06-30 10.0 3.035000e+09 2016-09-30 2.0
2017-01-10 00:00:00+00:00 Equity(39 [DDC]) -2.665900e+07 2016-01-31 1.0 -3.342400e+07 2016-04-30 1.0 -3.542800e+07 2016-07-31 1.0 3.835900e+07 2016-10-31 1.0
Equity(64 [ABX]) -3.131000e+09 2015-12-31 1.0 2.720000e+08 2016-03-30 1.0 4.960000e+08 2016-06-30 1.0 7.260000e+08 2016-09-30 1.0
Equity(154 [AEM]) 3.690800e+07 2015-12-31 1.0 4.499800e+07 2016-03-30 1.0 5.530100e+07 2016-06-30 1.0 1.075950e+08 2016-09-30 1.0
Equity(629 [AU]) NaN NaT 0.0 NaN NaT 0.0 3.900000e+07 2015-09-30 1.0 2.190000e+08 2015-12-31 1.0
Equity(3149 [GE]) 3.138000e+09 2015-12-31 2.0 2.876000e+09 2016-03-30 10.0 5.150000e+09 2016-06-30 10.0 3.035000e+09 2016-09-30 2.0
... ... ... ... ... ... ... ... ... ... ... ... ... ...
2017-01-25 00:00:00+00:00 Equity(39 [DDC]) -2.665900e+07 2016-01-31 1.0 -3.342400e+07 2016-04-30 1.0 -3.542800e+07 2016-07-31 1.0 3.835900e+07 2016-10-31 1.0
Equity(64 [ABX]) -3.131000e+09 2015-12-31 1.0 2.720000e+08 2016-03-30 1.0 4.960000e+08 2016-06-30 1.0 7.260000e+08 2016-09-30 1.0
Equity(154 [AEM]) 3.690800e+07 2015-12-31 1.0 4.499800e+07 2016-03-30 1.0 5.530100e+07 2016-06-30 1.0 1.075950e+08 2016-09-30 1.0
Equity(629 [AU]) NaN NaT 0.0 NaN NaT 0.0 NaN NaT 0.0 2.190000e+08 2015-12-31 1.0
Equity(3149 [GE]) 3.138000e+09 2015-12-31 2.0 2.876000e+09 2016-03-30 10.0 5.150000e+09 2016-06-30 10.0 3.035000e+09 2016-09-30 2.0
2017-01-26 00:00:00+00:00 Equity(39 [DDC]) -2.665900e+07 2016-01-31 1.0 -3.342400e+07 2016-04-30 1.0 -3.542800e+07 2016-07-31 1.0 3.835900e+07 2016-10-31 1.0
Equity(64 [ABX]) -3.131000e+09 2015-12-31 1.0 2.720000e+08 2016-03-30 1.0 4.960000e+08 2016-06-30 1.0 7.260000e+08 2016-09-30 1.0
Equity(154 [AEM]) 3.690800e+07 2015-12-31 1.0 4.499800e+07 2016-03-30 1.0 5.530100e+07 2016-06-30 1.0 1.075950e+08 2016-09-30 1.0
Equity(629 [AU]) NaN NaT 0.0 NaN NaT 0.0 NaN NaT 0.0 2.190000e+08 2015-12-31 1.0
Equity(3149 [GE]) 3.138000e+09 2015-12-31 2.0 2.876000e+09 2016-03-30 10.0 5.150000e+09 2016-06-30 10.0 3.035000e+09 2016-09-30 2.0
2017-01-27 00:00:00+00:00 Equity(39 [DDC]) -2.665900e+07 2016-01-31 1.0 -3.342400e+07 2016-04-30 1.0 -3.542800e+07 2016-07-31 1.0 3.835900e+07 2016-10-31 1.0
Equity(64 [ABX]) -3.131000e+09 2015-12-31 1.0 2.720000e+08 2016-03-30 1.0 4.960000e+08 2016-06-30 1.0 7.260000e+08 2016-09-30 1.0
Equity(154 [AEM]) 3.690800e+07 2015-12-31 1.0 4.499800e+07 2016-03-30 1.0 5.530100e+07 2016-06-30 1.0 1.075950e+08 2016-09-30 1.0
Equity(629 [AU]) NaN NaT 0.0 NaN NaT 0.0 NaN NaT 0.0 2.190000e+08 2015-12-31 1.0
Equity(3149 [GE]) 3.138000e+09 2015-12-31 2.0 2.876000e+09 2016-03-30 10.0 5.150000e+09 2016-06-30 10.0 3.035000e+09 2016-09-30 2.0
2017-01-30 00:00:00+00:00 Equity(39 [DDC]) -2.665900e+07 2016-01-31 1.0 -3.342400e+07 2016-04-30 1.0 -3.542800e+07 2016-07-31 1.0 3.835900e+07 2016-10-31 1.0
Equity(64 [ABX]) -3.131000e+09 2015-12-31 1.0 2.720000e+08 2016-03-30 1.0 4.960000e+08 2016-06-30 1.0 7.260000e+08 2016-09-30 1.0
Equity(154 [AEM]) 3.690800e+07 2015-12-31 1.0 4.499800e+07 2016-03-30 1.0 5.530100e+07 2016-06-30 1.0 1.075950e+08 2016-09-30 1.0
Equity(629 [AU]) NaN NaT 0.0 NaN NaT 0.0 NaN NaT 0.0 2.190000e+08 2015-12-31 1.0
Equity(3149 [GE]) 3.138000e+09 2015-12-31 2.0 2.876000e+09 2016-03-30 10.0 5.150000e+09 2016-06-30 10.0 3.035000e+09 2016-09-30 2.0
2017-01-31 00:00:00+00:00 Equity(39 [DDC]) -2.665900e+07 2016-01-31 1.0 -3.342400e+07 2016-04-30 1.0 -3.542800e+07 2016-07-31 1.0 3.835900e+07 2016-10-31 1.0
Equity(64 [ABX]) -3.131000e+09 2015-12-31 1.0 2.720000e+08 2016-03-30 1.0 4.960000e+08 2016-06-30 1.0 7.260000e+08 2016-09-30 1.0
Equity(154 [AEM]) 3.690800e+07 2015-12-31 1.0 4.499800e+07 2016-03-30 1.0 5.530100e+07 2016-06-30 1.0 1.075950e+08 2016-09-30 1.0
Equity(629 [AU]) NaN NaT 0.0 NaN NaT 0.0 NaN NaT 0.0 2.190000e+08 2015-12-31 1.0
Equity(3149 [GE]) 3.138000e+09 2015-12-31 2.0 2.876000e+09 2016-03-30 10.0 5.150000e+09 2016-06-30 10.0 3.035000e+09 2016-09-30 2.0
2017-02-01 00:00:00+00:00 Equity(39 [DDC]) -2.665900e+07 2016-01-31 1.0 -3.342400e+07 2016-04-30 1.0 -3.542800e+07 2016-07-31 1.0 3.835900e+07 2016-10-31 1.0
Equity(64 [ABX]) -3.131000e+09 2015-12-31 1.0 2.720000e+08 2016-03-30 1.0 4.960000e+08 2016-06-30 1.0 7.260000e+08 2016-09-30 1.0
Equity(154 [AEM]) 3.690800e+07 2015-12-31 1.0 4.499800e+07 2016-03-30 1.0 5.530100e+07 2016-06-30 1.0 1.075950e+08 2016-09-30 1.0
Equity(629 [AU]) NaN NaT 0.0 NaN NaT 0.0 NaN NaT 0.0 2.190000e+08 2015-12-31 1.0
Equity(3149 [GE]) 3.138000e+09 2015-12-31 2.0 2.876000e+09 2016-03-30 10.0 5.150000e+09 2016-06-30 10.0 3.035000e+09 2016-09-30 2.0

105 rows × 12 columns