f/fundlab
Greg Pomerantz 9458e316cb Price-appreciation vs payout split (fundlab/taxsplit.py)
Follow-up to the tax-location plan: the taxplan score only measured
DISTRIBUTION character. The user rightly noted that NAV appreciation
is also a capital gain (LTCG on a >1y sale). The fund price files
carry both series - Close = raw NAV with distributions paid out,
Adj Close = total return reinvested - so the split is computable
directly per fund (5y window + most-recent-12m payout).

Findings:
- ACCUMULATORS (>=50% of 5y return is price appreciation) get a new
  location "TAXABLE (accrues)": MBXIX 76% (0% payout 12m), ATESX 66%,
  LAMHX 62%, CVSIX 61%, candidate PBAIX 60% (0% payout 12m). For
  these the taxable account's LTCG-on-sale benefit is the dominant
  tax event.
- PAY-OUT funds: HMEZX (99% of return distributed - the STCG merger-
  arb case), MERVX, COSIX, PMORX, SVARX, SCFZX, DMSZX, munis, credit.
  IRA placement stands.
- Data artifacts caught: JLPSX/QSPNX one-time NAV gap events ~2022
  (special distribution or reorg) skew the 5y payout average; the
  12m payout column reflects current behavior. QCMMRX (MMF) series
  is not NAV-based - flagged.

App: tax-location expander gains 5y price / 5y payout / 12m payout
columns and the "TAXABLE (accrues)" filter. RESEARCH.md documents
the capital-loss question: registered RICs cannot distribute net
capital losses; the usable benefit is the fund's internal harvest
reserve (low capital-gain distributions after up-years), which needs
N-CSR/1099 history to verify. 97/32 suites green.
2026-08-27 14:34:42 -04:00
..
nport_cache N-PORT cross-check: verify top candidates' actual holdings 2026-08-27 12:43:17 -04:00
pool Fund Lab: returns-based strategy decomposition for the 16 shortlist funds 2026-08-26 11:59:59 -04:00
__init__.py fundlab: EDGAR investment-objective fetcher + curated fallback 2026-08-25 18:15:48 -04:00
cluster_kmeans.json Factor screen (v2, 35 drivers) + return-driver clusters 2026-08-27 08:35:42 -04:00
cluster_tree.json Factor screen (v2, 35 drivers) + return-driver clusters 2026-08-27 08:35:42 -04:00
cluster.py Factor screen (v2, 35 drivers) + return-driver clusters 2026-08-27 08:35:42 -04:00
dbmine.py Find candidate funds NOT in the DB: exhaustive EDGAR 497-universe pass 2026-08-26 15:22:52 -04:00
decompose_results.json Fund Lab: returns-based strategy decomposition for the 16 shortlist funds 2026-08-26 11:59:59 -04:00
decompose.py Alpha search: mine + screen the local DB for idiosyncratic alpha complements 2026-08-26 13:34:34 -04:00
drawdown_results.json Drawdown-resilience screen: who was positive when equities crashed 2026-08-27 13:29:01 -04:00
drawdown.py Drawdown-resilience screen: who was positive when equities crashed 2026-08-27 13:29:01 -04:00
edgar_universe.py Find candidate funds NOT in the DB: exhaustive EDGAR 497-universe pass 2026-08-26 15:22:52 -04:00
edgar.py fundlab: extract strategy sections from EDGAR docs; --strategy CLI mode 2026-08-25 23:06:13 -04:00
factor_results.json Factor screen (v2, 35 drivers) + return-driver clusters 2026-08-27 08:35:42 -04:00
factors.log Factor screen (v2, 35 drivers) + return-driver clusters 2026-08-27 08:35:42 -04:00
factors.py Factor screen (v2, 35 drivers) + return-driver clusters 2026-08-27 08:35:42 -04:00
fundinfo.py fundlab: extract strategy sections from EDGAR docs; --strategy CLI mode 2026-08-25 23:06:13 -04:00
funds_curated.json fundlab: EDGAR investment-objective fetcher + curated fallback 2026-08-25 18:15:48 -04:00
harvest.py Alpha search: mine + screen the local DB for idiosyncratic alpha complements 2026-08-26 13:34:34 -04:00
nport_manifest.json N-PORT cross-check: verify top candidates' actual holdings 2026-08-27 12:43:17 -04:00
nport.py N-PORT cross-check: verify top candidates' actual holdings 2026-08-27 12:43:17 -04:00
overnight.log Overnight comprehensive screen COMPLETE: 2,384 funds, 250 candidates, RESEARCH.md results + next iterations 2026-08-27 06:56:33 -04:00
overnight.py Watchdog: pidfile liveness (pgrep -f was fooled by shells quoting the pattern); per-batch download fault isolation 2026-08-26 22:09:20 -04:00
pool.py fundlab: EDGAR investment-objective fetcher + curated fallback 2026-08-25 18:15:48 -04:00
RESEARCH.md Price-appreciation vs payout split (fundlab/taxsplit.py) 2026-08-27 14:34:42 -04:00
resolved_tickers.json Alpha search: mine + screen the local DB for idiosyncratic alpha complements 2026-08-26 13:34:34 -04:00
search_all.json Overnight comprehensive screen COMPLETE: 2,384 funds, 250 candidates, RESEARCH.md results + next iterations 2026-08-27 06:56:33 -04:00
search_external.json Find candidate funds NOT in the DB: exhaustive EDGAR 497-universe pass 2026-08-26 15:22:52 -04:00
search_harvest.json Alpha search: mine + screen the local DB for idiosyncratic alpha complements 2026-08-26 13:34:34 -04:00
search_mined.json Alpha search: mine + screen the local DB for idiosyncratic alpha complements 2026-08-26 13:34:34 -04:00
search_results.json Alpha search: mine + screen the local DB for idiosyncratic alpha complements 2026-08-26 13:34:34 -04:00
search.py Alpha search: mine + screen the local DB for idiosyncratic alpha complements 2026-08-26 13:34:34 -04:00
searchlist.py Alpha search: mine + screen the local DB for idiosyncratic alpha complements 2026-08-26 13:34:34 -04:00
taxplan_results.json Price-appreciation vs payout split (fundlab/taxsplit.py) 2026-08-27 14:34:42 -04:00
taxplan.py Price-appreciation vs payout split (fundlab/taxsplit.py) 2026-08-27 14:34:42 -04:00
taxsplit_results.json Price-appreciation vs payout split (fundlab/taxsplit.py) 2026-08-27 14:34:42 -04:00
taxsplit.py Price-appreciation vs payout split (fundlab/taxsplit.py) 2026-08-27 14:34:42 -04:00
tickers.py Alpha search: mine + screen the local DB for idiosyncratic alpha complements 2026-08-26 13:34:34 -04:00
watchdog.log Overnight comprehensive screen COMPLETE: 2,384 funds, 250 candidates, RESEARCH.md results + next iterations 2026-08-27 06:56:33 -04:00
watchdog.sh Watchdog: pidfile liveness (pgrep -f was fooled by shells quoting the pattern); per-batch download fault isolation 2026-08-26 22:09:20 -04:00
xcheck_report.json N-PORT cross-check: verify top candidates' actual holdings 2026-08-27 12:43:17 -04:00
xcheck.py N-PORT cross-check: verify top candidates' actual holdings 2026-08-27 12:43:17 -04:00