Notebook

CloseOnN Custom Factor

This get's the adjusted price of a security N days a go.

In [7]:
from quantopian.pipeline import Pipeline, CustomFactor
from quantopian.research import run_pipeline

from quantopian.pipeline.data.builtin import USEquityPricing

class CloseOnN(CustomFactor):  
    # Define inputs
    inputs = [USEquityPricing.close]
    
    # Set window_length to one more  than the number of days to look back
    # my_close_on_10 = CloseOnN(window_length = 10+1)
    
    window_length = 2 
    
    def compute(self, today, assets, out, close):  
        out[:] = close[0]
        
In [8]:
def create_pipeline():
    # Create a Pipeline computing the previous close factor.
    close_5 = CloseOnN(window_length = 5+1)
    
    p = Pipeline()
    p.add(close_5, 'close_5')
    p.add(USEquityPricing.close.latest, 'close_0')

    return p

# Run the pipeline with desired date(s). close_5 collumn will be close 5 trading days before that date 
# In this case it will be the close on 6-30-2016 because of the July 4 holiday.
results = run_pipeline(create_pipeline(), '7-8-2016', '8-8-2016')
results

Pipeline Execution Time: 0.30 Seconds
Out[8]:
close_0 close_5
2016-07-08 00:00:00+00:00 Equity(2 [ARNC]) 9.330 9.100000
Equity(21 [AAME]) 4.150 3.990000
Equity(24 [AAPL]) 95.920 94.400000
Equity(25 [ARNC_PR]) 88.000 87.600000
Equity(31 [ABAX]) 48.430 46.150000
Equity(39 [DDC]) 8.670 8.500000
Equity(41 [ARCB]) 16.050 16.020000
Equity(52 [ABM]) 36.280 35.587589
Equity(53 [ABMD]) 113.540 108.160000
Equity(62 [ABT]) 41.370 38.580000
Equity(64 [GOLD]) 22.369 20.752000
Equity(66 [AB]) 22.960 22.950000
Equity(67 [ADSK]) 53.525 53.220000
Equity(69 [ACAT]) 16.820 16.320000
Equity(70 [VBF]) 19.160 18.840000
Equity(76 [TAP]) 99.850 98.440000
Equity(84 [ACET]) 23.740 21.780000
Equity(100 [IEP]) 52.610 52.690000
Equity(106 [ACU]) 18.920 18.182000
Equity(110 [RAMP]) 21.690 21.320000
Equity(112 [ACY]) NaN 9.410000
Equity(114 [ADBE]) 95.110 94.370000
Equity(117 [AEY]) 1.800 1.780000
Equity(122 [ADI]) 55.940 55.620000
Equity(128 [ADM]) 42.110 41.570000
Equity(149 [ADX]) 12.700 12.520000
Equity(153 [AE]) 37.680 36.690000
Equity(154 [AEM]) 55.300 52.940000
Equity(157 [AEG]) 3.520 3.960000
Equity(161 [AEP]) 70.290 68.720000
... ... ... ...
2016-08-08 00:00:00+00:00 Equity(50146 [BRG_PRC]) 26.050 26.200000
Equity(50147 [SRTS]) 6.355 6.114000
Equity(50148 [SRTS_W]) 1.450 NaN
Equity(50150 [MYSZ]) NaN NaN
Equity(50151 [CHUB_K]) 13.770 14.000000
Equity(50152 [CHUB_A]) 13.800 14.140000
Equity(50155 [DRUA]) 25.220 25.530000
Equity(50157 [PAVM]) 14.500 NaN
Equity(50158 [PAVM_W]) NaN NaN
Equity(50159 [WBIR]) 24.676 24.890000
Equity(50160 [KDMN]) 9.970 9.000000
Equity(50161 [LVHI]) NaN 24.930000
Equity(50165 [MELT]) NaN 23.220000
Equity(50166 [TLND]) 25.620 25.530000
Equity(50167 [EUFL]) 25.680 NaN
Equity(50168 [KNSL]) 18.750 18.430000
Equity(50169 [TCMD]) 14.190 11.490000
Equity(50170 [APOP]) 4.700 NaN
Equity(50171 [APOP_W]) 0.650 NaN
Equity(50173 [BDC_PRB]) 105.120 NaN
Equity(50175 [NSPR_WS]) 0.130 NaN
Equity(50179 [KEY_PRHCL]) 25.950 NaN
Equity(50180 [SPE_RT]) 0.550 NaN
Equity(50181 [FHB]) 24.850 NaN
Equity(50182 [ONTX_W]) 1.150 NaN
Equity(50184 [UAVSU]) NaN NaN
Equity(50185 [MTFB]) NaN NaN
Equity(50186 [ATOM]) 8.000 NaN
Equity(50187 [HOME]) 15.280 NaN
Equity(50188 [GEMP]) 9.250 NaN

184451 rows × 2 columns

In [9]:
# Let's check if that really did get the value 5 days ago.
# Make it easier and look at a single stock
results.xs(symbols('AAPL'), level=1)
Out[9]:
close_0 close_5
2016-07-08 00:00:00+00:00 95.920 94.400000
2016-07-11 00:00:00+00:00 96.680 95.600000
2016-07-12 00:00:00+00:00 96.980 95.900000
2016-07-13 00:00:00+00:00 97.420 95.020000
2016-07-14 00:00:00+00:00 96.870 95.530000
2016-07-15 00:00:00+00:00 98.790 95.920000
2016-07-18 00:00:00+00:00 98.770 96.680000
2016-07-19 00:00:00+00:00 99.840 96.980000
2016-07-20 00:00:00+00:00 99.870 97.420000
2016-07-21 00:00:00+00:00 99.930 96.870000
2016-07-22 00:00:00+00:00 99.420 98.790000
2016-07-25 00:00:00+00:00 98.660 98.770000
2016-07-26 00:00:00+00:00 97.330 99.840000
2016-07-27 00:00:00+00:00 96.672 99.870000
2016-07-28 00:00:00+00:00 102.930 99.930000
2016-07-29 00:00:00+00:00 104.340 99.420000
2016-08-01 00:00:00+00:00 104.195 98.660000
2016-08-02 00:00:00+00:00 106.060 97.330000
2016-08-03 00:00:00+00:00 104.470 96.672000
2016-08-04 00:00:00+00:00 105.230 102.375462
2016-08-05 00:00:00+00:00 105.890 103.777866
2016-08-08 00:00:00+00:00 107.470 103.633647
In [14]:
# We can also use the shift method to 'unshift' the data back 5
results['test'] = results.groupby(level=1).close_5.shift(-5)
results.xs(symbols('AAPL'), level=1)
Out[14]:
close_0 close_5 test
2016-07-08 00:00:00+00:00 95.920 94.400000 95.920000
2016-07-11 00:00:00+00:00 96.680 95.600000 96.680000
2016-07-12 00:00:00+00:00 96.980 95.900000 96.980000
2016-07-13 00:00:00+00:00 97.420 95.020000 97.420000
2016-07-14 00:00:00+00:00 96.870 95.530000 96.870000
2016-07-15 00:00:00+00:00 98.790 95.920000 98.790000
2016-07-18 00:00:00+00:00 98.770 96.680000 98.770000
2016-07-19 00:00:00+00:00 99.840 96.980000 99.840000
2016-07-20 00:00:00+00:00 99.870 97.420000 99.870000
2016-07-21 00:00:00+00:00 99.930 96.870000 99.930000
2016-07-22 00:00:00+00:00 99.420 98.790000 99.420000
2016-07-25 00:00:00+00:00 98.660 98.770000 98.660000
2016-07-26 00:00:00+00:00 97.330 99.840000 97.330000
2016-07-27 00:00:00+00:00 96.672 99.870000 96.672000
2016-07-28 00:00:00+00:00 102.930 99.930000 102.375462
2016-07-29 00:00:00+00:00 104.340 99.420000 103.777866
2016-08-01 00:00:00+00:00 104.195 98.660000 103.633647
2016-08-02 00:00:00+00:00 106.060 97.330000 NaN
2016-08-03 00:00:00+00:00 104.470 96.672000 NaN
2016-08-04 00:00:00+00:00 105.230 102.375462 NaN
2016-08-05 00:00:00+00:00 105.890 103.777866 NaN
2016-08-08 00:00:00+00:00 107.470 103.633647 NaN