Notebook
In [64]:
from quantopian.research import run_pipeline
from quantopian.pipeline import Pipeline
from quantopian.pipeline import CustomFactor
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.factors import SimpleMovingAverage, Returns
from quantopian.pipeline.filters.morningstar import Q1500US
from quantopian.pipeline.filters.morningstar import Q500US
from quantopian.pipeline.classifiers.morningstar import Sector
from quantopian.pipeline.data import morningstar
import numpy as np
import talib
import math
In [ ]:
 
In [65]:
def make_pipeline():
    sma_20 = SimpleMovingAverage(inputs=[USEquityPricing.close], window_length=20)
    sma_50 = SimpleMovingAverage(inputs=[USEquityPricing.close], window_length=50)
    sma_10 = SimpleMovingAverage(inputs=[USEquityPricing.close], window_length=10)
    sma_200 = SimpleMovingAverage(inputs=[USEquityPricing.close], window_length=200)
    pipe =  Pipeline(
        columns={'Close': USEquityPricing.close.latest,
                 'M_Cap': morningstar.valuation.market_cap.latest,
                 'Sector': Sector(),
                 'Style': morningstar.asset_classification.style_box.latest,
                 'Div': morningstar.valuation_ratios.dividend_yield.latest,
                 'PE': morningstar.valuation_ratios.pe_ratio.latest,
                 'PB': morningstar.valuation_ratios.pb_ratio.latest,
                 'Cash': morningstar.valuation_ratios.cash_return.latest,
                 'ROIC': morningstar.operation_ratios.roic.latest,
                 'Margin': morningstar.operation_ratios.operation_margin.latest,
                 'Current': morningstar.operation_ratios.current_ratio.latest,
                 'sma_10': sma_10,
                 'sma_20': sma_20,
                 'sma_50': sma_50,
                 'sma_200': sma_200
                },
    screen = Q1500US()
    )
    return pipe
In [98]:
start = '2016-01-03'
stocks = run_pipeline(make_pipeline(), start, start)

stocks = stocks[np.isfinite(stocks['M_Cap'])] #remove stocks with unknown market cap
nulls = stocks.isnull()
stocks.loc[nulls.Div,['Div']] = 0 #set NaN dividend yields to 0
stocks = stocks[np.isfinite(stocks['Div'])] #remove stocks that still have unknown dividend yield
stocks = stocks[np.isfinite(stocks['PE'])] #remove stocks that still have unknown P/E ratios
stocks = stocks[np.isfinite(stocks['ROIC'])]

pe = stocks['PE']
[]
In [100]:
start = '2016-01-03'
end = '2016-04-03'
walk_forward_returns = get_pricing(stocks.index, fields='price', start_date=start, end_date=end).pct_change()[1:]
walk_forward_returns = np.mean(walk_forward_returns)
print 'The Walk Forward Returns\n'
print walk_forward_returns
print '\n'

ValueErrorTraceback (most recent call last)
<ipython-input-100-d383ee6b1c56> in <module>()
      1 start = '2016-01-03'
      2 end = '2016-04-03'
----> 3 walk_forward_returns = get_pricing(stocks.index, fields='price', start_date=start, end_date=end).pct_change()[1:]
      4 walk_forward_returns = np.mean(walk_forward_returns)
      5 print 'The Walk Forward Returns\n'

/build/src/qexec_repo/qexec/research/api.py in get_pricing(symbols, start_date, end_date, symbol_reference_date, frequency, fields, handle_missing)
    238             asset_data_dir=asset_data_dir,
    239             findata_dir=findata_dir,
--> 240             user_id=user_id,
    241         )
    242 

/build/src/qexec_repo/qexec/research/_api.pyc in inner_get_pricing(symbols, start_date, end_date, symbol_reference_date, frequency, fields, handle_missing, asset_data_dir, findata_dir, user_id)
    562     # this docstring gets shown to the user in research.
    563 
--> 564     symbols, symbols_is_scalar = validate_symbols_input(symbols)
    565     fields, fields_is_scalar = validate_fields(fields)
    566 

/build/src/qexec_repo/qexec/research/validation.pyc in validate_symbols_input(symbols_input)
    335         except ValueError:
    336             # One of the yielded values isn't convertible.  Barf.
--> 337             _iterable_input_not_security_convertible(type(value), idx)
    338     return out, False

/build/src/qexec_repo/qexec/research/validation.pyc in _iterable_input_not_security_convertible(input_type, idx)
    109         """
    110     ).format(input_type=input_type, idx=idx)
--> 111     raise ValueError(msg)
    112 
    113 

ValueError: 
Unexpected `symbols` entry of type <type 'tuple'> at index 0.

`symbols` must be a string, integer, Asset, or iterable of same.
In [ ]:
 
In [72]:
import scipy.stats as stats
import matplotlib.pyplot as plt

plt.scatter(pe, returns)
plt.xlabel('PE')
plt.ylabel('Returns')

r_s = stats.spearmanr(pe, returns)
print 'Correlation Coefficient: ' + str(r_s[0])
print 'p-value: ' + str(r_s[1])

ValueErrorTraceback (most recent call last)
<ipython-input-72-03b36f3feb10> in <module>()
      2 import matplotlib.pyplot as plt
      3 
----> 4 plt.scatter(pe, returns)
      5 plt.xlabel('PE')
      6 plt.ylabel('Returns')

/usr/local/lib/python2.7/dist-packages/matplotlib/pyplot.pyc in scatter(x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, hold, data, **kwargs)
   3249                          vmin=vmin, vmax=vmax, alpha=alpha,
   3250                          linewidths=linewidths, verts=verts,
-> 3251                          edgecolors=edgecolors, data=data, **kwargs)
   3252     finally:
   3253         ax.hold(washold)

/usr/local/lib/python2.7/dist-packages/matplotlib/__init__.pyc in inner(ax, *args, **kwargs)
   1810                     warnings.warn(msg % (label_namer, func.__name__),
   1811                                   RuntimeWarning, stacklevel=2)
-> 1812             return func(ax, *args, **kwargs)
   1813         pre_doc = inner.__doc__
   1814         if pre_doc is None:

/usr/local/lib/python2.7/dist-packages/matplotlib/axes/_axes.pyc in scatter(self, x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, **kwargs)
   3838         y = np.ma.ravel(y)
   3839         if x.size != y.size:
-> 3840             raise ValueError("x and y must be the same size")
   3841 
   3842         s = np.ma.ravel(s)  # This doesn't have to match x, y in size.

ValueError: x and y must be the same size
In [ ]: