Notebook

Last close above SMA for n consecutive days

In [74]:
# Import modules for pipeline (research and algo)
from quantopian.pipeline import Pipeline, CustomFactor

# Import module to run pipeline in research
from quantopian.research import run_pipeline

# Import any needed filters and factors
from quantopian.pipeline.filters import QTradableStocksUS, Q500US, Q1500US, StaticAssets
from quantopian.pipeline.factors import SimpleMovingAverage

# Import data
from quantopian.pipeline.data.builtin import USEquityPricing

# Other imports
from scipy import stats

# Import numpy and pandas because they rock
import numpy as np
import pandas as pd
In [75]:
class Amount_Above_SMA(CustomFactor):
    inputs = [USEquityPricing.close]
    window_length = 50
    
    # Set window_safe to True so it can be used as an input to another factor
    window_safe = True
    
    def compute(self, today, assets, out, close_prices):
        sma_close_prices = np.nanmean(close_prices, axis=0)
        out[:] = close_prices[-1] - sma_close_prices
                
In [76]:
class Consecutive_Days_Above_Zero(CustomFactor):
    """
    Returns the number previous days where the input is above zero
    """
    # No defaults. Must be set when instantiated.
    # Takes a single input
    
    def compute(self, today, assets, out, values):
        # The the first row (0) in values is the earliest day
        # The last row (-1) is the latest
        # We want to use the numpy 'argmax' method to count from the latest day.
        # So, flip the values so it's in reverse order
        values_latest_to_earliest = np.flipud(values)
        
        # Now, a little trick, if 'argmax' doesn't find a value it returns 0
        # However, we want it to return the max if all are above zero
        # So, append a row to the end with zeros so it will find the max length
        asset_count = values_latest_to_earliest.shape[1]
        zeros = np.zeros(asset_count)
        zero_array_row = zeros.reshape(1,-1)
        values_latest_to_earliest = np.append(values_latest_to_earliest, zero_array_row, axis=0)
        
        # Finally, use 'argmax' to find the first value less than zero
        out[:] = np.argmax(values_latest_to_earliest<=0, axis=0)
In [77]:
# Pipeline definition
def make_pipeline():
    universe = StaticAssets(symbols(['AAPL', 'IBM']))

    last_close = USEquityPricing.close.latest
    sma_50 = SimpleMovingAverage(inputs=[USEquityPricing.close], window_length=50)
    pct_sma = Percent_Above_SMA(mask=universe)
    days_above_sma = Consecutive_Days_Above_Zero(inputs=[pct_sma], window_length=200)

    return Pipeline(
        columns={
            'last_close': last_close,
            'sma_50': sma_50,
            'pct_sma': pct_sma,
            'days_above_sma': days_above_sma,
        },
        screen=universe,
    )
In [78]:
# Select a time range to look at
period_start = '2019-10-1'
period_end = '2019-11-1'
In [79]:
# Pipeline execution
data = run_pipeline(
    make_pipeline(),
    start_date=period_start,
    end_date=period_end
)

data

Pipeline Execution Time: 0.97 Seconds
Out[79]:
days_above_sma last_close pct_sma sma_50
2019-10-01 00:00:00+00:00 Equity(24 [AAPL]) 25.0 223.980 0.063615 210.583709
Equity(3766 [IBM]) 18.0 145.410 0.036900 140.235302
2019-10-02 00:00:00+00:00 Equity(24 [AAPL]) 26.0 224.580 0.064630 210.946594
Equity(3766 [IBM]) 19.0 143.640 0.024917 140.147975
2019-10-03 00:00:00+00:00 Equity(24 [AAPL]) 27.0 218.960 0.036914 211.165101
Equity(3766 [IBM]) 20.0 141.770 0.012565 140.010795
2019-10-04 00:00:00+00:00 Equity(24 [AAPL]) 28.0 220.810 0.044396 211.423696
Equity(3766 [IBM]) 21.0 141.980 0.014980 139.884536
2019-10-07 00:00:00+00:00 Equity(24 [AAPL]) 29.0 227.010 0.071618 211.838569
Equity(3766 [IBM]) 22.0 142.990 0.023032 139.770767
2019-10-08 00:00:00+00:00 Equity(24 [AAPL]) 30.0 227.060 0.069824 212.240494
Equity(3766 [IBM]) 23.0 141.260 0.011859 139.604411
2019-10-09 00:00:00+00:00 Equity(24 [AAPL]) 31.0 224.390 0.055701 212.550765
Equity(3766 [IBM]) 0.0 138.380 -0.007241 139.389349
2019-10-10 00:00:00+00:00 Equity(24 [AAPL]) 32.0 227.000 0.066084 212.928896
Equity(3766 [IBM]) 1.0 139.630 0.002935 139.221427
2019-10-11 00:00:00+00:00 Equity(24 [AAPL]) 33.0 230.090 0.078760 213.291203
Equity(3766 [IBM]) 2.0 141.130 0.014494 139.113749
2019-10-14 00:00:00+00:00 Equity(24 [AAPL]) 34.0 236.220 0.104543 213.862182
Equity(3766 [IBM]) 3.0 142.690 0.026572 138.996550
2019-10-15 00:00:00+00:00 Equity(24 [AAPL]) 35.0 235.890 0.099650 214.513630
Equity(3766 [IBM]) 4.0 141.960 0.021850 138.924448
2019-10-16 00:00:00+00:00 Equity(24 [AAPL]) 36.0 235.320 0.092630 215.370256
Equity(3766 [IBM]) 5.0 142.930 0.028267 139.000825
2019-10-17 00:00:00+00:00 Equity(24 [AAPL]) 37.0 234.390 0.084469 216.133366
Equity(3766 [IBM]) 6.0 142.040 0.021433 139.059600
2019-10-18 00:00:00+00:00 Equity(24 [AAPL]) 38.0 235.290 0.084928 216.871440
Equity(3766 [IBM]) 0.0 134.250 -0.034134 138.994400
2019-10-21 00:00:00+00:00 Equity(24 [AAPL]) 39.0 236.280 0.086128 217.543440
Equity(3766 [IBM]) 0.0 134.100 -0.034375 138.873800
2019-10-22 00:00:00+00:00 Equity(24 [AAPL]) 40.0 240.530 0.101653 218.335440
Equity(3766 [IBM]) 0.0 132.580 -0.044832 138.802800
2019-10-23 00:00:00+00:00 Equity(24 [AAPL]) 41.0 239.970 0.095129 219.124840
Equity(3766 [IBM]) 0.0 133.940 -0.035013 138.799800
2019-10-24 00:00:00+00:00 Equity(24 [AAPL]) 42.0 243.140 0.106147 219.808040
Equity(3766 [IBM]) 0.0 134.390 -0.031577 138.772000
2019-10-25 00:00:00+00:00 Equity(24 [AAPL]) 43.0 243.600 0.104136 220.625040
Equity(3766 [IBM]) 0.0 134.060 -0.034346 138.828200
2019-10-28 00:00:00+00:00 Equity(24 [AAPL]) 44.0 246.580 0.113118 221.521840
Equity(3766 [IBM]) 0.0 135.430 -0.024976 138.899200
2019-10-29 00:00:00+00:00 Equity(24 [AAPL]) 45.0 249.040 0.119916 222.373840
Equity(3766 [IBM]) 0.0 135.970 -0.021397 138.943000
2019-10-30 00:00:00+00:00 Equity(24 [AAPL]) 46.0 243.290 0.090837 223.030640
Equity(3766 [IBM]) 0.0 133.816 -0.036736 138.919320
2019-10-31 00:00:00+00:00 Equity(24 [AAPL]) 47.0 243.290 0.087624 223.689440
Equity(3766 [IBM]) 0.0 135.250 -0.026716 138.962520
2019-11-01 00:00:00+00:00 Equity(24 [AAPL]) 48.0 248.840 0.108847 224.413240
Equity(3766 [IBM]) 0.0 133.720 -0.037649 138.951320