Back to Community
Dividend Growth Stocks - Financed by Equity Issuance?

I noticed an interesting divergence between dividend growth and shares outstanding in the algorithm below. The algo filters Top 500 by market cap (then some additional filters for liquidity and nominal trade price). Finally it filters for companies that have reported nominal dividend growth over 150 trading days. I then compare these companies against the quantity of companies with a contraction in shares outstanding (which I label "buybacks"). It appears that in the final quarter of 2015, the trend for dividend growth remained stable, however the trend for share contraction bucked entirely. Very interesting.....

Clone Algorithm
3
Loading...
Total Returns
--
Alpha
--
Beta
--
Sharpe
--
Sortino
--
Max Drawdown
--
Benchmark Returns
--
Volatility
--
Returns 1 Month 3 Month 6 Month 12 Month
Alpha 1 Month 3 Month 6 Month 12 Month
Beta 1 Month 3 Month 6 Month 12 Month
Sharpe 1 Month 3 Month 6 Month 12 Month
Sortino 1 Month 3 Month 6 Month 12 Month
Volatility 1 Month 3 Month 6 Month 12 Month
Max Drawdown 1 Month 3 Month 6 Month 12 Month
"""
Observing the growth/contraction in shares issued in dividend growth stocks

- Frank Vigilante

"""

from quantopian.pipeline.data.quandl import rateinf_inflation_usa
from quantopian.algorithm import attach_pipeline, pipeline_output
from quantopian.pipeline.data.builtin import USEquityPricing 
from quantopian.pipeline import CustomFactor 
from quantopian.pipeline.data import morningstar 
from quantopian.pipeline import Pipeline
from quantopian.pipeline.factors import AverageDollarVolume
import numpy as np

        
class Share_Growth(CustomFactor):
    inputs = [morningstar.valuation.shares_outstanding]
    window_length = 150
    def compute(self, today, assets, out, growth):
        out[:] = (growth[-1] - growth[0]) / growth[0]    
class Dividend_Paid(CustomFactor):
    inputs = [morningstar.cash_flow_statement.cash_dividends_paid,USEquityPricing.close, morningstar.valuation.shares_outstanding]
    window_length = 150
    def compute(self, today, assets, out, dividend, close, shares):
        out[:] = (abs(dividend[-1]) - abs(dividend[0])) / abs(dividend[0])
class MarketCap(CustomFactor):
    inputs = [USEquityPricing.close, morningstar.valuation.shares_outstanding]
    window_length = 1
    def compute(self, today, assets, out, close, shares):
        out[:] = close[-1] * shares[-1]
def initialize(context):
    attach_pipeline(my_pipeline(context), 'my_pipeline')
    set_slippage(slippage.FixedSlippage(spread=0.00))
    set_commission(commission.PerShare(cost=0.0, min_trade_cost=0.0))
def my_pipeline(context):
    pipe = Pipeline()
    dollar_volume = AverageDollarVolume(window_length=20)
    minimum_volume = dollar_volume > 100000
    mkt_cap = MarketCap()
    mkt_cap_top_500 = mkt_cap.top(500)
    equity_price = USEquityPricing.close
    over_two = equity_price > 2
    Dividend_Factor = Dividend_Paid()
    pipe.add(Dividend_Factor, 'Dividend_Paid')
    Pays_Dividend = Dividend_Factor > 0.0 
    Share_Grow = Share_Growth()
    pipe.add(Share_Grow, 'Share_Growth')
    pipe.set_screen(minimum_volume & mkt_cap_top_500 & over_two & Pays_Dividend) 
    return pipe
def before_trading_start(context, data):
    context.output = pipeline_output('my_pipeline')
    Quantity = len(context.output.index)
    record(Quantity=Quantity)
    Buy_Back_List = []
    for value in context.output.Share_Growth:
        if value < 0:
            Buy_Back_List.append(value)
    Buybacks = len(Buy_Back_List)
    record(Buybacks=Buybacks)
            

     
There was a runtime error.
2 responses

Here is an update to this metric. Still a big gap between the quantity of dividend growth stocks and the quantity of those companies that are decreasing the supply of shares outstanding.

Clone Algorithm
3
Loading...
Total Returns
--
Alpha
--
Beta
--
Sharpe
--
Sortino
--
Max Drawdown
--
Benchmark Returns
--
Volatility
--
Returns 1 Month 3 Month 6 Month 12 Month
Alpha 1 Month 3 Month 6 Month 12 Month
Beta 1 Month 3 Month 6 Month 12 Month
Sharpe 1 Month 3 Month 6 Month 12 Month
Sortino 1 Month 3 Month 6 Month 12 Month
Volatility 1 Month 3 Month 6 Month 12 Month
Max Drawdown 1 Month 3 Month 6 Month 12 Month
"""
Observing the growth/contraction in shares issued in dividend growth stocks

- Frank Vigilante

"""

from quantopian.pipeline.data.quandl import rateinf_inflation_usa
from quantopian.algorithm import attach_pipeline, pipeline_output
from quantopian.pipeline.data.builtin import USEquityPricing 
from quantopian.pipeline import CustomFactor 
from quantopian.pipeline.data import morningstar 
from quantopian.pipeline import Pipeline
from quantopian.pipeline.factors import AverageDollarVolume
import numpy as np

        
class Share_Growth(CustomFactor):
    inputs = [morningstar.valuation.shares_outstanding]
    window_length = 150
    def compute(self, today, assets, out, growth):
        out[:] = (growth[-1] - growth[0]) / growth[0]    
class Dividend_Paid(CustomFactor):
    inputs = [morningstar.cash_flow_statement.cash_dividends_paid,USEquityPricing.close, morningstar.valuation.shares_outstanding]
    window_length = 150
    def compute(self, today, assets, out, dividend, close, shares):
        out[:] = (abs(dividend[-1]) - abs(dividend[0])) / abs(dividend[0])
class MarketCap(CustomFactor):
    inputs = [USEquityPricing.close, morningstar.valuation.shares_outstanding]
    window_length = 1
    def compute(self, today, assets, out, close, shares):
        out[:] = close[-1] * shares[-1]
def initialize(context):
    attach_pipeline(my_pipeline(context), 'my_pipeline')
    set_slippage(slippage.FixedSlippage(spread=0.00))
    set_commission(commission.PerShare(cost=0.0, min_trade_cost=0.0))
def my_pipeline(context):
    pipe = Pipeline()
    dollar_volume = AverageDollarVolume(window_length=20)
    minimum_volume = dollar_volume > 100000
    mkt_cap = MarketCap()
    mkt_cap_top_500 = mkt_cap.top(500)
    equity_price = USEquityPricing.close
    over_two = equity_price > 2
    Dividend_Factor = Dividend_Paid()
    pipe.add(Dividend_Factor, 'Dividend_Paid')
    Pays_Dividend = Dividend_Factor > 0.0 
    Share_Grow = Share_Growth()
    pipe.add(Share_Grow, 'Share_Growth')
    pipe.set_screen(minimum_volume & mkt_cap_top_500 & over_two & Pays_Dividend) 
    return pipe
def before_trading_start(context, data):
    context.output = pipeline_output('my_pipeline')
    Quantity = len(context.output.index)
    record(Quantity=Quantity)
    Buy_Back_List = []
    for value in context.output.Share_Growth:
        if value < 0:
            Buy_Back_List.append(value)
    Buybacks = len(Buy_Back_List)
    record(Buybacks=Buybacks)
            

     
There was a runtime error.

Update - I think the new Morningstar data was not populated when I originally produced these metrics. The correlation holds strong with this new backtest:

Clone Algorithm
2
Loading...
Total Returns
--
Alpha
--
Beta
--
Sharpe
--
Sortino
--
Max Drawdown
--
Benchmark Returns
--
Volatility
--
Returns 1 Month 3 Month 6 Month 12 Month
Alpha 1 Month 3 Month 6 Month 12 Month
Beta 1 Month 3 Month 6 Month 12 Month
Sharpe 1 Month 3 Month 6 Month 12 Month
Sortino 1 Month 3 Month 6 Month 12 Month
Volatility 1 Month 3 Month 6 Month 12 Month
Max Drawdown 1 Month 3 Month 6 Month 12 Month
"""
Observing the growth/contraction in shares issued in dividend growth stocks

- Frank Vigilante

"""

from quantopian.pipeline.data.quandl import rateinf_inflation_usa
from quantopian.algorithm import attach_pipeline, pipeline_output
from quantopian.pipeline.data.builtin import USEquityPricing 
from quantopian.pipeline import CustomFactor 
from quantopian.pipeline.data import morningstar 
from quantopian.pipeline import Pipeline
from quantopian.pipeline.factors import AverageDollarVolume
import numpy as np

        
class Share_Growth(CustomFactor):
    inputs = [morningstar.valuation.shares_outstanding]
    window_length = 150
    def compute(self, today, assets, out, growth):
        out[:] = (growth[-1] - growth[0]) / growth[0]    
class Dividend_Paid(CustomFactor):
    inputs = [morningstar.cash_flow_statement.cash_dividends_paid,USEquityPricing.close, morningstar.valuation.shares_outstanding]
    window_length = 150
    def compute(self, today, assets, out, dividend, close, shares):
        out[:] = (abs(dividend[-1]) - abs(dividend[0])) / abs(dividend[0])
class MarketCap(CustomFactor):
    inputs = [USEquityPricing.close, morningstar.valuation.shares_outstanding]
    window_length = 1
    def compute(self, today, assets, out, close, shares):
        out[:] = close[-1] * shares[-1]
def initialize(context):
    attach_pipeline(my_pipeline(context), 'my_pipeline')
    set_slippage(slippage.FixedSlippage(spread=0.00))
    set_commission(commission.PerShare(cost=0.0, min_trade_cost=0.0))
def my_pipeline(context):
    pipe = Pipeline()
    dollar_volume = AverageDollarVolume(window_length=20)
    minimum_volume = dollar_volume > 100000
    mkt_cap = MarketCap()
    mkt_cap_top_500 = mkt_cap.top(500)
    equity_price = USEquityPricing.close
    over_two = equity_price > 2
    Dividend_Factor = Dividend_Paid()
    pipe.add(Dividend_Factor, 'Dividend_Paid')
    Pays_Dividend = Dividend_Factor > 0.0 
    Share_Grow = Share_Growth()
    pipe.add(Share_Grow, 'Share_Growth')
    pipe.set_screen(minimum_volume & mkt_cap_top_500 & over_two & Pays_Dividend) 
    return pipe
def before_trading_start(context, data):
    context.output = pipeline_output('my_pipeline')
    Quantity = len(context.output.index)
    record(Quantity=Quantity)
    Buy_Back_List = []
    for value in context.output.Share_Growth:
        if value < 0:
            Buy_Back_List.append(value)
    Buybacks = len(Buy_Back_List)
    record(Buybacks=Buybacks)
            

     
There was a runtime error.