Notebook

International Factor Research - Alphalens Example

In [1]:
from quantopian.pipeline import Pipeline, CustomFactor
from quantopian.pipeline.data import EquityPricing, factset
from quantopian.pipeline.factors import Returns, SimpleMovingAverage, AverageDollarVolume
from quantopian.pipeline.domain import (
    AT_EQUITIES, # Austria
    AU_EQUITIES, # Australia
    BE_EQUITIES, # Belgium
    CA_EQUITIES, # Canada
    CH_EQUITIES, # Switzerland
    CN_EQUITIES, # China
    DE_EQUITIES, # Germany
    DK_EQUITIES, # Denmark
    ES_EQUITIES, # Spain
    FI_EQUITIES, # Finland
    FR_EQUITIES, # France
    GB_EQUITIES, # Great Britain
    HK_EQUITIES, # Hong Kong
    IE_EQUITIES, # Ireland
    IN_EQUITIES, # India
    IT_EQUITIES, # Italy
    JP_EQUITIES, # Japan
    NL_EQUITIES, # Netherlands
    NO_EQUITIES, # Norway
    NZ_EQUITIES, # New Zealand
    PT_EQUITIES, # Portugal
    SE_EQUITIES, # Sweden
    SG_EQUITIES, # Singapore
    US_EQUITIES, # United States
)
from quantopian.research import run_pipeline
from quantopian.pipeline.filters import Q500US
# from quantopian.pipeline.classifiers.fundamentals import Sector
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# import talib as ta

The below helper function makes it easier to get Alphalens-formatted factor and returns data given a pipeline factor, a domain, and date bounds.

In [2]:
def evaluate_factor(factor, 
                    domain, 
                    start_date, 
                    end_date,
                    factor_screen=None,
                    quantiles=5,
                    returns_lengths=(1, 5, 10),
                    session = 'Overnight',
                    chunksize = None
                   ):
    """Analyze a Pipeline Factor using Alphalens.
    
    Parameters
    ----------
    factor : quantopian.pipeline.factors.Factor
        Factor producing scores to be evaluated.
    domain : quantopian.pipeline.domain.Domain
        Domain on which the factor should be evaluated.
    start_date : str or pd.Timestamp
        Start date for evaluation period.
    end_date : str or pd.Timestamp
        End date for evaluation period.
    standardize : 
    factor_screen : quantopian.pipeline.filters.Filter, optional
        Filter defining which assets ``factor`` should be evaluated on.
        Default is ``factor.notnull()``.
    quantiles : int, optional
        Number of buckets to use for quantile groups. Default is 5
    returns_lengths : sequence[int]
        Forward-returns horizons to use when evaluating ``factor``. 
        Default is 1-day, 5-day, and 10-day returns.
    session: str
        "Overnight", "Intraday", "Daily"
        
    Returns
    -------
    factor_data : pd.DataFrame
        A (date, asset)-indexed DataFrame with the following columns:
            'factor': float64
                Values produced by ``factor``.
            'factor_quantiles': int64
                Daily quantile label for each
    """
    calendar = domain.calendar

    # Roll input dates to the next trading session.
    start_date = calendar.minute_to_session_label(pd.Timestamp(start_date, tz='UTC'))
    end_date = calendar.minute_to_session_label(pd.Timestamp(end_date, tz='UTC'))
    
    if factor_screen is None:
        factor_screen = factor.notnull()
        
        
    # Run pipeline to get factor values and quantiles.
    factor_pipe = Pipeline(
        {'factor': factor, 
         'factor_quantile': factor.quantiles(quantiles, mask=factor_screen)},
        screen=factor_screen,
        domain=domain,
    )
    # Put chunksize ~252-504 if you run into memory problems 
    factor_results = run_pipeline(factor_pipe, start_date, end_date, chunksize=chunksize)
    
    class Daily(CustomFactor):  
        inputs = [EquityPricing.close]  

        def compute(self, today, assets, out, close):  
            out[:] = close[-1] / close[0] - 1
            
    class Overnight(CustomFactor):  
        inputs = [EquityPricing.close, EquityPricing.open]  

        def compute(self, today, assets, out, close, open):  
            out[:] = np.cumprod(open[1:] / close[:-1], axis=0)[-1] - 1
            
    class Intraday(CustomFactor):  
        inputs = [EquityPricing.close, EquityPricing.open]  

        def compute(self, today, assets, out, close, open):  
            out[:] = np.cumprod(close / open, axis=0)[-1] - 1
    
    column_order = []
    returns_cols = {}
    for length in returns_lengths:
        colname = '{}D'.format(length)
        column_order.append(colname)
        
        # Add 1 because "1-day" returns needs 2 price observations.
        # Not relevant for Intraday.
        # Winsorize returns to handle data gliches
        # Example: get_pricing("BRK_A", start_date='2014-11-03', end_date='2014-11-08')
        # 0.002 * ~500 (companies per day) = 1 (from each side)
        if session == 'Overnight':
            returns_cols[colname] = Overnight(window_length=length + 1).winsorize(.002, .998)
        elif session == "Intraday":
            returns_cols[colname] = Intraday(window_length=length).winsorize(.002, .998)
        elif session == "Daily":
            returns_cols[colname] = Daily(window_length=length + 1).winsorize(.002, .998)
        else:
            raise SystemExit("session should be one of 'Overnight', 'Intraday', 'Daily'")
        

    returns_pipe = Pipeline(returns_cols, domain=domain)
    
    # Compute returns for the period after the factor pipeline, then 
    # shift the results back to align with our factor values.
    returns_start_date = start_date
    returns_end_date = end_date + domain.calendar.day * max(returns_lengths)
    raw_returns = run_pipeline(returns_pipe, returns_start_date, returns_end_date, chunksize=252)
    
    shifted_returns = {}
    for name, length in zip(column_order, returns_lengths):
        # Shift 1-day returns back by a day, 5-day returns back by 5 days, etc.
        raw = raw_returns[name]
        shifted_returns[name] = backshift_returns_series(raw, length)
        
    # Merge backshifted returns into a single frame indexed like our desired output.
    merged_returns = pd.DataFrame(
        data=shifted_returns, 
        index=factor_results.index, 
        columns=column_order,
    )
    
    # Concat factor results and forward returns column-wise.
    merged = pd.concat([factor_results, merged_returns], axis=1)
    merged.index.set_names(['date', 'asset'], inplace=True)

    return merged.dropna(how='any')


def backshift_returns_series(series, N):
    """Shift a multi-indexed series backwards by N observations in the first level.
    
    This can be used to convert backward-looking returns into a forward-returns series.
    """
    ix = series.index
    dates, sids = ix.levels
    date_labels, sid_labels = map(np.array, ix.labels)

    # Output date labels will contain all but the last N dates.
    new_dates = dates[:-N]

    # Output data will remove the first M rows, where M is the index of the
    # last record with one of the first N dates.
    cutoff = date_labels.searchsorted(N)
    new_date_labels = date_labels[cutoff:] - N
    new_sid_labels = sid_labels[cutoff:]
    new_values = series.values[cutoff:]

    assert new_date_labels[0] == 0

    new_index = pd.MultiIndex(
        levels=[new_dates, sids],
        labels=[new_date_labels, new_sid_labels],
        sortorder=1,
        names=ix.names,
    )

    return pd.Series(data=new_values, index=new_index)
In [3]:
# Low Volatility factor
class MyFactor (CustomFactor):  
  
        inputs = [Returns(window_length=2)]  
        window_length=252

        def compute(self, today, assets, out, returns):  
            out[:] = -np.nanstd(returns, axis=0)
In [4]:
# Yield Factor
from quantopian.pipeline.data import morningstar

class Yield(CustomFactor):  
    inputs = [morningstar.valuation_ratios.total_yield]  
    window_length = 1  
    def compute(self, today, assets, out, syield):  
        out[:] =  syield[-1]

Define your factors and filters here:

In [5]:
Yield1= Yield().zscore().winsorize(.005, .995)
volatility_fact=MyFactor().zscore().winsorize(.005, .995)




my_factor = volatility_fact + Yield1

# Create a volume filter that filters for stocks in the top 10% companies based on Average Dollar Volume.
avg_dollar_vol = AverageDollarVolume(window_length = 63)
volume_filter = avg_dollar_vol.percentile_between(90, 100, mask=(avg_dollar_vol > 0))
In [6]:
# Call evaluate_factor on your factor to get Alphalens-formatted data.
al_data = evaluate_factor(
    factor = my_factor, 
    domain = US_EQUITIES, 
    start_date = '2010-01-01', 
    end_date = '2017-11-06', 
    factor_screen = volume_filter & Q500US(), # Remove Q500US() if using non-US market
    session = "Intraday", # Can be "Overnight", "Intraday", "Daily"
    quantiles = 5,
    returns_lengths = (1, 5, 10),
    chunksize = None # Put chunksize ~252-504 if you run into memory problems
)
/usr/local/lib/python2.7/dist-packages/numpy/lib/nanfunctions.py:1202: RuntimeWarning: Degrees of freedom <= 0 for slice.
  warnings.warn("Degrees of freedom <= 0 for slice.", RuntimeWarning)

Results index reference:

t(0) = index of results

  • Overnight_Returns (1D): From t(-1) close to t(0) open
  • Intraday_Returns (1D): From t(0) open to t(0) close
  • Daily Returns (1D): From t(-1) close to t(0) close
  • Factors should be as of Close of t(-1)
In [7]:
# Import Alphalens and run our factor data through a tear sheet.
from alphalens.tears import create_full_tear_sheet

create_full_tear_sheet(al_data)
Quantiles Statistics
min max mean std count count %
factor_quantile
0 -5.009287 0.111819 -0.509257 0.318384 189284 20.063173
1 -0.482168 0.217991 -0.129840 0.152623 188157 19.943717
2 -0.196572 0.626737 0.166137 0.165479 188340 19.963114
3 -0.037343 1.128047 0.462371 0.234858 188399 19.969367
4 0.049178 6.169489 1.167762 0.731978 189260 20.060629
Returns Analysis
1D 5D 10D
Ann. alpha 0.097 0.103 0.103
beta -0.241 -0.246 -0.235
Mean Period Wise Return Top Quantile (bps) 2.516 2.618 2.585
Mean Period Wise Return Bottom Quantile (bps) -5.486 -5.697 -5.736
Mean Period Wise Spread (bps) 8.002 8.375 8.383
/usr/local/lib/python2.7/dist-packages/alphalens/tears.py:258: UserWarning: 'freq' not set in factor_data index: assuming business day
  UserWarning
<matplotlib.figure.Figure at 0x7f90a091a1d0>
Information Analysis
1D 5D 10D
IC Mean 0.024 0.041 0.058
IC Std. 0.168 0.166 0.165
Risk-Adjusted IC 0.143 0.249 0.348
t-stat(IC) 6.336 11.065 15.486
p-value(IC) 0.000 0.000 0.000
IC Skew 0.123 0.226 0.186
IC Kurtosis 0.359 0.328 0.249

ValueErrorTraceback (most recent call last)
<ipython-input-7-3dba5307e48e> in <module>()
      2 from alphalens.tears import create_full_tear_sheet
      3 
----> 4 create_full_tear_sheet(al_data)

/usr/local/lib/python2.7/dist-packages/alphalens/plotting.pyc in call_w_context(*args, **kwargs)
     43             with plotting_context(), axes_style(), color_palette:
     44                 sns.despine(left=True)
---> 45                 return func(*args, **kwargs)
     46         else:
     47             return func(*args, **kwargs)

/usr/local/lib/python2.7/dist-packages/alphalens/tears.pyc in create_full_tear_sheet(factor_data, long_short, group_neutral, by_group)
    488                                   by_group,
    489                                   set_context=False)
--> 490     create_turnover_tear_sheet(factor_data, set_context=False)
    491 
    492 

/usr/local/lib/python2.7/dist-packages/alphalens/plotting.pyc in call_w_context(*args, **kwargs)
     45                 return func(*args, **kwargs)
     46         else:
---> 47             return func(*args, **kwargs)
     48     return call_w_context
     49 

/usr/local/lib/python2.7/dist-packages/alphalens/tears.pyc in create_turnover_tear_sheet(factor_data, turnover_periods)
    415                        for q in range(1, int(quantile_factor.max()) + 1)],
    416                       axis=1)
--> 417             for p in turnover_periods}
    418 
    419     autocorrelation = pd.concat(

/usr/local/lib/python2.7/dist-packages/alphalens/tears.pyc in <dictcomp>((p,))
    415                        for q in range(1, int(quantile_factor.max()) + 1)],
    416                       axis=1)
--> 417             for p in turnover_periods}
    418 
    419     autocorrelation = pd.concat(

/usr/local/lib/python2.7/dist-packages/alphalens/performance.pyc in quantile_turnover(quantile_factor, quantile, period)
    738         shifted_idx = utils.add_custom_calendar_timedelta(
    739                 quant_name_sets.index, -pd.Timedelta(period),
--> 740                 quantile_factor.index.levels[0].freq)
    741         name_shifted = quant_name_sets.reindex(shifted_idx)
    742         name_shifted.index = quant_name_sets.index

/usr/local/lib/python2.7/dist-packages/alphalens/utils.pyc in add_custom_calendar_timedelta(input, timedelta, freq)
    915     """
    916     if not isinstance(freq, (Day, BusinessDay, CustomBusinessDay)):
--> 917         raise ValueError("freq must be Day, BDay or CustomBusinessDay")
    918     days = timedelta.components.days
    919     offset = timedelta - pd.Timedelta(days=days)

ValueError: freq must be Day, BDay or CustomBusinessDay
In [ ]:
al_data

Plot Number of companies per day

pyfolio analysis:

In [8]:
from alphalens.performance import create_pyfolio_input

import alphalens
import pyfolio

pf_returns, pf_positions, pf_benchmark = \
    create_pyfolio_input(al_data,
                         period='1D',
                         capital=1000000,
                         long_short=True,
                         group_neutral=False,
                         equal_weight=False, # Equal weight vs weight based on alpha factor
                         quantiles=[0,4], # Choose the "best" quantiles to trade based on your analysis above
                         groups=None,
                         benchmark_period='1D')
/usr/local/lib/python2.7/dist-packages/alphalens/performance.py:394: UserWarning: 'freq' not set, using business day calendar
  UserWarning)
/usr/local/lib/python2.7/dist-packages/alphalens/performance.py:541: UserWarning: 'freq' not set, using business day calendar
  UserWarning)
In [9]:
from pyfolio.tears import create_full_tear_sheet

create_full_tear_sheet(pf_returns,
                       positions=pf_positions,
                       benchmark_rets=pf_benchmark,
                       round_trips=True)
Start date2010-01-05
End date2017-11-07
Total months136
Backtest
Annual return 7.7%
Cumulative returns 131.7%
Annual volatility 5.2%
Sharpe ratio 1.45
Calmar ratio 1.10
Stability 0.97
Max drawdown -7.0%
Omega ratio 1.35
Sortino ratio 2.29
Skew 0.31
Kurtosis 3.59
Tail ratio 1.19
Daily value at risk -0.6%
Gross leverage 0.97
Alpha 0.09
Beta -0.30
Worst drawdown periods Net drawdown in % Peak date Valley date Recovery date Duration
0 6.97 2014-12-09 2015-04-16 2015-09-29 211
1 5.71 2010-02-10 2010-04-26 2010-05-21 73
2 5.58 2011-10-04 2011-11-07 2011-12-14 52
3 4.07 2017-08-13 2017-10-04 NaT NaN
4 4.05 2011-12-20 2012-02-07 2012-04-05 78
/usr/local/lib/python2.7/dist-packages/numpy/lib/function_base.py:3834: RuntimeWarning: Invalid value encountered in percentile
  RuntimeWarning)
Stress Events mean min max
US downgrade/European Debt Crisis 0.11% -1.31% 1.79%
Fukushima 0.06% -0.59% 0.65%
EZB IR Event 0.01% -1.06% 0.87%
Flash Crash 0.31% -0.37% 1.01%
Apr14 0.13% -0.74% 1.37%
Oct14 0.07% -1.14% 0.96%
Fall2015 0.07% -0.84% 1.23%
Recovery 0.04% -1.66% 1.79%
New Normal 0.03% -1.35% 1.37%
Top 10 long positions of all time max
HRB 3.33%
INCY 3.22%
CRUS 3.11%
MSI 2.99%
TPX 2.97%
FTR 2.88%
STX 2.71%
FIS 2.67%
HLF 2.61%
AAL 2.57%
Top 10 short positions of all time max
ICPT -5.57%
PLUG -4.42%
SM -4.14%
CLF -3.42%
ACHN -3.26%
ARIA -3.12%
AA -2.90%
TSRO -2.84%
WPX -2.70%
OAS -2.68%
Top 10 positions of all time max
ICPT 5.57%
PLUG 4.42%
SM 4.14%
CLF 3.42%
HRB 3.33%
ACHN 3.26%
INCY 3.22%
ARIA 3.12%
CRUS 3.11%
MSI 2.99%
All positions ever held max
ICPT 5.57%
PLUG 4.42%
SM 4.14%
CLF 3.42%
HRB 3.33%
ACHN 3.26%
INCY 3.22%
ARIA 3.12%
CRUS 3.11%
MSI 2.99%
TPX 2.97%
AA 2.90%
FTR 2.88%
TSRO 2.84%
STX 2.71%
WPX 2.70%
OAS 2.68%
FIS 2.67%
HLF 2.61%
AAL 2.57%
NLY 2.57%
LOW 2.53%
ADT 2.40%
ATVI 2.40%
TRV 2.36%
YUM 2.35%
OCN 2.31%
SLM 2.31%
LBTY_A 2.30%
SRPT 2.28%
HSH 2.25%
PE 2.23%
RSH 2.19%
SWY 2.17%
AKS 2.12%
ANTM 2.12%
NOV 2.11%
NRF 2.11%
ESI 2.09%
SIG 2.08%
STRZ_A 2.07%
GPOR 2.06%
RICE 2.06%
CPRI 2.02%
GLW 2.01%
NVLS 2.00%
CIT 2.00%
APOL 1.99%
CAM 1.99%
AGNC 1.99%
WTW 1.98%
BBY 1.95%
AAPL 1.95%
MS 1.93%
DLTR 1.92%
MET 1.85%
CTXS 1.85%
LRCX 1.84%
AIG 1.82%
CLVS 1.79%
AZO 1.78%
CBRE 1.76%
LNG 1.75%
ACIA 1.74%
FANG 1.73%
ANF 1.71%
LO 1.71%
BIIB 1.67%
EXPE 1.65%
NE 1.64%
HFC 1.63%
SLCA 1.61%
JNPR 1.61%
BBBY 1.60%
AAOI 1.60%
AGN 1.59%
GPS 1.58%
AR 1.58%
DISC_A 1.57%
SNAP 1.54%
CPN 1.54%
CSIQ 1.53%
FITB 1.52%
VVUS 1.52%
GMCR 1.51%
ESRX 1.49%
VOYA 1.49%
GXP 1.48%
WFT 1.47%
IONS 1.47%
FOSL 1.46%
TWLO 1.44%
LL 1.43%
NTAP 1.43%
M 1.42%
MRVL 1.42%
HBAN 1.42%
TGT 1.41%
WLL 1.40%
HPQ 1.40%
BRCD 1.37%
RSPP 1.36%
CENX 1.35%
XRX 1.35%
LDOS 1.35%
CHK 1.34%
GILD 1.34%
JWN 1.33%
ADS 1.32%
CTL 1.32%
HES 1.31%
ZNGA 1.31%
DGX 1.30%
DTV 1.30%
COP 1.30%
KSS 1.29%
JCI 1.29%
TWO 1.28%
AFL 1.28%
CF 1.28%
RIG 1.26%
ASH 1.26%
OCLR 1.25%
DF 1.25%
JCP 1.24%
HOG 1.24%
SNDK 1.23%
AMGN 1.23%
MNK 1.22%
KDP 1.21%
NOC 1.21%
MOS 1.21%
MON 1.20%
CB 1.20%
YELP 1.20%
PM 1.20%
UAL 1.20%
ARNA 1.20%
MGM 1.20%
X 1.19%
AMD 1.19%
IRM 1.19%
EQT 1.17%
BLUE 1.17%
GM 1.17%
NRG 1.16%
CIM 1.16%
SYMC 1.15%
LVS 1.15%
LNC 1.15%
FSLR 1.14%
HTZ 1.14%
RAD 1.13%
T 1.13%
BMRN 1.12%
SUNE 1.12%
ENDP 1.12%
GTAT 1.11%
TEX 1.10%
HUM 1.10%
SCCO 1.09%
CNC 1.09%
QCOM 1.08%
NFLX 1.08%
HIG 1.08%
ARO 1.08%
LYB 1.08%
MCP 1.07%
BAC 1.07%
MPC 1.06%
GME 1.06%
RH 1.06%
QEP 1.05%
GNW 1.05%
FNSR 1.05%
NDAQ 1.04%
QRVO 1.04%
FCX 1.03%
C 1.03%
URBN 1.03%
P 1.02%
LLL 1.02%
GRPN 1.02%
ZION 1.02%
PTEN 1.02%
ESV 1.02%
MLNX 1.01%
MCD 1.01%
CAR 1.01%
TRGP 1.01%
TEL 1.01%
QCOR 1.01%
SSYS 1.01%
DNKN 1.01%
ITW 1.00%
ABC 1.00%
RF 1.00%
AAP 1.00%
ANR 1.00%
HOT 0.99%
SHW 0.99%
HCA 0.99%
LCC 0.98%
AET 0.98%
TSLA 0.97%
LH 0.97%
HAS 0.97%
DRYS 0.96%
DNR 0.96%
SVU 0.96%
SWN 0.96%
IBM 0.96%
PALM 0.96%
FEYE 0.96%
DVA 0.96%
TGNA 0.95%
GT 0.95%
VER 0.95%
MNST 0.94%
OVTI 0.94%
CREE 0.94%
AABA 0.94%
SIRI 0.93%
SD 0.93%
ZG 0.93%
GLNG 0.93%
CLR 0.92%
GGP 0.92%
WIN 0.92%
AMP 0.92%
LMT 0.91%
WMB 0.91%
IR 0.91%
FB 0.91%
AMBA 0.90%
VMED 0.90%
GOOG_L 0.90%
STT 0.90%
MYL 0.90%
NVDA 0.90%
KR 0.89%
JOY 0.89%
PRGO 0.89%
CHRW 0.89%
STI 0.89%
EXEL 0.89%
GNC 0.89%
WFM 0.89%
STJ 0.88%
HRI 0.88%
SCTY 0.88%
SINA 0.88%
SYF 0.88%
CCEP 0.88%
VRSN 0.87%
ACI 0.87%
CNX 0.87%
RVBD 0.87%
AEO 0.87%
OII 0.87%
TWC 0.87%
VIAV 0.86%
COF 0.86%
URI 0.86%
LSI 0.86%
XL 0.86%
NUS 0.85%
SWK 0.85%
GS 0.85%
KITE 0.85%
CBS 0.84%
BTU 0.84%
ATHN 0.84%
TWX 0.84%
IDCC 0.83%
WRK 0.83%
TXT 0.83%
VLO 0.83%
FLS 0.83%
SLG 0.83%
PHM 0.83%
UTX 0.83%
SUN 0.83%
SHLD 0.82%
MUR 0.82%
SWC 0.82%
EBAY 0.82%
TPR 0.82%
WLT 0.82%
WY 0.82%
LINE 0.81%
WU 0.81%
CIEN 0.81%
RTN 0.81%
DDD 0.81%
NFX 0.81%
ORLY 0.80%
IQV 0.80%
DPZ 0.79%
SPWR 0.79%
HST 0.79%
DE 0.79%
SHOP 0.79%
PFE 0.79%
MWW 0.79%
IGT 0.78%
PRU 0.78%
ILMN 0.78%
ETR 0.78%
PCYC 0.78%
CA 0.78%
CVC 0.78%
TMUS 0.77%
HL 0.77%
HAL 0.77%
WYND 0.77%
KEY 0.77%
NBR 0.77%
PH 0.77%
PGR 0.77%
PFG 0.76%
SYNA 0.76%
IOC 0.76%
APA 0.76%
CDE 0.75%
FFIV 0.75%
PNC 0.75%
MCK 0.75%
PPO 0.75%
DVN 0.75%
DOV 0.74%
ARG 0.74%
ALL 0.74%
USG 0.74%
WFC 0.74%
JNJ 0.74%
FLR 0.74%
CAG 0.74%
SLXP 0.73%
OSK 0.73%
HPE 0.73%
XOM 0.72%
FDO 0.72%
NYX 0.72%
FST 0.71%
GE 0.71%
MEE 0.71%
RAX 0.71%
MAR 0.71%
MO 0.71%
CPB 0.71%
GWW 0.71%
S 0.71%
MU 0.70%
BDX 0.70%
MTG 0.69%
LMCA 0.69%
CSCO 0.69%
PGN 0.69%
RRC 0.69%
EXAS 0.68%
AMAT 0.68%
SRC 0.68%
SO 0.68%
ADM 0.68%
FDX 0.67%
BIG 0.67%
TIN 0.67%
MDVN 0.67%
XLNX 0.67%
THC 0.67%
OMC 0.67%
KMB 0.67%
DFS 0.67%
MRO 0.67%
KBH 0.67%
TRIP 0.66%
SPGI 0.66%
PAY 0.66%
ACN 0.66%
VECO 0.66%
SODA 0.66%
DUK 0.66%
ED 0.66%
SOHU 0.66%
WP 0.65%
PNR 0.65%
F 0.65%
DECK 0.65%
BCR 0.65%
APC 0.65%
LULU 0.65%
INFA 0.65%
GIS 0.64%
INFO 0.64%
PG 0.64%
ODP 0.64%
WMT 0.64%
PLCM 0.64%
TWTR 0.63%
BRK_B 0.63%
RCL 0.63%
LNKD 0.63%
CB 0.63%
SKX 0.63%
MBI 0.63%
MAT 0.63%
NOW 0.63%
TSN 0.63%
PEP 0.63%
CAT 0.63%
PLD 0.63%
VZ 0.63%
MMM 0.62%
WM 0.62%
KO 0.62%
SWKS 0.62%
DIS 0.62%
CRR 0.62%
WBA 0.62%
ARUN 0.62%
PANW 0.62%
CXO 0.62%
COTY 0.62%
GRUB 0.62%
MAC 0.62%
ABT 0.62%
RAI 0.61%
BA 0.61%
MJN 0.61%
FSL 0.61%
CHTR 0.61%
NTY 0.61%
KMI 0.61%
MBLY 0.60%
ANAC 0.60%
HNZ 0.60%
CLX 0.60%
DAL 0.60%
PSA 0.60%
PPL 0.60%
HSP 0.60%
ARNC 0.60%
CVS 0.60%
RFMD 0.60%
FTNT 0.60%
NAV 0.60%
MXIM 0.60%
YNDX 0.60%
COL 0.60%
ETFC 0.60%
EQIX 0.60%
ZBH 0.59%
INTC 0.59%
CYH 0.59%
ABBV 0.59%
Q 0.59%
FWLT 0.59%
HD 0.59%
TRN 0.59%
ECL 0.59%
CTV 0.59%
DRI 0.59%
EMR 0.59%
TRW 0.59%
XEL 0.59%
ULTA 0.59%
FLEX 0.59%
AMZN 0.59%
LEN 0.59%
LXK 0.59%
CRM 0.59%
FOXA 0.59%
MMC 0.59%
UPS 0.58%
AES 0.58%
NEM 0.58%
CL 0.58%
D 0.58%
SYY 0.58%
GPRO 0.58%
CBI 0.58%
EMC 0.58%
WWAV 0.58%
DISH 0.58%
K 0.58%
USB 0.58%
CCL 0.58%
HSY 0.58%
BEN 0.58%
WDC 0.58%
MHK 0.58%
ANDV 0.57%
MDLZ 0.57%
BKD 0.57%
TOL 0.57%
HDS 0.57%
ICE 0.57%
AON 0.57%
REGN 0.57%
JPM 0.57%
JCG 0.57%
ISRG 0.57%
WYNN 0.57%
OUTR 0.57%
ALXN 0.57%
RL 0.57%
PWR 0.57%
CVX 0.57%
PXD 0.57%
DELL 0.57%
PX 0.57%
TIE 0.57%
KMX 0.57%
NSC 0.57%
SPG 0.57%
CERN 0.57%
CNQR 0.57%
NWL 0.57%
MRK 0.56%
COG 0.56%
SAVE 0.56%
ON 0.56%
AYI 0.56%
STZ 0.56%
SRCL 0.56%
CIE 0.56%
LLY 0.56%
CI 0.56%
ADP 0.56%
GD 0.56%
COST 0.56%
AVB 0.56%
FISV 0.56%
RLGY 0.56%
OI 0.56%
BSX 0.56%
BWLD 0.55%
HCP 0.55%
BXP 0.55%
AGCO 0.55%
NCLH 0.55%
WOOF 0.55%
EXC 0.55%
MOS 0.55%
RDN 0.55%
CMCS_A 0.55%
PAYX 0.55%
TDG 0.55%
PCP 0.55%
HMA 0.55%
BAX 0.55%
FRX 0.55%
AEP 0.55%
NEE 0.55%
UPL 0.55%
LUV 0.55%
HAIN 0.55%
PNRA 0.55%
DXCM 0.55%
OIS 0.55%
CVI 0.54%
BKNG 0.54%
BMY 0.54%
CC 0.54%
WAB 0.54%
JAZZ 0.54%
SBAC 0.54%
AER 0.54%
PVH 0.54%
HLT 0.54%
DHI 0.54%
PCG 0.54%
HON 0.54%
ATI 0.54%
XEC 0.54%
SE 0.54%
SRE 0.54%
VMW 0.54%
DHR 0.54%
CSC 0.54%
CY 0.54%
SPN 0.54%
VMC 0.54%
APD 0.53%
CHKP 0.53%
JBLU 0.53%
BXLT 0.53%
CCI 0.53%
AKAM 0.53%
MA 0.53%
CTSH 0.53%
LM 0.53%
SYK 0.53%
BLK 0.53%
MDR 0.53%
ALLY 0.53%
EW 0.53%
MTB 0.52%
ROP 0.52%
EP 0.52%
PLD 0.52%
ZTS 0.52%
VFC 0.52%
ADBE 0.52%
V 0.52%
HP 0.52%
CMG 0.52%
MELI 0.51%
AMTD 0.51%
BWA 0.51%
UNP 0.51%
MSFT 0.51%
SCHW 0.51%
IP 0.51%
TDC 0.51%
EOG 0.51%
INTU 0.51%
KLAC 0.50%
IPG 0.50%
CMA 0.50%
HAR 0.50%
AMT 0.50%
SBUX 0.50%
FTV 0.50%
APH 0.50%
EA 0.50%
A 0.50%
TROW 0.50%
OXY 0.50%
JBL 0.50%
KHC 0.50%
FE 0.50%
CE 0.50%
DD 0.50%
EQR 0.49%
BBT 0.49%
EIX 0.49%
WELL 0.49%
UNM 0.49%
AVGO 0.49%
DO 0.49%
DTE 0.49%
FL 0.49%
MDT 0.49%
AXLL 0.49%
ATML 0.49%
COV 0.48%
TJX 0.48%
SIAL 0.48%
NYCB 0.48%
AGN 0.48%
ALTR 0.48%
RX 0.48%
KATE 0.48%
AXP 0.48%
KRFT 0.48%
CNP 0.48%
MLM 0.48%
VTR 0.48%
TMO 0.48%
BRCM 0.48%
O 0.47%
RHT 0.47%
KSU 0.47%
PEG 0.47%
MCO 0.47%
NUAN 0.47%
BEC 0.47%
OKE 0.47%
BK 0.47%
LB 0.47%
CAH 0.47%
AVP 0.47%
WEC 0.47%
BEAV 0.46%
DRC 0.46%
DOW 0.46%
ROST 0.46%
NBL 0.46%
ORCL 0.46%
BHI 0.46%
UNH 0.46%
SJM 0.46%
EMN 0.46%
HBI 0.46%
EL 0.46%
LEA 0.46%
RKT 0.46%
RGLD 0.46%
HRL 0.46%
GPN 0.45%
ALB 0.45%
FTI 0.45%
BLL 0.45%
ZAYO 0.45%
ES 0.45%
UTHR 0.45%
AMG 0.45%
OC 0.45%
QRTE_A 0.44%
TAP 0.44%
XRAY 0.44%
AME 0.44%
WNR 0.44%
PSX 0.44%
NCR 0.44%
KIM 0.44%
EFX 0.44%
GES 0.44%
TXN 0.44%
PBCT 0.44%
LIFE 0.43%
FLT 0.43%
ROC 0.43%
PCAR 0.43%
MCHP 0.43%
MAS 0.42%
VRTX 0.42%
WHR 0.42%
NI 0.42%
SNI 0.41%
PETM 0.41%
SEE 0.41%
UHS 0.41%
TSCO 0.41%
SPLS 0.41%
NLC 0.40%
LITE 0.40%
RMBS 0.40%
ADSK 0.40%
SFD 0.40%
STLD 0.40%
DKS 0.39%
CFN 0.39%
DG 0.39%
COO 0.39%
NTRS 0.39%
HUN 0.38%
SQ 0.38%
YUMC 0.38%
CLB 0.37%
CSX 0.37%
ETN 0.37%
PPG 0.36%
IVZ 0.36%
LZ 0.36%
WSM 0.36%
OLED 0.35%
REG 0.35%
COLE 0.34%
PII 0.34%
W 0.33%
FRC 0.33%
PCL 0.33%
CMI 0.32%
VNO 0.32%
HSIC 0.31%
EVHC 0.31%
COHR 0.30%
ANET 0.28%
CNW 0.28%
CFG 0.28%
GRMN 0.27%
RSG 0.27%
DLR 0.27%
CELG 0.27%
SPLK 0.27%
TLAB 0.25%
NKE 0.25%
WDAY 0.25%
NLSN 0.25%
CVH 0.24%
AKRX 0.23%
JCI 0.22%
APTV 0.21%
HCBK 0.18%
ALK 0.18%
PBI 0.16%
TTWO 0.16%
ALGN 0.15%
JBHT 0.12%
HOLX 0.09%
In [ ]: