Quantopian's community platform is shutting down. Please read this post for more information and download your code.
Back to Community
Custom Factor in Pipeline Research: Ratio of Stock to SPY

I cannot seem to figure out the correct way to go about creating a custom factor that takes the price of the assets and divides them by the price of the SPY.

Some built-in factors such as linear_regression() seem to be able to take an argument specifying a separate target symbol and do a regression analysis on all symbols vs. that target. This is basically what I am trying to do, but instead of performing a regression, I just want to do a simple division operation.

Is this possible?

3 responses

Hi,

from quantopian.pipeline import Pipeline, CustomFactor  
from quantopian.research import run_pipeline  
from quantopian.pipeline.data.builtin import USEquityPricing  
import pandas as pd  
import numpy as np

class betta(CustomFactor):  
    inputs = [USEquityPricing.close]  
    window_length = 1  
    def compute(self, today, assets, out, price):  
        df = pd.DataFrame(price, columns=assets)  
        spy=df[8554].values  
        out[:]=price/spy  

def make_pipeline():  
    price= USEquityPricing.close.latest  
    price_div_betta = betta()  


    return Pipeline(columns={'price_div_betta': price_div_betta ,  
                             'close_price':price})


my_pipe=make_pipeline()  
results=run_pipeline(my_pipe, '2015-01-01', '2015-01-01')  
results  

basically you create pandas data frame which contains stock and the price, then you can use this data frame to search for SPY which i believe is 8554 and finally your out[:] is all the price decided by spy =)

good luck

well this is alternative version, maybe more faster without creating pandas data frame

from quantopian.pipeline import Pipeline, CustomFactor  
from quantopian.research import run_pipeline  
from quantopian.pipeline.data.builtin import USEquityPricing  
import pandas as pd  
import numpy as np

class betta(CustomFactor):  
    inputs = [USEquityPricing.close]  
    window_length = 1  
    def compute(self, today, assets, out, price):  
        out[:]=price/price[0][np.where(assets==8554)]  

def make_pipeline():  
    price= USEquityPricing.close.latest  
    price_div_betta = betta()  


    return Pipeline(columns={'price_div_betta': price_div_betta ,  
                             'close_price':price})

my_pipe=make_pipeline()  
results=run_pipeline(my_pipe, '2015-01-01', '2015-01-01')  
results


That works perfectly. Thank you, Has Buk!