Notebook

First Problem, the price doesn't match

In [62]:
from quantopian.pipeline import Pipeline
from quantopian.pipeline.data import factset
from quantopian.research import run_pipeline
from quantopian.pipeline.filters import QTradableStocksUS
from quantopian.pipeline.factors import CustomFactor, SimpleBeta, Returns, SimpleMovingAverage
from quantopian.pipeline.data.builtin import USEquityPricing

# class yesterday_gain(CustomFactor):
#     inputs =[USEquityPricing.close];
#     window_length=2
#     window_safe =True
#     def compute(self,today,assets,out,close):
#         days_return = (close[-1]-close[0])/close[0]
#         out[:] = close[-1]

def make_pipeline():
    # Measures a company's asset growth rate.
    asset_growth = factset.Fundamentals.assets_gr_qf.latest 
    close_price =USEquityPricing.close.latest
    universe = QTradableStocksUS()
    factor_maps= {'Asset Growth': asset_growth,'price':close_price}
    return Pipeline(
        columns = factor_maps,
        screen = universe
    )

pipeline_output = run_pipeline(pipeline=make_pipeline(), start_date='2016-01-04', end_date='2016-12-01')

pipeline_output.head(5)
# Show the first 5 rows of factor_data
Out[62]:
Asset Growth price
2016-01-04 00:00:00+00:00 Equity(2 [ARNC]) -1.441194 9.86
Equity(24 [AAPL]) 25.293415 105.23
Equity(31 [ABAX]) 13.797479 55.69
Equity(39 [DDC]) -3.337442 10.23
Equity(41 [ARCB]) 9.093635 21.38
In [60]:
pricing_data = get_pricing(
    symbols=pipeline_output.index.levels[1], # Finds all assets that appear at least once in "factor_data"  
    start_date='2016-01-04', end_date='2016-12-01',
    fields='close_price' # Generally, you should use open pricing.
)
In [61]:
pricing_data.head(5)
Out[61]:
Equity(2 [ARNC]) Equity(24 [AAPL]) Equity(31 [ABAX]) Equity(39 [DDC]) Equity(41 [ARCB]) Equity(52 [ABM]) Equity(53 [ABMD]) Equity(62 [ABT]) Equity(64 [ABX]) Equity(67 [ADSK]) ... Equity(49610 [SQ]) Equity(49615 [DLTH]) Equity(49630 [CSRA]) Equity(49655 [TEAM]) Equity(49666 [AGR]) Equity(49700 [FCE_A]) Equity(49727 [GCP]) Equity(49736 [EDIT]) Equity(49751 [AVXS]) Equity(49760 [WBT])
2016-01-04 00:00:00+00:00 28.657 103.038 53.813 9.893 20.525 27.126 85.16 41.876 7.711 60.30 ... 12.170 14.75 28.857 27.41 36.689 NaN NaN NaN NaN NaN
2016-01-05 00:00:00+00:00 27.357 100.465 54.446 9.950 20.790 27.200 84.99 41.866 7.621 60.39 ... 11.525 14.67 28.205 26.73 36.970 NaN NaN NaN NaN NaN
2016-01-06 00:00:00+00:00 25.407 98.508 54.446 9.672 20.358 26.924 85.30 41.525 7.910 59.53 ... 11.510 14.96 27.750 27.03 36.853 NaN NaN NaN NaN NaN
2016-01-07 00:00:00+00:00 24.441 94.439 52.556 9.393 18.971 26.352 81.92 40.520 8.706 55.97 ... 11.190 14.91 27.157 26.99 36.572 20.595 NaN NaN NaN NaN
2016-01-08 00:00:00+00:00 23.836 94.869 50.943 9.691 18.351 26.234 84.64 39.652 8.367 55.07 ... 11.315 13.99 27.374 27.15 36.553 20.021 NaN NaN NaN NaN

5 rows × 2315 columns

Second Question, I used price difference as 'alpha', it is pretty good.. is that mean

In [72]:
class yesterday_gain(CustomFactor):
    inputs =[USEquityPricing.close];
    window_length=2
    window_safe =True
    def compute(self,today,assets,out,close):
        days_return = ((close[-1]-close[0])/close[0])*100
        out[:] = days_return

def make_pipeline():
    # Measures a company's asset growth rate.
    asset_growth = factset.Fundamentals.assets_gr_qf.latest 
#     close_price =USEquityPricing.close.latest
    universe = QTradableStocksUS()
    factor_maps= {'Asset Growth': asset_growth,'yesterday_gain':yesterday_gain(mask = universe)}
    return Pipeline(
        columns = factor_maps,
        screen = universe
    )

pipeline_output = run_pipeline(pipeline=make_pipeline(), start_date='2016-01-04', end_date='2016-12-01')

new_pipe = pipeline_output.reset_index()
new_pipe.loc[new_pipe.level_0>'2016-01-04']
# Show the first 5 rows of factor_data
Out[72]:
level_0 level_1 Asset Growth yesterday_gain
2104 2016-01-05 00:00:00+00:00 Equity(2 [ARNC]) -1.441194 -1.622718
2105 2016-01-05 00:00:00+00:00 Equity(24 [AAPL]) 25.293415 0.095030
2106 2016-01-05 00:00:00+00:00 Equity(31 [ABAX]) 13.797479 -2.352307
2107 2016-01-05 00:00:00+00:00 Equity(39 [DDC]) -3.337442 0.684262
2108 2016-01-05 00:00:00+00:00 Equity(41 [ARCB]) 9.093635 -2.385407
2109 2016-01-05 00:00:00+00:00 Equity(52 [ABM]) -1.965434 -2.809975
2110 2016-01-05 00:00:00+00:00 Equity(53 [ABMD]) 73.238875 -5.629433
2111 2016-01-05 00:00:00+00:00 Equity(62 [ABT]) -1.855859 -4.408818
2112 2016-01-05 00:00:00+00:00 Equity(64 [ABX]) -13.584956 5.013550
2113 2016-01-05 00:00:00+00:00 Equity(67 [ADSK]) 10.200980 -1.017728
2114 2016-01-05 00:00:00+00:00 Equity(76 [TAP]) -14.751170 -1.799404
2115 2016-01-05 00:00:00+00:00 Equity(84 [ACET]) 6.485316 -8.191253
2116 2016-01-05 00:00:00+00:00 Equity(110 [RAMP]) -12.363408 -3.871893
2117 2016-01-05 00:00:00+00:00 Equity(114 [ADBE]) 9.669773 -2.076456
2118 2016-01-05 00:00:00+00:00 Equity(122 [ADI]) 2.951854 -1.590745
2119 2016-01-05 00:00:00+00:00 Equity(128 [ADM]) -2.257239 -2.236160
2120 2016-01-05 00:00:00+00:00 Equity(154 [AEM]) 1.958675 2.584599
2121 2016-01-05 00:00:00+00:00 Equity(161 [AEP]) 5.479499 0.154453
2122 2016-01-05 00:00:00+00:00 Equity(166 [AES]) -5.086833 -1.461378
2123 2016-01-05 00:00:00+00:00 Equity(168 [AET]) 0.853927 1.045135
2124 2016-01-05 00:00:00+00:00 Equity(185 [AFL]) -7.699622 -1.202003
2125 2016-01-05 00:00:00+00:00 Equity(197 [AGCO]) -12.845857 -0.814978
2126 2016-01-05 00:00:00+00:00 Equity(216 [HES]) -11.028676 -0.618684
2127 2016-01-05 00:00:00+00:00 Equity(239 [AIG]) -4.781009 -2.468937
2128 2016-01-05 00:00:00+00:00 Equity(253 [AIR]) -31.112807 -1.977186
2129 2016-01-05 00:00:00+00:00 Equity(266 [AJG]) 5.230276 -1.807523
2130 2016-01-05 00:00:00+00:00 Equity(270 [AKRX]) 11.958123 2.144772
2131 2016-01-05 00:00:00+00:00 Equity(289 [MATX]) 27.623457 -4.010319
2132 2016-01-05 00:00:00+00:00 Equity(300 [ALK]) 5.259782 -2.559324
2133 2016-01-05 00:00:00+00:00 Equity(301 [ALKS]) 2.345125 -5.745968
... ... ... ... ...
480649 2016-12-01 00:00:00+00:00 Equity(49315 [Z]) -3.097125 -0.222161
480650 2016-12-01 00:00:00+00:00 Equity(49318 [BETR]) 147.175328 -0.523013
480651 2016-12-01 00:00:00+00:00 Equity(49321 [RUN]) 29.931638 2.000000
480652 2016-12-01 00:00:00+00:00 Equity(49322 [PLNT]) 21.564075 -2.092798
480653 2016-12-01 00:00:00+00:00 Equity(49325 [CCP]) -5.792471 -0.041511
480654 2016-12-01 00:00:00+00:00 Equity(49335 [GBT]) 37.413439 2.949062
480655 2016-12-01 00:00:00+00:00 Equity(49413 [PEN]) 14.624197 -3.953488
480656 2016-12-01 00:00:00+00:00 Equity(49434 [FLOW]) -19.354839 3.772336
480657 2016-12-01 00:00:00+00:00 Equity(49448 [PJT]) 85.612825 -0.641026
480658 2016-12-01 00:00:00+00:00 Equity(49455 [PFGC]) 3.624402 -5.180180
480659 2016-12-01 00:00:00+00:00 Equity(49458 [MSG]) -7.615873 0.086420
480660 2016-12-01 00:00:00+00:00 Equity(49460 [NVCR]) 67.505654 -1.273885
480661 2016-12-01 00:00:00+00:00 Equity(49464 [PSTG]) 156.179081 -2.312544
480662 2016-12-01 00:00:00+00:00 Equity(49496 [FDC]) 3.002392 -1.885522
480663 2016-12-01 00:00:00+00:00 Equity(49501 [LIVN]) NaN -1.512792
480664 2016-12-01 00:00:00+00:00 Equity(49506 [HPE]) NaN 0.168421
480665 2016-12-01 00:00:00+00:00 Equity(49511 [NRE]) -21.612669 -0.648749
480666 2016-12-01 00:00:00+00:00 Equity(49515 [RACE]) -14.089669 -1.132627
480667 2016-12-01 00:00:00+00:00 Equity(49543 [FCPT]) NaN -2.340967
480668 2016-12-01 00:00:00+00:00 Equity(49608 [MTCH]) 38.073340 -4.414894
480669 2016-12-01 00:00:00+00:00 Equity(49610 [SQ]) 75.970405 3.813729
480670 2016-12-01 00:00:00+00:00 Equity(49615 [DLTH]) 79.352088 -4.370180
480671 2016-12-01 00:00:00+00:00 Equity(49630 [CSRA]) 149.234892 -1.389402
480672 2016-12-01 00:00:00+00:00 Equity(49655 [TEAM]) 153.104997 -1.701665
480673 2016-12-01 00:00:00+00:00 Equity(49666 [AGR]) 491.779468 -3.185225
480674 2016-12-01 00:00:00+00:00 Equity(49700 [FCE_A]) -14.150601 -1.176471
480675 2016-12-01 00:00:00+00:00 Equity(49727 [GCP]) 20.322068 -0.532860
480676 2016-12-01 00:00:00+00:00 Equity(49736 [EDIT]) NaN 1.855817
480677 2016-12-01 00:00:00+00:00 Equity(49751 [AVXS]) NaN 3.883325
480678 2016-12-01 00:00:00+00:00 Equity(49760 [WBT]) NaN 1.721170

478575 rows × 4 columns

In [66]:
pricing_data = get_pricing(
    symbols=pipeline_output.index.levels[1], # Finds all assets that appear at least once in "factor_data"  
    start_date='2016-01-04', 
    end_date='2016-12-01',
    fields='open_price' # Generally, you should use open pricing.
)

# Show the first 5 rows of pricing_data
pricing_data.head(5)
Out[66]:
Equity(2 [ARNC]) Equity(24 [AAPL]) Equity(31 [ABAX]) Equity(39 [DDC]) Equity(41 [ARCB]) Equity(52 [ABM]) Equity(53 [ABMD]) Equity(62 [ABT]) Equity(64 [ABX]) Equity(67 [ADSK]) ... Equity(49610 [SQ]) Equity(49615 [DLTH]) Equity(49630 [CSRA]) Equity(49655 [TEAM]) Equity(49666 [AGR]) Equity(49700 [FCE_A]) Equity(49727 [GCP]) Equity(49736 [EDIT]) Equity(49751 [AVXS]) Equity(49760 [WBT])
2016-01-04 00:00:00+00:00 28.125 100.377 54.090 9.797 20.505 27.508 88.80 42.861 7.651 60.01 ... 12.75 14.51 29.222 28.94 37.590 NaN NaN NaN NaN NaN
2016-01-05 00:00:00+00:00 28.716 103.448 53.872 9.941 20.623 27.190 85.20 41.905 7.760 60.39 ... 12.20 14.88 28.659 27.91 36.776 NaN NaN NaN NaN NaN
2016-01-06 00:00:00+00:00 26.589 98.371 53.882 9.816 20.407 26.855 84.01 41.271 7.790 59.46 ... 11.50 14.52 27.730 26.46 36.349 NaN NaN NaN NaN NaN
2016-01-07 00:00:00+00:00 24.787 96.532 53.407 9.432 19.591 26.470 83.71 40.657 8.188 58.36 ... 11.13 14.90 27.335 26.55 36.407 21.575 NaN NaN NaN NaN
2016-01-08 00:00:00+00:00 25.171 96.405 52.507 9.345 18.932 26.510 82.66 40.832 8.437 56.17 ... 11.25 15.10 27.384 27.06 36.834 20.645 NaN NaN NaN NaN

5 rows × 2315 columns

as you can see... the data doesn't match..

I TRY USE MINUS YESTERDAY GAIN AS ALPHA.. THE RESULT....

In [73]:
from alphalens.utils import get_clean_factor_and_forward_returns

factor_data = get_clean_factor_and_forward_returns(
    factor=-pipeline_output['yesterday_gain'], 
    prices=pricing_data
)

# Show the first 5 rows of merged_data
factor_data.head(5) 
Dropped 4.3% entries from factor data: 4.3% in forward returns computation and 0.0% in binning phase (set max_loss=0 to see potentially suppressed Exceptions).
max_loss is 35.0%, not exceeded: OK!
Out[73]:
1D 5D 10D factor factor_quantile
date asset
2016-01-04 00:00:00+00:00 Equity(2 [ARNC]) 0.021013 -0.129173 -0.266809 1.004016 3
Equity(24 [AAPL]) 0.030595 -0.035476 -0.040936 1.947447 5
Equity(31 [ABAX]) -0.004030 -0.051229 -0.049029 3.800311 5
Equity(39 [DDC]) 0.014698 -0.005920 -0.036338 -1.287129 1
Equity(41 [ARCB]) 0.005755 -0.105048 -0.124214 -1.471286 1

Visualize Results

Finally, execute the following cell to pass the output of get_clean_factor_and_forward_returns() to a function called create_full_tear_sheet(). This will create whats known as a tear sheet.

In [74]:
from alphalens.tears import create_full_tear_sheet

create_full_tear_sheet(factor_data)
Quantiles Statistics
min max mean std count count %
factor_quantile
1 -123.134328 1.691475 -2.768431 2.837890 92122 20.019819
2 -5.209188 3.502455 -0.767345 1.118461 92024 19.998522
3 -3.433476 4.767510 -0.053805 1.074760 91962 19.985048
4 -2.580051 6.420478 0.664001 1.173544 91976 19.988091
5 -1.564792 84.604317 2.603946 2.832494 92070 20.008519
Returns Analysis
1D 5D 10D
Ann. alpha 0.103 -0.041 -0.007
beta 0.081 0.069 0.066
Mean Period Wise Return Top Quantile (bps) 4.008 -0.467 1.250
Mean Period Wise Return Bottom Quantile (bps) -4.259 1.856 1.235
Mean Period Wise Spread (bps) 8.267 -2.363 -0.018
<matplotlib.figure.Figure at 0x7f4ea2b9ebd0>
Information Analysis
1D 5D 10D
IC Mean 0.017 -0.007 -0.002
IC Std. 0.142 0.135 0.124
Risk-Adjusted IC 0.119 -0.053 -0.017
t-stat(IC) 1.771 -0.791 -0.247
p-value(IC) 0.078 0.430 0.805
IC Skew -0.047 0.324 0.214
IC Kurtosis 0.278 0.913 0.229
Turnover Analysis
10D 1D 5D
Quantile 1 Mean Turnover 0.767 0.764 0.765
Quantile 2 Mean Turnover 0.788 0.787 0.785
Quantile 3 Mean Turnover 0.777 0.768 0.775
Quantile 4 Mean Turnover 0.791 0.789 0.787
Quantile 5 Mean Turnover 0.768 0.766 0.759
1D 5D 10D
Mean Factor Rank Autocorrelation -0.02 0.009 0.004

That's It!

In the next lesson, we will show you how to interpret the charts produced by create_full_tear_sheet().

In [ ]: