from quantopian.pipeline import Pipeline
from quantopian.pipeline.data import USEquityPricing
from quantopian.pipeline.experimental import QTradableStocksUS
from quantopian.research import run_pipeline
from quantopian.pipeline.data import Fundamentals
def make_pipeline():
base_universe = QTradableStocksUS()
close_price = USEquityPricing.close.latest
#Profitability Ratios
earning_yield = Fundamentals.earning_yield.latest
return_on_equity = Fundamentals.roe.latest
return_on_assets = Fundamentals.roa.latest
net_profit = Fundamentals.net_margin.latest
#Liquidity Ratios
quick_ratio = Fundamentals.quick_ratio.latest
current_ratio = Fundamentals.current_ratio.latest
debt_to_equity_ratio = (Fundamentals.long_term_debt_equity_ratio.latest)**-1
interest_coverage = Fundamentals.interest_coverage.latest
#Efficiency Ratios
assets_turnover = Fundamentals.assets_turnover.latest
change_in_working_capital = Fundamentals.change_in_working_capital.latest
#Investment Ratios
book_value_yield = Fundamentals.book_value_yield.latest
fcf_yield = Fundamentals.fcf_yield.latest
trailing_dividend_yield = Fundamentals.trailing_dividend_yield.latest
total_yield = Fundamentals.total_yield.latest
#Winsorising
earning_yield_winsorized = earning_yield.winsorize(min_percentile=0.01, max_percentile=0.99)
return_on_equity_winsorized = return_on_equity.winsorize(min_percentile=0.01, max_percentile=0.99)
return_on_assets_winsorized = return_on_assets.winsorize(min_percentile=0.01, max_percentile=0.99)
net_profit_winsorized = net_profit.winsorize(min_percentile=0.01, max_percentile=0.99)
quick_ratio_winsorized = quick_ratio.winsorize(min_percentile=0.01, max_percentile=0.99)
current_ratio_winsorized = current_ratio.winsorize(min_percentile=0.01, max_percentile=0.99)
debt_to_equity_ratio_winsorized = debt_to_equity_ratio.winsorize(min_percentile=0.01, max_percentile=0.99)
interest_coverage_winsorized = interest_coverage.winsorize(min_percentile=0.01, max_percentile=0.99)
assets_turnover_winsorized = assets_turnover.winsorize(min_percentile=0.01, max_percentile=0.99)
change_in_working_capital_winsorized = change_in_working_capital.winsorize(min_percentile=0.01, max_percentile=0.99)
book_value_yield_winsorized = book_value_yield.winsorize(min_percentile=0.01, max_percentile=0.99)
fcf_yield_winsorized = fcf_yield.winsorize(min_percentile=0.01, max_percentile=0.99)
trailing_dividend_yield_winsorized = trailing_dividend_yield.winsorize(min_percentile=0.01, max_percentile=0.99)
total_yield_winsorized = total_yield.winsorize(min_percentile=0.01, max_percentile=0.99)
#Creating a combined factor
return Pipeline(
columns = {
'close price': close_price,
'earning_yield': earning_yield_winsorized.zscore(),
'return_on_equity': return_on_equity_winsorized.zscore(),
'return_on_assets': return_on_assets_winsorized.zscore(),
'net_profit': net_profit_winsorized.zscore(),
'quick_ratio': quick_ratio_winsorized.zscore(),
'current_ratio': current_ratio_winsorized.zscore(),
'debt_to_equity_ratio': debt_to_equity_ratio_winsorized.zscore(),
'interest_coverage': interest_coverage_winsorized.zscore(),
'assets_turnover': assets_turnover_winsorized.zscore(),
'change_in_working_capital': change_in_working_capital_winsorized.zscore(),
'book_value_yield': book_value_yield_winsorized.zscore(),
'fcf_yield': fcf_yield_winsorized.zscore(),
'trailing_dividend_yield': trailing_dividend_yield_winsorized.zscore(),
'total_yield': total_yield_winsorized.zscore(),
},
screen = (base_universe),)
period_start = '2009-01-01'
period_end = '2014-01-01'
pipeline_output = run_pipeline(
make_pipeline(),
start_date = period_start,
end_date = period_end)
pipeline_output.info()
pipeline_output.dropna(inplace=True)
pipeline_output.info()
pipeline_output['30d_future_close'] = pipeline_output['close price'].shift(-30)
pipeline_output['30d_close_future_pct'] = pipeline_output['30d_future_close'].pct_change(30)
pipeline_output.dropna(inplace=True)
pipeline_output.head()
pipeline_output.info()
# Import Lasso
from sklearn.linear_model import Lasso
import matplotlib.pyplot as plt
# Instantiate a lasso regressor: lasso
lasso = Lasso(alpha=0.4,normalize=True)
X = pipeline_output['30d_close_future_pct']
y = pipeline_output[pipeline_output.columns[~pipeline_output.columns.isin(['30d_future_close','30d_close_future_pct','close price'])]]
y = y.values
X = X.values
lasso.fit(X,y)
lasso_coef = lasso.coef_