29 — Active Share, Style Tilt, and Shareholder Yield¶
Free learning pack¶
reference/equity/active_share.mdreference/equity/equity_factor_investing.mdreference/equity/shareholder_yield.md
Do not search for more material until these are insufficient.
PREDICT¶
A fund holds 98% of the same names, at nearly the same weights, as its benchmark. Without calculating, is its active share close to 0%, close to 50%, or close to 100%? Could this fund still justify an active management fee?
Formula (active share)¶
active_share = 0.5 * sum(|w_portfolio_i - w_benchmark_i|)
portfolio_weights = [0.60, 0.40]
benchmark_weights = [0.50, 0.50]
# MANUAL FIRST:
# compute active share by hand from the active weights.
active_share_value = None
print(active_share_value)
PREDICT (style tilt)¶
A portfolio's value-factor exposure is +0.6, its benchmark's is +0.1. Without calculating, is this portfolio tilted toward value or away from it, relative to the benchmark — and is that the same question as asking whether the portfolio's raw exposure is positive?
Formula (style tilt)¶
style_tilt = portfolio_exposure - benchmark_exposure
Get each side's exposure first with
pm.factors.portfolio_factor_exposure(weights, factor_scores) — the
same generic function Phase 4's risk-model work uses, applied here to a
single equity style factor's scores.
portfolio_value_exposure = 0.6
benchmark_value_exposure = 0.1
# MANUAL FIRST:
# compute the active style tilt by hand.
tilt = None
print(tilt)
PREDICT (shareholder yield)¶
Company A pays a 1% dividend yield and buys back 4% of its market cap a year. Company B pays a 5% dividend yield and buys back nothing. Without calculating, do these two companies return the same amount of cash to shareholders, more for A, or more for B?
Formula¶
shareholder_yield = dividend_yield + buyback_yield
total_shareholder_return = (price_end - price_start + dividends_paid) / price_start
dividend_per_share, price = 1.0, 100.0 # 1% dividend yield
buyback_value, market_cap = 400.0, 10_000.0 # 4% buyback yield
price_start, price_end, dividends_paid = 100.0, 108.0, 2.0
# MANUAL FIRST:
# compute Company A's shareholder yield, and a separate stock's total
# shareholder return from the price/dividend numbers above.
shareholder_yield_value = None
total_shareholder_return_value = None
print(shareholder_yield_value, total_shareholder_return_value)
Experiment¶
Recompute active share for a fund with 20% active weight concentrated in just one name out of ten versus one spread evenly across all ten at 2% each. Same total active share — does that change how much you'd trust the position sizing?
Reference¶
reference/equity/active_share.md
reference/equity/equity_factor_investing.md
reference/equity/shareholder_yield.md
Promote¶
Use src/pm/equity/factors.py (active_share, style_tilt) and
src/pm/equity/income.py (shareholder_yield,
total_shareholder_return) only after your own implementation.
Test¶
pytest tests/test_equity.py
ORAL CHECK¶
Explain to a PM why active share and tracking error can disagree about how "active" the same portfolio is, and why a buyback-heavy company isn't returning less cash to shareholders than a dividend-heavy one just because its dividend yield looks small.
Try /tutor active share or /tutor equity factor investing for an
adaptive walkthrough.