Notebook
In [1]:
import pandas as pd
import numpy as np
from quantopian.pipeline import Pipeline, CustomFactor

from quantopian.pipeline.factors import Latest
from quantopian.pipeline.filters import Q500US
from quantopian.research import run_pipeline
from time import strftime
from datetime import timedelta, datetime
from quantopian.pipeline.data.builtin import USEquityPricing
import seaborn as sns
import alphalens
import matplotlib.pyplot as plt
import talib as ta
from quantopian.pipeline.classifiers.morningstar import Sector
from quantopian.pipeline.data.user_5aba7037bad61a0013e6e687 import test
import math
from quantopian.pipeline.data import Fundamentals
In [2]:
MORNINGSTAR_SECTOR_CODES = {
     -1: 'Misc',
    101: 'Basic Materials',
    102: 'Consumer Cyclical',
    103: 'Financial Services',
    104: 'Real Estate',
    205: 'Consumer Defensive',
    206: 'Healthcare',
    207: 'Utilities',
    308: 'Communication Services',
    309: 'Energy',
    310: 'Industrials',
    311: 'Technology' ,    
}
In [ ]:
 
In [3]:
def auto_heatmap(factor1, factor2, factor_1_name, factor_2_name, quantile_groups = 4, start_date = '2018-11-06', end_date = '2018-11-08'):
    class PreviousClose(CustomFactor):  
        inputs = [USEquityPricing.close]  
        window_length = 1

        def compute(self, today, assets, out, close):  
            out[:] = close[0]

    class PreviousOpen(CustomFactor):  
        inputs = [USEquityPricing.open]  
        window_length = 1

        def compute(self, today, assets, out, open):  
            out[:] = open[0]

    def make_pipeline():
        # define our fundamental factor pipeline
        pipe = Pipeline()
        
        universe = Q500US()
        
        factor_1 = Latest([factor1])
        factor_2 = Latest([factor2])

        factor_1_dec = factor_1.quantiles(quantile_groups, mask=universe)
        factor_2_dec = factor_2.quantiles(quantile_groups, mask=universe)


    #     PreviousClose(window_length = 1) is the same as USEquityPricing.close.latest
        previous_close_price = PreviousClose(window_length = 2)
        close_price = USEquityPricing.close.latest
        open_price = USEquityPricing.open.latest

        Overnight_return = open_price / previous_close_price - 1
        Intraday_return = close_price / open_price - 1

        pipe = Pipeline(
            columns = {
                'open':open_price,
                'close':close_price,
                'close_previous':previous_close_price,
                'Overnight_return':Overnight_return,
                'Intraday_return':Intraday_return,
                factor_1_name:factor_1,
                factor_2_name:factor_2,
                factor_1_name+" quantile":factor_1_dec,
                factor_2_name+" quantile":factor_2_dec,
                'Sector': Sector(mask=universe),
                'first_30': test.first_30.latest,
                'last_30': test.last_30.latest
            },
            screen=universe
        )

        return pipe

    pipe = make_pipeline()

    results = run_pipeline(pipe, start_date, end_date).dropna()
    
    decile_means = results.groupby([factor_1_name+" quantile", factor_2_name+" quantile"])['Intraday_return', 'Overnight_return', 'first_30', 'last_30'].mean()
    decile_count = results.groupby([factor_1_name+" quantile", factor_2_name+" quantile"])['Overnight_return'].count()
    
    for ret_type in ['Intraday_return', 'Overnight_return', 'first_30', 'last_30']:
        sns.heatmap(decile_means[ret_type].unstack(), annot=True, linewidths=.5, fmt=".2%", center=0, cmap=sns.diverging_palette(20, 150, as_cmap=True), vmin=-0.005, vmax=0.005,).set_title(ret_type)
        plt.figure()
    
    sns.heatmap(decile_count.unstack(), annot=True, linewidths=.5, fmt='g', cmap="Blues").set_title('Number of Observations')
    plt.figure()
    
    decile_means_sector = results.groupby([factor_1_name+" quantile", factor_2_name+" quantile", "Sector"])['Intraday_return', 'Overnight_return', 'first_30', 'last_30'].mean()
    
    
    for ret_type in ['Intraday_return', 'Overnight_return', 'first_30', 'last_30']:
        def facet_heatmap(data, color, value_col, **kws):
            data = data.pivot(index=factor_1_name+" quantile", columns=factor_2_name+" quantile", values = value_col)
            sns.heatmap(data, annot=True, linewidths=.5, fmt=".2%", center=0, cmap=sns.diverging_palette(20, 150, as_cmap=True), vmin=-0.005, vmax=0.005, cbar = False, **kws)

        with sns.plotting_context(font_scale=5):
            g = sns.FacetGrid(decile_means_sector.reset_index(), col="Sector", col_wrap=3, size=4.5, aspect=1)

        g = g.map_dataframe(facet_heatmap, value_col = ret_type)

        g.set_titles(col_template="{col_name}", fontweight='bold', fontsize=18)
        g.fig.suptitle(ret_type + ' by sector')
        plt.figure()
        
    decile_count_sector = results.groupby([factor_1_name+" quantile", factor_2_name+" quantile", "Sector"])['Overnight_return'].count()
    
    def facet_heatmap_count(data, color, value_col, **kws):
            data = data.pivot(index=factor_1_name+" quantile", columns=factor_2_name+" quantile", values = value_col)
            sns.heatmap(data, annot=True, linewidths=.5, fmt='g', cmap="Blues", **kws)


    with sns.plotting_context(font_scale=5):
        g = sns.FacetGrid(decile_count_sector.reset_index(), col="Sector", col_wrap=3, size=4.5, aspect=1)

        g = g.map_dataframe(facet_heatmap_count, value_col = "Overnight_return")

        g.set_titles(col_template="{col_name}", fontweight='bold', fontsize=18)
        g.fig.suptitle('Number of observations by sector')
        plt.figure()
    
#     results['cum_intraday']=results.groupby(level = 1)['Intraday_return'].apply(lambda x : x.shift().fillna(0).add(1).cumprod()).values
#     results['cum_overnight']=results.groupby(level = 1)['Overnight_return'].apply(lambda x : x.shift().fillna(0).add(1).cumprod()).values
        
    return results

    
In [4]:
class Volatility(CustomFactor):  
    inputs = [USEquityPricing.close]  
    window_length = 20  
    def compute(self, today, assets, out, close):  
        # [0:-1] is needed to remove last close since diff is one element shorter  
        daily_returns = np.diff(close, axis = 0) / close[0:-1]  
        out[:] = daily_returns.std(axis = 0) * math.sqrt(252)
In [5]:
a = auto_heatmap(Volatility(), 
                 Fundamentals.pb_ratio, "Volatility", "PB ratio", 
                 5, '2014-01-01', '2017-11-06')
<matplotlib.figure.Figure at 0x7efd2c0c0d50>
<matplotlib.figure.Figure at 0x7efd22557ed0>
<matplotlib.figure.Figure at 0x7efd1c8f5d90>
<matplotlib.figure.Figure at 0x7efd07f78150>
<matplotlib.figure.Figure at 0x7efd076c4fd0>
<matplotlib.figure.Figure at 0x7efd0659cc10>
In [ ]:
 
In [6]:
a
Out[6]:
Intraday_return Overnight_return PB ratio PB ratio quantile Sector Volatility Volatility quantile close close_previous first_30 last_30 open
2014-01-02 00:00:00+00:00 Equity(24 [AAPL]) 0.012613 -0.000595 3.861000 3 311 0.191030 3 561.160 554.500 0.008643 0.003092 554.170
Equity(62 [ABT]) -0.001042 -0.000521 2.357400 1 206 0.194415 3 38.340 38.400 -0.003387 0.001305 38.380
Equity(67 [ADSK]) 0.010645 0.004236 5.252100 3 311 0.234711 3 50.320 49.580 0.002811 0.000000 49.790
Equity(114 [ADBE]) 0.004530 0.001008 4.418900 3 311 0.513567 4 59.870 59.540 0.002516 0.001505 59.600
Equity(122 [ADI]) -0.001373 0.002950 3.342200 2 311 0.108179 0 50.930 50.850 -0.000392 0.001179 51.000
Equity(128 [ADM]) -0.008225 0.001831 1.419000 0 205 0.231050 3 43.410 43.690 -0.002741 0.002123 43.770
Equity(161 [AEP]) -0.000641 0.002787 1.417400 0 207 0.111747 0 46.740 46.640 -0.001502 0.002364 46.770
Equity(166 [AES]) 0.003460 -0.000692 2.421300 1 207 0.275803 4 14.500 14.460 0.001384 0.000000 14.450
Equity(168 [AET]) 0.005572 0.000881 1.771200 1 206 0.190163 3 68.580 68.140 0.002052 0.001167 68.200
Equity(185 [AFL]) -0.001122 0.002699 2.099100 1 103 0.106505 0 66.795 66.690 -0.002093 0.001124 66.870
Equity(205 [AGN]) 0.002980 0.000361 5.115100 3 206 0.237003 3 111.080 110.710 -0.004785 0.000630 110.750
Equity(216 [HES]) 0.001218 0.003389 1.092300 0 309 0.139268 1 83.001 82.620 -0.001206 0.001218 82.900
Equity(239 [AIG]) -0.002929 0.001761 0.743900 0 103 0.177821 2 51.060 51.120 0.001366 0.001176 51.210
Equity(328 [ALTR]) -0.001842 0.004625 2.941200 2 311 0.145980 1 32.520 32.430 -0.001841 0.000338 32.580
Equity(337 [AMAT]) 0.008842 0.002001 3.003900 2 311 0.182605 2 17.685 17.495 0.002281 0.001132 17.530
Equity(351 [AMD]) -0.001292 0.007812 5.157300 3 311 0.200419 3 3.865 3.840 -0.002583 0.001554 3.870
Equity(357 [TWX]) 0.000718 0.000000 2.086800 1 102 0.160053 1 69.720 69.670 0.003731 0.000574 69.670
Equity(368 [AMGN]) -0.015529 0.003724 3.895600 3 206 0.131127 0 114.110 115.480 -0.008541 0.002724 115.910
Equity(438 [AON]) 0.003949 0.003844 3.096900 2 103 0.141769 1 83.890 83.240 0.008018 0.002749 83.560
Equity(448 [APA]) -0.002438 -0.000116 1.018400 0 309 0.101878 0 85.940 86.160 -0.003598 0.003503 86.150
Equity(455 [APC]) 0.003543 -0.000759 1.827800 1 309 0.251986 4 79.320 79.100 0.002277 0.001262 79.040
Equity(460 [APD]) -0.006487 -0.000622 3.257300 2 101 0.186469 2 111.800 112.600 -0.002043 -0.000357 112.530
Equity(559 [ASH]) 0.003413 0.001554 1.618400 0 101 0.124351 0 97.020 96.540 0.003826 0.002998 96.690
Equity(630 [ADP]) -0.005416 0.001973 6.215000 3 310 0.135836 1 80.800 81.080 -0.004431 -0.000432 81.240
Equity(660 [AVP]) -0.001159 0.004075 6.729500 4 205 0.197949 3 17.230 17.180 -0.000579 -0.001738 17.250
Equity(679 [AXP]) 0.009569 0.003125 4.950500 3 103 0.141607 1 90.730 89.590 0.007455 0.002541 89.870
Equity(693 [AZO]) -0.011949 0.009053 126.582300 4 102 0.149520 1 477.960 479.400 0.004838 0.001385 483.740
Equity(698 [BA]) 0.002424 0.001766 6.858700 4 310 0.124785 0 136.490 135.920 0.001395 0.003012 136.160
Equity(700 [BAC]) -0.001923 0.003861 0.751900 0 103 0.172708 2 15.570 15.540 -0.003205 0.002252 15.600
Equity(734 [BAX]) 0.002884 0.001155 4.462300 3 206 0.140389 1 69.540 69.260 0.000144 0.000143 69.340
... ... ... ... ... ... ... ... ... ... ... ... ... ...
2017-11-06 00:00:00+00:00 Equity(44990 [HDS]) 0.009220 0.000279 5.960795 3 310 0.193941 2 36.120 35.780 0.008102 0.000276 35.790
Equity(45451 [FEYE]) -0.012559 0.003064 3.455393 2 311 0.384252 4 14.545 14.685 -0.008825 -0.001373 14.730
Equity(45503 [AAOI]) -0.037913 0.000509 2.374122 1 311 0.854140 4 37.810 39.280 -0.022137 -0.008652 39.300
Equity(45815 [TWTR]) 0.000503 0.008629 3.060747 2 311 0.766576 4 19.880 19.700 -0.006039 -0.004755 19.870
Equity(45971 [AAL]) 0.001900 0.000000 5.750958 3 310 0.301183 3 47.450 47.360 -0.006136 0.001057 47.360
Equity(45993 [HLT]) 0.010915 -0.001104 16.176673 4 102 0.100086 0 73.170 72.460 0.005731 0.002870 72.380
Equity(46015 [ALLY]) 0.009077 -0.003956 0.869190 0 103 0.191665 2 26.680 26.545 0.000756 -0.002989 26.440
Equity(46240 [RICE]) 0.008153 0.000709 1.914765 1 309 0.394986 4 28.440 28.190 -0.006380 -0.003154 28.210
Equity(46693 [GRUB]) 0.026238 -0.003945 5.226548 3 311 0.423476 4 62.190 60.840 0.007590 -0.001284 60.600
Equity(46989 [PE]) 0.029555 -0.000374 1.884679 1 309 0.350937 4 27.520 26.740 0.012345 -0.004161 26.730
Equity(47063 [ANET]) -0.002452 0.115289 10.763449 4 311 0.529197 4 201.340 180.971 -0.029033 -0.001141 201.835
Equity(47163 [INFO]) 0.011395 0.001631 2.252356 1 310 0.123675 0 43.490 42.930 -0.006976 0.001266 43.000
Equity(47415 [SYF]) -0.000302 0.001512 1.799167 1 103 0.237390 3 33.110 33.070 0.001207 0.000755 33.120
Equity(47777 [CFG]) 0.003619 -0.001806 0.978493 0 103 0.151501 1 38.820 38.750 -0.000775 0.000000 38.680
Equity(48384 [QRVO]) -0.006859 0.000538 1.912897 1 311 0.245718 3 73.840 74.310 -0.027706 0.008977 74.350
Equity(49060 [SHOP]) -0.020445 0.008710 9.918971 4 311 0.529541 4 98.700 99.890 0.001786 0.000516 100.760
Equity(49210 [CC]) -0.009214 -0.057138 17.000385 4 101 0.279123 3 52.155 55.830 -0.044441 0.007149 52.640
Equity(49229 [KHC]) 0.001669 -0.002050 1.628985 0 205 0.152031 1 78.000 78.030 0.000647 0.000129 77.870
Equity(49242 [PYPL]) 0.013956 0.001800 5.715928 3 103 0.260742 3 73.380 72.240 -0.001036 0.003967 72.370
Equity(49288 [LITE]) -0.012500 0.020408 5.734831 3 311 0.486695 4 59.250 58.800 -0.045000 0.007327 60.000
Equity(49506 [HPE]) -0.008811 0.000000 0.753577 0 311 0.267305 3 13.500 13.620 -0.009151 0.001491 13.620
Equity(49610 [SQ]) 0.018217 0.004157 20.113326 4 311 0.273005 3 36.890 36.080 0.000276 0.000000 36.230
Equity(50070 [HTZ]) 0.023639 -0.004622 2.684255 1 310 0.251393 3 24.250 23.800 0.024482 -0.000412 23.690
Equity(50077 [TWLO]) -0.003624 0.000000 7.762106 3 311 0.268301 3 30.240 30.350 -0.020560 0.000993 30.350
Equity(50242 [DVMT]) -0.009917 -0.002077 1.006670 0 311 0.105838 0 80.870 81.850 -0.001934 -0.003415 81.680
Equity(50392 [YUMC]) 0.038481 0.002738 5.596153 3 102 0.234972 3 41.830 40.170 0.016027 0.003004 40.280
Equity(50428 [AA]) -0.002751 -0.004425 1.487254 0 101 0.259417 3 47.120 47.460 -0.010582 -0.001800 47.250
Equity(50499 [EVHC]) 0.001481 -0.008443 0.514510 0 206 1.295999 4 27.050 27.240 0.008515 -0.001476 27.010
Equity(50683 [SNAP]) 0.043716 0.006186 5.162674 3 311 0.650424 4 15.280 14.550 0.019877 0.002295 14.640
Equity(50716 [DXC]) 0.008714 0.000110 2.168668 1 311 0.173054 1 91.450 90.650 0.002426 -0.002073 90.660

461520 rows × 12 columns

In [ ]: