f/fundlab
Greg Pomerantz d1e85026bf CEF pass: universe (SEC report, 973 -> 295 listed) + stage 1 screen + stage 2a character
fundlab/cef_universe.py: SEC 'Closed-End Fund Information' report
(973 active CEFs) + company_tickers CIK join -> 295 listed common
classes (preferreds and 6(c)-converted companies flagged).  Supersedes
the N-2 full-index approach (N-2/A annual updates + 404ing index
paths).  Prices via goget.

fundlab/cef_screen.py: 290 screened - t5/t12, vol5, maxdd5, the 5
crash episodes, 12m payout proxy.  Energy/midstream CEFs (EMO +305%,
SRV +234%, NML +232%) top return AND crash resilience; Voya
Dividend-Premium series (IGD maxDD -16%); EM CEFs volatile + 14-24%
dist; long-dur munis -26..-42%.

fundlab/cef_character.py: 50-fund shortlist, 35-sleeve character +
crude tax_arb = character x (upside + 0.4 x vol).

Tests: 6 new cef checks (105 total).  RESEARCH.md: CEF form facts
(N-2ASR, N-PX, N-23C-3A, BDC caveats) + remaining stage 2b work.
2026-08-27 22:24:12 -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
roc_cache RIC-vs-pass-through verification + return-of-capital detector 2026-08-27 16:04:59 -04:00
__init__.py fundlab: EDGAR investment-objective fetcher + curated fallback 2026-08-25 18:15:48 -04:00
cef_character.json CEF pass: universe (SEC report, 973 -> 295 listed) + stage 1 screen + stage 2a character 2026-08-27 22:24:12 -04:00
cef_character.py CEF pass: universe (SEC report, 973 -> 295 listed) + stage 1 screen + stage 2a character 2026-08-27 22:24:12 -04:00
cef_screen.json CEF pass: universe (SEC report, 973 -> 295 listed) + stage 1 screen + stage 2a character 2026-08-27 22:24:12 -04:00
cef_screen.py CEF pass: universe (SEC report, 973 -> 295 listed) + stage 1 screen + stage 2a character 2026-08-27 22:24:12 -04:00
cef_universe.json CEF pass: universe (SEC report, 973 -> 295 listed) + stage 1 screen + stage 2a character 2026-08-27 22:24:12 -04:00
cef_universe.py CEF pass: universe (SEC report, 973 -> 295 listed) + stage 1 screen + stage 2a character 2026-08-27 22:24:12 -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
goget_cef.log CEF pass: universe (SEC report, 973 -> 295 listed) + stage 1 screen + stage 2a character 2026-08-27 22:24:12 -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 CEF pass: universe (SEC report, 973 -> 295 listed) + stage 1 screen + stage 2a character 2026-08-27 22:24:12 -04:00
resolved_tickers.json Alpha search: mine + screen the local DB for idiosyncratic alpha complements 2026-08-26 13:34:34 -04:00
roc_results.json RIC-vs-pass-through verification + return-of-capital detector 2026-08-27 16:04:59 -04:00
roc_run.log RIC-vs-pass-through verification + return-of-capital detector 2026-08-27 16:04:59 -04:00
rocdetect.py RIC-vs-pass-through verification + return-of-capital detector 2026-08-27 16:04:59 -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 Correct ROC placement: ROC defers to the investor's LTCG, like 2026-08-27 17:11:55 -04:00
taxplan.py Correct ROC placement: ROC defers to the investor's LTCG, like 2026-08-27 17:11:55 -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