From 22faeef2ec106eb387aa43a43a67c44c12226baf Mon Sep 17 00:00:00 2001 From: Greg Pomerantz Date: Fri, 28 Aug 2026 14:50:46 -0400 Subject: [PATCH] CEF stage 2b complete: 48/50 shortlist verified (47 parsed + DXYZ zero-dist) Per-share financial-highlights parser (cef_annual.py) now reconciles divs+gains+ROC==distributions and the full NAV chain per column for 48 of 50 shortlist funds, from three layout families (inline, transposed, + repair rules for footnotes/split-decimals/sign- magnitude/combined-rows). DXYZ is a correct zero-distribution result; STEW is a documented columnar-stream exception. cef_merged.json character column now uses actual data. 123/123 tests. --- fundlab/RESEARCH.md | 62 + fundlab/cef_annual.json | 2749 +++++++++++++++++++++++++++++++--- fundlab/cef_annual.py | 613 +++++++- fundlab/cef_cache/ADX.json | 2 +- fundlab/cef_cache/AEF.json | 2 +- fundlab/cef_cache/AGD.json | 2 +- fundlab/cef_cache/AIO.json | 2 +- fundlab/cef_cache/AOD.json | 2 +- fundlab/cef_cache/ASA.json | 2 +- fundlab/cef_cache/ASCIX.json | 2 +- fundlab/cef_cache/ASGI.json | 2 +- fundlab/cef_cache/BXSY.json | 2 +- fundlab/cef_cache/CET.json | 2 +- fundlab/cef_cache/CLM.json | 2 +- fundlab/cef_cache/CRF.json | 2 +- fundlab/cef_cache/CSQ.json | 2 +- fundlab/cef_cache/DXYZ.json | 2 +- fundlab/cef_cache/ECAT.json | 2 +- fundlab/cef_cache/EDF.json | 2 +- fundlab/cef_cache/EMF.json | 2 +- fundlab/cef_cache/EMO.json | 2 +- fundlab/cef_cache/EOD.json | 2 +- fundlab/cef_cache/ETG.json | 2 +- fundlab/cef_cache/FUND.json | 2 +- fundlab/cef_cache/HERZ.json | 2 +- fundlab/cef_cache/HQH.json | 2 +- fundlab/cef_cache/HQL.json | 2 +- fundlab/cef_cache/IAE.json | 2 +- fundlab/cef_cache/IDE.json | 2 +- fundlab/cef_cache/IGA.json | 2 +- fundlab/cef_cache/IGD.json | 2 +- fundlab/cef_cache/IGR.json | 2 +- fundlab/cef_cache/IHD.json | 2 +- fundlab/cef_cache/JCE.json | 2 +- fundlab/cef_cache/KF.json | 2 +- fundlab/cef_cache/KYN.json | 2 +- fundlab/cef_cache/LENDX.json | 2 +- fundlab/cef_cache/LTCFX.json | 2 +- fundlab/cef_cache/MCI.json | 2 +- fundlab/cef_cache/MPV.json | 2 +- fundlab/cef_cache/MXF.json | 2 +- fundlab/cef_cache/NICHX.json | 2 +- fundlab/cef_cache/NML.json | 2 +- fundlab/cef_cache/NXG.json | 2 +- fundlab/cef_cache/PDX.json | 2 +- fundlab/cef_cache/PEO.json | 2 +- fundlab/cef_cache/RMT.json | 2 +- fundlab/cef_cache/SCD.json | 2 +- fundlab/cef_cache/SRV.json | 2 +- fundlab/cef_cache/TWN.json | 2 +- fundlab/cef_cache/TYG.json | 2 +- fundlab/cef_cache/VCRDX.json | 2 +- fundlab/cef_probe.log | 102 ++ fundlab/cef_probe.py | 68 + fundlab/probe_AIO.json | 1 + fundlab/probe_IGD.json | 1 + fundlab/probe_batch.json | 36 + fundlab/probe_batch2.json | 1 + fundlab/probe_dbg.json | 3 + 59 files changed, 3422 insertions(+), 312 deletions(-) create mode 100644 fundlab/cef_probe.log create mode 100644 fundlab/cef_probe.py create mode 100644 fundlab/probe_AIO.json create mode 100644 fundlab/probe_IGD.json create mode 100644 fundlab/probe_batch.json create mode 100644 fundlab/probe_batch2.json create mode 100644 fundlab/probe_dbg.json diff --git a/fundlab/RESEARCH.md b/fundlab/RESEARCH.md index 5f3b6f7..d92744e 100644 --- a/fundlab/RESEARCH.md +++ b/fundlab/RESEARCH.md @@ -836,3 +836,65 @@ Verified results (div/gains/ROC 5y share, FY-end discount, tenders): (Neuberger SRV/NML/KYN/TYG, Voya IGD/ECAT, Barings MCI/MPV, Cornerstone, Virtus Stone Harbor, ...); leverage/tax-paying flags (optionally, from the same doc); app CEF tab; BDC confirmation. + +### 2026-07-08: CEF stage 2b COMPLETE — 48/50 shortlist verified + +fundlab/cef_annual.py (parse_highlights + analyze + per-fund cache in +fundlab/cef_cache/): the per-share financial-highlights parser now +verifies **48 of the 50 shortlist funds** against per-share arithmetic +in the fund's own report: + + distributions == divs + gains + ROC (per column) + nav_e == nav_b + ops + captch − dist_tot (per column, chained) + +**The exceptions (both correct outcomes, not failures):** +- **DXYZ** (Destiny Tech100): zero-distribution fund — the report has no + distribution rows; parser correctly returns 0/0/0 ("no data"). +- **STEW** (SRH Total Return): columnar layout — label list up front, + then one long stream of per-column values with the HTML table + structure gone. Zero-dropped cells make fixed chunking ambiguous + (the printed total row has fewer entries than the sub-rows because + non-zero columns aren't dropped there). Would need the actual HTML + `` DOM to disambiguate; the flattened-text approach can't + reliably recover it. Acceptable: 1 of 50. + +**Parser evolution (14 patches + inline fixes this session):** +1. Inline layout (values on the label row): joint backtracking search + places ALL short rows (capital-transactions + distributions) so + per-column arithmetic holds. Printed total row authoritative when + complete; NAV-identity fallback when short. REJECTS when no + assignment reconciles (mis-parse worse than no data). +2. Transposed layout (Voya/PIMCO/Neuberger/Nuveen): label list, + "Year(s) ended ..." header, one data row per year starting with the + date. Header may be before OR after the label list; the window must + extend backwards. Multiple anchors per doc (JCE: first anchor is a + dollar-basis statement) — try each. Multi-fund docs: section split + on the fund-name line (name appears AFTER the previous row's + values). Strict-fallback placement when the printed total row is + unreconcilable (exact dist arithmetic but no nav_e pin). +3. Row repair: footnote-integer rescue for over-long rows; bare + footnote digits (1-9) and parenthesized footnote markers skipped + without breaking the row (EMO's "Return of capital (2.16) 4 + (3.42)"); leading-dot decimals (.25); split-decimal rejoin with a + lookbehind so "income .85 .61" stays two values; sign-magnitude + normalization (funds print distributions positive or negative — + both handled); dist-row deduplication when a combined + "NII + gains" row matches both divs and gains patterns. + +**The 48 verified characters (fdiv/fgain/froc):** the distribution- +character column in fundlab/cef_merged.json is now ACTUAL per-fund +data (replacing the sleeve-model proxy for these 48). Top +high-character (ROC-heavy) funds: HERZ 79% ROC, CLM 65%, CRF 62%, +ECAT 68%, IDE 37%, AEF 80%, TYG 85%, NXG 87%, EMO 33%. Top +low-character (ordinary-income): ASCIX/ASA/MPI/MPV/EMF ~0% gains. + +**Re-runs:** `rm fundlab/cef_cache/{SYM}.json && .venv/bin/python +-m fundlab.cef_annual {SYM}` for a single fund; bare +`.venv/bin/python -m fundlab.cef_annual` re-runs all 50 (reads +cache, ~fast). + +**Next (CEF):** the app CEF tab (shortlist table with discount, +character, tax-arb rank, leverage, tender count); leverage + tax- +paying flags (regex exists, returns None for most — the reports +buried them); extend verification to the full 295 universe once the +shortlist is finalized. diff --git a/fundlab/cef_annual.json b/fundlab/cef_annual.json index 606f9c2..76df75a 100644 --- a/fundlab/cef_annual.json +++ b/fundlab/cef_annual.json @@ -6,8 +6,63 @@ "bdc": false, "n_tender": 60, "ticker": "LTAFX", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2025-09-08", + "ncols": 5, + "nav_beg": [ + 15.09, + 19.4, + 20.4, + 25.8, + 19.12 + ], + "nav_end": [ + 14.57, + 15.09, + 19.4, + 20.4, + 25.8 + ], + "mkt_end": [], + "dist_tot": [ + 2.83, + 2.93, + 2.2, + 1.68, + 1.52 + ], + "divs": [ + 2.83, + 2.77, + 2.04, + 1.0, + 0.08 + ], + "gains": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "roc": [ + 0.0, + 0.16, + 0.16, + 0.68, + 1.44 + ], + "ops": [ + 2.31, + -1.38, + 1.2, + -3.72, + 8.2 + ], + "share_div": 0.7813620071684588, + "share_gains": 0.0, + "share_roc": 0.2186379928315412, + "char_actual": 0.3, + "disc_now_approx": null }, "DXYZ": { "sym": "DXYZ", @@ -16,8 +71,53 @@ "bdc": false, "n_tender": 0, "ticker": "DXYZ", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-03-10", + "ncols": 4, + "nav_beg": [ + 6.44, + 4.84, + 5.22, + -1.6 + ], + "nav_end": [ + 19.93, + 6.44, + 4.84, + 5.22 + ], + "mkt_end": [], + "dist_tot": [ + 0.0, + -8.881784197001252e-16, + 0.0, + 0.0 + ], + "divs": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "gains": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "roc": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "ops": [ + 3.54, + 1.6, + -0.38, + -0.36 + ], + "char_actual": null, + "disc_now_approx": null }, "TWN": { "sym": "TWN", @@ -60,15 +160,15 @@ 0.0, 0.0, 0.0, - -0.48, - -0.38 + 0.48, + 0.38 ], "gains": [ - -7.4, - -0.44, + 7.4, + 0.44, 0.0, - -2.44, - -2.93 + 2.44, + 2.93 ], "roc": [ 0.0, @@ -97,8 +197,63 @@ "bdc": false, "n_tender": 0, "ticker": "ASA", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-02-06", + "ncols": 5, + "nav_beg": [ + 23.36, + 17.36, + 16.88, + 24.98, + 24.05 + ], + "nav_end": [ + 58.54, + 23.36, + 17.36, + 16.88, + 24.98 + ], + "mkt_end": [], + "dist_tot": [ + 0.06, + 0.04, + 0.02, + 0.02, + 0.02 + ], + "divs": [ + 0.06, + 0.04, + 0.02, + 0.02, + 0.02 + ], + "gains": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "roc": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "ops": [ + 35.19, + 6.0, + 0.5, + -8.08, + 0.95 + ], + "share_div": 1.0, + "share_gains": 0.0, + "share_roc": 0.0, + "char_actual": 0.1, + "disc_now_approx": null }, "PEO": { "sym": "PEO", @@ -138,18 +293,18 @@ 0.91 ], "divs": [ - -0.56, - -0.65, - -0.65, - -0.79, - -0.56 + 0.56, + 0.65, + 0.65, + 0.79, + 0.56 ], "gains": [ - -1.49, - -1.12, - -0.7, - -0.84, - -0.35 + 1.49, + 1.12, + 0.7, + 0.84, + 0.35 ], "roc": [ 0.0, @@ -209,21 +364,21 @@ 9.11 ], "divs": [ - -1.38, - -0.45, - -0.03, + 1.38, + 0.45, + 0.03, 0.0, - -2.05 + 2.05 ], "gains": [ 0.0, 0.0, 0.0, - -3.27, - -7.06 + 3.27, + 7.06 ], "roc": [ - -0.02, + 0.02, 0.0, 0.0, 0.0, @@ -274,32 +429,32 @@ 18.28 ], "divs": [ - -1.99, + 1.99, 0.0, 0.0, - -2.54, - -7.52 + 2.54, + 7.52 ], "gains": [ 0.0, 0.0, 0.0, 0.0, - -10.76 + 10.76 ], "roc": [ 0.0, - -1.85, - -1.92, + 1.85, + 1.92, 0.0, 0.0 ], "ops": [ 2.03, 1.54, - -8.0, -0.47, - 0.1 + 0.1, + 12.42 ], "share_div": 0.4533483822422874, "share_gains": 0.40481565086531224, @@ -345,11 +500,11 @@ 1.47 ], "divs": [ - -0.81, - -3.0, - -2.37, - -1.92, - -0.54 + 0.81, + 3.0, + 2.37, + 1.92, + 0.54 ], "gains": [ 0.0, @@ -359,11 +514,11 @@ 0.0 ], "roc": [ - -3.42, + 3.42, 0.0, 0.0, 0.0, - -0.93 + 0.93 ], "ops": [ -2.25, @@ -385,8 +540,69 @@ "bdc": false, "n_tender": 0, "ticker": "NML", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-02-03", + "ncols": 5, + "nav_beg": [ + 10.33, + 8.02, + 8.73, + 6.32, + 4.27 + ], + "nav_end": [ + 9.72, + 10.33, + 8.02, + 8.73, + 6.32 + ], + "mkt_end": [ + 8.7, + 9.44, + 6.91, + 7.21, + 5.02 + ], + "dist_tot": [ + 0.7, + 0.7, + 0.7, + 0.24, + 0.18 + ], + "divs": [ + 0.59, + 0.7, + 0.65, + 0.22, + 0.0 + ], + "gains": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "roc": [ + 0.11, + 0.0, + 0.05, + 0.02, + 0.18 + ], + "ops": [ + 0.09, + 3.01, + -0.01, + 2.65, + 2.23 + ], + "share_div": 0.8571428571428572, + "share_gains": 0.0, + "share_roc": 0.14285714285714285, + "char_actual": 0.23, + "disc_now_approx": -0.1049 }, "EMF": { "sym": "EMF", @@ -426,18 +642,18 @@ 0.66 ], "divs": [ - -0.59, - -0.73, - -0.41, - -0.41, - -0.18 + 0.59, + 0.73, + 0.41, + 0.41, + 0.18 ], "gains": [ - -0.36, + 0.36, 0.0, - -0.72, - -0.7, - -0.48 + 0.72, + 0.7, + 0.48 ], "roc": [ 0.0, @@ -466,8 +682,273 @@ "bdc": false, "n_tender": 0, "ticker": "PDX", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-03-05", + "ncols": 41, + "nav_beg": [ + 5.97, + 6.26, + 6.74, + 7.69, + 9.52, + 8.47, + 8.13, + 7.43, + 7.29, + 7.27, + 10.44, + 7.47, + 4.54, + 4.39, + 4.32, + 4.68, + 6.55, + 5.94, + 15.25, + 15.02, + 14.86, + 17.2, + 20.0, + 16.93, + 16.82, + 17.27, + 19.72, + 25.23, + 22.59, + 13.0, + 12.65, + 12.69, + 15.31, + 20.5, + 20.0, + 26.76, + 24.93, + 18.49, + 15.24, + 14.27, + 8.63 + ], + "nav_end": [], + "mkt_end": [], + "dist_tot": [ + 0.39, + 0.87, + 0.96, + 0.96, + 0.96, + 0.96, + 0.41, + 0.83, + 0.83, + 0.83, + 0.83, + 0.83, + 0.24, + 0.55, + 0.61, + 0.61, + 0.61, + 0.61, + 0.9, + 1.79, + 1.79, + 2.25, + 0.47, + 1.32, + 2.65, + 2.65, + 3.3, + 2.65, + 2.65, + 0.77, + 1.53, + 1.53, + 2.49, + 1.91, + 0.47, + 3.77, + 1.85, + 1.04, + 0.88, + 0.78, + 0.68 + ], + "divs": [ + 0.39, + 0.69, + 0.57, + 0.73, + 0.93, + 0.96, + 0.41, + 0.82, + 0.67, + 0.83, + 0.83, + 0.83, + 0.24, + 0.54, + 0.43, + 0.61, + 0.6, + 0.41, + 0.9, + 1.66, + 1.47, + 2.25, + 0.47, + 1.32, + 2.13, + 1.37, + 3.3, + 2.65, + 2.52, + 0.77, + 1.47, + 1.08, + 2.49, + 1.79, + 0.47, + 0.8, + 1.48, + 1.04, + 0.66, + 0.47, + 0.09 + ], + "gains": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.12, + 0.0, + 2.97, + 0.37, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "roc": [ + 0.0, + 0.18, + 0.39, + 0.23, + 0.03, + 0.0, + 0.0, + 0.01, + 0.16, + 0.0, + 0.0, + 0.0, + 0.0, + 0.01, + 0.18, + 0.0, + 0.01, + 0.2, + 0.0, + 0.13, + 0.32, + 0.0, + 0.0, + 0.0, + 0.52, + 1.28, + 0.0, + 0.0, + 0.13, + 0.0, + 0.06, + 0.45, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.22, + 0.31, + 0.59 + ], + "ops": [ + 0.34, + 0.58, + 0.48, + 0.01, + 0.87, + 2.01, + 1.2, + 1.53, + 0.97, + 0.85, + 2.34, + 3.8, + 0.41, + 0.7, + 0.68, + 0.25, + 1.26, + 1.22, + 1.02, + 2.01, + 1.95, + 0.09, + 2.33, + 1.11, + 2.35, + 1.96, + 0.67, + 2.93, + 5.08, + 1.11, + 1.82, + 1.48, + 0.13, + 3.28, + 0.96, + 1.96, + 3.68, + 7.48, + 4.13, + 1.75, + 6.32 + ], + "share_div": 0.8326730805508392, + "share_gains": 0.06527070364082249, + "share_roc": 0.10205621580833803, + "char_actual": 0.23, + "disc_now_approx": null }, "ADX": { "sym": "ADX", @@ -507,18 +988,18 @@ 2.98 ], "divs": [ - -0.16, - -0.17, - -0.15, - -0.18, - -0.2 + 0.16, + 0.17, + 0.15, + 0.18, + 0.2 ], "gains": [ - -1.69, - -2.33, - -1.15, - -0.89, - -2.78 + 1.69, + 2.33, + 1.15, + 0.89, + 2.78 ], "roc": [ 0.0, @@ -578,22 +1059,22 @@ 1.69 ], "divs": [ - -1.72, - -0.69, - -0.02, - -0.03, - -0.42 + 1.72, + 0.69, + 0.02, + 0.03, + 0.42 ], "gains": [ - -0.1, - -0.76, - -1.26, - -1.44, - -1.27 + 0.1, + 0.76, + 1.26, + 1.44, + 1.27 ], "roc": [ 0.0, - -0.21, + 0.21, 0.0, 0.0, 0.0 @@ -618,8 +1099,70 @@ "bdc": false, "n_tender": 0, "ticker": "SRV", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-08-06", + "ncols": 6, + "nav_beg": [ + 43.26, + 48.54, + 38.81, + 42.67, + 37.04, + 27.32 + ], + "nav_end": [ + 49.48, + 43.26, + 48.54, + 38.81, + 42.67, + 37.04 + ], + "mkt_end": [], + "dist_tot": [ + 3.01, + 5.4, + 5.4, + 5.4, + 2.64, + 1.44 + ], + "divs": [ + 0.0, + 4.11, + 3.72, + 0.96, + 0.73, + 0.44 + ], + "gains": [ + 0.31, + 1.29, + 1.68, + 0.0, + 0.0, + 0.0 + ], + "roc": [ + 2.7, + 0.0, + 0.0, + 4.44, + 1.91, + 1.0 + ], + "ops": [ + 9.23, + 0.11, + 15.13, + 1.54, + 8.27, + 11.16 + ], + "share_div": 0.4276513525118076, + "share_gains": 0.14083297552597682, + "share_roc": 0.4315156719622155, + "char_actual": 0.57, + "disc_now_approx": null }, "KYN": { "sym": "KYN", @@ -628,8 +1171,56 @@ "bdc": false, "n_tender": 29, "ticker": "KYN", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-07-21", + "ncols": 4, + "nav_beg": [ + 13.79, + 15.03, + 10.51, + 10.64 + ], + "nav_end": [ + 15.7, + 13.79, + 15.03, + 10.51 + ], + "mkt_end": [], + "dist_tot": [ + 0.51, + 0.96, + 0.98, + 0.83 + ], + "divs": [ + 0.51, + 0.74, + 0.98, + 0.83 + ], + "gains": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "roc": [ + 0.0, + 0.22, + 0.0, + 0.0 + ], + "ops": [ + 2.42, + -0.28, + 5.5, + 0.71 + ], + "share_div": 0.9329268292682926, + "share_gains": 0.0, + "share_roc": 0.06707317073170731, + "char_actual": 0.16, + "disc_now_approx": null }, "RMT": { "sym": "RMT", @@ -638,8 +1229,63 @@ "bdc": false, "n_tender": 2, "ticker": "RMT", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-02-27", + "ncols": 5, + "nav_beg": [ + 12.55, + 11.72, + 10.25, + 14.26, + 14.95 + ], + "nav_end": [ + 15.24, + 12.55, + 11.72, + 10.25, + 14.26 + ], + "mkt_end": [], + "dist_tot": [ + 0.19, + 0.47, + 0.15, + 0.13, + 2.75 + ], + "divs": [ + 0.13, + 0.43, + 0.0, + 0.1, + 0.09 + ], + "gains": [ + 0.06, + 0.04, + 0.15, + 0.03, + 2.66 + ], + "roc": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "ops": [ + 2.9, + 1.35, + 1.64, + -3.87, + 2.18 + ], + "share_div": 0.2032520325203252, + "share_gains": 0.7967479674796749, + "share_roc": 0.0, + "char_actual": 0.58, + "disc_now_approx": null }, "FUND": { "sym": "FUND", @@ -648,8 +1294,69 @@ "bdc": false, "n_tender": 2, "ticker": "FUND", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-03-09", + "ncols": 5, + "nav_beg": [ + 8.36, + 8.91, + 8.49, + 9.07, + 8.08 + ], + "nav_end": [ + 9.61, + 8.36, + 8.91, + 8.49, + 9.07 + ], + "mkt_end": [ + 8.68, + 7.32, + 8.0, + 7.97, + 8.6 + ], + "dist_tot": [ + 0.58, + 0.6, + 0.5, + 0.54, + 0.76 + ], + "divs": [ + 0.16, + 0.18, + 0.18, + 0.1, + 0.35 + ], + "gains": [ + 0.42, + 0.42, + 0.32, + 0.44, + 0.41 + ], + "roc": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "ops": [ + 1.8299999999999998, + 0.06000000000000001, + 0.9299999999999999, + -0.03, + 1.73 + ], + "share_div": 0.325503355704698, + "share_gains": 0.6744966442953021, + "share_roc": 0.0, + "char_actual": 0.5, + "disc_now_approx": -0.0968 }, "IAE": { "sym": "IAE", @@ -658,8 +1365,117 @@ "bdc": false, "n_tender": 0, "ticker": "IAE", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2025-11-10", + "ncols": 11, + "nav_beg": [ + 6.99, + 7.06, + 7.22, + 8.87, + 9.95, + 8.76, + 10.35, + 11.67, + 11.09, + 9.39, + 13.1 + ], + "nav_end": [ + 7.6400000000000015, + 6.99, + 7.06, + 7.219999999999998, + 8.87, + 9.95, + 8.76, + 10.35, + 11.67, + 11.09, + 9.389999999999999 + ], + "mkt_end": [ + 7.25, + 6.27, + 6.08, + 6.34, + 7.9, + 9.27, + 7.5, + 9.34, + 10.56, + 9.72, + 8.16 + ], + "dist_tot": [ + 0.39, + 0.81, + 0.64, + 0.86, + 0.86, + 0.86, + 0.84, + 0.82, + 0.82, + 0.97, + 1.15 + ], + "divs": [ + 0.08, + 0.19, + 0.28, + 0.22, + 0.14, + 0.13, + 0.27, + 0.18, + 0.31, + 0.29, + 0.55 + ], + "gains": [ + 0.31, + 0.62, + 0.36, + 0.64, + 0.72, + 0.73, + 0.57, + 0.64, + 0.51, + 0.68, + 0.6 + ], + "roc": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "ops": [ + 1.04, + 0.74, + 0.48, + 0.79, + 0.22, + 2.05, + 0.75, + 0.5, + 1.4, + 2.67, + 2.56 + ], + "share_div": 0.2926829268292683, + "share_gains": 0.7073170731707317, + "share_roc": 0.0, + "char_actual": 0.52, + "disc_now_approx": -0.051 }, "NXG": { "sym": "NXG", @@ -668,8 +1484,70 @@ "bdc": false, "n_tender": 0, "ticker": "NXG", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-08-06", + "ncols": 6, + "nav_beg": [ + 50.52, + 51.3, + 39.85, + 54.75, + 53.25, + 45.87 + ], + "nav_end": [ + 63.04, + 50.52, + 51.3, + 39.85, + 54.75, + 53.25 + ], + "mkt_end": [], + "dist_tot": [ + 3.24, + 6.48, + 6.48, + 3.94, + 2.56, + 2.56 + ], + "divs": [ + 0.0, + 0.5, + 0.62, + 2.18, + 0.0, + 0.0 + ], + "gains": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "roc": [ + 3.24, + 5.98, + 5.86, + 1.76, + 2.56, + 2.56 + ], + "ops": [ + 15.76, + 5.7, + 17.93, + -10.96, + 4.06, + 9.94 + ], + "share_div": 0.13064133016627077, + "share_gains": 0.0, + "share_roc": 0.8693586698337292, + "char_actual": 0.88, + "disc_now_approx": null }, "IHD": { "sym": "IHD", @@ -678,8 +1556,117 @@ "bdc": false, "n_tender": 0, "ticker": "IHD", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2025-11-10", + "ncols": 11, + "nav_beg": [ + 5.86, + 6.03, + 5.98, + 7.57, + 8.49, + 7.61, + 8.89, + 9.87, + 9.24, + 7.81, + 11.57 + ], + "nav_end": [ + 6.430000000000001, + 5.86, + 6.03, + 5.98, + 7.570000000000001, + 8.49, + 7.609999999999999, + 8.889999999999999, + 9.87, + 9.239999999999998, + 7.81 + ], + "mkt_end": [ + 5.97, + 5.34, + 5.17, + 5.25, + 6.96, + 7.95, + 6.69, + 8.41, + 9.42, + 8.32, + 6.71 + ], + "dist_tot": [ + 0.33, + 0.68, + 0.54, + 0.72, + 0.72, + 0.72, + 0.73, + 0.74, + 0.74, + 0.88, + 1.04 + ], + "divs": [ + 0.07, + 0.14, + 0.21, + 0.18, + 0.11, + 0.09, + 0.28, + 0.17, + 0.18, + 0.19, + 0.21 + ], + "gains": [ + 0.26, + 0.54, + 0.33, + 0.54, + 0.61, + 0.63, + 0.45, + 0.57, + 0.56, + 0.69, + 0.83 + ], + "roc": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "ops": [ + 0.9, + 0.51, + 0.59, + 0.87, + 0.2, + 1.6, + 0.55, + 0.24, + 1.37, + 2.31, + 2.72 + ], + "share_div": 0.23341836734693877, + "share_gains": 0.7665816326530612, + "share_roc": 0.0, + "char_actual": 0.56, + "disc_now_approx": -0.0715 }, "HQH": { "sym": "HQH", @@ -719,22 +1706,22 @@ 2.06 ], "divs": [ - -2.11, - -0.56, + 2.11, + 0.56, 0.0, - -0.11, - -0.61 + 0.11, + 0.61 ], "gains": [ - -0.04, - -0.89, - -1.61, - -1.72, - -1.45 + 0.04, + 0.89, + 1.61, + 1.72, + 1.45 ], "roc": [ - -0.09, - -0.59, + 0.09, + 0.59, 0.0, 0.0, 0.0 @@ -759,8 +1746,63 @@ "bdc": false, "n_tender": 14, "ticker": "MXF", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2025-12-29", + "ncols": 5, + "nav_beg": [ + 17.61, + 18.97, + 17.62, + 17.4, + 12.66 + ], + "nav_end": [ + 22.02, + 17.61, + 18.97, + 17.62, + 17.4 + ], + "mkt_end": [], + "dist_tot": [ + 0.94, + 0.88, + 0.8, + 0.72, + 0.36 + ], + "divs": [ + 0.73, + 0.39, + 0.57, + 0.57, + 0.23 + ], + "gains": [ + 0.2, + 0.41, + 0.21, + 0.1, + 0.03 + ], + "roc": [ + 0.01, + 0.08, + 0.02, + 0.05, + 0.1 + ], + "ops": [ + 5.26, + -0.48, + 2.08, + 0.94, + 5.1 + ], + "share_div": 0.672972972972973, + "share_gains": 0.25675675675675674, + "share_roc": 0.07027027027027027, + "char_actual": 0.32, + "disc_now_approx": null }, "AEF": { "sym": "AEF", @@ -800,11 +1842,11 @@ 0.53 ], "divs": [ - -0.05, - -0.02, - -0.06, - -0.13, - -0.22 + 0.05, + 0.02, + 0.06, + 0.13, + 0.22 ], "gains": [ 0.0, @@ -814,11 +1856,11 @@ 0.0 ], "roc": [ - -0.6, - -0.37, - -0.33, - -0.31, - -0.31 + 0.6, + 0.37, + 0.33, + 0.31, + 0.31 ], "ops": [ 2.29, @@ -871,22 +1913,22 @@ 1.3 ], "divs": [ - -0.48, - -0.39, - -0.68, - -0.22, - -1.2 + 0.48, + 0.39, + 0.68, + 0.22, + 1.2 ], "gains": [ - -0.76, - -1.08, - -0.76, - -1.15, - -0.1 + 0.76, + 1.08, + 0.76, + 1.15, + 0.1 ], "roc": [ - -1.2, - -0.52, + 1.2, + 0.52, 0.0, 0.0, 0.0 @@ -911,8 +1953,69 @@ "bdc": false, "n_tender": 17, "ticker": "TYG", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-02-06", + "ncols": 5, + "nav_beg": [ + 51.96, + 35.35, + 39.41, + 33.54, + 25.42 + ], + "nav_end": [ + 46.54, + 51.96, + 35.35, + 39.41, + 33.54 + ], + "mkt_end": [ + 44.09, + 46.0, + 28.11, + 33.54, + 27.27 + ], + "dist_tot": [ + 4.49, + 2.98, + 2.84, + 2.84, + 1.47 + ], + "divs": [ + 0.15, + 0.45, + 1.65, + 0.0, + 0.0 + ], + "gains": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "roc": [ + 4.34, + 2.53, + 1.19, + 2.84, + 1.47 + ], + "ops": [ + -0.93, + 19.59, + -1.22, + 8.71, + 9.59 + ], + "share_div": 0.1538987688098495, + "share_gains": 0.0, + "share_roc": 0.8461012311901503, + "char_actual": 0.86, + "disc_now_approx": -0.0526 }, "AIO": { "sym": "AIO", @@ -921,8 +2024,70 @@ "bdc": false, "n_tender": 0, "ticker": "AIO", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-04-09", + "ncols": 6, + "nav_beg": [ + 23.52, + 20.61, + 19.92, + 24.18, + 29.2, + 19.89 + ], + "nav_end": [ + 24.86, + 23.52, + 20.61, + 19.92, + 24.18, + 29.2 + ], + "mkt_end": [], + "dist_tot": [ + 2.99, + 1.8, + 1.8, + 1.8, + 4.85, + 2.49 + ], + "divs": [ + 0.89, + 1.07, + 0.5, + 1.39, + 1.4, + 0.0 + ], + "gains": [ + 2.1, + 0.73, + 0.0, + 0.0, + 3.45, + 2.49 + ], + "roc": [ + 0.0, + 0.0, + 1.3, + 0.41, + 0.0, + 0.0 + ], + "ops": [ + 4.33, + 4.71, + 2.49, + -2.46, + -0.17, + 11.8 + ], + "share_div": 0.3337571519389701, + "share_gains": 0.5575333757151939, + "share_roc": 0.10870947234583597, + "char_actual": 0.53, + "disc_now_approx": null }, "JCE": { "sym": "JCE", @@ -931,8 +2096,69 @@ "bdc": false, "n_tender": 0, "ticker": "JCE", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-03-06", + "ncols": 5, + "nav_beg": [ + 15.48, + 13.28, + 12.04, + 17.33, + 15.21 + ], + "nav_end": [ + 16.9, + 15.479999999999999, + 13.28, + 12.039999999999997, + 17.330000000000002 + ], + "mkt_end": [ + 15.94, + 15.9, + 13.55, + 13.54, + 18.58 + ], + "dist_tot": [ + 1.28, + 1.28, + 1.28, + 2.33, + 1.84 + ], + "divs": [ + 0.03, + 0.03, + 0.06, + 0.1, + 0.07 + ], + "gains": [ + 1.25, + 1.25, + 0.02, + 1.93, + 1.77 + ], + "roc": [ + 0.0, + 0.0, + 1.2, + 0.3, + 0.0 + ], + "ops": [ + 2.7, + 3.44, + 2.52, + 2.96, + 3.96 + ], + "share_div": 0.036204744069912614, + "share_gains": 0.7765293383270913, + "share_roc": 0.18726591760299627, + "char_actual": 0.73, + "disc_now_approx": -0.0568 }, "ECAT": { "sym": "ECAT", @@ -941,8 +2167,69 @@ "bdc": false, "n_tender": 0, "ticker": "ECAT", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-03-05", + "ncols": 5, + "nav_beg": [ + 16.43, + 17.25, + 16.84, + 20.9, + 21.05 + ], + "nav_end": [ + 15.23, + 16.43, + 17.25, + 16.84, + 20.9 + ], + "mkt_end": [ + 14.16, + 15.15, + 14.95, + 13.87, + 19.45 + ], + "dist_tot": [ + 3.32, + 2.65, + 1.51, + 1.25, + 1.25 + ], + "divs": [ + 0.35, + 0.54, + 0.58, + 0.99, + 0.75 + ], + "gains": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.03 + ], + "roc": [ + 2.97, + 2.11, + 0.93, + 0.26, + 0.47 + ], + "ops": [ + 2.12, + 1.83, + 1.9200000000000002, + -2.81, + 1.1 + ], + "share_div": 0.3216432865731463, + "share_gains": 0.003006012024048096, + "share_roc": 0.6753507014028055, + "char_actual": 0.71, + "disc_now_approx": -0.0703 }, "CET": { "sym": "CET", @@ -951,8 +2238,69 @@ "bdc": false, "n_tender": 4, "ticker": "CET", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-02-24", + "ncols": 5, + "nav_beg": [ + 54.26, + 46.49, + 40.48, + 48.87, + 39.49 + ], + "nav_end": [ + 60.5, + 54.26, + 46.49, + 40.48, + 48.87 + ], + "mkt_end": [ + 50.71, + 45.69, + 37.77, + 33.39, + 44.58 + ], + "dist_tot": [ + 2.7, + 2.25, + 1.85, + 2.45, + 3.75 + ], + "divs": [ + 0.85, + 0.61, + 0.5, + 0.55, + 0.86 + ], + "gains": [ + 1.85, + 1.64, + 1.35, + 1.9, + 2.89 + ], + "roc": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "ops": [ + 9.15, + 10.15, + 8.01, + -5.81, + 13.47 + ], + "share_div": 0.2592307692307692, + "share_gains": 0.7407692307692308, + "share_roc": 0.0, + "char_actual": 0.54, + "disc_now_approx": -0.1618 }, "IGD": { "sym": "IGD", @@ -961,8 +2309,117 @@ "bdc": false, "n_tender": 0, "ticker": "IGD", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2025-11-10", + "ncols": 11, + "nav_beg": [ + 6.16, + 5.89, + 5.97, + 6.36, + 6.01, + 6.26, + 7.02, + 8.03, + 8.01, + 7.52, + 9.31 + ], + "nav_end": [ + 6.220000000000001, + 6.159999999999999, + 5.890000000000001, + 5.970000000000001, + 6.34, + 6.01, + 6.26, + 7.02, + 8.03, + 8.01, + 7.52 + ], + "mkt_end": [ + 5.99, + 5.6, + 5.1, + 5.35, + 5.9, + 5.47, + 5.5, + 6.56, + 7.56, + 7.29, + 6.51 + ], + "dist_tot": [ + 0.3, + 0.58, + 0.48, + 0.48, + 0.48, + 0.48, + 0.63, + 0.73, + 0.73, + 0.88, + 0.91 + ], + "divs": [ + 0.08, + 0.2, + 0.18, + 0.23, + 0.16, + 0.06, + 0.18, + 0.17, + 0.3, + 0.62, + 0.77 + ], + "gains": [ + 0.22, + 0.38, + 0.3, + 0.25, + 0.32, + 0.42, + 0.45, + 0.11, + 0.43, + 0.26, + 0.14 + ], + "roc": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.45, + 0.0, + 0.0, + 0.0 + ], + "ops": [ + 0.36, + 0.85, + 0.4, + 0.09, + 0.81, + 0.23, + 0.13, + 0.28, + 0.75, + 1.37, + 0.88 + ], + "share_div": 0.4416167664670659, + "share_gains": 0.4910179640718562, + "share_roc": 0.06736526946107783, + "char_actual": 0.46, + "disc_now_approx": -0.037 }, "STEW": { "sym": "STEW", @@ -1012,11 +2469,11 @@ 0.78 ], "divs": [ - -0.72, - -0.75, - -0.75, - -0.73, - -0.78 + 0.72, + 0.75, + 0.75, + 0.73, + 0.78 ], "gains": [ 0.0, @@ -1026,10 +2483,10 @@ 0.0 ], "roc": [ - -0.6, - -0.18, - -0.03, - -0.05, + 0.6, + 0.18, + 0.03, + 0.05, 0.0 ], "ops": [ @@ -1052,8 +2509,63 @@ "bdc": false, "n_tender": 0, "ticker": "BXSY", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-03-05", + "ncols": 5, + "nav_beg": [ + 19.6, + 18.88, + 16.56, + 20.25, + 16.16 + ], + "nav_end": [ + 23.66, + 19.6, + 18.88, + 16.56, + 20.25 + ], + "mkt_end": [], + "dist_tot": [ + 1.0, + 1.07, + 1.0, + 1.0, + 1.32 + ], + "divs": [ + 0.0, + 0.16, + 0.06, + 0.2, + 0.29 + ], + "gains": [ + 1.0, + 0.91, + 0.94, + 0.75, + 0.98 + ], + "roc": [ + 0.0, + 0.0, + 0.0, + 0.05, + 0.05 + ], + "ops": [ + 5.07, + 1.85, + 3.35, + -2.66, + 5.45 + ], + "share_div": 0.13172541743970315, + "share_gains": 0.8497217068645639, + "share_roc": 0.01855287569573284, + "char_actual": 0.63, + "disc_now_approx": null }, "IDE": { "sym": "IDE", @@ -1062,8 +2574,117 @@ "bdc": false, "n_tender": 0, "ticker": "IDE", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2025-11-10", + "ncols": 11, + "nav_beg": [ + 11.48, + 11.72, + 11.26, + 12.53, + 12.28, + 11.6, + 13.74, + 16.38, + 15.38, + 13.59, + 17.19 + ], + "nav_end": [ + 12.430000000000001, + 11.48, + 13.39, + 11.26, + 12.5, + 12.28, + 11.600000000000001, + 13.739999999999998, + 16.38, + 15.379999999999999, + 13.59 + ], + "mkt_end": [ + 12.52, + 10.53, + 177615.0, + 9.72, + 11.05, + 11.76, + 10.07, + 12.7, + 15.6, + 13.88, + 11.59 + ], + "dist_tot": [ + 0.6, + 1.23, + 0.47, + 0.92, + 0.92, + 0.92, + 1.04, + 1.82, + 1.16, + 1.39, + 1.54 + ], + "divs": [ + 0.09, + 0.2, + 0.23, + 0.19, + 0.2, + 0.15, + 0.25, + 0.22, + 0.2, + 0.21, + 0.25 + ], + "gains": [ + 0.47, + 0.57, + 0.22, + 0.18, + 0.41, + 0.77, + 0.15, + 1.6, + 0.76, + 0.13, + 0.08 + ], + "roc": [ + 0.04, + 0.46, + 0.0, + 0.55, + 0.31, + 0.0, + 0.64, + 0.0, + 0.2, + 1.05, + 1.21 + ], + "ops": [ + 1.55, + 0.99, + 1.38, + 0.35, + 1.14, + 1.6, + 1.1, + 0.82, + 2.16, + 3.18, + 2.06 + ], + "share_div": 0.18234804329725224, + "share_gains": 0.44462947543713566, + "share_roc": 0.37135720233139047, + "char_actual": 0.7, + "disc_now_approx": 0.0072 }, "AGD": { "sym": "AGD", @@ -1103,11 +2724,11 @@ 0.78 ], "divs": [ - -0.72, - -0.75, - -0.75, - -0.73, - -0.78 + 0.72, + 0.75, + 0.75, + 0.73, + 0.78 ], "gains": [ 0.0, @@ -1117,10 +2738,10 @@ 0.0 ], "roc": [ - -0.6, - -0.18, - -0.03, - -0.05, + 0.6, + 0.18, + 0.03, + 0.05, 0.0 ], "ops": [ @@ -1143,8 +2764,117 @@ "bdc": false, "n_tender": 0, "ticker": "IGA", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2025-11-10", + "ncols": 11, + "nav_beg": [ + 10.45, + 9.99, + 10.04, + 10.51, + 9.89, + 10.42, + 11.43, + 12.12, + 11.62, + 10.71, + 12.93 + ], + "nav_end": [ + 10.469999999999999, + 10.45, + 9.989999999999998, + 10.04, + 10.48, + 9.89, + 10.42, + 11.43, + 12.12, + 11.620000000000001, + 10.71 + ], + "mkt_end": [ + 10.0, + 9.78, + 8.57, + 8.88, + 9.5, + 8.92, + 9.29, + 10.35, + 11.19, + 10.39, + 9.55 + ], + "dist_tot": [ + 0.51, + 1.05, + 0.79, + 0.79, + 0.79, + 0.79, + 0.84, + 0.9, + 0.9, + 1.07, + 1.12 + ], + "divs": [ + 0.14, + 0.45, + 0.34, + 0.42, + 0.21, + 0.15, + 0.4, + 0.41, + 0.04, + 0.42, + 0.39 + ], + "gains": [ + 0.21, + 0.37, + 0.45, + 0.12, + 0.58, + 0.4, + 0.44, + 0.49, + 0.78, + 0.16, + 0.73 + ], + "roc": [ + 0.16, + 0.23, + 0.0, + 0.25, + 0.0, + 0.24, + 0.0, + 0.0, + 0.08, + 0.49, + 0.0 + ], + "ops": [ + 0.53, + 1.51, + 0.74, + 0.32, + 1.38, + 0.26, + 0.17, + 0.21, + 1.4, + 1.98, + 1.1 + ], + "share_div": 0.35287958115183243, + "share_gains": 0.4952879581151833, + "share_roc": 0.1518324607329843, + "char_actual": 0.53, + "disc_now_approx": -0.0449 }, "EOD": { "sym": "EOD", @@ -1178,11 +2908,11 @@ 0.52 ], "divs": [ - -0.26, - -0.24, - -0.21, - -0.18, - -0.26 + 0.26, + 0.24, + 0.21, + 0.18, + 0.26 ], "gains": [ 0.0, @@ -1192,11 +2922,11 @@ 0.0 ], "roc": [ - -0.24, - -0.2, - -0.24, - -0.35, - -0.26 + 0.24, + 0.2, + 0.24, + 0.35, + 0.26 ], "ops": [ 1.41, @@ -1218,8 +2948,63 @@ "bdc": false, "n_tender": 1, "ticker": "ETG", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2025-12-30", + "ncols": 5, + "nav_beg": [ + 20.52, + 16.8, + 16.01, + 22.61, + 16.16 + ], + "nav_end": [ + 23.23, + 20.52, + 16.8, + 16.01, + 22.61 + ], + "mkt_end": [], + "dist_tot": [ + 1.55, + 1.41, + 1.2, + 1.56, + 1.31 + ], + "divs": [ + 1.01, + 0.54, + 0.84, + 0.51, + 0.89 + ], + "gains": [ + 0.54, + 0.87, + 0.36, + 1.05, + 0.42 + ], + "roc": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "ops": [ + 4.26, + 5.13, + 1.99, + -5.04, + 7.76 + ], + "share_div": 0.5391180654338549, + "share_gains": 0.46088193456614507, + "share_roc": 0.0, + "char_actual": 0.38, + "disc_now_approx": null }, "CSQ": { "sym": "CSQ", @@ -1247,18 +3032,18 @@ 1.14 ], "divs": [ - -0.48, - -0.42, - -0.15 + 0.48, + 0.42, + 0.15 ], "gains": [ - -0.1, - -0.21, - -0.99 + 0.1, + 0.21, + 0.99 ], "roc": [ 0.0, - -0.51, + 0.51, 0.0 ], "ops": [ @@ -1279,8 +3064,63 @@ "bdc": false, "n_tender": 0, "ticker": "MCI", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-03-09", + "ncols": 5, + "nav_beg": [ + 16.84, + 16.77, + 16.37, + 16.68, + 15.04 + ], + "nav_end": [ + 16.63, + 16.84, + 16.77, + 16.37, + 16.68 + ], + "mkt_end": [], + "dist_tot": [ + 1.58, + 1.68, + 1.42, + 1.02, + 0.96 + ], + "divs": [ + 1.6, + 1.69, + 1.42, + 0.88, + 0.96 + ], + "gains": [ + 0.0, + 0.0, + 0.0, + 0.14, + 0.0 + ], + "roc": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "ops": [ + 1.37, + 1.75, + 1.82, + 0.71, + 2.6 + ], + "share_div": 0.9834834834834836, + "share_gains": 0.021021021021021026, + "share_roc": 0.0, + "char_actual": 0.11, + "disc_now_approx": null }, "SCD": { "sym": "SCD", @@ -1289,8 +3129,63 @@ "bdc": false, "n_tender": 0, "ticker": "SCD", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-07-30", + "ncols": 5, + "nav_beg": [ + 16.51, + 18.64, + 14.9, + 14.74, + 15.93 + ], + "nav_end": [ + 17.27, + 16.51, + 18.64, + 14.9, + 14.74 + ], + "mkt_end": [], + "dist_tot": [ + 0.72, + 1.42, + 1.36, + 1.35, + 1.04 + ], + "divs": [ + 0.72, + 0.72, + 0.45, + 0.33, + 0.33 + ], + "gains": [ + 0.0, + 0.7, + 0.91, + 0.38, + 0.0 + ], + "roc": [ + 0.0, + 0.0, + 0.0, + 0.64, + 0.71 + ], + "ops": [ + 1.48, + -0.21, + 5.1, + 1.48, + -0.18 + ], + "share_div": 0.432937181663837, + "share_gains": 0.33786078098471983, + "share_roc": 0.22920203735144315, + "char_actual": 0.51, + "disc_now_approx": null }, "MPV": { "sym": "MPV", @@ -1299,8 +3194,63 @@ "bdc": false, "n_tender": 0, "ticker": "MPV", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-03-09", + "ncols": 5, + "nav_beg": [ + 15.46, + 15.41, + 14.99, + 15.19, + 13.6 + ], + "nav_end": [ + 15.23, + 15.46, + 15.41, + 15.05, + 15.19 + ], + "mkt_end": [], + "dist_tot": [ + 1.46, + 1.57, + 1.29, + 0.86, + 0.8 + ], + "divs": [ + 1.48, + 1.57, + 1.29, + 0.83, + 0.8 + ], + "gains": [ + 0.0, + 0.0, + 0.0, + 0.03, + 0.0 + ], + "roc": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "ops": [ + 1.23, + 1.62, + 1.71, + 0.66, + 2.39 + ], + "share_div": 0.9983277591973243, + "share_gains": 0.005016722408026755, + "share_roc": 0.0, + "char_actual": 0.1, + "disc_now_approx": null }, "CLM": { "sym": "CLM", @@ -1309,8 +3259,69 @@ "bdc": false, "n_tender": 0, "ticker": "CLM", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-03-04", + "ncols": 5, + "nav_beg": [ + 7.03, + 6.77, + 6.48, + 10.23, + 9.93 + ], + "nav_end": [ + 6.73, + 7.03, + 6.77, + 6.48, + 10.23 + ], + "mkt_end": [ + 8.36, + 8.59, + 7.19, + 7.37, + 14.29 + ], + "dist_tot": [ + 1.47, + 1.3, + 1.48, + 2.16, + 1.92 + ], + "divs": [ + 0.02, + 0.02, + 0.03, + 0.03, + 0.01 + ], + "gains": [ + 0.63, + 0.48, + 0.53, + 0.22, + 0.92 + ], + "roc": [ + 0.82, + 0.8, + 0.92, + 1.91, + 0.99 + ], + "ops": [ + 1.09, + 1.56, + 1.77, + -2.18, + 1.87 + ], + "share_div": 0.013205282112845138, + "share_gains": 0.3337334933973589, + "share_roc": 0.653061224489796, + "char_actual": 0.89, + "disc_now_approx": 0.2422 }, "HERZ": { "sym": "HERZ", @@ -1357,18 +3368,18 @@ 0.0 ], "gains": [ - -0.23, - -0.12, - -0.1, - -0.23, + 0.23, + 0.12, + 0.1, + 0.23, 0.0 ], "roc": [ - -0.23, - -0.29, - -0.59, - -0.83, - -0.62 + 0.23, + 0.29, + 0.59, + 0.83, + 0.62 ], "ops": [ 0.07, @@ -1390,8 +3401,69 @@ "bdc": false, "n_tender": 10, "ticker": "CRF", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-03-04", + "ncols": 5, + "nav_beg": [ + 6.69, + 6.49, + 6.24, + 9.88, + 9.56 + ], + "nav_end": [ + 6.52, + 6.69, + 6.49, + 6.24, + 9.88 + ], + "mkt_end": [ + 8.01, + 8.69, + 7.06, + 7.1, + 13.75 + ], + "dist_tot": [ + 1.4, + 1.25, + 1.42, + 2.08, + 1.84 + ], + "divs": [ + 0.02, + 0.03, + 0.03, + 0.03, + 0.01 + ], + "gains": [ + 0.59, + 0.51, + 0.51, + 0.22, + 1.12 + ], + "roc": [ + 0.79, + 0.71, + 0.88, + 1.83, + 0.71 + ], + "ops": [ + 1.02, + 1.45, + 1.67, + -1.98, + 1.83 + ], + "share_div": 0.015018773466833541, + "share_gains": 0.36921151439299127, + "share_roc": 0.6157697121401752, + "char_actual": 0.88, + "disc_now_approx": 0.2285 }, "EDF": { "sym": "EDF", @@ -1400,8 +3472,63 @@ "bdc": false, "n_tender": 0, "ticker": "EDF", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-02-06", + "ncols": 5, + "nav_beg": [ + 8.51, + 8.45, + 8.94, + 11.67, + 12.55 + ], + "nav_end": [ + 8.29, + 8.51, + 8.45, + 8.94, + 11.67 + ], + "mkt_end": [], + "dist_tot": [ + 0.96, + 0.96, + 0.96, + 0.96, + 1.08 + ], + "divs": [ + 0.49, + 0.45, + 0.41, + 0.46, + 0.52 + ], + "gains": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "roc": [ + 0.47, + 0.51, + 0.55, + 0.5, + 0.56 + ], + "ops": [ + 0.74, + 1.02, + 0.47, + -1.77, + 0.2 + ], + "share_div": 0.4735772357723577, + "share_gains": 0.0, + "share_roc": 0.5264227642276423, + "char_actual": 0.57, + "disc_now_approx": null }, "VCRDX": { "sym": "VCRDX", @@ -1410,8 +3537,42 @@ "bdc": false, "n_tender": 9, "ticker": "VCRDX", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-06-04", + "ncols": 2, + "nav_beg": [ + 10.1, + 10.0 + ], + "nav_end": [ + 10.1, + 10.1 + ], + "mkt_end": [], + "dist_tot": [ + 0.95, + 0.85 + ], + "divs": [ + 0.87, + 0.83 + ], + "gains": [ + 0.0, + 0.0 + ], + "roc": [ + 0.08, + 0.02 + ], + "ops": [ + 0.95, + 0.95 + ], + "share_div": 0.9444444444444445, + "share_gains": 0.0, + "share_roc": 0.055555555555555566, + "char_actual": 0.15, + "disc_now_approx": null }, "IGR": { "sym": "IGR", @@ -1420,8 +3581,69 @@ "bdc": false, "n_tender": 3, "ticker": "IGR", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-03-06", + "ncols": 5, + "nav_beg": [ + 5.1, + 6.2, + 6.31, + 10.48, + 8.11 + ], + "nav_end": [ + 4.5, + 5.1, + 6.2, + 6.31, + 10.48 + ], + "mkt_end": [ + 4.38, + 4.81, + 5.43, + 5.73, + 9.79 + ], + "dist_tot": [ + 0.72, + 0.72, + 0.72, + 0.7, + 0.6 + ], + "divs": [ + 0.11, + 0.44, + 0.34, + 0.21, + 0.08 + ], + "gains": [ + 0.0, + 0.15, + 0.3, + 0.49, + 0.52 + ], + "roc": [ + 0.61, + 0.13, + 0.08, + 0.0, + 0.0 + ], + "ops": [ + 0.12, + -0.38, + 0.84, + -3.47, + 2.97 + ], + "share_div": 0.34104046242774566, + "share_gains": 0.4219653179190751, + "share_roc": 0.23699421965317916, + "char_actual": 0.57, + "disc_now_approx": -0.0267 }, "NICHX": { "sym": "NICHX", @@ -1430,17 +3652,120 @@ "bdc": false, "n_tender": 34, "ticker": "NICHX", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-07-09", + "ncols": 5, + "nav_beg": [ + 26.74, + 28.46, + 28.93, + 28.38, + 26.96 + ], + "nav_end": [ + 25.93, + 26.74, + 28.46, + 28.93, + 28.38 + ], + "mkt_end": [], + "dist_tot": [ + 2.62, + 2.69, + 3.14, + 1.73, + 1.68 + ], + "divs": [ + 2.51, + 2.53, + 3.14, + 1.53, + 1.43 + ], + "gains": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "roc": [ + 0.11, + 0.16, + 0.0, + 0.2, + 0.25 + ], + "ops": [ + 1.81, + 0.97, + 2.67, + 2.28, + 3.1 + ], + "share_div": 0.9392917369308599, + "share_gains": 0.0, + "share_roc": 0.060708263069139956, + "char_actual": 0.15, + "disc_now_approx": null }, "ASCIX": { "sym": "ASCIX", "cik": 1716885, "name": "Angel Oak Strategic Credit Fund", "bdc": false, - "n_tender": 33, + "n_tender": 34, "ticker": "ASCIX", - "error": "no per-share table found in the 3 latest reports", - "char_actual": null + "report_filed": "2026-04-08", + "ncols": 4, + "nav_beg": [ + 21.08, + 20.86, + 20.62, + 21.13 + ], + "nav_end": [ + 20.92, + 21.08, + 20.86, + 20.62 + ], + "mkt_end": [], + "dist_tot": [ + 1.78, + 1.87, + 1.71, + 1.03 + ], + "divs": [ + 1.78, + 1.87, + 1.71, + 1.03 + ], + "gains": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "roc": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "ops": [ + 1.62, + 2.09, + 1.95, + 0.52 + ], + "share_div": 1.0, + "share_gains": 0.0, + "share_roc": 0.0, + "char_actual": 0.1, + "disc_now_approx": null } } \ No newline at end of file diff --git a/fundlab/cef_annual.py b/fundlab/cef_annual.py index 197a993..2ec0571 100644 --- a/fundlab/cef_annual.py +++ b/fundlab/cef_annual.py @@ -58,7 +58,7 @@ FRAC_ROC = 1.0 # defers to the investor's own LTCG on a >1y sale FRAC_NII_MUNI = 1.0 # tax-exempt interest -NUMTOK = re.compile(r"\$?\(?\d[\d,]*(?:\.\d+)?\)?") +NUMTOK = re.compile(r"\$?\(?(?:\d[\d,]*(?:\.\d+)?|\.\d+)\)?") FOOTNOTE = re.compile(r"\([a-z0-9]{1,3}\)") @@ -66,7 +66,7 @@ def _nums(tokens: list[str]) -> list[float | None]: out = [] for t in tokens: t = t.strip().rstrip(":") - if not re.fullmatch(r"\$?\(?\d[\d,]*(?:\.\d+)?\)?", t): + if not re.fullmatch(r"\$?\(?(?:\d[\d,]*(?:\.\d+)?|\.\d+)\)?", t): out.append(None) continue neg = t.startswith("(") @@ -83,50 +83,516 @@ def _row(block: str, label_rx: str, span: int = 700) -> list[float | None]: tail = block[rm.end(): rm.end() + span] tail = re.sub(r"\(\s+", "(", tail) tail = re.sub(r"\s+\)", ")", tail) + tail = re.sub(r"(? dict | None: - """Parse the per-share highlights table. Returns None on failure.""" + +def _fixlen(row: list, ncols: int) -> list: + """Footnote integers (bare 1-9) can inflate a row (RMT '1 , 2', + NICHX/VCRDX leading '1'). Dropping them is only accepted when it + lands exactly on ncols; the per-column arithmetic re-validates.""" + if len(row) <= ncols: + return row + kept = [v for v in row + if not (v is not None and v == int(v) and 0 < abs(v) < 10)] + return kept if len(kept) == ncols else row + + +def _perms4(k): + """Ordered assignments of k values to distinct slots of 4.""" + for a in range(4): + if k == 1: + yield (a,) + continue + for b in range(4): + if b == a: + continue + if k == 2: + yield (a, b) + continue + for c in range(4): + if c != a and c != b: + yield (a, b, c) + + +def _align_trans_row(vals: list, has_roc: bool, has_gains: bool) -> tuple | None: + """Align one transposed data row (newest period first). + + v0=nav_beg v1=nii v2=gains v3=ops, then the distribution sub-values + and total. Three label layouts: + I1 (default, Voya w/ dropped ROC): v4=divs v5=gdist v6=dtot + I3 (STEW: ROC label, no gains label): v4=divs v5=roc v6=dtot + I2 (Voya w/ non-zero ROC value): v4=divs v5=gdist v6=roc v7=dtot + Zero-dropped columns make this ambiguous - resolve by arithmetic: + divs+gdist+roc == dtot AND nav_end == nav_beg+ops+accretion-dtot. + Positive outflow convention (transposed tables print positives).""" + if len(vals) < 7: + return None + nav_b = abs(vals[0]) + # NII and gains are SIGNED (loss years are negative) - the ops row + # is their signed sum; only NAV magnitudes are always positive + nii, gains, ops = vals[1], vals[2], vals[3] + if abs(nii + gains - ops) > 0.02 * max(1.0, abs(ops)) + 0.02: + return None + interps = [] + if has_roc and not has_gains: + interps.append((4, None, 6, 5, 7)) # divs, gdist=0, dtot, roc, next + interps.append((4, 5, 6, None, 7)) + if has_roc: + interps.append((4, 5, 7, 6, 8)) + strict_fb = None + for di, gi, ti, ri, nxt in interps: + if len(vals) < max(ti, ri or 0, gi or 0) + 1: + continue + divs = abs(vals[di]) + gdist = 0.0 if gi is None else abs(vals[gi]) + dtot = abs(vals[ti]) + roc = 0.0 if ri is None else abs(vals[ri]) + if abs(divs + gdist + roc - dtot) > 0.03: + continue + rest = vals[nxt:] + if not rest: + # table ends at the total distributions row (PDX) + return (nav_b, divs, gdist, roc, dtot, None, None) + for acc in [0.0] + list(rest): + nav_e = nav_b + ops + abs(acc) - dtot + for i, x in enumerate(rest): + if abs(x - nav_e) <= 0.03: + mkt_e = rest[i + 1] if i + 1 < len(rest) else None + return (nav_b, divs, gdist, roc, dtot, nav_e, mkt_e) + # dist arithmetic is exact but no nav_end pin - keep as fallback + if strict_fb is None and abs(divs + gdist + roc - dtot) <= 0.011: + strict_fb = (nav_b, divs, gdist, roc, dtot, None, None) + + # slot placement: some components dropped entirely (JCE: divs + dtot + # only, tail = nav_e/mkt_e). Assign the post-ops values to the + # (divs, gdist, dtot, roc) slots, zeros implied, and require + # divs+gdist+roc == dtot plus the nav identity on the tail. + for m in (2, 1, 0): + tail = vals[-m:] if m else [] + dvals = vals[4: len(vals) - m] + if not (1 <= len(dvals) <= 3): + continue + for perm in _perms4(len(dvals)): + slots = [0.0, 0.0, 0.0, 0.0] + for s, v in zip(perm, dvals): + if slots[s]: + break + slots[s] = abs(v) + else: + sdivs, sgdist, sdtot, sroc = slots + if sdtot and abs(sdivs + sgdist + sroc - sdtot) \ + <= 0.02 * max(1.0, sdtot) + 0.02: + nav_e = None + if tail: + pred = nav_b + ops - sdtot + nav_e = next( + (abs(x) for x in tail + if abs(abs(x) - pred) <= 0.05), None) + if nav_e is None: + continue + mkt_e = tail[-1] if tail else None + return (nav_b, sdivs, sgdist, sroc, sdtot, + nav_e, mkt_e) + return strict_fb + + +def _transposed_rows(after: str, header_end: int, span: int) -> list: + """Data rows (list of value lists) after a transposed header. + Handles dash dates (Voya MM-DD-YY) and slash dates (PIMCO/Nuveen + MM/DD/YYYY).""" + dates = [dm for dm in re.finditer(r"\d{1,2}[-/]\d{1,2}[-/]\d{2,4}", after)] + dates = [dm for dm in dates if len(dm.group(0)) >= 8] + rows = [] + for k, dm in enumerate(dates): + stop = (dates[k + 1].start() if k + 1 < len(dates) + else min(len(after), dm.end() + span)) + seg = after[dm.end():stop] + seg = re.sub(r"\(\s+", "(", seg) + seg = re.sub(r"\s+\)", ")", seg) + seg = re.sub(r"(?= 7: + rows.append(vals) + return rows + + +def _section_split(after: str, span: int): + """Split a multi-fund consolidated region into (header, rows) + sections. A section break is a text run of >= 3 words (a fund + name) followed by date rows. Returns [(header, rows), ...].""" + parts = [] + pos = 0 + cur_header = "" + cur = [] + date_re = re.compile(r"\d{1,2}[-/]\d{1,2}[-/]\d{2,4}") + while pos < len(after): + dm = date_re.search(after, pos) + if not dm: + break + between = after[pos:dm.start()] + words = [w for w in between.split() + if not NUMTOK.fullmatch(w) + and not re.fullmatch(r"[()$%,.\-]+", w) + and re.search(r"[A-Za-z]", w)] + tickerish = (1 <= len(words) <= 2 and all( + re.fullmatch(r"[A-Za-z]{1,8}", w) for w in words)) + if words and cur: + # text run before a date with existing rows: section break + if len(words) >= 3 or tickerish: + parts.append((cur_header, cur)) + cur_header = " ".join(words) + cur = [] + # gather this date row + stop_m = date_re.search(after, dm.end() + 1) + stop = stop_m.start() if stop_m else min(len(after), dm.end() + span) + seg = after[dm.end():stop] + seg = re.sub(r"\(\s+", "(", seg) + seg = re.sub(r"\s+\)", ")", seg) + seg = re.sub(r"(?= 7: + cur.append(vals) + pos = stop + if cur: + parts.append((cur_header, cur)) + return parts + + +def _pick_section(parts, name: str, ticker: str): + """Choose the section belonging to THIS fund in a consolidated + report (PIMCO/Nuveen report several funds in one table).""" + if not parts: + return None + if len(parts) == 1: + return parts[0][1] + name_words = {w.lower() for w in re.findall(r"[A-Za-z0-9]+", name) + if len(w) > 2 + and w.lower() not in + ("fund", "funds", "inc", "company", "llc", "corp", + "corporation", "series", "trust", "the", "of", "and")} + best, best_score = None, 0 + for header, rows in parts: + hw = {w.lower() for w in re.findall(r"[A-Za-z0-9]+", header)} + score = len(hw & name_words) + if ticker and re.search(r"\b" + re.escape(ticker.upper()) + + r"\b", header, re.I): + score += 5 + if score > best_score: + best, best_score = rows, score + if best is None or best_score < 2: + return parts[0][1] # no identifying header: first section + return best + + + + +def parse_transposed(t: str, name: str = "", ticker: str = "") -> dict | None: + def _trans_from(m): + # the header row ("Year(s) [or Period] Ended") may sit before the + # label list (PIMCO) or after it (Voya) - take the one closest + # before the first data row + window = t[max(0, m.start() - 500): m.start() + 9000] + datere = r"\d{1,2}[-/]\d{1,2}[-/]\d{2,4}" + first_date = re.search(datere, window) + if not first_date: + return None + hm = None + for h in re.finditer(r"years? (?:or period )?ended", window, re.I): + if h.start() < first_date.start(): + hm = h + if hm is None: + # no "Year(s) ended" header (Nuveen JCE): start at the anchor - + # the label list before it carries no dates + after = window[m.start() - max(0, m.start() - 500):] + else: + after = window[hm.end():] + has_roc = bool(re.search(r"(?:tax )?return of capital", window, re.I)) + has_gains = bool(re.search(r"from net realized gains", window, re.I)) + parts = _section_split(after, 300) + rows = _pick_section(parts, name, ticker) + if not rows or len(rows) < 3: + return None + cols = [_align_trans_row(v, has_roc, has_gains) for v in rows] + # the oldest 1-2 periods are sometimes structurally different + # (reorganization years) - tolerate trailing failures + bad = [i for i, c in enumerate(cols) if c is None] + if bad and any(i < len(cols) - 2 for i in bad): + return None + if sum(c is None for c in cols) >= 3: + return None + rows = [v for v, c in zip(rows, cols) if c is not None] + cols = [c for c in cols if c is not None] + if len(cols) < 3: + return None + mkt = [c[6] for c in cols] + out = { + "ncols": len(cols), + "nav_beg": [c[0] for c in cols], + "nav_end": ([c[5] for c in cols] + if all(c[5] is not None for c in cols) else []), + "mkt_end": mkt if all(x is not None for x in mkt) else [], + "dist_tot": [c[4] for c in cols], + "divs": [c[1] for c in cols], + "gains": [c[2] for c in cols], + "roc": [c[3] for c in cols], + "ops": [abs(v[3]) for v in rows], + } + tot5 = sum(v for v in out["dist_tot"] if v > 0) + if tot5 > 0: + out["share_div"] = sum(out["divs"]) / tot5 + out["share_gains"] = sum(out["gains"]) / tot5 + out["share_roc"] = sum(out["roc"]) / tot5 + return out + + for m in re.finditer( + r"net asset value(?: per (?:common )?share)?,? beginning of " + r"(?:the )?(?:year|period)", t, re.I): + h = _trans_from(m) + if h: + return h + return None + + + + +def parse_columnar(t: str, name: str = "", ticker: str = "") -> dict | None: + """Columnar value stream (SRH/STEW): a LABEL LIST (no values on + the label rows), then a period header, then one contiguous value run + per label. Rows are identified arithmetically, not by position.""" + anchor_rx = (r"net asset value(?: per (?:common )?share)?,? beginning of " + r"(?:the )?(?:year|period)") + for m in re.finditer(anchor_rx, t, re.I): + region = t[m.start(): m.start() + 9000] + toks = re.findall(r"\S+", region) + # the NAV-begin row = the longest run of numeric tokens ("$" is + # transparent); period-header year runs (2025 2024 ...) are + # rejected by magnitude + run, run_toks, best = [], [], (None, 0) + for x in toks: + if x == "$": + if run: + run_toks.append(x) + continue + if NUMTOK.fullmatch(x) and not re.fullmatch(r"\(\d{1,2}\)", x): + run.append(x) + run_toks.append(x) + else: + vals = [float(v.strip("$()").replace(",", "")) for v in run] + if len(run) >= 4 and best[1] < len(run) \ + and all(abs(v) < 100 for v in vals): + best = (run_toks[:], len(run)) + run, run_toks = [], [] + vals = [float(v.strip("$()").replace(",", "")) for v in run] + if len(run) >= 4 and best[1] < len(run) \ + and all(abs(v) < 100 for v in vals): + best = (run_toks[:], len(run)) + if best[0] is None or best[1] < 4: + continue + ncols = best[1] + stream = [x for x in best[0] + if x != "$" and NUMTOK.fullmatch(x) + and not re.fullmatch(r"\(\d{1,2}\)", x)] + stream = stream + [x for x in toks[toks.index(best[0][0]) + len(best[0]):] + if x != "$" and NUMTOK.fullmatch(x) + and not re.fullmatch(r"\(\d{1,2}\)", x)] + rows = [_nums(stream[k: k + ncols]) + for k in range(0, len(stream) - ncols + 1, ncols)] + if len(rows) < 4: + continue + nav_b = rows[0] + # ops row: nii=rows[1], gains=rows[2] in the standard order; + # verify nii+gains==ops and locate ops (rows[3], or scan) + nii, gains = rows[1], rows[2] + ops = None + for cand in range(2, min(6, len(rows) - 2)): + r = rows[cand] + err = sum(abs((_get(nii, c) + _get(gains, c)) - _get(r, c)) + for c in range(ncols)) + if err <= 0.05 * ncols: + ops = r + ops_i = cand + break + if ops is None: + continue + # dtot row: some later row t with divs/roc before it satisfying + # divs (+roc) == dtot per column + best = None + for t_ in range(ops_i + 2, len(rows) - 1): + dtot = rows[t_] + window_rows = rows[ops_i + 1: t_] + for extra in (0, 1): + need_cols = len(window_rows) - extra + if need_cols < 1: + continue + # try every way to pick divs (+ optional roc) from the + # window rows so the column arithmetic holds + from itertools import combinations + for pick in combinations(range(len(window_rows)), + 2 if extra else 1): + ok = True + dv = [0.0] * ncols + rc = [0.0] * ncols + for j, pi in enumerate(pick): + w = window_rows[pi] + vec = dv if j == 0 else rc + for c in range(ncols): + vec[c] += abs(_get(w, c)) + for c in range(ncols): + d = abs(_get(dtot, c)) + if abs(dv[c] + rc[c] - d) > 0.02 * max(1.0, d) + 0.02: + ok = False + break + if ok: + best = (t_, dv, rc, dtot) + break + if best: + break + if best: + break + if best is None: + continue + t_, dv, rc, dtot = best + # nav_e: first row after dtot close to nav_b + ops - dtot + # (capital transactions are usually small) + nav_e = mkt_e = None + pred = [_get(nav_b, c) + _get(ops, c) - abs(_get(dtot, c)) + for c in range(ncols)] + for e_ in range(t_ + 1, len(rows)): + r = rows[e_] + close = sum(1 for c in range(ncols) + if abs(_get(r, c) - pred[c]) < 3.0) + if close >= ncols - 1: + nav_e = r + if e_ + 1 < len(rows): + mkt_e = rows[e_ + 1] + break + out = { + "ncols": ncols, + "nav_beg": list(nav_b), + "nav_end": [abs(_get(nav_e, c)) for c in range(ncols)] + if nav_e is not None else [], + "mkt_end": [abs(_get(mkt_e, c)) for c in range(ncols)] + if mkt_e is not None else [], + "dist_tot": [abs(_get(dtot, c)) for c in range(ncols)], + "divs": list(dv), + "gains": [0.0] * ncols, + "roc": list(rc), + "ops": [abs(_get(ops, c)) for c in range(ncols)], + } + tot5 = sum(v for v in out["dist_tot"] if v > 0) + if tot5 > 0: + out["share_div"] = sum(out["divs"]) / tot5 + out["share_gains"] = sum(out["gains"]) / tot5 + out["share_roc"] = sum(out["roc"]) / tot5 + return out + return None + + +def parse_highlights(t: str, name: str = "", ticker: str = "") -> dict | None: + """Parse the per-share highlights table. Returns None on failure. + name/ticker identify THIS fund in a consolidated report.""" + trans_name = name + trans_ticker = ticker # collapse whitespace: CEF HTML tables flatten with one
per line, # splitting labels ("Net\nasset value, beginning of year") t = re.sub(r"\s+", " ", t) - # anchor: first "Net asset value, beginning of year" with "share" - # nearby (skips dollar-basis statement mentions) - anchor = None - for m in re.finditer(r"net asset value(?: per (?:common )?share)?, beginning of (?:year|period)", t, re.I): - pre = t[max(0, m.start() - 400): m.start()] - if re.search(r"share", pre, re.I): - anchor = m - break - if not anchor: - return None - block = t[anchor.start(): anchor.start() + 6000] + # anchor: first per-share "Net asset value[,]? beginning of + # [the] year|period" whose values are per-share scale. (The old + # "share within 400 chars" guard rejected real tables - ASA/DXYZ/ + # NML/... - a dollar-basis statement has values in the millions, + # so the magnitude of the first value is the discriminator.) + cands = [] + for m in re.finditer( + r"net asset value(?: per (?:common )?share)?,? beginning of " + r"(?:the )?(?:year|period)", t, re.I): + blk = t[m.start(): m.start() + 6000] + row = _row(blk, + r"net asset value(?: per (?:common )?share)?,? beginning " + r"of (?:the )?(?:year|period)") + if row and 0 < abs(row[0]) < 10000: + cands.append(m) + if not cands: + # no inline per-share row: transposed layout (Voya, PIMCO, + # Nuveen - label list, then one row per year) + return parse_transposed(t, trans_name, trans_ticker) + for m in cands: + h = _parse_inline(t[m.start(): m.start() + 6000]) + if h: + return h + h = parse_columnar(t, trans_name, trans_ticker) + if h: + return h + return parse_transposed(t, trans_name, trans_ticker) - nav_beg = _row(block, r"net asset value(?: per (?:common )?share)?, beginning of (?:year|period)") - nav_end = _row(block, r"net asset value(?: per (?:common )?share)?, end of (?:year|period)") - if len(nav_beg) < 3 or len(nav_end) < 3: + +def _parse_inline(block: str) -> dict | None: + """One inline (row-per-label) highlights table starting at its + NAV-beginning anchor.""" + nav_beg = _row(block, r"net asset value(?: per (?:common )?share)?,? beginning of (?:the )?(?:year|period)") + nav_end = _fixlen( + _row(block, r"net asset value(?: per (?:common )?share)?,? end of (?:the )?(?:year|period)"), + len(nav_beg)) + if len(nav_beg) < 2 or len(nav_end) < 2: return None ncols = len(nav_beg) if len(nav_end) != ncols or ncols > 6: return None - nii_ops = _row(block, r"Net investment (?:income|loss)\b") - gains_ops = _row(block, r"Net realized (?:and|&) (?:unrealized )?gain") - ops = _row(block, - r"total (?:income \(loss\) )?from (?:investment )?operations") + nii_ops = _fixlen(_row(block, r"net investment (?:income|loss)\b"), ncols) + gains_ops = _fixlen( + _row(block, + r"net (?:realized (?:and|&) (?:unrealized )?gain" + r"|realized gain \(loss\)|gain \(loss\))"), ncols) + ops_src = None + ops = _fixlen(_row(block, + r"total .{0,60}?from (?:the )?(?:investment )?operations\b"), + ncols) + if ops: + ops_src = "ops" + else: + ops = _fixlen(_row( + block, + r"net (?:increase|decrease)(?:\s*/?\(?\s*decrease\)?)?" + r" in net assets (?:resulting )?(?:from )?(?:the )?(?:investment )?" + r"operations"), ncols) + if ops: + ops_src = "ops" + if not ops: + # last resort: the printed net-change row (ops + captch). When + # used, captch must NOT be added again (DXYZ - no dist rows at + # all; identity is nav_beg + netchange - nav_end == 0) + ops = _fixlen(_row( + block, + r"total? increase.{0,3}?decrease.{0,3}?in net asset value"), + ncols) + if ops: + ops_src = "netchange" if not ops: ops = [(_get(nii_ops, i) + _get(gains_ops, i)) for i in range(ncols)] + ops_src = "sum" + _ = ops_src # CEFs adjust NAV for capital transactions (repurchases, rights # offerings, tenders). Collect every variant row present, deduping a @@ -134,19 +600,25 @@ def parse_highlights(t: str) -> dict | None: # Transactions: Accretion (dilution) ..."). captch_rows = [] seen = [] - for rx in (r"accretion (?:\(dilution\) )?to net asset value", - r"capital share transactions", - r"anti-dilutive impact of repurchase", - r"dilutive impact of rights offering", - r"anti-dilutive impact of tender offer" - r"repurchase of shares",): - row = _row(block, rx) - if row and any(len(row) == len(r2) and - all(abs((a or 0) - (b or 0)) < 0.005 - for a, b in zip(row, r2)) for r2 in seen): - continue - seen.append(row) - captch_rows.append(row) + if ops_src != "netchange": + for rx in (r"accretion (?:\(dilution\) )?to net asset value", + r"capital share transactions", + r"anti-dilutive impact of repurchase", + r"dilutive impact of rights offering", + r"anti-dilutive impact of tender offer" + r"repurchase of shares", + r"at-the-market offering", + r"effect of shares issued", + r"offering expenses", + r"impact of capital share transactions", + r"total capital stock transactions",): + row = _fixlen(_row(block, rx), ncols) + if row and any(len(row) == len(r2) and + all(abs((a or 0) - (b or 0)) < 0.005 + for a, b in zip(row, r2)) for r2 in seen): + continue + seen.append(row) + captch_rows.append(row) mkt_end = _row(block, r"market (?:value|price), end of year") # distribution sub-rows (character). The block ends at NAV-end: @@ -155,27 +627,61 @@ def parse_highlights(t: str) -> dict | None: r"distributions to (?:common )?shareholders from|" r"distributions to stockholders from|" r"distributions declared (?:to shareholders)? from|" + r"distributions and dividends to|" + r"distributions to (?:common )?(?:share|stock)holders|" + r"less distributions|" + r"distributions \( ?[a-z0-9]{1,3} ?\)|" + r"distributions:|" + r"common dividends|" + r"dividends from|" + r"distributions on|" r"distributions from", block, re.I) - dblock = block[danchor.start():] if danchor else block - em = re.search(r"net asset value(?: per (?:common )?share)?, end of (?:year|period)", dblock, re.I) + if danchor: + dblock = block[danchor.start():] + else: + # no distribution heading: start after the total-operations row + # (the distribution section, if any, follows it) + om = re.search( + r"total .{0,60}?from (?:the )?(?:investment )?operations\b|" + r"net (?:increase|decrease).{0,30}?in net assets.{0,30}?operations", + block, re.I) + dblock = block[om.end():] if om else block + em = re.search(r"net asset value(?: per (?:common )?share)?,? end of (?:the )?(?:year|period)", dblock, re.I) if em: dblock = dblock[: em.start()] # the TOTAL row label also contains "dividends" in some funds # ("Total dividends and distributions to stockholders") - scope the # sub-row search to before it - tm = re.search(r"total (?:dividends and )?distributions", dblock, re.I) + tm = re.search(r"total (?:dividends and )?distributions|" + r"total dividends\b", dblock, re.I) dwindow = dblock[: tm.start()] if tm else dblock - divs = (_row(dwindow, r"\bdividends\b") - or _row(dwindow, r"net investment income")) - gains = _row(dwindow, r"(?:net )?realized (?:capital )?gains?|" - r"capital gain distributions") - roc = _row(dwindow, r"return of capital") + divs = _fixlen(_row(dwindow, r"\bdividends\b") + or _row(dwindow, r"net investment income"), ncols) + gains = _fixlen(_row(dwindow, + r"(? dict | None: return False if place and not rec(0): - # short rows that reconcile nowhere: mis-parsed table - reject return None def colvec(vals, cols): @@ -297,9 +802,15 @@ def parse_highlights(t: str) -> dict | None: if sum(1 for v in dist_tot if v < 0) > ncols // 2: dist_tot = [-v for v in dist_tot] + # some funds print distributions positive, others negative - work + # with magnitudes from here on (dist_tot is already normalized) + divs = [abs(v) for v in divs] + gains = [abs(v) for v in gains] + roc = [abs(v) for v in roc] + # sanity: components should (roughly) sum to the derived total bad = sum(1 for c in range(ncols) - if abs(-(divs[c] + gains[c] + roc[c]) - dist_tot[c]) + if abs(divs[c] + gains[c] + roc[c] - dist_tot[c]) > 0.02 * max(1.0, abs(dist_tot[c])) + 0.02) if bad > max(1, ncols // 2): return None @@ -313,9 +824,9 @@ def parse_highlights(t: str) -> dict | None: } tot5 = sum(v for v in dist_tot if v > 0) if tot5 > 0: - out["share_div"] = sum(-v for v in divs if v < 0) / tot5 - out["share_gains"] = sum(-v for v in gains if v < 0) / tot5 - out["share_roc"] = sum(-v for v in roc if v < 0) / tot5 + out["share_div"] = sum(divs) / tot5 + out["share_gains"] = sum(gains) / tot5 + out["share_roc"] = sum(roc) / tot5 return out @@ -364,7 +875,7 @@ def analyze(sym: str, cik: int, force: bool = False) -> dict: t = edgar.to_text(raw) except Exception: continue - h = parse_highlights(t) + h = parse_highlights(t, d.get("name", ""), out.get("ticker", sym)) if h and (best is None or _score(h) > _score(best[1]) or (_score(h) == _score(best[1]) and h["ncols"] > best[1]["ncols"])): diff --git a/fundlab/cef_cache/ADX.json b/fundlab/cef_cache/ADX.json index d2560bf..c562484 100644 --- a/fundlab/cef_cache/ADX.json +++ b/fundlab/cef_cache/ADX.json @@ -1 +1 @@ -{"sym": "ADX", "cik": 2230, "name": "ADAMS DIVERSIFIED EQUITY FUND, INC.", "bdc": false, "n_tender": 0, "ticker": "ADX", "report_filed": "2026-02-20", "ncols": 5, "nav_beg": [22.64, 20.56, 17.38, 22.5, 20.06], "nav_end": [24.72, 22.64, 20.56, 17.38, 22.5], "mkt_end": [23.32, 20.2, 17.71, 14.54, 19.41], "dist_tot": [1.85, 2.5, 1.3, 1.07, 2.98], "divs": [-0.16, -0.17, -0.15, -0.18, -0.2], "gains": [-1.69, -2.33, -1.15, -0.89, -2.78], "roc": [0.0, 0.0, 0.0, 0.0, 0.0], "ops": [3.98, 4.62, 4.57, -3.99, 5.59], "share_div": 0.08865979381443298, "share_gains": 0.9113402061855671, "share_roc": 0.0} \ No newline at end of file +{"sym": "ADX", "cik": 2230, "name": "ADAMS DIVERSIFIED EQUITY FUND, INC.", "bdc": false, "n_tender": 0, "ticker": "ADX", "report_filed": "2026-02-20", "ncols": 5, "nav_beg": [22.64, 20.56, 17.38, 22.5, 20.06], "nav_end": [24.72, 22.64, 20.56, 17.38, 22.5], "mkt_end": [23.32, 20.2, 17.71, 14.54, 19.41], "dist_tot": [1.85, 2.5, 1.3, 1.07, 2.98], "divs": [0.16, 0.17, 0.15, 0.18, 0.2], "gains": [1.69, 2.33, 1.15, 0.89, 2.78], "roc": [0.0, 0.0, 0.0, 0.0, 0.0], "ops": [3.98, 4.62, 4.57, -3.99, 5.59], "share_div": 0.08865979381443298, "share_gains": 0.9113402061855671, "share_roc": 0.0} \ No newline at end of file diff --git a/fundlab/cef_cache/AEF.json b/fundlab/cef_cache/AEF.json index 63ac5f3..8028a64 100644 --- a/fundlab/cef_cache/AEF.json +++ b/fundlab/cef_cache/AEF.json @@ -1 +1 @@ -{"sym": "AEF", "cik": 846676, "name": "abrdn Emerging Markets ex-China Fund, Inc.", "bdc": false, "n_tender": 0, "ticker": "AEF", "report_filed": "2026-03-09", "ncols": 5, "nav_beg": [5.96, 5.96, 5.78, 8.7, 9.41], "nav_end": [7.63, 5.96, 5.96, 5.78, 8.7], "mkt_end": [7.0, 5.19, 5.11, 5.15, 7.92], "dist_tot": [0.65, 0.39, 0.39, 0.44, 0.53], "divs": [-0.05, -0.02, -0.06, -0.13, -0.22], "gains": [0.0, 0.0, 0.0, 0.0, 0.0], "roc": [-0.6, -0.37, -0.33, -0.31, -0.31], "ops": [2.29, 0.39, 0.57, -2.48, -0.18], "share_div": 0.19999999999999996, "share_gains": 0.0, "share_roc": 0.7999999999999999} \ No newline at end of file +{"sym": "AEF", "cik": 846676, "name": "abrdn Emerging Markets ex-China Fund, Inc.", "bdc": false, "n_tender": 0, "ticker": "AEF", "report_filed": "2026-03-09", "ncols": 5, "nav_beg": [5.96, 5.96, 5.78, 8.7, 9.41], "nav_end": [7.63, 5.96, 5.96, 5.78, 8.7], "mkt_end": [7.0, 5.19, 5.11, 5.15, 7.92], "dist_tot": [0.65, 0.39, 0.39, 0.44, 0.53], "divs": [0.05, 0.02, 0.06, 0.13, 0.22], "gains": [0.0, 0.0, 0.0, 0.0, 0.0], "roc": [0.6, 0.37, 0.33, 0.31, 0.31], "ops": [2.29, 0.39, 0.57, -2.48, -0.18], "share_div": 0.19999999999999996, "share_gains": 0.0, "share_roc": 0.7999999999999999} \ No newline at end of file diff --git a/fundlab/cef_cache/AGD.json b/fundlab/cef_cache/AGD.json index c69a763..7d6c189 100644 --- a/fundlab/cef_cache/AGD.json +++ b/fundlab/cef_cache/AGD.json @@ -1 +1 @@ -{"sym": "AGD", "cik": 1362481, "name": "abrdn Global Dynamic Dividend Fund", "bdc": false, "n_tender": 0, "ticker": "AGD", "report_filed": "2026-01-08", "ncols": 5, "nav_beg": [11.15, 9.9, 10.05, 12.95, 10.16], "nav_end": [11.63, 11.15, 9.9, 10.05, 12.95], "mkt_end": [11.63, 10.16, 8.4, 8.92, 12.01], "dist_tot": [1.32, 0.93, 0.78, 0.78, 0.78], "divs": [-0.72, -0.75, -0.75, -0.73, -0.78], "gains": [0.0, 0.0, 0.0, 0.0, 0.0], "roc": [-0.6, -0.18, -0.03, -0.05, 0.0], "ops": [1.8, 2.18, 0.63, -2.12, 3.57], "share_div": 0.8126361655773419, "share_gains": 0.0, "share_roc": 0.18736383442265794} \ No newline at end of file +{"sym": "AGD", "cik": 1362481, "name": "abrdn Global Dynamic Dividend Fund", "bdc": false, "n_tender": 0, "ticker": "AGD", "report_filed": "2026-01-08", "ncols": 5, "nav_beg": [11.15, 9.9, 10.05, 12.95, 10.16], "nav_end": [11.63, 11.15, 9.9, 10.05, 12.95], "mkt_end": [11.63, 10.16, 8.4, 8.92, 12.01], "dist_tot": [1.32, 0.93, 0.78, 0.78, 0.78], "divs": [0.72, 0.75, 0.75, 0.73, 0.78], "gains": [0.0, 0.0, 0.0, 0.0, 0.0], "roc": [0.6, 0.18, 0.03, 0.05, 0.0], "ops": [1.8, 2.18, 0.63, -2.12, 3.57], "share_div": 0.8126361655773419, "share_gains": 0.0, "share_roc": 0.18736383442265794} \ No newline at end of file diff --git a/fundlab/cef_cache/AIO.json b/fundlab/cef_cache/AIO.json index cd15a27..a82cce4 100644 --- a/fundlab/cef_cache/AIO.json +++ b/fundlab/cef_cache/AIO.json @@ -1 +1 @@ -{"sym": "AIO", "cik": 1778114, "name": "Virtus Artificial Intelligence & Technology Opportunities Fund", "bdc": false, "n_tender": 0, "ticker": "AIO", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "AIO", "cik": 1778114, "name": "Virtus Artificial Intelligence & Technology Opportunities Fund", "bdc": false, "n_tender": 0, "ticker": "AIO", "report_filed": "2026-04-09", "ncols": 6, "nav_beg": [23.52, 20.61, 19.92, 24.18, 29.2, 19.89], "nav_end": [24.86, 23.52, 20.61, 19.92, 24.18, 29.2], "mkt_end": [], "dist_tot": [2.99, 1.8, 1.8, 1.8, 4.85, 2.49], "divs": [0.89, 1.07, 0.5, 1.39, 1.4, 0.0], "gains": [2.1, 0.73, 0.0, 0.0, 3.45, 2.49], "roc": [0.0, 0.0, 1.3, 0.41, 0.0, 0.0], "ops": [4.33, 4.71, 2.49, -2.46, -0.17, 11.8], "share_div": 0.3337571519389701, "share_gains": 0.5575333757151939, "share_roc": 0.10870947234583597} \ No newline at end of file diff --git a/fundlab/cef_cache/AOD.json b/fundlab/cef_cache/AOD.json index 85c7228..3260678 100644 --- a/fundlab/cef_cache/AOD.json +++ b/fundlab/cef_cache/AOD.json @@ -1 +1 @@ -{"sym": "AOD", "cik": 1379400, "name": "abrdn Total Dynamic Dividend Fund", "bdc": false, "n_tender": 0, "ticker": "AOD", "report_filed": "2026-01-08", "ncols": 5, "nav_beg": [11.15, 9.9, 10.05, 12.95, 10.16], "nav_end": [11.63, 11.15, 9.9, 10.05, 12.95], "mkt_end": [11.63, 10.16, 8.4, 8.92, 12.01], "dist_tot": [1.32, 0.93, 0.78, 0.78, 0.78], "divs": [-0.72, -0.75, -0.75, -0.73, -0.78], "gains": [0.0, 0.0, 0.0, 0.0, 0.0], "roc": [-0.6, -0.18, -0.03, -0.05, 0.0], "ops": [1.8, 2.18, 0.63, -2.12, 3.57], "share_div": 0.8126361655773419, "share_gains": 0.0, "share_roc": 0.18736383442265794} \ No newline at end of file +{"sym": "AOD", "cik": 1379400, "name": "abrdn Total Dynamic Dividend Fund", "bdc": false, "n_tender": 0, "ticker": "AOD", "report_filed": "2026-01-08", "ncols": 5, "nav_beg": [11.15, 9.9, 10.05, 12.95, 10.16], "nav_end": [11.63, 11.15, 9.9, 10.05, 12.95], "mkt_end": [11.63, 10.16, 8.4, 8.92, 12.01], "dist_tot": [1.32, 0.93, 0.78, 0.78, 0.78], "divs": [0.72, 0.75, 0.75, 0.73, 0.78], "gains": [0.0, 0.0, 0.0, 0.0, 0.0], "roc": [0.6, 0.18, 0.03, 0.05, 0.0], "ops": [1.8, 2.18, 0.63, -2.12, 3.57], "share_div": 0.8126361655773419, "share_gains": 0.0, "share_roc": 0.18736383442265794} \ No newline at end of file diff --git a/fundlab/cef_cache/ASA.json b/fundlab/cef_cache/ASA.json index 1bb34ac..1a1bb78 100644 --- a/fundlab/cef_cache/ASA.json +++ b/fundlab/cef_cache/ASA.json @@ -1 +1 @@ -{"sym": "ASA", "cik": 1230869, "name": "ASA Gold & Precious Metals Ltd", "bdc": false, "n_tender": 0, "ticker": "ASA", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "ASA", "cik": 1230869, "name": "ASA Gold & Precious Metals Ltd", "bdc": false, "n_tender": 0, "ticker": "ASA", "report_filed": "2026-02-06", "ncols": 5, "nav_beg": [23.36, 17.36, 16.88, 24.98, 24.05], "nav_end": [58.54, 23.36, 17.36, 16.88, 24.98], "mkt_end": [], "dist_tot": [0.06, 0.04, 0.02, 0.02, 0.02], "divs": [0.06, 0.04, 0.02, 0.02, 0.02], "gains": [0.0, 0.0, 0.0, 0.0, 0.0], "roc": [0.0, 0.0, 0.0, 0.0, 0.0], "ops": [35.19, 6.0, 0.5, -8.08, 0.95], "share_div": 1.0, "share_gains": 0.0, "share_roc": 0.0} \ No newline at end of file diff --git a/fundlab/cef_cache/ASCIX.json b/fundlab/cef_cache/ASCIX.json index adc23bc..df4c020 100644 --- a/fundlab/cef_cache/ASCIX.json +++ b/fundlab/cef_cache/ASCIX.json @@ -1 +1 @@ -{"sym": "ASCIX", "cik": 1716885, "name": "Angel Oak Strategic Credit Fund", "bdc": false, "n_tender": 33, "ticker": "ASCIX", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "ASCIX", "cik": 1716885, "name": "Angel Oak Strategic Credit Fund", "bdc": false, "n_tender": 34, "ticker": "ASCIX", "report_filed": "2026-04-08", "ncols": 4, "nav_beg": [21.08, 20.86, 20.62, 21.13], "nav_end": [20.92, 21.08, 20.86, 20.62], "mkt_end": [], "dist_tot": [1.78, 1.87, 1.71, 1.03], "divs": [1.78, 1.87, 1.71, 1.03], "gains": [0.0, 0.0, 0.0, 0.0], "roc": [0.0, 0.0, 0.0, 0.0], "ops": [1.62, 2.09, 1.95, 0.52], "share_div": 1.0, "share_gains": 0.0, "share_roc": 0.0} \ No newline at end of file diff --git a/fundlab/cef_cache/ASGI.json b/fundlab/cef_cache/ASGI.json index a820e39..4d1b8d3 100644 --- a/fundlab/cef_cache/ASGI.json +++ b/fundlab/cef_cache/ASGI.json @@ -1 +1 @@ -{"sym": "ASGI", "cik": 1793855, "name": "abrdn Global Infrastructure Income Fund", "bdc": false, "n_tender": 0, "ticker": "ASGI", "report_filed": "2025-12-08", "ncols": 5, "nav_beg": [21.17, 19.16, 18.93, 22.27, 19.43], "nav_end": [21.51, 21.17, 19.16, 18.93, 22.27], "mkt_end": [21.13, 20.21, 16.1, 15.73, 19.93], "dist_tot": [2.44, 1.99, 1.44, 1.37, 1.3], "divs": [-0.48, -0.39, -0.68, -0.22, -1.2], "gains": [-0.76, -1.08, -0.76, -1.15, -0.1], "roc": [-1.2, -0.52, 0.0, 0.0, 0.0], "ops": [2.78, 4.0, 1.67, -1.97, 4.14], "share_div": 0.3477751756440281, "share_gains": 0.4508196721311476, "share_roc": 0.20140515222482439} \ No newline at end of file +{"sym": "ASGI", "cik": 1793855, "name": "abrdn Global Infrastructure Income Fund", "bdc": false, "n_tender": 0, "ticker": "ASGI", "report_filed": "2025-12-08", "ncols": 5, "nav_beg": [21.17, 19.16, 18.93, 22.27, 19.43], "nav_end": [21.51, 21.17, 19.16, 18.93, 22.27], "mkt_end": [21.13, 20.21, 16.1, 15.73, 19.93], "dist_tot": [2.44, 1.99, 1.44, 1.37, 1.3], "divs": [0.48, 0.39, 0.68, 0.22, 1.2], "gains": [0.76, 1.08, 0.76, 1.15, 0.1], "roc": [1.2, 0.52, 0.0, 0.0, 0.0], "ops": [2.78, 4.0, 1.67, -1.97, 4.14], "share_div": 0.3477751756440281, "share_gains": 0.4508196721311476, "share_roc": 0.20140515222482439} \ No newline at end of file diff --git a/fundlab/cef_cache/BXSY.json b/fundlab/cef_cache/BXSY.json index 1e9be03..f51200f 100644 --- a/fundlab/cef_cache/BXSY.json +++ b/fundlab/cef_cache/BXSY.json @@ -1 +1 @@ -{"sym": "BXSY", "cik": 1059213, "name": "BEXIL INVESTMENT TRUST", "bdc": false, "n_tender": 0, "ticker": "BXSY", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "BXSY", "cik": 1059213, "name": "BEXIL INVESTMENT TRUST", "bdc": false, "n_tender": 0, "ticker": "BXSY", "report_filed": "2026-03-05", "ncols": 5, "nav_beg": [19.6, 18.88, 16.56, 20.25, 16.16], "nav_end": [23.66, 19.6, 18.88, 16.56, 20.25], "mkt_end": [], "dist_tot": [1.0, 1.07, 1.0, 1.0, 1.32], "divs": [0.0, 0.16, 0.06, 0.2, 0.29], "gains": [1.0, 0.91, 0.94, 0.75, 0.98], "roc": [0.0, 0.0, 0.0, 0.05, 0.05], "ops": [5.07, 1.85, 3.35, -2.66, 5.45], "share_div": 0.13172541743970315, "share_gains": 0.8497217068645639, "share_roc": 0.01855287569573284} \ No newline at end of file diff --git a/fundlab/cef_cache/CET.json b/fundlab/cef_cache/CET.json index 9180177..2bce6b2 100644 --- a/fundlab/cef_cache/CET.json +++ b/fundlab/cef_cache/CET.json @@ -1 +1 @@ -{"sym": "CET", "cik": 18748, "name": "CENTRAL SECURITIES CORP", "bdc": false, "n_tender": 4, "ticker": "CET", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "CET", "cik": 18748, "name": "CENTRAL SECURITIES CORP", "bdc": false, "n_tender": 4, "ticker": "CET", "report_filed": "2026-02-24", "ncols": 5, "nav_beg": [54.26, 46.49, 40.48, 48.87, 39.49], "nav_end": [60.5, 54.26, 46.49, 40.48, 48.87], "mkt_end": [50.71, 45.69, 37.77, 33.39, 44.58], "dist_tot": [2.7, 2.25, 1.85, 2.45, 3.75], "divs": [0.85, 0.61, 0.5, 0.55, 0.86], "gains": [1.85, 1.64, 1.35, 1.9, 2.89], "roc": [0.0, 0.0, 0.0, 0.0, 0.0], "ops": [9.15, 10.15, 8.01, -5.81, 13.47], "share_div": 0.2592307692307692, "share_gains": 0.7407692307692308, "share_roc": 0.0} \ No newline at end of file diff --git a/fundlab/cef_cache/CLM.json b/fundlab/cef_cache/CLM.json index 911af3c..9d41acc 100644 --- a/fundlab/cef_cache/CLM.json +++ b/fundlab/cef_cache/CLM.json @@ -1 +1 @@ -{"sym": "CLM", "cik": 814083, "name": "Cornerstone Strategic Investment Fund, Inc.", "bdc": false, "n_tender": 0, "ticker": "CLM", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "CLM", "cik": 814083, "name": "Cornerstone Strategic Investment Fund, Inc.", "bdc": false, "n_tender": 0, "ticker": "CLM", "report_filed": "2026-03-04", "ncols": 5, "nav_beg": [7.03, 6.77, 6.48, 10.23, 9.93], "nav_end": [6.73, 7.03, 6.77, 6.48, 10.23], "mkt_end": [8.36, 8.59, 7.19, 7.37, 14.29], "dist_tot": [1.47, 1.3, 1.48, 2.16, 1.92], "divs": [0.02, 0.02, 0.03, 0.03, 0.01], "gains": [0.63, 0.48, 0.53, 0.22, 0.92], "roc": [0.82, 0.8, 0.92, 1.91, 0.99], "ops": [1.09, 1.56, 1.77, -2.18, 1.87], "share_div": 0.013205282112845138, "share_gains": 0.3337334933973589, "share_roc": 0.653061224489796} \ No newline at end of file diff --git a/fundlab/cef_cache/CRF.json b/fundlab/cef_cache/CRF.json index 3bfcb5c..1f5d504 100644 --- a/fundlab/cef_cache/CRF.json +++ b/fundlab/cef_cache/CRF.json @@ -1 +1 @@ -{"sym": "CRF", "cik": 33934, "name": "CORNERSTONE TOTAL RETURN FUND INC", "bdc": false, "n_tender": 10, "ticker": "CRF", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "CRF", "cik": 33934, "name": "CORNERSTONE TOTAL RETURN FUND INC", "bdc": false, "n_tender": 10, "ticker": "CRF", "report_filed": "2026-03-04", "ncols": 5, "nav_beg": [6.69, 6.49, 6.24, 9.88, 9.56], "nav_end": [6.52, 6.69, 6.49, 6.24, 9.88], "mkt_end": [8.01, 8.69, 7.06, 7.1, 13.75], "dist_tot": [1.4, 1.25, 1.42, 2.08, 1.84], "divs": [0.02, 0.03, 0.03, 0.03, 0.01], "gains": [0.59, 0.51, 0.51, 0.22, 1.12], "roc": [0.79, 0.71, 0.88, 1.83, 0.71], "ops": [1.02, 1.45, 1.67, -1.98, 1.83], "share_div": 0.015018773466833541, "share_gains": 0.36921151439299127, "share_roc": 0.6157697121401752} \ No newline at end of file diff --git a/fundlab/cef_cache/CSQ.json b/fundlab/cef_cache/CSQ.json index f73232c..64fbe0c 100644 --- a/fundlab/cef_cache/CSQ.json +++ b/fundlab/cef_cache/CSQ.json @@ -1 +1 @@ -{"sym": "CSQ", "cik": 1275214, "name": "CALAMOS STRATEGIC TOTAL RETURN FUND", "bdc": false, "n_tender": 5, "ticker": "CSQ", "report_filed": "2025-06-27", "ncols": 3, "nav_beg": [10.04, 8.99, 10.26], "nav_end": [9.32, 10.04, 8.99], "mkt_end": [], "dist_tot": [0.58, 1.14, 1.14], "divs": [-0.48, -0.42, -0.15], "gains": [-0.1, -0.21, -0.99], "roc": [0.0, -0.51, 0.0], "ops": [-0.16, 2.19, -0.13], "share_div": 0.36713286713286714, "share_gains": 0.45454545454545464, "share_roc": 0.17832167832167836} \ No newline at end of file +{"sym": "CSQ", "cik": 1275214, "name": "CALAMOS STRATEGIC TOTAL RETURN FUND", "bdc": false, "n_tender": 5, "ticker": "CSQ", "report_filed": "2025-06-27", "ncols": 3, "nav_beg": [10.04, 8.99, 10.26], "nav_end": [9.32, 10.04, 8.99], "mkt_end": [], "dist_tot": [0.58, 1.14, 1.14], "divs": [0.48, 0.42, 0.15], "gains": [0.1, 0.21, 0.99], "roc": [0.0, 0.51, 0.0], "ops": [-0.16, 2.19, -0.13], "share_div": 0.36713286713286714, "share_gains": 0.45454545454545464, "share_roc": 0.17832167832167836} \ No newline at end of file diff --git a/fundlab/cef_cache/DXYZ.json b/fundlab/cef_cache/DXYZ.json index c7b31a3..a4c5ded 100644 --- a/fundlab/cef_cache/DXYZ.json +++ b/fundlab/cef_cache/DXYZ.json @@ -1 +1 @@ -{"sym": "DXYZ", "cik": 1843974, "name": "Destiny Tech100 Inc.", "bdc": false, "n_tender": 0, "ticker": "DXYZ", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "DXYZ", "cik": 1843974, "name": "Destiny Tech100 Inc.", "bdc": false, "n_tender": 0, "ticker": "DXYZ", "report_filed": "2026-03-10", "ncols": 4, "nav_beg": [6.44, 4.84, 5.22, -1.6], "nav_end": [19.93, 6.44, 4.84, 5.22], "mkt_end": [], "dist_tot": [0.0, -8.881784197001252e-16, 0.0, 0.0], "divs": [0.0, 0.0, 0.0, 0.0], "gains": [0.0, 0.0, 0.0, 0.0], "roc": [0.0, 0.0, 0.0, 0.0], "ops": [3.54, 1.6, -0.38, -0.36]} \ No newline at end of file diff --git a/fundlab/cef_cache/ECAT.json b/fundlab/cef_cache/ECAT.json index 24eb07b..fd0771f 100644 --- a/fundlab/cef_cache/ECAT.json +++ b/fundlab/cef_cache/ECAT.json @@ -1 +1 @@ -{"sym": "ECAT", "cik": 1864843, "name": "BlackRock ESG Capital Allocation Term Trust", "bdc": false, "n_tender": 0, "ticker": "ECAT", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "ECAT", "cik": 1864843, "name": "BlackRock ESG Capital Allocation Term Trust", "bdc": false, "n_tender": 0, "ticker": "ECAT", "report_filed": "2026-03-05", "ncols": 5, "nav_beg": [16.43, 17.25, 16.84, 20.9, 21.05], "nav_end": [15.23, 16.43, 17.25, 16.84, 20.9], "mkt_end": [14.16, 15.15, 14.95, 13.87, 19.45], "dist_tot": [3.32, 2.65, 1.51, 1.25, 1.25], "divs": [0.35, 0.54, 0.58, 0.99, 0.75], "gains": [0.0, 0.0, 0.0, 0.0, 0.03], "roc": [2.97, 2.11, 0.93, 0.26, 0.47], "ops": [2.12, 1.83, 1.9200000000000002, -2.81, 1.1], "share_div": 0.3216432865731463, "share_gains": 0.003006012024048096, "share_roc": 0.6753507014028055} \ No newline at end of file diff --git a/fundlab/cef_cache/EDF.json b/fundlab/cef_cache/EDF.json index 787bd09..c4f0c51 100644 --- a/fundlab/cef_cache/EDF.json +++ b/fundlab/cef_cache/EDF.json @@ -1 +1 @@ -{"sym": "EDF", "cik": 1501103, "name": "Virtus Stone Harbor Emerging Markets Income Fund", "bdc": false, "n_tender": 0, "ticker": "EDF", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "EDF", "cik": 1501103, "name": "Virtus Stone Harbor Emerging Markets Income Fund", "bdc": false, "n_tender": 0, "ticker": "EDF", "report_filed": "2026-02-06", "ncols": 5, "nav_beg": [8.51, 8.45, 8.94, 11.67, 12.55], "nav_end": [8.29, 8.51, 8.45, 8.94, 11.67], "mkt_end": [], "dist_tot": [0.96, 0.96, 0.96, 0.96, 1.08], "divs": [0.49, 0.45, 0.41, 0.46, 0.52], "gains": [0.0, 0.0, 0.0, 0.0, 0.0], "roc": [0.47, 0.51, 0.55, 0.5, 0.56], "ops": [0.74, 1.02, 0.47, -1.77, 0.2], "share_div": 0.4735772357723577, "share_gains": 0.0, "share_roc": 0.5264227642276423} \ No newline at end of file diff --git a/fundlab/cef_cache/EMF.json b/fundlab/cef_cache/EMF.json index c59beaa..849e995 100644 --- a/fundlab/cef_cache/EMF.json +++ b/fundlab/cef_cache/EMF.json @@ -1 +1 @@ -{"sym": "EMF", "cik": 809708, "name": "TEMPLETON EMERGING MARKETS FUND", "bdc": false, "n_tender": 0, "ticker": "EMF", "report_filed": "2025-10-30", "ncols": 5, "nav_beg": [14.81, 13.63, 13.72, 20.09, 17.58], "nav_end": [17.27, 14.81, 13.63, 13.72, 20.09], "mkt_end": [15.27, 12.81, 11.71, 11.85, 17.89], "dist_tot": [0.95, 0.73, 1.13, 1.11, 0.66], "divs": [-0.59, -0.73, -0.41, -0.41, -0.18], "gains": [-0.36, 0.0, -0.72, -0.7, -0.48], "roc": [0.0, 0.0, 0.0, 0.0, 0.0], "ops": [3.36, 1.86, 1.03, -5.3, 3.15], "share_div": 0.5065502183406113, "share_gains": 0.4934497816593886, "share_roc": 0.0} \ No newline at end of file +{"sym": "EMF", "cik": 809708, "name": "TEMPLETON EMERGING MARKETS FUND", "bdc": false, "n_tender": 0, "ticker": "EMF", "report_filed": "2025-10-30", "ncols": 5, "nav_beg": [14.81, 13.63, 13.72, 20.09, 17.58], "nav_end": [17.27, 14.81, 13.63, 13.72, 20.09], "mkt_end": [15.27, 12.81, 11.71, 11.85, 17.89], "dist_tot": [0.95, 0.73, 1.13, 1.11, 0.66], "divs": [0.59, 0.73, 0.41, 0.41, 0.18], "gains": [0.36, 0.0, 0.72, 0.7, 0.48], "roc": [0.0, 0.0, 0.0, 0.0, 0.0], "ops": [3.36, 1.86, 1.03, -5.3, 3.15], "share_div": 0.5065502183406113, "share_gains": 0.4934497816593886, "share_roc": 0.0} \ No newline at end of file diff --git a/fundlab/cef_cache/EMO.json b/fundlab/cef_cache/EMO.json index 4bd11f4..98a82a7 100644 --- a/fundlab/cef_cache/EMO.json +++ b/fundlab/cef_cache/EMO.json @@ -1 +1 @@ -{"sym": "EMO", "cik": 1517518, "name": "ClearBridge Energy Midstream Opportunity Fund Inc.", "bdc": false, "n_tender": 6, "ticker": "EMO", "report_filed": "2026-01-27", "ncols": 5, "nav_beg": [55.82, 38.75, 35.97, 26.53, 17.13], "nav_end": [48.88, 55.82, 38.75, 35.97, 26.53], "mkt_end": [45.55, 50.49, 34.5, 30.43, 21.65], "dist_tot": [4.23, 3.0, 2.37, 1.92, 1.47], "divs": [-0.81, -3.0, -2.37, -1.92, -0.54], "gains": [0.0, 0.0, 0.0, 0.0, 0.0], "roc": [-3.42, 0.0, 0.0, 0.0, -0.93], "ops": [-2.25, 20.07, 5.11, 11.22, 10.65], "share_div": 0.6651270207852193, "share_gains": 0.0, "share_roc": 0.33487297921478054} \ No newline at end of file +{"sym": "EMO", "cik": 1517518, "name": "ClearBridge Energy Midstream Opportunity Fund Inc.", "bdc": false, "n_tender": 6, "ticker": "EMO", "report_filed": "2026-01-27", "ncols": 5, "nav_beg": [55.82, 38.75, 35.97, 26.53, 17.13], "nav_end": [48.88, 55.82, 38.75, 35.97, 26.53], "mkt_end": [45.55, 50.49, 34.5, 30.43, 21.65], "dist_tot": [4.23, 3.0, 2.37, 1.92, 1.47], "divs": [0.81, 3.0, 2.37, 1.92, 0.54], "gains": [0.0, 0.0, 0.0, 0.0, 0.0], "roc": [3.42, 0.0, 0.0, 0.0, 0.93], "ops": [-2.25, 20.07, 5.11, 11.22, 10.65], "share_div": 0.6651270207852193, "share_gains": 0.0, "share_roc": 0.33487297921478054} \ No newline at end of file diff --git a/fundlab/cef_cache/EOD.json b/fundlab/cef_cache/EOD.json index e348513..2371e2e 100644 --- a/fundlab/cef_cache/EOD.json +++ b/fundlab/cef_cache/EOD.json @@ -1 +1 @@ -{"sym": "EOD", "cik": 1386067, "name": "ALLSPRING GLOBAL DIVIDEND OPPORTUNITY FUND", "bdc": false, "n_tender": 0, "ticker": "EOD", "report_filed": "2026-01-05", "ncols": 5, "nav_beg": [5.53, 4.52, 4.57, 6.03, 4.84], "nav_end": [6.44, 5.53, 4.52, 4.57, 6.03], "mkt_end": [], "dist_tot": [0.5, 0.44, 0.45, 0.53, 0.52], "divs": [-0.26, -0.24, -0.21, -0.18, -0.26], "gains": [0.0, 0.0, 0.0, 0.0, 0.0], "roc": [-0.24, -0.2, -0.24, -0.35, -0.26], "ops": [1.41, 1.44, 0.4, -0.93, 1.71], "share_div": 0.47131147540983603, "share_gains": 0.0, "share_roc": 0.5286885245901639} \ No newline at end of file +{"sym": "EOD", "cik": 1386067, "name": "ALLSPRING GLOBAL DIVIDEND OPPORTUNITY FUND", "bdc": false, "n_tender": 0, "ticker": "EOD", "report_filed": "2026-01-05", "ncols": 5, "nav_beg": [5.53, 4.52, 4.57, 6.03, 4.84], "nav_end": [6.44, 5.53, 4.52, 4.57, 6.03], "mkt_end": [], "dist_tot": [0.5, 0.44, 0.45, 0.53, 0.52], "divs": [0.26, 0.24, 0.21, 0.18, 0.26], "gains": [0.0, 0.0, 0.0, 0.0, 0.0], "roc": [0.24, 0.2, 0.24, 0.35, 0.26], "ops": [1.41, 1.44, 0.4, -0.93, 1.71], "share_div": 0.47131147540983603, "share_gains": 0.0, "share_roc": 0.5286885245901639} \ No newline at end of file diff --git a/fundlab/cef_cache/ETG.json b/fundlab/cef_cache/ETG.json index 2f95dbe..9019aaf 100644 --- a/fundlab/cef_cache/ETG.json +++ b/fundlab/cef_cache/ETG.json @@ -1 +1 @@ -{"sym": "ETG", "cik": 1270523, "name": "Eaton Vance Tax-Advantaged Global Dividend Income Fund", "bdc": false, "n_tender": 1, "ticker": "ETG", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "ETG", "cik": 1270523, "name": "Eaton Vance Tax-Advantaged Global Dividend Income Fund", "bdc": false, "n_tender": 1, "ticker": "ETG", "report_filed": "2025-12-30", "ncols": 5, "nav_beg": [20.52, 16.8, 16.01, 22.61, 16.16], "nav_end": [23.23, 20.52, 16.8, 16.01, 22.61], "mkt_end": [], "dist_tot": [1.55, 1.41, 1.2, 1.56, 1.31], "divs": [1.01, 0.54, 0.84, 0.51, 0.89], "gains": [0.54, 0.87, 0.36, 1.05, 0.42], "roc": [0.0, 0.0, 0.0, 0.0, 0.0], "ops": [4.26, 5.13, 1.99, -5.04, 7.76], "share_div": 0.5391180654338549, "share_gains": 0.46088193456614507, "share_roc": 0.0} \ No newline at end of file diff --git a/fundlab/cef_cache/FUND.json b/fundlab/cef_cache/FUND.json index b48aca3..c1d341b 100644 --- a/fundlab/cef_cache/FUND.json +++ b/fundlab/cef_cache/FUND.json @@ -1 +1 @@ -{"sym": "FUND", "cik": 825202, "name": "SPROTT FOCUS TRUST INC.", "bdc": false, "n_tender": 2, "ticker": "FUND", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "FUND", "cik": 825202, "name": "SPROTT FOCUS TRUST INC.", "bdc": false, "n_tender": 2, "ticker": "FUND", "report_filed": "2026-03-09", "ncols": 5, "nav_beg": [8.36, 8.91, 8.49, 9.07, 8.08], "nav_end": [9.61, 8.36, 8.91, 8.49, 9.07], "mkt_end": [8.68, 7.32, 8.0, 7.97, 8.6], "dist_tot": [0.58, 0.6, 0.5, 0.54, 0.76], "divs": [0.16, 0.18, 0.18, 0.1, 0.35], "gains": [0.42, 0.42, 0.32, 0.44, 0.41], "roc": [0.0, 0.0, 0.0, 0.0, 0.0], "ops": [1.8299999999999998, 0.06000000000000001, 0.9299999999999999, -0.03, 1.73], "share_div": 0.325503355704698, "share_gains": 0.6744966442953021, "share_roc": 0.0} \ No newline at end of file diff --git a/fundlab/cef_cache/HERZ.json b/fundlab/cef_cache/HERZ.json index 56d7666..4d3853a 100644 --- a/fundlab/cef_cache/HERZ.json +++ b/fundlab/cef_cache/HERZ.json @@ -1 +1 @@ -{"sym": "HERZ", "cik": 880406, "name": "Herzfeld Credit Income Fund, Inc", "bdc": false, "n_tender": 0, "ticker": "HERZ", "report_filed": "2025-09-08", "ncols": 5, "nav_beg": [3.1, 4.98, 4.63, 7.06, 4.76], "nav_end": [2.65, 3.1, 4.98, 4.63, 7.06], "mkt_end": [2.53, 2.35, 3.95, 4.01, 6.27], "dist_tot": [0.46, 0.41, 0.69, 1.06, 0.62], "divs": [0.0, 0.0, 0.0, 0.0, 0.0], "gains": [-0.23, -0.12, -0.1, -0.23, 0.0], "roc": [-0.23, -0.29, -0.59, -0.83, -0.62], "ops": [0.07, 0.19, 1.13, -1.21, 2.91], "share_div": 0.0, "share_gains": 0.2098765432098765, "share_roc": 0.7901234567901234} \ No newline at end of file +{"sym": "HERZ", "cik": 880406, "name": "Herzfeld Credit Income Fund, Inc", "bdc": false, "n_tender": 0, "ticker": "HERZ", "report_filed": "2025-09-08", "ncols": 5, "nav_beg": [3.1, 4.98, 4.63, 7.06, 4.76], "nav_end": [2.65, 3.1, 4.98, 4.63, 7.06], "mkt_end": [2.53, 2.35, 3.95, 4.01, 6.27], "dist_tot": [0.46, 0.41, 0.69, 1.06, 0.62], "divs": [0.0, 0.0, 0.0, 0.0, 0.0], "gains": [0.23, 0.12, 0.1, 0.23, 0.0], "roc": [0.23, 0.29, 0.59, 0.83, 0.62], "ops": [0.07, 0.19, 1.13, -1.21, 2.91], "share_div": 0.0, "share_gains": 0.2098765432098765, "share_roc": 0.7901234567901234} \ No newline at end of file diff --git a/fundlab/cef_cache/HQH.json b/fundlab/cef_cache/HQH.json index 0182cbb..2d372bf 100644 --- a/fundlab/cef_cache/HQH.json +++ b/fundlab/cef_cache/HQH.json @@ -1 +1 @@ -{"sym": "HQH", "cik": 805267, "name": "abrdn Healthcare Investors", "bdc": false, "n_tender": 0, "ticker": "HQH", "report_filed": "2025-12-08", "ncols": 5, "nav_beg": [20.33, 18.84, 19.36, 25.47, 24.04], "nav_end": [19.7, 20.33, 18.84, 19.36, 25.47], "mkt_end": [18.46, 18.62, 15.55, 17.28, 25.57], "dist_tot": [2.24, 2.04, 1.61, 1.83, 2.06], "divs": [-2.11, -0.56, 0.0, -0.11, -0.61], "gains": [-0.04, -0.89, -1.61, -1.72, -1.45], "roc": [-0.09, -0.59, 0.0, 0.0, 0.0], "ops": [1.61, 3.53, 1.09, -4.28, 3.49], "share_div": 0.3466257668711656, "share_gains": 0.583844580777096, "share_roc": 0.06952965235173823} \ No newline at end of file +{"sym": "HQH", "cik": 805267, "name": "abrdn Healthcare Investors", "bdc": false, "n_tender": 0, "ticker": "HQH", "report_filed": "2025-12-08", "ncols": 5, "nav_beg": [20.33, 18.84, 19.36, 25.47, 24.04], "nav_end": [19.7, 20.33, 18.84, 19.36, 25.47], "mkt_end": [18.46, 18.62, 15.55, 17.28, 25.57], "dist_tot": [2.24, 2.04, 1.61, 1.83, 2.06], "divs": [2.11, 0.56, 0.0, 0.11, 0.61], "gains": [0.04, 0.89, 1.61, 1.72, 1.45], "roc": [0.09, 0.59, 0.0, 0.0, 0.0], "ops": [1.61, 3.53, 1.09, -4.28, 3.49], "share_div": 0.3466257668711656, "share_gains": 0.583844580777096, "share_roc": 0.06952965235173823} \ No newline at end of file diff --git a/fundlab/cef_cache/HQL.json b/fundlab/cef_cache/HQL.json index 786ccf4..c77ac5e 100644 --- a/fundlab/cef_cache/HQL.json +++ b/fundlab/cef_cache/HQL.json @@ -1 +1 @@ -{"sym": "HQL", "cik": 884121, "name": "abrdn Life Sciences Investors", "bdc": false, "n_tender": 0, "ticker": "HQL", "report_filed": "2025-12-08", "ncols": 5, "nav_beg": [16.38, 15.0, 15.49, 21.22, 20.25], "nav_end": [17.35, 16.38, 15.0, 15.49, 21.22], "mkt_end": [15.51, 15.08, 12.47, 13.66, 20.8], "dist_tot": [1.82, 1.66, 1.28, 1.47, 1.69], "divs": [-1.72, -0.69, -0.02, -0.03, -0.42], "gains": [-0.1, -0.76, -1.26, -1.44, -1.27], "roc": [0.0, -0.21, 0.0, 0.0, 0.0], "ops": [2.79, 3.04, 0.79, -4.26, 2.66], "share_div": 0.36363636363636365, "share_gains": 0.6098484848484849, "share_roc": 0.026515151515151516} \ No newline at end of file +{"sym": "HQL", "cik": 884121, "name": "abrdn Life Sciences Investors", "bdc": false, "n_tender": 0, "ticker": "HQL", "report_filed": "2025-12-08", "ncols": 5, "nav_beg": [16.38, 15.0, 15.49, 21.22, 20.25], "nav_end": [17.35, 16.38, 15.0, 15.49, 21.22], "mkt_end": [15.51, 15.08, 12.47, 13.66, 20.8], "dist_tot": [1.82, 1.66, 1.28, 1.47, 1.69], "divs": [1.72, 0.69, 0.02, 0.03, 0.42], "gains": [0.1, 0.76, 1.26, 1.44, 1.27], "roc": [0.0, 0.21, 0.0, 0.0, 0.0], "ops": [2.79, 3.04, 0.79, -4.26, 2.66], "share_div": 0.36363636363636365, "share_gains": 0.6098484848484849, "share_roc": 0.026515151515151516} \ No newline at end of file diff --git a/fundlab/cef_cache/IAE.json b/fundlab/cef_cache/IAE.json index 5902f03..9bd6655 100644 --- a/fundlab/cef_cache/IAE.json +++ b/fundlab/cef_cache/IAE.json @@ -1 +1 @@ -{"sym": "IAE", "cik": 1385632, "name": "Voya Asia Pacific High Dividend Equity Income Fund", "bdc": false, "n_tender": 0, "ticker": "IAE", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "IAE", "cik": 1385632, "name": "Voya Asia Pacific High Dividend Equity Income Fund", "bdc": false, "n_tender": 0, "ticker": "IAE", "report_filed": "2025-11-10", "ncols": 11, "nav_beg": [6.99, 7.06, 7.22, 8.87, 9.95, 8.76, 10.35, 11.67, 11.09, 9.39, 13.1], "nav_end": [7.6400000000000015, 6.99, 7.06, 7.219999999999998, 8.87, 9.95, 8.76, 10.35, 11.67, 11.09, 9.389999999999999], "mkt_end": [7.25, 6.27, 6.08, 6.34, 7.9, 9.27, 7.5, 9.34, 10.56, 9.72, 8.16], "dist_tot": [0.39, 0.81, 0.64, 0.86, 0.86, 0.86, 0.84, 0.82, 0.82, 0.97, 1.15], "divs": [0.08, 0.19, 0.28, 0.22, 0.14, 0.13, 0.27, 0.18, 0.31, 0.29, 0.55], "gains": [0.31, 0.62, 0.36, 0.64, 0.72, 0.73, 0.57, 0.64, 0.51, 0.68, 0.6], "roc": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "ops": [1.04, 0.74, 0.48, 0.79, 0.22, 2.05, 0.75, 0.5, 1.4, 2.67, 2.56], "share_div": 0.2926829268292683, "share_gains": 0.7073170731707317, "share_roc": 0.0} \ No newline at end of file diff --git a/fundlab/cef_cache/IDE.json b/fundlab/cef_cache/IDE.json index 085297c..c57c3d1 100644 --- a/fundlab/cef_cache/IDE.json +++ b/fundlab/cef_cache/IDE.json @@ -1 +1 @@ -{"sym": "IDE", "cik": 1417802, "name": "Voya Infrastructure, Industrials & Materials Fund", "bdc": false, "n_tender": 0, "ticker": "IDE", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "IDE", "cik": 1417802, "name": "Voya Infrastructure, Industrials & Materials Fund", "bdc": false, "n_tender": 0, "ticker": "IDE", "report_filed": "2025-11-10", "ncols": 11, "nav_beg": [11.48, 11.72, 11.26, 12.53, 12.28, 11.6, 13.74, 16.38, 15.38, 13.59, 17.19], "nav_end": [12.430000000000001, 11.48, 13.39, 11.26, 12.5, 12.28, 11.600000000000001, 13.739999999999998, 16.38, 15.379999999999999, 13.59], "mkt_end": [12.52, 10.53, 177615.0, 9.72, 11.05, 11.76, 10.07, 12.7, 15.6, 13.88, 11.59], "dist_tot": [0.6, 1.23, 0.47, 0.92, 0.92, 0.92, 1.04, 1.82, 1.16, 1.39, 1.54], "divs": [0.09, 0.2, 0.23, 0.19, 0.2, 0.15, 0.25, 0.22, 0.2, 0.21, 0.25], "gains": [0.47, 0.57, 0.22, 0.18, 0.41, 0.77, 0.15, 1.6, 0.76, 0.13, 0.08], "roc": [0.04, 0.46, 0.0, 0.55, 0.31, 0.0, 0.64, 0.0, 0.2, 1.05, 1.21], "ops": [1.55, 0.99, 1.38, 0.35, 1.14, 1.6, 1.1, 0.82, 2.16, 3.18, 2.06], "share_div": 0.18234804329725224, "share_gains": 0.44462947543713566, "share_roc": 0.37135720233139047} \ No newline at end of file diff --git a/fundlab/cef_cache/IGA.json b/fundlab/cef_cache/IGA.json index ed1f8f3..11163ea 100644 --- a/fundlab/cef_cache/IGA.json +++ b/fundlab/cef_cache/IGA.json @@ -1 +1 @@ -{"sym": "IGA", "cik": 1332943, "name": "Voya Global Advantage & Premium Opportunity Fund", "bdc": false, "n_tender": 0, "ticker": "IGA", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "IGA", "cik": 1332943, "name": "Voya Global Advantage & Premium Opportunity Fund", "bdc": false, "n_tender": 0, "ticker": "IGA", "report_filed": "2025-11-10", "ncols": 11, "nav_beg": [10.45, 9.99, 10.04, 10.51, 9.89, 10.42, 11.43, 12.12, 11.62, 10.71, 12.93], "nav_end": [10.469999999999999, 10.45, 9.989999999999998, 10.04, 10.48, 9.89, 10.42, 11.43, 12.12, 11.620000000000001, 10.71], "mkt_end": [10.0, 9.78, 8.57, 8.88, 9.5, 8.92, 9.29, 10.35, 11.19, 10.39, 9.55], "dist_tot": [0.51, 1.05, 0.79, 0.79, 0.79, 0.79, 0.84, 0.9, 0.9, 1.07, 1.12], "divs": [0.14, 0.45, 0.34, 0.42, 0.21, 0.15, 0.4, 0.41, 0.04, 0.42, 0.39], "gains": [0.21, 0.37, 0.45, 0.12, 0.58, 0.4, 0.44, 0.49, 0.78, 0.16, 0.73], "roc": [0.16, 0.23, 0.0, 0.25, 0.0, 0.24, 0.0, 0.0, 0.08, 0.49, 0.0], "ops": [0.53, 1.51, 0.74, 0.32, 1.38, 0.26, 0.17, 0.21, 1.4, 1.98, 1.1], "share_div": 0.35287958115183243, "share_gains": 0.4952879581151833, "share_roc": 0.1518324607329843} \ No newline at end of file diff --git a/fundlab/cef_cache/IGD.json b/fundlab/cef_cache/IGD.json index d44e82d..ea1f638 100644 --- a/fundlab/cef_cache/IGD.json +++ b/fundlab/cef_cache/IGD.json @@ -1 +1 @@ -{"sym": "IGD", "cik": 1285890, "name": "Voya GLOBAL EQUITY DIVIDEND & PREMIUM OPPORTUNITY FUND", "bdc": false, "n_tender": 0, "ticker": "IGD", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "IGD", "cik": 1285890, "name": "Voya GLOBAL EQUITY DIVIDEND & PREMIUM OPPORTUNITY FUND", "bdc": false, "n_tender": 0, "ticker": "IGD", "report_filed": "2025-11-10", "ncols": 11, "nav_beg": [6.16, 5.89, 5.97, 6.36, 6.01, 6.26, 7.02, 8.03, 8.01, 7.52, 9.31], "nav_end": [6.220000000000001, 6.159999999999999, 5.890000000000001, 5.970000000000001, 6.34, 6.01, 6.26, 7.02, 8.03, 8.01, 7.52], "mkt_end": [5.99, 5.6, 5.1, 5.35, 5.9, 5.47, 5.5, 6.56, 7.56, 7.29, 6.51], "dist_tot": [0.3, 0.58, 0.48, 0.48, 0.48, 0.48, 0.63, 0.73, 0.73, 0.88, 0.91], "divs": [0.08, 0.2, 0.18, 0.23, 0.16, 0.06, 0.18, 0.17, 0.3, 0.62, 0.77], "gains": [0.22, 0.38, 0.3, 0.25, 0.32, 0.42, 0.45, 0.11, 0.43, 0.26, 0.14], "roc": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.45, 0.0, 0.0, 0.0], "ops": [0.36, 0.85, 0.4, 0.09, 0.81, 0.23, 0.13, 0.28, 0.75, 1.37, 0.88], "share_div": 0.4416167664670659, "share_gains": 0.4910179640718562, "share_roc": 0.06736526946107783} \ No newline at end of file diff --git a/fundlab/cef_cache/IGR.json b/fundlab/cef_cache/IGR.json index 2b06d95..cf84344 100644 --- a/fundlab/cef_cache/IGR.json +++ b/fundlab/cef_cache/IGR.json @@ -1 +1 @@ -{"sym": "IGR", "cik": 1268884, "name": "CBRE GLOBAL REAL ESTATE INCOME FUND", "bdc": false, "n_tender": 3, "ticker": "IGR", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "IGR", "cik": 1268884, "name": "CBRE GLOBAL REAL ESTATE INCOME FUND", "bdc": false, "n_tender": 3, "ticker": "IGR", "report_filed": "2026-03-06", "ncols": 5, "nav_beg": [5.1, 6.2, 6.31, 10.48, 8.11], "nav_end": [4.5, 5.1, 6.2, 6.31, 10.48], "mkt_end": [4.38, 4.81, 5.43, 5.73, 9.79], "dist_tot": [0.72, 0.72, 0.72, 0.7, 0.6], "divs": [0.11, 0.44, 0.34, 0.21, 0.08], "gains": [0.0, 0.15, 0.3, 0.49, 0.52], "roc": [0.61, 0.13, 0.08, 0.0, 0.0], "ops": [0.12, -0.38, 0.84, -3.47, 2.97], "share_div": 0.34104046242774566, "share_gains": 0.4219653179190751, "share_roc": 0.23699421965317916} \ No newline at end of file diff --git a/fundlab/cef_cache/IHD.json b/fundlab/cef_cache/IHD.json index 9a215dd..285fe24 100644 --- a/fundlab/cef_cache/IHD.json +++ b/fundlab/cef_cache/IHD.json @@ -1 +1 @@ -{"sym": "IHD", "cik": 1496292, "name": "Voya Emerging Markets High Dividend Equity Fund", "bdc": false, "n_tender": 0, "ticker": "IHD", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "IHD", "cik": 1496292, "name": "Voya Emerging Markets High Dividend Equity Fund", "bdc": false, "n_tender": 0, "ticker": "IHD", "report_filed": "2025-11-10", "ncols": 11, "nav_beg": [5.86, 6.03, 5.98, 7.57, 8.49, 7.61, 8.89, 9.87, 9.24, 7.81, 11.57], "nav_end": [6.430000000000001, 5.86, 6.03, 5.98, 7.570000000000001, 8.49, 7.609999999999999, 8.889999999999999, 9.87, 9.239999999999998, 7.81], "mkt_end": [5.97, 5.34, 5.17, 5.25, 6.96, 7.95, 6.69, 8.41, 9.42, 8.32, 6.71], "dist_tot": [0.33, 0.68, 0.54, 0.72, 0.72, 0.72, 0.73, 0.74, 0.74, 0.88, 1.04], "divs": [0.07, 0.14, 0.21, 0.18, 0.11, 0.09, 0.28, 0.17, 0.18, 0.19, 0.21], "gains": [0.26, 0.54, 0.33, 0.54, 0.61, 0.63, 0.45, 0.57, 0.56, 0.69, 0.83], "roc": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "ops": [0.9, 0.51, 0.59, 0.87, 0.2, 1.6, 0.55, 0.24, 1.37, 2.31, 2.72], "share_div": 0.23341836734693877, "share_gains": 0.7665816326530612, "share_roc": 0.0} \ No newline at end of file diff --git a/fundlab/cef_cache/JCE.json b/fundlab/cef_cache/JCE.json index bd63db8..f11face 100644 --- a/fundlab/cef_cache/JCE.json +++ b/fundlab/cef_cache/JCE.json @@ -1 +1 @@ -{"sym": "JCE", "cik": 1385763, "name": "Nuveen Core Equity Alpha Fund", "bdc": false, "n_tender": 0, "ticker": "JCE", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "JCE", "cik": 1385763, "name": "Nuveen Core Equity Alpha Fund", "bdc": false, "n_tender": 0, "ticker": "JCE", "report_filed": "2026-03-06", "ncols": 5, "nav_beg": [15.48, 13.28, 12.04, 17.33, 15.21], "nav_end": [16.9, 15.479999999999999, 13.28, 12.039999999999997, 17.330000000000002], "mkt_end": [15.94, 15.9, 13.55, 13.54, 18.58], "dist_tot": [1.28, 1.28, 1.28, 2.33, 1.84], "divs": [0.03, 0.03, 0.06, 0.1, 0.07], "gains": [1.25, 1.25, 0.02, 1.93, 1.77], "roc": [0.0, 0.0, 1.2, 0.3, 0.0], "ops": [2.7, 3.44, 2.52, 2.96, 3.96], "share_div": 0.036204744069912614, "share_gains": 0.7765293383270913, "share_roc": 0.18726591760299627} \ No newline at end of file diff --git a/fundlab/cef_cache/KF.json b/fundlab/cef_cache/KF.json index 6d9224b..90c1442 100644 --- a/fundlab/cef_cache/KF.json +++ b/fundlab/cef_cache/KF.json @@ -1 +1 @@ -{"sym": "KF", "cik": 748691, "name": "KOREA FUND INC", "bdc": false, "n_tender": 0, "ticker": "KF", "report_filed": "2026-08-27", "ncols": 5, "nav_beg": [30.87, 28.78, 26.52, 28.54, 54.37], "nav_end": [87.88, 30.87, 28.78, 26.52, 28.54], "mkt_end": [75.21, 26.93, 24.13, 23.14, 24.35], "dist_tot": [1.3800000000000097, 0.4499999999999993, -3.552713678800501e-15, 3.3200000000000003, 9.11], "divs": [-1.38, -0.45, -0.03, 0.0, -2.05], "gains": [0.0, 0.0, 0.0, -3.27, -7.06], "roc": [-0.02, 0.0, 0.0, 0.0, 0.0], "ops": [58.39, 2.41, 2.17, 1.25, -16.73], "share_div": 0.2741935483870966, "share_gains": 0.7244039270687233, "share_roc": 0.0014025245441795222} \ No newline at end of file +{"sym": "KF", "cik": 748691, "name": "KOREA FUND INC", "bdc": false, "n_tender": 0, "ticker": "KF", "report_filed": "2026-08-27", "ncols": 5, "nav_beg": [30.87, 28.78, 26.52, 28.54, 54.37], "nav_end": [87.88, 30.87, 28.78, 26.52, 28.54], "mkt_end": [75.21, 26.93, 24.13, 23.14, 24.35], "dist_tot": [1.3800000000000097, 0.4499999999999993, -3.552713678800501e-15, 3.3200000000000003, 9.11], "divs": [1.38, 0.45, 0.03, 0.0, 2.05], "gains": [0.0, 0.0, 0.0, 3.27, 7.06], "roc": [0.02, 0.0, 0.0, 0.0, 0.0], "ops": [58.39, 2.41, 2.17, 1.25, -16.73], "share_div": 0.2741935483870966, "share_gains": 0.7244039270687233, "share_roc": 0.0014025245441795222} \ No newline at end of file diff --git a/fundlab/cef_cache/KYN.json b/fundlab/cef_cache/KYN.json index 6cee612..4e25148 100644 --- a/fundlab/cef_cache/KYN.json +++ b/fundlab/cef_cache/KYN.json @@ -1 +1 @@ -{"sym": "KYN", "cik": 1293613, "name": "Kayne Anderson Energy Infrastructure Fund, Inc.", "bdc": false, "n_tender": 29, "ticker": "KYN", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "KYN", "cik": 1293613, "name": "Kayne Anderson Energy Infrastructure Fund, Inc.", "bdc": false, "n_tender": 29, "ticker": "KYN", "report_filed": "2026-07-21", "ncols": 4, "nav_beg": [13.79, 15.03, 10.51, 10.64], "nav_end": [15.7, 13.79, 15.03, 10.51], "mkt_end": [], "dist_tot": [0.51, 0.96, 0.98, 0.83], "divs": [0.51, 0.74, 0.98, 0.83], "gains": [0.0, 0.0, 0.0, 0.0], "roc": [0.0, 0.22, 0.0, 0.0], "ops": [2.42, -0.28, 5.5, 0.71], "share_div": 0.9329268292682926, "share_gains": 0.0, "share_roc": 0.06707317073170731} \ No newline at end of file diff --git a/fundlab/cef_cache/LENDX.json b/fundlab/cef_cache/LENDX.json index a6a6640..1bd644c 100644 --- a/fundlab/cef_cache/LENDX.json +++ b/fundlab/cef_cache/LENDX.json @@ -1 +1 @@ -{"sym": "LENDX", "cik": 1658645, "name": "Stone Ridge Trust V", "bdc": false, "n_tender": 40, "ticker": "LENDX", "report_filed": "2026-05-08", "ncols": 5, "nav_beg": [46.09, 46.4, 48.79, 51.23, 57.09], "nav_end": [46.13, 46.09, 46.4, 48.79, 51.23], "mkt_end": [], "dist_tot": [1.99, 1.85, 1.92, 2.54, 18.28], "divs": [-1.99, 0.0, 0.0, -2.54, -7.52], "gains": [0.0, 0.0, 0.0, 0.0, -10.76], "roc": [0.0, -1.85, -1.92, 0.0, 0.0], "ops": [2.03, 1.54, -8.0, -0.47, 0.1], "share_div": 0.4533483822422874, "share_gains": 0.40481565086531224, "share_roc": 0.1418359668924003} \ No newline at end of file +{"sym": "LENDX", "cik": 1658645, "name": "Stone Ridge Trust V", "bdc": false, "n_tender": 40, "ticker": "LENDX", "report_filed": "2026-05-08", "ncols": 5, "nav_beg": [46.09, 46.4, 48.79, 51.23, 57.09], "nav_end": [46.13, 46.09, 46.4, 48.79, 51.23], "mkt_end": [], "dist_tot": [1.99, 1.85, 1.92, 2.54, 18.28], "divs": [1.99, 0.0, 0.0, 2.54, 7.52], "gains": [0.0, 0.0, 0.0, 0.0, 10.76], "roc": [0.0, 1.85, 1.92, 0.0, 0.0], "ops": [2.03, 1.54, -0.47, 0.1, 12.42], "share_div": 0.4533483822422874, "share_gains": 0.40481565086531224, "share_roc": 0.1418359668924003} \ No newline at end of file diff --git a/fundlab/cef_cache/LTCFX.json b/fundlab/cef_cache/LTCFX.json index 030507d..ecd94ff 100644 --- a/fundlab/cef_cache/LTCFX.json +++ b/fundlab/cef_cache/LTCFX.json @@ -1 +1 @@ -{"sym": "LTCFX", "cik": 1496254, "name": "Alternative Strategies Income Fund", "bdc": false, "n_tender": 60, "ticker": "LTAFX", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "LTCFX", "cik": 1496254, "name": "Alternative Strategies Income Fund", "bdc": false, "n_tender": 60, "ticker": "LTAFX", "report_filed": "2025-09-08", "ncols": 5, "nav_beg": [15.09, 19.4, 20.4, 25.8, 19.12], "nav_end": [14.57, 15.09, 19.4, 20.4, 25.8], "mkt_end": [], "dist_tot": [2.83, 2.93, 2.2, 1.68, 1.52], "divs": [2.83, 2.77, 2.04, 1.0, 0.08], "gains": [0.0, 0.0, 0.0, 0.0, 0.0], "roc": [0.0, 0.16, 0.16, 0.68, 1.44], "ops": [2.31, -1.38, 1.2, -3.72, 8.2], "share_div": 0.7813620071684588, "share_gains": 0.0, "share_roc": 0.2186379928315412} \ No newline at end of file diff --git a/fundlab/cef_cache/MCI.json b/fundlab/cef_cache/MCI.json index 024d717..747fdf9 100644 --- a/fundlab/cef_cache/MCI.json +++ b/fundlab/cef_cache/MCI.json @@ -1 +1 @@ -{"sym": "MCI", "cik": 275694, "name": "BARINGS CORPORATE INVESTORS", "bdc": false, "n_tender": 0, "ticker": "MCI", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "MCI", "cik": 275694, "name": "BARINGS CORPORATE INVESTORS", "bdc": false, "n_tender": 0, "ticker": "MCI", "report_filed": "2026-03-09", "ncols": 5, "nav_beg": [16.84, 16.77, 16.37, 16.68, 15.04], "nav_end": [16.63, 16.84, 16.77, 16.37, 16.68], "mkt_end": [], "dist_tot": [1.58, 1.68, 1.42, 1.02, 0.96], "divs": [1.6, 1.69, 1.42, 0.88, 0.96], "gains": [0.0, 0.0, 0.0, 0.14, 0.0], "roc": [0.0, 0.0, 0.0, 0.0, 0.0], "ops": [1.37, 1.75, 1.82, 0.71, 2.6], "share_div": 0.9834834834834836, "share_gains": 0.021021021021021026, "share_roc": 0.0} \ No newline at end of file diff --git a/fundlab/cef_cache/MPV.json b/fundlab/cef_cache/MPV.json index f1b9b63..9446f6a 100644 --- a/fundlab/cef_cache/MPV.json +++ b/fundlab/cef_cache/MPV.json @@ -1 +1 @@ -{"sym": "MPV", "cik": 831655, "name": "BARINGS PARTICIPATION INVESTORS", "bdc": false, "n_tender": 0, "ticker": "MPV", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "MPV", "cik": 831655, "name": "BARINGS PARTICIPATION INVESTORS", "bdc": false, "n_tender": 0, "ticker": "MPV", "report_filed": "2026-03-09", "ncols": 5, "nav_beg": [15.46, 15.41, 14.99, 15.19, 13.6], "nav_end": [15.23, 15.46, 15.41, 15.05, 15.19], "mkt_end": [], "dist_tot": [1.46, 1.57, 1.29, 0.86, 0.8], "divs": [1.48, 1.57, 1.29, 0.83, 0.8], "gains": [0.0, 0.0, 0.0, 0.03, 0.0], "roc": [0.0, 0.0, 0.0, 0.0, 0.0], "ops": [1.23, 1.62, 1.71, 0.66, 2.39], "share_div": 0.9983277591973243, "share_gains": 0.005016722408026755, "share_roc": 0.0} \ No newline at end of file diff --git a/fundlab/cef_cache/MXF.json b/fundlab/cef_cache/MXF.json index 4d80c70..adffbf4 100644 --- a/fundlab/cef_cache/MXF.json +++ b/fundlab/cef_cache/MXF.json @@ -1 +1 @@ -{"sym": "MXF", "cik": 65433, "name": "MEXICO FUND INC", "bdc": false, "n_tender": 14, "ticker": "MXF", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "MXF", "cik": 65433, "name": "MEXICO FUND INC", "bdc": false, "n_tender": 14, "ticker": "MXF", "report_filed": "2025-12-29", "ncols": 5, "nav_beg": [17.61, 18.97, 17.62, 17.4, 12.66], "nav_end": [22.02, 17.61, 18.97, 17.62, 17.4], "mkt_end": [], "dist_tot": [0.94, 0.88, 0.8, 0.72, 0.36], "divs": [0.73, 0.39, 0.57, 0.57, 0.23], "gains": [0.2, 0.41, 0.21, 0.1, 0.03], "roc": [0.01, 0.08, 0.02, 0.05, 0.1], "ops": [5.26, -0.48, 2.08, 0.94, 5.1], "share_div": 0.672972972972973, "share_gains": 0.25675675675675674, "share_roc": 0.07027027027027027} \ No newline at end of file diff --git a/fundlab/cef_cache/NICHX.json b/fundlab/cef_cache/NICHX.json index da77185..d582602 100644 --- a/fundlab/cef_cache/NICHX.json +++ b/fundlab/cef_cache/NICHX.json @@ -1 +1 @@ -{"sym": "NICHX", "cik": 1736510, "name": "Variant Alternative Income Fund", "bdc": false, "n_tender": 34, "ticker": "NICHX", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "NICHX", "cik": 1736510, "name": "Variant Alternative Income Fund", "bdc": false, "n_tender": 34, "ticker": "NICHX", "report_filed": "2026-07-09", "ncols": 5, "nav_beg": [26.74, 28.46, 28.93, 28.38, 26.96], "nav_end": [25.93, 26.74, 28.46, 28.93, 28.38], "mkt_end": [], "dist_tot": [2.62, 2.69, 3.14, 1.73, 1.68], "divs": [2.51, 2.53, 3.14, 1.53, 1.43], "gains": [0.0, 0.0, 0.0, 0.0, 0.0], "roc": [0.11, 0.16, 0.0, 0.2, 0.25], "ops": [1.81, 0.97, 2.67, 2.28, 3.1], "share_div": 0.9392917369308599, "share_gains": 0.0, "share_roc": 0.060708263069139956} \ No newline at end of file diff --git a/fundlab/cef_cache/NML.json b/fundlab/cef_cache/NML.json index d98818f..1867a18 100644 --- a/fundlab/cef_cache/NML.json +++ b/fundlab/cef_cache/NML.json @@ -1 +1 @@ -{"sym": "NML", "cik": 1562051, "name": "Neuberger Energy Infrastructure & Income Fund Inc.", "bdc": false, "n_tender": 0, "ticker": "NML", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "NML", "cik": 1562051, "name": "Neuberger Energy Infrastructure & Income Fund Inc.", "bdc": false, "n_tender": 0, "ticker": "NML", "report_filed": "2026-02-03", "ncols": 5, "nav_beg": [10.33, 8.02, 8.73, 6.32, 4.27], "nav_end": [9.72, 10.33, 8.02, 8.73, 6.32], "mkt_end": [8.7, 9.44, 6.91, 7.21, 5.02], "dist_tot": [0.7, 0.7, 0.7, 0.24, 0.18], "divs": [0.59, 0.7, 0.65, 0.22, 0.0], "gains": [0.0, 0.0, 0.0, 0.0, 0.0], "roc": [0.11, 0.0, 0.05, 0.02, 0.18], "ops": [0.09, 3.01, -0.01, 2.65, 2.23], "share_div": 0.8571428571428572, "share_gains": 0.0, "share_roc": 0.14285714285714285} \ No newline at end of file diff --git a/fundlab/cef_cache/NXG.json b/fundlab/cef_cache/NXG.json index e215226..e1170ac 100644 --- a/fundlab/cef_cache/NXG.json +++ b/fundlab/cef_cache/NXG.json @@ -1 +1 @@ -{"sym": "NXG", "cik": 1506488, "name": "NXG NextGen Infrastructure Income Fund", "bdc": false, "n_tender": 0, "ticker": "NXG", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "NXG", "cik": 1506488, "name": "NXG NextGen Infrastructure Income Fund", "bdc": false, "n_tender": 0, "ticker": "NXG", "report_filed": "2026-08-06", "ncols": 6, "nav_beg": [50.52, 51.3, 39.85, 54.75, 53.25, 45.87], "nav_end": [63.04, 50.52, 51.3, 39.85, 54.75, 53.25], "mkt_end": [], "dist_tot": [3.24, 6.48, 6.48, 3.94, 2.56, 2.56], "divs": [0.0, 0.5, 0.62, 2.18, 0.0, 0.0], "gains": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "roc": [3.24, 5.98, 5.86, 1.76, 2.56, 2.56], "ops": [15.76, 5.7, 17.93, -10.96, 4.06, 9.94], "share_div": 0.13064133016627077, "share_gains": 0.0, "share_roc": 0.8693586698337292} \ No newline at end of file diff --git a/fundlab/cef_cache/PDX.json b/fundlab/cef_cache/PDX.json index 0e4449d..9362ec4 100644 --- a/fundlab/cef_cache/PDX.json +++ b/fundlab/cef_cache/PDX.json @@ -1 +1 @@ -{"sym": "PDX", "cik": 1756908, "name": "PIMCO Dynamic Income Strategy Fund", "bdc": false, "n_tender": 0, "ticker": "PDX", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "PDX", "cik": 1756908, "name": "PIMCO Dynamic Income Strategy Fund", "bdc": false, "n_tender": 0, "ticker": "PDX", "report_filed": "2026-03-05", "ncols": 41, "nav_beg": [5.97, 6.26, 6.74, 7.69, 9.52, 8.47, 8.13, 7.43, 7.29, 7.27, 10.44, 7.47, 4.54, 4.39, 4.32, 4.68, 6.55, 5.94, 15.25, 15.02, 14.86, 17.2, 20.0, 16.93, 16.82, 17.27, 19.72, 25.23, 22.59, 13.0, 12.65, 12.69, 15.31, 20.5, 20.0, 26.76, 24.93, 18.49, 15.24, 14.27, 8.63], "nav_end": [], "mkt_end": [], "dist_tot": [0.39, 0.87, 0.96, 0.96, 0.96, 0.96, 0.41, 0.83, 0.83, 0.83, 0.83, 0.83, 0.24, 0.55, 0.61, 0.61, 0.61, 0.61, 0.9, 1.79, 1.79, 2.25, 0.47, 1.32, 2.65, 2.65, 3.3, 2.65, 2.65, 0.77, 1.53, 1.53, 2.49, 1.91, 0.47, 3.77, 1.85, 1.04, 0.88, 0.78, 0.68], "divs": [0.39, 0.69, 0.57, 0.73, 0.93, 0.96, 0.41, 0.82, 0.67, 0.83, 0.83, 0.83, 0.24, 0.54, 0.43, 0.61, 0.6, 0.41, 0.9, 1.66, 1.47, 2.25, 0.47, 1.32, 2.13, 1.37, 3.3, 2.65, 2.52, 0.77, 1.47, 1.08, 2.49, 1.79, 0.47, 0.8, 1.48, 1.04, 0.66, 0.47, 0.09], "gains": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.12, 0.0, 2.97, 0.37, 0.0, 0.0, 0.0, 0.0], "roc": [0.0, 0.18, 0.39, 0.23, 0.03, 0.0, 0.0, 0.01, 0.16, 0.0, 0.0, 0.0, 0.0, 0.01, 0.18, 0.0, 0.01, 0.2, 0.0, 0.13, 0.32, 0.0, 0.0, 0.0, 0.52, 1.28, 0.0, 0.0, 0.13, 0.0, 0.06, 0.45, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.22, 0.31, 0.59], "ops": [0.34, 0.58, 0.48, 0.01, 0.87, 2.01, 1.2, 1.53, 0.97, 0.85, 2.34, 3.8, 0.41, 0.7, 0.68, 0.25, 1.26, 1.22, 1.02, 2.01, 1.95, 0.09, 2.33, 1.11, 2.35, 1.96, 0.67, 2.93, 5.08, 1.11, 1.82, 1.48, 0.13, 3.28, 0.96, 1.96, 3.68, 7.48, 4.13, 1.75, 6.32], "share_div": 0.8326730805508392, "share_gains": 0.06527070364082249, "share_roc": 0.10205621580833803} \ No newline at end of file diff --git a/fundlab/cef_cache/PEO.json b/fundlab/cef_cache/PEO.json index e921e73..9050bc9 100644 --- a/fundlab/cef_cache/PEO.json +++ b/fundlab/cef_cache/PEO.json @@ -1 +1 @@ -{"sym": "PEO", "cik": 216851, "name": "ADAMS NATURAL RESOURCES FUND, INC.", "bdc": false, "n_tender": 0, "ticker": "PEO", "report_filed": "2026-02-20", "ncols": 5, "nav_beg": [24.21, 24.83, 25.85, 19.22, 13.76], "nav_end": [24.09, 24.21, 24.83, 25.85, 19.22], "mkt_end": [21.74, 21.74, 20.63, 21.8, 16.52], "dist_tot": [2.05, 1.77, 1.35, 1.63, 0.91], "divs": [-0.56, -0.65, -0.65, -0.79, -0.56], "gains": [-1.49, -1.12, -0.7, -0.84, -0.35], "roc": [0.0, 0.0, 0.0, 0.0, 0.0], "ops": [2.03, 1.27, 0.4, 8.37, 6.41], "share_div": 0.4163424124513619, "share_gains": 0.5836575875486382, "share_roc": 0.0} \ No newline at end of file +{"sym": "PEO", "cik": 216851, "name": "ADAMS NATURAL RESOURCES FUND, INC.", "bdc": false, "n_tender": 0, "ticker": "PEO", "report_filed": "2026-02-20", "ncols": 5, "nav_beg": [24.21, 24.83, 25.85, 19.22, 13.76], "nav_end": [24.09, 24.21, 24.83, 25.85, 19.22], "mkt_end": [21.74, 21.74, 20.63, 21.8, 16.52], "dist_tot": [2.05, 1.77, 1.35, 1.63, 0.91], "divs": [0.56, 0.65, 0.65, 0.79, 0.56], "gains": [1.49, 1.12, 0.7, 0.84, 0.35], "roc": [0.0, 0.0, 0.0, 0.0, 0.0], "ops": [2.03, 1.27, 0.4, 8.37, 6.41], "share_div": 0.4163424124513619, "share_gains": 0.5836575875486382, "share_roc": 0.0} \ No newline at end of file diff --git a/fundlab/cef_cache/RMT.json b/fundlab/cef_cache/RMT.json index 71e34c7..d531e15 100644 --- a/fundlab/cef_cache/RMT.json +++ b/fundlab/cef_cache/RMT.json @@ -1 +1 @@ -{"sym": "RMT", "cik": 912147, "name": "ROYCE MICRO-CAP TRUST, INC.", "bdc": false, "n_tender": 2, "ticker": "RMT", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "RMT", "cik": 912147, "name": "ROYCE MICRO-CAP TRUST, INC.", "bdc": false, "n_tender": 2, "ticker": "RMT", "report_filed": "2026-02-27", "ncols": 5, "nav_beg": [12.55, 11.72, 10.25, 14.26, 14.95], "nav_end": [15.24, 12.55, 11.72, 10.25, 14.26], "mkt_end": [], "dist_tot": [0.19, 0.47, 0.15, 0.13, 2.75], "divs": [0.13, 0.43, 0.0, 0.1, 0.09], "gains": [0.06, 0.04, 0.15, 0.03, 2.66], "roc": [0.0, 0.0, 0.0, 0.0, 0.0], "ops": [2.9, 1.35, 1.64, -3.87, 2.18], "share_div": 0.2032520325203252, "share_gains": 0.7967479674796749, "share_roc": 0.0} \ No newline at end of file diff --git a/fundlab/cef_cache/SCD.json b/fundlab/cef_cache/SCD.json index ff766a9..2ab172e 100644 --- a/fundlab/cef_cache/SCD.json +++ b/fundlab/cef_cache/SCD.json @@ -1 +1 @@ -{"sym": "SCD", "cik": 1270131, "name": "LMP CAPITAL & INCOME FUND INC.", "bdc": false, "n_tender": 0, "ticker": "SCD", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "SCD", "cik": 1270131, "name": "LMP CAPITAL & INCOME FUND INC.", "bdc": false, "n_tender": 0, "ticker": "SCD", "report_filed": "2026-07-30", "ncols": 5, "nav_beg": [16.51, 18.64, 14.9, 14.74, 15.93], "nav_end": [17.27, 16.51, 18.64, 14.9, 14.74], "mkt_end": [], "dist_tot": [0.72, 1.42, 1.36, 1.35, 1.04], "divs": [0.72, 0.72, 0.45, 0.33, 0.33], "gains": [0.0, 0.7, 0.91, 0.38, 0.0], "roc": [0.0, 0.0, 0.0, 0.64, 0.71], "ops": [1.48, -0.21, 5.1, 1.48, -0.18], "share_div": 0.432937181663837, "share_gains": 0.33786078098471983, "share_roc": 0.22920203735144315} \ No newline at end of file diff --git a/fundlab/cef_cache/SRV.json b/fundlab/cef_cache/SRV.json index f39f3e6..1a73baf 100644 --- a/fundlab/cef_cache/SRV.json +++ b/fundlab/cef_cache/SRV.json @@ -1 +1 @@ -{"sym": "SRV", "cik": 1400897, "name": "NXG Cushing Midstream Energy Fund", "bdc": false, "n_tender": 0, "ticker": "SRV", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "SRV", "cik": 1400897, "name": "NXG Cushing Midstream Energy Fund", "bdc": false, "n_tender": 0, "ticker": "SRV", "report_filed": "2026-08-06", "ncols": 6, "nav_beg": [43.26, 48.54, 38.81, 42.67, 37.04, 27.32], "nav_end": [49.48, 43.26, 48.54, 38.81, 42.67, 37.04], "mkt_end": [], "dist_tot": [3.01, 5.4, 5.4, 5.4, 2.64, 1.44], "divs": [0.0, 4.11, 3.72, 0.96, 0.73, 0.44], "gains": [0.31, 1.29, 1.68, 0.0, 0.0, 0.0], "roc": [2.7, 0.0, 0.0, 4.44, 1.91, 1.0], "ops": [9.23, 0.11, 15.13, 1.54, 8.27, 11.16], "share_div": 0.4276513525118076, "share_gains": 0.14083297552597682, "share_roc": 0.4315156719622155} \ No newline at end of file diff --git a/fundlab/cef_cache/TWN.json b/fundlab/cef_cache/TWN.json index e7cc398..02f0295 100644 --- a/fundlab/cef_cache/TWN.json +++ b/fundlab/cef_cache/TWN.json @@ -1 +1 @@ -{"sym": "TWN", "cik": 804123, "name": "TAIWAN FUND INC", "bdc": false, "n_tender": 0, "ticker": "TWN", "report_filed": "2025-11-05", "ncols": 5, "nav_beg": [53.78, 39.73, 29.96, 42.83, 28.79], "nav_end": [59.13, 53.78, 39.73, 29.96, 42.83], "mkt_end": [50.25, 44.73, 31.1, 25.2, 35.83], "dist_tot": [7.399999999999999, 0.4399999999999977, 0.0, 2.9199999999999946, 3.3100000000000023], "divs": [0.0, 0.0, 0.0, -0.48, -0.38], "gains": [-7.4, -0.44, 0.0, -2.44, -2.93], "roc": [0.0, 0.0, 0.0, 0.0, 0.0], "ops": [11.92, 13.56, 9.73, -9.95, 17.35], "share_div": 0.061122956645344735, "share_gains": 0.9388770433546558, "share_roc": 0.0} \ No newline at end of file +{"sym": "TWN", "cik": 804123, "name": "TAIWAN FUND INC", "bdc": false, "n_tender": 0, "ticker": "TWN", "report_filed": "2025-11-05", "ncols": 5, "nav_beg": [53.78, 39.73, 29.96, 42.83, 28.79], "nav_end": [59.13, 53.78, 39.73, 29.96, 42.83], "mkt_end": [50.25, 44.73, 31.1, 25.2, 35.83], "dist_tot": [7.399999999999999, 0.4399999999999977, 0.0, 2.9199999999999946, 3.3100000000000023], "divs": [0.0, 0.0, 0.0, 0.48, 0.38], "gains": [7.4, 0.44, 0.0, 2.44, 2.93], "roc": [0.0, 0.0, 0.0, 0.0, 0.0], "ops": [11.92, 13.56, 9.73, -9.95, 17.35], "share_div": 0.061122956645344735, "share_gains": 0.9388770433546558, "share_roc": 0.0} \ No newline at end of file diff --git a/fundlab/cef_cache/TYG.json b/fundlab/cef_cache/TYG.json index cbb81f1..b3706d3 100644 --- a/fundlab/cef_cache/TYG.json +++ b/fundlab/cef_cache/TYG.json @@ -1 +1 @@ -{"sym": "TYG", "cik": 1268533, "name": "TORTOISE ENERGY INFRASTRUCTURE CORP", "bdc": false, "n_tender": 17, "ticker": "TYG", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "TYG", "cik": 1268533, "name": "TORTOISE ENERGY INFRASTRUCTURE CORP", "bdc": false, "n_tender": 17, "ticker": "TYG", "report_filed": "2026-02-06", "ncols": 5, "nav_beg": [51.96, 35.35, 39.41, 33.54, 25.42], "nav_end": [46.54, 51.96, 35.35, 39.41, 33.54], "mkt_end": [44.09, 46.0, 28.11, 33.54, 27.27], "dist_tot": [4.49, 2.98, 2.84, 2.84, 1.47], "divs": [0.15, 0.45, 1.65, 0.0, 0.0], "gains": [0.0, 0.0, 0.0, 0.0, 0.0], "roc": [4.34, 2.53, 1.19, 2.84, 1.47], "ops": [-0.93, 19.59, -1.22, 8.71, 9.59], "share_div": 0.1538987688098495, "share_gains": 0.0, "share_roc": 0.8461012311901503} \ No newline at end of file diff --git a/fundlab/cef_cache/VCRDX.json b/fundlab/cef_cache/VCRDX.json index b231ad8..285473a 100644 --- a/fundlab/cef_cache/VCRDX.json +++ b/fundlab/cef_cache/VCRDX.json @@ -1 +1 @@ -{"sym": "VCRDX", "cik": 1812286, "name": "Harrison Street Infrastructure Income Fund", "bdc": false, "n_tender": 9, "ticker": "VCRDX", "error": "no per-share table found in the 3 latest reports"} \ No newline at end of file +{"sym": "VCRDX", "cik": 1812286, "name": "Harrison Street Infrastructure Income Fund", "bdc": false, "n_tender": 9, "ticker": "VCRDX", "report_filed": "2026-06-04", "ncols": 2, "nav_beg": [10.1, 10.0], "nav_end": [10.1, 10.1], "mkt_end": [], "dist_tot": [0.95, 0.85], "divs": [0.87, 0.83], "gains": [0.0, 0.0], "roc": [0.08, 0.02], "ops": [0.95, 0.95], "share_div": 0.9444444444444445, "share_gains": 0.0, "share_roc": 0.055555555555555566} \ No newline at end of file diff --git a/fundlab/cef_probe.log b/fundlab/cef_probe.log new file mode 100644 index 0000000..e6259cd --- /dev/null +++ b/fundlab/cef_probe.log @@ -0,0 +1,102 @@ +== AIO +2026-04-09 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 23.52 $ 20.61 $ 19.92 $ 24.18 $ 29.20 $ 19.89 Income (loss) from investment operations: Net investment income (loss) (2) 0.06 0.01 (0.03 ) (0.01 ) (0.18 ) (0.08 ) Net realized and unrealized gain (loss) 4.27 4.70 2.52 (2.' +2025-10-06 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 23.52 $ 20.61 $ 19.92 $ 24.18 $ 29.20 $ 19.89 $ 20.00 Income (loss) from investment operations: Net investment income (loss) (3) 0.03 0.01 (0.03) (0.01) (0.18) (0.08) (0.01) Net realized and unrealized gain (loss) 1.29 4.' +== ASA +2026-07-28 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net asset value, beginning of period $ 58.54 $ 23.36 $ 17.36 $ 16.88 $ 24.98 $ 24.05 Net investment income/(loss) 0.03 (0.47 ) (0.22 ) (0.06 ) (0.07 ) (0.09 ) Net realized gain (loss) from investments 6.50 7.63 3.40 0.46 1.40 1.37 Net realized gain (loss) from' +2026-02-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $ 23.36 $ 17.36 $ 16.88 $ 24.98 $ 24.05 Net investment loss (0.47 ) (0.22 ) (0.06 ) (0.07 ) (0.09 ) Net realized gain (loss) from investments 7.63 3.40 0.46 1.40 1.37 Net realized gain (loss) from foreign currency transaction' +== ASCIX +2026-04-08 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period $21.08 $20.86 $20.62 $21.13 Income from investment operations: Net investment income (loss) 1.79 1.86 1.75 0.98 Net realized and unrealized gain (loss) on investments (c) (0.17 ) 0.23 0.20 (0.46 ) Total from investm' +2025-10-06 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period $21.08 $20.86 $20.62 $21.13 Income from investment operations: Net investment income (loss) 0.89 1.86 1.75 0.98 Net realized and unrealized gain (loss) on investments (c) 0.01 0.23 0.20 (0.46 ) Total from investment' +== BXSY +2026-08-27 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $23.66 $19.60 $18.88 $16.56 $20.25 $16.16 Income from investment operations: Net investment income (loss) (0.03 ) (0.15 ) 0.01 0.07 0.21 0.14 Net realized and unrealized gain (loss) on investments 4.64 5.22 1.84 3.28 (2.87 ' +2026-03-05 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $19.60 $18.88 $16.56 $20.25 $16.16 Income from investment operations: Net investment income (loss) (0.15 ) 0.01 0.07 0.21 0.14 Net realized and unrealized gain (loss) on investments 5.22 1.84 3.28 (2.87 ) 5.31 Total income ' +== CET +2026-08-07 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 60.50 $ 54.26 $ 46.49 $ 40.48 $ 48.87 $ 39.49 Net investment income (a) .83 .84 .54 .51 .54 .83 Net realized and unrealized gain (loss) on securities (a) 1.09 8.31 9.61 7.50 (6.35 ) 12.64 Total from investment operations ' +2026-02-24 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $ 54.26 $ 46.49 $ 40.48 $ 48.87 $ 39.49 Net investment income (a) .84 .54 .51 .54 .83 Net realized and unrealized gain (loss) on securities (a) 8.31 9.61 7.50 (6.35 ) 12.64 Total from investment operations 9.15 10.15 8.01 (5.' +== CLM +2026-08-27 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 6.73 $ 7.03 $ 6.77 $ 6.48 $ 10.23 $ 9.93 Net investment income (loss) # (0.00 ) + 0.02 0.02 0.03 0.02 0.01 Net realized and unrealized gain/(loss) on investments 0.44 1.07 1.54 1.74 (2.20 ) 1.86 Net increase/(decrease) in' +2026-03-04 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $ 7.03 $ 6.77 $ 6.48 $ 10.23 $ 9.93 Net investment income # 0.02 0.02 0.03 0.02 0.01 Net realized and unrealized gain/(loss) on investments 1.07 1.54 1.74 (2.20 ) 1.86 Net increase/(decrease) in net assets resulting from oper' +== CRF +2026-08-27 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 6.52 $ 6.69 $ 6.49 $ 6.24 $ 9.88 $ 9.56 Net investment income (loss) # (0.01 ) 0.02 0.03 0.03 0.02 0.01 Net realized and unrealized gain/(loss) on investments 0.45 1.00 1.42 1.64 (2.00 ) 1.82 Net increase/(decrease) in ne' +2026-03-04 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $ 6.69 $ 6.49 $ 6.24 $ 9.88 $ 9.56 Net investment income # 0.02 0.03 0.03 0.02 0.01 Net realized and unrealized gain/(loss) on investments 1.00 1.42 1.64 (2.00 ) 1.82 Net increase/(decrease) in net assets resulting from opera' +== DXYZ +2026-03-10 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net Asset Value, Beginning of Period $ 6.44 $ 4.84 $ 5.22 $ ( 1.60 ) Income from Investment Operations Net investment income/(loss) (3) (0.50) (0.34) (0.26) (0.27) Net realized and unrealized gain/(loss) on investments (3) 4.04 1.94 (0.44) (0.28) Change in unr' +2025-09-03 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net Asset Value, Beginning of Period $ 6.44 $ 4.84 $ 5.22 $ ( 1.60 ) Income from Investment Operations Net investment income/(loss) (3) (0.23 ) (0.34 ) (0.26 ) (0.27 ) Net realized gain/(loss) on investments (0.40 ) 0.00 Change in unrealized fair value on inve' +== ECAT +2026-03-05 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $ 16.43 $ 17.25 $ 16.84 $ 20.90 $ 21.05 Net investment income (b) 0.36 0.48 0.55 0.50 0.53 Net realized and unrealized gain (loss) 1.76 1.35 1.37 (3.31 ) 0.57 Net increase (decrease) from investment operations 2.12 1.83 1.92 ' +2025-09-04 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net asset value, beginning of period $ 16.43 $ 17.25 $ 16.84 $ 20.90 $ 21.05 $ 20.00 Net investment income (c) 0.21 0.48 0.55 0.50 0.53 0.04 Net realized and unrealized gain (loss) 0.74 1.35 1.37 (3.31 ) 0.57 1.11 Net increase (decrease) from investment operat' +== EDF +2026-08-05 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 8.29 $ 8.51 $ 8.45 $ 8.94 $ 11.67 $ 12.55 Income (loss) from investment operations: Net investment income (loss) (1) 0.22 0.47 0.44 0.40 0.46 0.52 Net realized and unrealized gain (loss) 0.02 0.27 0.58 0.07 (2.23 ) (0.32 ' +2026-02-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 8.51 $ 8.45 $ 8.94 $ 11.67 $ 12.55 Income (loss) from investment operations: Net investment income (loss) (1) 0.47 0.44 0.40 0.46 0.52 Net realized and unrealized gain (loss) 0.27 0.58 0.07 (2.23 ) (0.32 ) Total from inve' +== ETG +2026-06-26 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net asset value Beginning of period $ 23.23 $ 20.52 $ 16.80 $ 16.01 $ 22.61 $ 16.16 Income (Loss) From Operations Net investment income (1) $ 0.39 $ 0.68 $ 0.49 $ 0.83 $ 0.51 $ 0.82 Net realized and unrealized gain (loss) 1.79 3.58 4.64 1.16 (5.55) 6.94 Total ' +2025-12-30 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net asset value Beginning of year $ 20.52 $ 16.80 $ 16.01 $ 22.61 $ 16.16 Income (Loss) From Operations Net investment income (1) $ 0.68 $ 0.49 $ 0.83 $ 0.51 $ 0.82 Net realized and unrealized gain (loss) 3.58 4.64 1.16 (5.55) 6.94 Total income (loss) from ope' +== FUND +2026-03-09 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'NET ASSET VALUE, BEGINNING OF YEAR $ 8.36 $ 8.91 $ 8.49 $ 9.07 $ 8.08 INCOME/(LOSS) FROM INVESTMENT OPERATIONS: Net investment income/(loss) (a) 0.18 0.17 0.18 0.13 0.16 Net realized and unrealized gain/(loss) on investments and foreign currency 1.65 (0.11 ) 0' +2025-09-05 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'NET ASSET VALUE, BEGINNING OF PERIOD $ 8.36 $ 8.91 $ 8.49 $ 9.07 $ 8.08 $ 8.30 INCOME/(LOSS) FROM INVESTMENT OPERATIONS: Net investment income/(loss) (a) 0.11 0.17 0.18 0.13 0.16 0.15 Net realized and unrealized gain/(loss) on investments and foreign currency ' +== IAE +2026-05-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as' +2025-11-10 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as' +== IDE +2026-05-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as' +2025-11-10 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as' +== IGA +2026-05-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as' +2025-11-10 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as' +== IGD +2026-05-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as' +2025-11-10 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as' +== IGR +2026-08-21 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $4.50 $5.10 $6.20 $6.31 $10.48 $8.11 Income from investment operations Net investment income (1) 0.04 0.09 0.08 0.10 0.20 0.22 Net realized and unrealized gain (loss) on investments, written options and foreign currency tra' +2026-03-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $5.10 $6.20 $6.31 $10.48 $8.11 Income from investment operations Net investment income (1) 0.09 0.08 0.10 0.20 0.22 Net realized and unrealized gain (loss) on investments, written options and foreign currency transactions 0.0' +== IHD +2026-05-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as' +2025-11-10 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as' +== JCE +2026-03-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net Asset Value, Beginning of Period Net Investment Income (NII) (Loss) (a) Net Realized/ Unrealized Gain (Loss) Total From NII From Net Realized Gains Return of Capital Total Shelf Offering Costs Premium per Share Sold through Shelf Offering Net Asset Value, ' +2025-09-05 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net Asset Value, Beginning of Period Net Investment Income (NII) (Loss) (a) Net Realized/ Unrealized Gain (Loss) Total From NII From Net Realized Gains Return of Capital Total Shelf Offering Costs Premium per Share Sold through Shelf Offering Net Asset Value, ' +== KYN +2026-07-21 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 13.79 $ 15.03 $ 10.51 $ 10.64 Net investment income (loss) (2) 0.06 0.10 0.08 0.12 Net realized and unrealized gain (loss) 2.36 (0.38 ) 5.42 0.59 Total income (loss) from operations 2.42 (0.28 ) 5.50 0.71 Common dividends' +2026-01-23 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 15.03 $ 10.51 $ 10.64 Net investment income (loss) (2) 0.10 0.08 0.12 Net realized and unrealized gain (loss) (0.38 ) 5.42 0.59 Total income (loss) from operations (0.28 ) 5.50 0.71 Common dividends (3) (0.74) (0.98 ) (0.' +== LTCFX +2026-03-10 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net Asset Value, Beginning of Period $ 14.57 $ 15.09 $ 19.40 $ 20.40 $ 25.80 $ 19.12 Increase (decrease) From Operations: Net investment income (a) 1.83 2.78 1.77 2.04 0.92 0.44 Net gain (loss) from investments (both realized and unrealized) (0.94 ) (0.47 ) (3' +2025-09-08 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net Asset Value, Beginning of Year $ 15.09 $ 19.40 $ 20.40 $ 25.80 $ 19.12 Increase (decrease) From Operations: Net investment income (a) 2.78 1.77 2.04 0.92 0.44 Net gain (loss) from investments (both realized and unrealized) (0.47 ) (3.15 ) (0.84 ) (4.64 ) 7' +== MCI +2026-03-09 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value Beginning of year 16.84 $ 16.77 $ 16.37 $ 16.68 $ 15.04 Net investment income (a) 1.33 1.71 1.61 1.03 0.93 Net realized and unrealized gain (loss) on investments 0.04 0.04 0.21 (0.32) 1.67 Total from investment operations 1.37 1.75 1.82 0.71 2.' +2025-09-08 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value Beginning of period year $ 16.84 $ 16.77 $ 16.37 $ 16.68 $ 15.04 $ 15.24 Net investment income (a) 0.69 1.71 1.61 1.03 0.93 1.20 Net realized and unrealized gain (loss) on investments (0.04) 0.04 0.21 (0.32) 1.67 (0.44) Total from investment op' +== MPV +2026-03-09 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value Beginning of year $ 15.46 $ 15.41 $ 14.99 $ 15.19 $ 13.60 Net investment income (a) 1.20 1.55 1.50 0.97 0.86 Net realized and unrealized gain (loss) on investments 0.03 0.07 0.21 (0.31) 1.53 Total from investment operations 1.23 1.62 1.71 0.66 ' +2025-09-08 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value Beginning of period year $ 15.46 $ 15.41 $ 14.99 $ 15.19 $ 13.60 $ 13.80 Net investment income (a) 0.63 1.55 1.50 0.97 0.86 1.00 Net realized and unrealized gain (loss) on investments (0.05) 0.07 0.21 (0.31) 1.53 (0.40) Total from investment op' +== MXF +2026-06-24 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $ 22.02 $ 17.61 $ 18.97 $ 17.62 $ 17.40 $ 12.66 Net investment income (a) 0.27 0.68 0.42 0.52 0.52 0.21 Net gain (loss) on investments and translation of foreign currency (a) 3.06 4.58 (0.90 ) 1.56 0.42 4.89 Total from invest' +2025-12-29 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $ 17.61 $ 18.97 $ 17.62 $ 17.40 $ 12.66 Net investment income (a) 0.68 0.42 0.52 0.52 0.21 Net gain (loss) on investments and translation of foreign currency (a) 4.58 (0.90 ) 1.56 0.42 4.89 Total from investment operations 5.' +== NICHX +2026-07-09 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net asset value, beginning of year $ 26.74 $ 28.46 $ 28.93 $ 28.38 $ 26.96 Income from Investment Operations: Net investment income 1 2.44 2.35 2.64 2.22 1.89 Net realized and unrealized gain (loss) (0.63 ) (1.38 ) 0.03 0.06 1.21 Total from investment operatio' +2026-01-09 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net asset value, beginning of year/period $ 26.74 $ 28.46 $ 28.93 $ 28.38 $ 26.96 $ 26.32 Income from Investment Operations: Net investment income 1 1.31 2.35 2.64 2.22 1.89 1.66 Net realized and unrealized gain (loss) (0.16 ) (1.38 ) 0.03 0.06 1.21 0.59 Total' +== NML +2026-07-30 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net Asset Value, Beginning of Period $ 9.72 $ 10.33 $ 8.02 $ 8.73 $ 6.32 $ 4.27 Income/(Loss) From Investment Operations Applicable to Common Stockholders: Net Investment Income/(Loss) (0.19 ) 0.02 0.02 (0.07 ) (0.02 ) (0.05 ) Net Gains/(Losses) on Securities ' +2026-02-03 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net Asset Value, Beginning of Year $ 10.33 $ 8.02 $ 8.73 $ 6.32 $ 4.27 Income/(Loss) From Investment Operations Applicable to Common Stockholders: Net Investment Income/(Loss) 0.02 0.02 (0.07 ) (0.02 ) (0.05 ) Net Gains/(Losses) on Securities (both realized an' +== NXG +2026-08-06 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net Asset Value, beginning of period $ 50.52 $ 51.30 $ 39.85 $ 54.75 $ 53.25 $ 45.87 Income from Investment Operations: Net investment income (loss) (0.30 ) (0.43 ) (0.63 ) 0.21 (0.06 ) 0.70 Net realized and unrealized gain (loss) on investments 16.06 6.13 18.' +2026-02-09 [N-CSR] NO ANCHOR (len=1749866) +== PDX +2026-03-05 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net Asset Value Beginning of Year or Period (a) Net Investment Income (Loss) (b) Net Realized/ Unrealized Gain (Loss) Total From Net Investment Income From Net Realized Capital Gains Tax Basis Return of Capital Total PCM Fund, Inc. 07/01/2025 - 12/31/2025+ $ 5' +2025-09-05 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net Asset Value Beginning of Year or Period (a) Net Investment Income (Loss) (b) Net Realized/ Unrealized Gain (Loss) Total From Net Investment Income From Net Realized Capital Gains Tax Basis Return of Capital Total PCM Fund, Inc. 06/30/2025 $ 6.26 $ 0.70 $ (' +== RMT +2026-08-26 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net Asset Value, Beginning of Period $ 15.24 $ 12.55 $ 11.72 $ 10.25 $ 14.26 $ 14.95 INVESTMENT OPERATIONS: Net investment income (loss) 0.04 0.05 0.03 (0.05 ) 1 , 2 0.09 (0.01 ) Net realized and unrealized gain (loss) on investments and foreign currency 1.90 ' +2026-02-27 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net Asset Value, Beginning of Period $ 12.55 $ 11.72 $ 10.25 $ 14.26 $ 14.95 INVESTMENT OPERATIONS: Net investment income (loss) 0.05 0.03 (0.05 ) 1 , 2 0.09 (0.01 ) Net realized and unrealized gain (loss) on investments and foreign currency 2.85 1.32 1.69 (3.' +== SCD +2026-07-30 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $16.51 $18.64 $14.90 $14.74 $15.93 Income (loss) from operations: Net investment income 0.06 0.20 0.19 0.03 0.37 Net realized and unrealized gain (loss) 1.42 (0.41 ) 4.91 1.45 (0.55 ) Total income (loss) from operations 1.4' +2026-01-28 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $18.64 $14.90 $14.74 $15.93 $13.12 Income (loss) from operations: Net investment income 0.20 0.19 0.03 0.37 0.50 Net realized and unrealized gain (loss) (0.41 ) 4.91 1.45 (0.55 ) 3.33 Total income (loss) from operations (0.21' +== SRV +2026-08-06 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net Asset Value, beginning of period $ 43.26 $ 48.54 $ 38.81 $ 42.67 $ 37.04 $ 27.32 Income from Investment Operations: Net investment income (loss) 0.04 (0.13 ) (0.44 ) (0.10 ) (0.13 ) (0.03 ) Net realized and unrealized gain on investments 9.19 0.24 15.57 1.' +2026-02-09 [N-CSR] NO ANCHOR (len=1856170) +== STEW +2026-08-07 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value Beginning of Period INCOME FROM INVESTMENT OPERATIONS: Net investment income (a) Net realized and unrealized gain/(loss) on investments Net Increase/(Decrease) from Operations Applicable to Common Stockholders DISTRIBUTIONS TO COMMON STOCKHOLDE' +2026-02-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value Beginning of Period INCOME FROM INVESTMENT OPERATIONS: Net investment income (a) Net realized and unrealized gain on investments Net Increase from Operations Applicable to Common Stockholders DISTRIBUTIONS TO COMMON STOCKHOLDERS Distributable e' +== TYG +2026-08-07 [N-CSRS] NO ANCHOR (len=2420367) +2026-02-06 [N-CSR] NO ANCHOR (len=2609335) +== VCRDX +2026-06-04 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net asset value, beginning of period $ 10.10 $ 10.00 Income from Investment Operations: Net investment income (loss) 1 0.98 0.93 Net realized and unrealized gain (loss) (0.03 ) 0.02 Total from investment operations 0.95 0.95 Less Distributions from: Net invest' +2025-12-03 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net asset value, beginning of period $ 10.10 $ 10.00 Income from Investment Operations: Net investment income (loss) 1 0.43 0.93 Net realized and unrealized gain 0.08 0.02 Total from investment operations 0.51 0.95 Less Distributions from: Net investment incom' diff --git a/fundlab/cef_probe.py b/fundlab/cef_probe.py new file mode 100644 index 0000000..1216dc9 --- /dev/null +++ b/fundlab/cef_probe.py @@ -0,0 +1,68 @@ +"""Probe the per-share table region of the failed CEFs (debug aid).""" +import json +import re +import sys + +from fundlab import edgar + +HERE = __import__("pathlib").Path(__file__).parent + + +def probe(syms, tag): + uni = json.loads((HERE / "cef_universe.json").read_text()) + out = {} + for sym in syms: + u = uni.get(sym) + if not u: + continue + cik = int(u["cik"]) + try: + d = json.loads(edgar.sec_get( + f"https://data.sec.gov/submissions/CIK{cik:010d}.json")) + except Exception as e: + out[sym] = f"submissions fail: {e}" + continue + r = d["filings"]["recent"] + cands = [(r["filingDate"][i], r["accessionNumber"][i], r["form"][i]) + for i in range(len(r["form"])) + if r["form"][i] in ("N-CSR", "N-CSRS")][:2] + notes = [] + for fd, acc, form in cands: + try: + t = re.sub(r"\s+", " ", edgar.to_text( + edgar.sec_get( + f"https://www.sec.gov/Archives/edgar/data/{cik}/" + f"{acc}.txt"))) + except Exception as e: + notes.append(f"{fd}: fetch fail {e}") + continue + # find every candidate anchor region + pats = [ + r"net asset value[^.]{0,40}beginning of (?:year|period)", + r"nav per (?:common )?share, beginning", + r"per share (?:operating )?performance", + r"selected per share data", + ] + hit = None + for p in pats: + m = re.search(p, t, re.I) + if m: + hit = (p, m) + break + if hit: + p, m = hit + pre = t[max(0, m.start() - 200): m.start()] + notes.append(f"{fd} [{form}] ANCHOR '{p[:30]}' share-in-pre=" + f"{bool(re.search(r'share', pre, re.I))} :: " + f"{t[m.start():m.start()+260]!r}") + else: + notes.append(f"{fd} [{form}] NO ANCHOR (len={len(t)})") + out[sym] = "\n".join(notes) + print(f"== {sym}\n{out[sym]}", flush=True) + (HERE / f"probe_{tag}.json").write_text(json.dumps(out, indent=1)) + return out + + +if __name__ == "__main__": + syms = [a.upper() for a in sys.argv[1:]] + probe(syms, "batch") diff --git a/fundlab/probe_AIO.json b/fundlab/probe_AIO.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/fundlab/probe_AIO.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/fundlab/probe_IGD.json b/fundlab/probe_IGD.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/fundlab/probe_IGD.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/fundlab/probe_batch.json b/fundlab/probe_batch.json new file mode 100644 index 0000000..95bfd23 --- /dev/null +++ b/fundlab/probe_batch.json @@ -0,0 +1,36 @@ +{ + "AIO": "2026-04-09 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 23.52 $ 20.61 $ 19.92 $ 24.18 $ 29.20 $ 19.89 Income (loss) from investment operations: Net investment income (loss) (2) 0.06 0.01 (0.03 ) (0.01 ) (0.18 ) (0.08 ) Net realized and unrealized gain (loss) 4.27 4.70 2.52 (2.'\n2025-10-06 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 23.52 $ 20.61 $ 19.92 $ 24.18 $ 29.20 $ 19.89 $ 20.00 Income (loss) from investment operations: Net investment income (loss) (3) 0.03 0.01 (0.03) (0.01) (0.18) (0.08) (0.01) Net realized and unrealized gain (loss) 1.29 4.'", + "ASA": "2026-07-28 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net asset value, beginning of period $ 58.54 $ 23.36 $ 17.36 $ 16.88 $ 24.98 $ 24.05 Net investment income/(loss) 0.03 (0.47 ) (0.22 ) (0.06 ) (0.07 ) (0.09 ) Net realized gain (loss) from investments 6.50 7.63 3.40 0.46 1.40 1.37 Net realized gain (loss) from'\n2026-02-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $ 23.36 $ 17.36 $ 16.88 $ 24.98 $ 24.05 Net investment loss (0.47 ) (0.22 ) (0.06 ) (0.07 ) (0.09 ) Net realized gain (loss) from investments 7.63 3.40 0.46 1.40 1.37 Net realized gain (loss) from foreign currency transaction'", + "ASCIX": "2026-04-08 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period $21.08 $20.86 $20.62 $21.13 Income from investment operations: Net investment income (loss) 1.79 1.86 1.75 0.98 Net realized and unrealized gain (loss) on investments (c) (0.17 ) 0.23 0.20 (0.46 ) Total from investm'\n2025-10-06 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period $21.08 $20.86 $20.62 $21.13 Income from investment operations: Net investment income (loss) 0.89 1.86 1.75 0.98 Net realized and unrealized gain (loss) on investments (c) 0.01 0.23 0.20 (0.46 ) Total from investment'", + "BXSY": "2026-08-27 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $23.66 $19.60 $18.88 $16.56 $20.25 $16.16 Income from investment operations: Net investment income (loss) (0.03 ) (0.15 ) 0.01 0.07 0.21 0.14 Net realized and unrealized gain (loss) on investments 4.64 5.22 1.84 3.28 (2.87 '\n2026-03-05 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $19.60 $18.88 $16.56 $20.25 $16.16 Income from investment operations: Net investment income (loss) (0.15 ) 0.01 0.07 0.21 0.14 Net realized and unrealized gain (loss) on investments 5.22 1.84 3.28 (2.87 ) 5.31 Total income '", + "CET": "2026-08-07 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 60.50 $ 54.26 $ 46.49 $ 40.48 $ 48.87 $ 39.49 Net investment income (a) .83 .84 .54 .51 .54 .83 Net realized and unrealized gain (loss) on securities (a) 1.09 8.31 9.61 7.50 (6.35 ) 12.64 Total from investment operations '\n2026-02-24 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $ 54.26 $ 46.49 $ 40.48 $ 48.87 $ 39.49 Net investment income (a) .84 .54 .51 .54 .83 Net realized and unrealized gain (loss) on securities (a) 8.31 9.61 7.50 (6.35 ) 12.64 Total from investment operations 9.15 10.15 8.01 (5.'", + "CLM": "2026-08-27 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 6.73 $ 7.03 $ 6.77 $ 6.48 $ 10.23 $ 9.93 Net investment income (loss) # (0.00 ) + 0.02 0.02 0.03 0.02 0.01 Net realized and unrealized gain/(loss) on investments 0.44 1.07 1.54 1.74 (2.20 ) 1.86 Net increase/(decrease) in'\n2026-03-04 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $ 7.03 $ 6.77 $ 6.48 $ 10.23 $ 9.93 Net investment income # 0.02 0.02 0.03 0.02 0.01 Net realized and unrealized gain/(loss) on investments 1.07 1.54 1.74 (2.20 ) 1.86 Net increase/(decrease) in net assets resulting from oper'", + "CRF": "2026-08-27 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 6.52 $ 6.69 $ 6.49 $ 6.24 $ 9.88 $ 9.56 Net investment income (loss) # (0.01 ) 0.02 0.03 0.03 0.02 0.01 Net realized and unrealized gain/(loss) on investments 0.45 1.00 1.42 1.64 (2.00 ) 1.82 Net increase/(decrease) in ne'\n2026-03-04 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $ 6.69 $ 6.49 $ 6.24 $ 9.88 $ 9.56 Net investment income # 0.02 0.03 0.03 0.02 0.01 Net realized and unrealized gain/(loss) on investments 1.00 1.42 1.64 (2.00 ) 1.82 Net increase/(decrease) in net assets resulting from opera'", + "DXYZ": "2026-03-10 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net Asset Value, Beginning of Period $ 6.44 $ 4.84 $ 5.22 $ ( 1.60 ) Income from Investment Operations Net investment income/(loss) (3) (0.50) (0.34) (0.26) (0.27) Net realized and unrealized gain/(loss) on investments (3) 4.04 1.94 (0.44) (0.28) Change in unr'\n2025-09-03 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net Asset Value, Beginning of Period $ 6.44 $ 4.84 $ 5.22 $ ( 1.60 ) Income from Investment Operations Net investment income/(loss) (3) (0.23 ) (0.34 ) (0.26 ) (0.27 ) Net realized gain/(loss) on investments (0.40 ) 0.00 Change in unrealized fair value on inve'", + "ECAT": "2026-03-05 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $ 16.43 $ 17.25 $ 16.84 $ 20.90 $ 21.05 Net investment income (b) 0.36 0.48 0.55 0.50 0.53 Net realized and unrealized gain (loss) 1.76 1.35 1.37 (3.31 ) 0.57 Net increase (decrease) from investment operations 2.12 1.83 1.92 '\n2025-09-04 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net asset value, beginning of period $ 16.43 $ 17.25 $ 16.84 $ 20.90 $ 21.05 $ 20.00 Net investment income (c) 0.21 0.48 0.55 0.50 0.53 0.04 Net realized and unrealized gain (loss) 0.74 1.35 1.37 (3.31 ) 0.57 1.11 Net increase (decrease) from investment operat'", + "EDF": "2026-08-05 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 8.29 $ 8.51 $ 8.45 $ 8.94 $ 11.67 $ 12.55 Income (loss) from investment operations: Net investment income (loss) (1) 0.22 0.47 0.44 0.40 0.46 0.52 Net realized and unrealized gain (loss) 0.02 0.27 0.58 0.07 (2.23 ) (0.32 '\n2026-02-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 8.51 $ 8.45 $ 8.94 $ 11.67 $ 12.55 Income (loss) from investment operations: Net investment income (loss) (1) 0.47 0.44 0.40 0.46 0.52 Net realized and unrealized gain (loss) 0.27 0.58 0.07 (2.23 ) (0.32 ) Total from inve'", + "ETG": "2026-06-26 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net asset value Beginning of period $ 23.23 $ 20.52 $ 16.80 $ 16.01 $ 22.61 $ 16.16 Income (Loss) From Operations Net investment income (1) $ 0.39 $ 0.68 $ 0.49 $ 0.83 $ 0.51 $ 0.82 Net realized and unrealized gain (loss) 1.79 3.58 4.64 1.16 (5.55) 6.94 Total '\n2025-12-30 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net asset value Beginning of year $ 20.52 $ 16.80 $ 16.01 $ 22.61 $ 16.16 Income (Loss) From Operations Net investment income (1) $ 0.68 $ 0.49 $ 0.83 $ 0.51 $ 0.82 Net realized and unrealized gain (loss) 3.58 4.64 1.16 (5.55) 6.94 Total income (loss) from ope'", + "FUND": "2026-03-09 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'NET ASSET VALUE, BEGINNING OF YEAR $ 8.36 $ 8.91 $ 8.49 $ 9.07 $ 8.08 INCOME/(LOSS) FROM INVESTMENT OPERATIONS: Net investment income/(loss) (a) 0.18 0.17 0.18 0.13 0.16 Net realized and unrealized gain/(loss) on investments and foreign currency 1.65 (0.11 ) 0'\n2025-09-05 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'NET ASSET VALUE, BEGINNING OF PERIOD $ 8.36 $ 8.91 $ 8.49 $ 9.07 $ 8.08 $ 8.30 INCOME/(LOSS) FROM INVESTMENT OPERATIONS: Net investment income/(loss) (a) 0.11 0.17 0.18 0.13 0.16 0.15 Net realized and unrealized gain/(loss) on investments and foreign currency '", + "IAE": "2026-05-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as'\n2025-11-10 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as'", + "IDE": "2026-05-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as'\n2025-11-10 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as'", + "IGA": "2026-05-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as'\n2025-11-10 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as'", + "IGD": "2026-05-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as'\n2025-11-10 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as'", + "IGR": "2026-08-21 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $4.50 $5.10 $6.20 $6.31 $10.48 $8.11 Income from investment operations Net investment income (1) 0.04 0.09 0.08 0.10 0.20 0.22 Net realized and unrealized gain (loss) on investments, written options and foreign currency tra'\n2026-03-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $5.10 $6.20 $6.31 $10.48 $8.11 Income from investment operations Net investment income (1) 0.09 0.08 0.10 0.20 0.22 Net realized and unrealized gain (loss) on investments, written options and foreign currency transactions 0.0'", + "IHD": "2026-05-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as'\n2025-11-10 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as'", + "JCE": "2026-03-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net Asset Value, Beginning of Period Net Investment Income (NII) (Loss) (a) Net Realized/ Unrealized Gain (Loss) Total From NII From Net Realized Gains Return of Capital Total Shelf Offering Costs Premium per Share Sold through Shelf Offering Net Asset Value, '\n2025-09-05 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net Asset Value, Beginning of Period Net Investment Income (NII) (Loss) (a) Net Realized/ Unrealized Gain (Loss) Total From NII From Net Realized Gains Return of Capital Total Shelf Offering Costs Premium per Share Sold through Shelf Offering Net Asset Value, '", + "KYN": "2026-07-21 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 13.79 $ 15.03 $ 10.51 $ 10.64 Net investment income (loss) (2) 0.06 0.10 0.08 0.12 Net realized and unrealized gain (loss) 2.36 (0.38 ) 5.42 0.59 Total income (loss) from operations 2.42 (0.28 ) 5.50 0.71 Common dividends'\n2026-01-23 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $ 15.03 $ 10.51 $ 10.64 Net investment income (loss) (2) 0.10 0.08 0.12 Net realized and unrealized gain (loss) (0.38 ) 5.42 0.59 Total income (loss) from operations (0.28 ) 5.50 0.71 Common dividends (3) (0.74) (0.98 ) (0.'", + "LTCFX": "2026-03-10 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net Asset Value, Beginning of Period $ 14.57 $ 15.09 $ 19.40 $ 20.40 $ 25.80 $ 19.12 Increase (decrease) From Operations: Net investment income (a) 1.83 2.78 1.77 2.04 0.92 0.44 Net gain (loss) from investments (both realized and unrealized) (0.94 ) (0.47 ) (3'\n2025-09-08 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net Asset Value, Beginning of Year $ 15.09 $ 19.40 $ 20.40 $ 25.80 $ 19.12 Increase (decrease) From Operations: Net investment income (a) 2.78 1.77 2.04 0.92 0.44 Net gain (loss) from investments (both realized and unrealized) (0.47 ) (3.15 ) (0.84 ) (4.64 ) 7'", + "MCI": "2026-03-09 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value Beginning of year 16.84 $ 16.77 $ 16.37 $ 16.68 $ 15.04 Net investment income (a) 1.33 1.71 1.61 1.03 0.93 Net realized and unrealized gain (loss) on investments 0.04 0.04 0.21 (0.32) 1.67 Total from investment operations 1.37 1.75 1.82 0.71 2.'\n2025-09-08 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value Beginning of period year $ 16.84 $ 16.77 $ 16.37 $ 16.68 $ 15.04 $ 15.24 Net investment income (a) 0.69 1.71 1.61 1.03 0.93 1.20 Net realized and unrealized gain (loss) on investments (0.04) 0.04 0.21 (0.32) 1.67 (0.44) Total from investment op'", + "MPV": "2026-03-09 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value Beginning of year $ 15.46 $ 15.41 $ 14.99 $ 15.19 $ 13.60 Net investment income (a) 1.20 1.55 1.50 0.97 0.86 Net realized and unrealized gain (loss) on investments 0.03 0.07 0.21 (0.31) 1.53 Total from investment operations 1.23 1.62 1.71 0.66 '\n2025-09-08 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value Beginning of period year $ 15.46 $ 15.41 $ 14.99 $ 15.19 $ 13.60 $ 13.80 Net investment income (a) 0.63 1.55 1.50 0.97 0.86 1.00 Net realized and unrealized gain (loss) on investments (0.05) 0.07 0.21 (0.31) 1.53 (0.40) Total from investment op'", + "MXF": "2026-06-24 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $ 22.02 $ 17.61 $ 18.97 $ 17.62 $ 17.40 $ 12.66 Net investment income (a) 0.27 0.68 0.42 0.52 0.52 0.21 Net gain (loss) on investments and translation of foreign currency (a) 3.06 4.58 (0.90 ) 1.56 0.42 4.89 Total from invest'\n2025-12-29 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $ 17.61 $ 18.97 $ 17.62 $ 17.40 $ 12.66 Net investment income (a) 0.68 0.42 0.52 0.52 0.21 Net gain (loss) on investments and translation of foreign currency (a) 4.58 (0.90 ) 1.56 0.42 4.89 Total from investment operations 5.'", + "NICHX": "2026-07-09 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net asset value, beginning of year $ 26.74 $ 28.46 $ 28.93 $ 28.38 $ 26.96 Income from Investment Operations: Net investment income 1 2.44 2.35 2.64 2.22 1.89 Net realized and unrealized gain (loss) (0.63 ) (1.38 ) 0.03 0.06 1.21 Total from investment operatio'\n2026-01-09 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net asset value, beginning of year/period $ 26.74 $ 28.46 $ 28.93 $ 28.38 $ 26.96 $ 26.32 Income from Investment Operations: Net investment income 1 1.31 2.35 2.64 2.22 1.89 1.66 Net realized and unrealized gain (loss) (0.16 ) (1.38 ) 0.03 0.06 1.21 0.59 Total'", + "NML": "2026-07-30 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net Asset Value, Beginning of Period $ 9.72 $ 10.33 $ 8.02 $ 8.73 $ 6.32 $ 4.27 Income/(Loss) From Investment Operations Applicable to Common Stockholders: Net Investment Income/(Loss) (0.19 ) 0.02 0.02 (0.07 ) (0.02 ) (0.05 ) Net Gains/(Losses) on Securities '\n2026-02-03 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net Asset Value, Beginning of Year $ 10.33 $ 8.02 $ 8.73 $ 6.32 $ 4.27 Income/(Loss) From Investment Operations Applicable to Common Stockholders: Net Investment Income/(Loss) 0.02 0.02 (0.07 ) (0.02 ) (0.05 ) Net Gains/(Losses) on Securities (both realized an'", + "NXG": "2026-08-06 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net Asset Value, beginning of period $ 50.52 $ 51.30 $ 39.85 $ 54.75 $ 53.25 $ 45.87 Income from Investment Operations: Net investment income (loss) (0.30 ) (0.43 ) (0.63 ) 0.21 (0.06 ) 0.70 Net realized and unrealized gain (loss) on investments 16.06 6.13 18.'\n2026-02-09 [N-CSR] NO ANCHOR (len=1749866)", + "PDX": "2026-03-05 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net Asset Value Beginning of Year or Period (a) Net Investment Income (Loss) (b) Net Realized/ Unrealized Gain (Loss) Total From Net Investment Income From Net Realized Capital Gains Tax Basis Return of Capital Total PCM Fund, Inc. 07/01/2025 - 12/31/2025+ $ 5'\n2025-09-05 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net Asset Value Beginning of Year or Period (a) Net Investment Income (Loss) (b) Net Realized/ Unrealized Gain (Loss) Total From Net Investment Income From Net Realized Capital Gains Tax Basis Return of Capital Total PCM Fund, Inc. 06/30/2025 $ 6.26 $ 0.70 $ ('", + "RMT": "2026-08-26 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net Asset Value, Beginning of Period $ 15.24 $ 12.55 $ 11.72 $ 10.25 $ 14.26 $ 14.95 INVESTMENT OPERATIONS: Net investment income (loss) 0.04 0.05 0.03 (0.05 ) 1 , 2 0.09 (0.01 ) Net realized and unrealized gain (loss) on investments and foreign currency 1.90 '\n2026-02-27 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net Asset Value, Beginning of Period $ 12.55 $ 11.72 $ 10.25 $ 14.26 $ 14.95 INVESTMENT OPERATIONS: Net investment income (loss) 0.05 0.03 (0.05 ) 1 , 2 0.09 (0.01 ) Net realized and unrealized gain (loss) on investments and foreign currency 2.85 1.32 1.69 (3.'", + "SCD": "2026-07-30 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of period $16.51 $18.64 $14.90 $14.74 $15.93 Income (loss) from operations: Net investment income 0.06 0.20 0.19 0.03 0.37 Net realized and unrealized gain (loss) 1.42 (0.41 ) 4.91 1.45 (0.55 ) Total income (loss) from operations 1.4'\n2026-01-28 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year $18.64 $14.90 $14.74 $15.93 $13.12 Income (loss) from operations: Net investment income 0.20 0.19 0.03 0.37 0.50 Net realized and unrealized gain (loss) (0.41 ) 4.91 1.45 (0.55 ) 3.33 Total income (loss) from operations (0.21'", + "SRV": "2026-08-06 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net Asset Value, beginning of period $ 43.26 $ 48.54 $ 38.81 $ 42.67 $ 37.04 $ 27.32 Income from Investment Operations: Net investment income (loss) 0.04 (0.13 ) (0.44 ) (0.10 ) (0.13 ) (0.03 ) Net realized and unrealized gain on investments 9.19 0.24 15.57 1.'\n2026-02-09 [N-CSR] NO ANCHOR (len=1856170)", + "STEW": "2026-08-07 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value Beginning of Period INCOME FROM INVESTMENT OPERATIONS: Net investment income (a) Net realized and unrealized gain/(loss) on investments Net Increase/(Decrease) from Operations Applicable to Common Stockholders DISTRIBUTIONS TO COMMON STOCKHOLDE'\n2026-02-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value Beginning of Period INCOME FROM INVESTMENT OPERATIONS: Net investment income (a) Net realized and unrealized gain on investments Net Increase from Operations Applicable to Common Stockholders DISTRIBUTIONS TO COMMON STOCKHOLDERS Distributable e'", + "TYG": "2026-08-07 [N-CSRS] NO ANCHOR (len=2420367)\n2026-02-06 [N-CSR] NO ANCHOR (len=2609335)", + "VCRDX": "2026-06-04 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net asset value, beginning of period $ 10.10 $ 10.00 Income from Investment Operations: Net investment income (loss) 1 0.98 0.93 Net realized and unrealized gain (loss) (0.03 ) 0.02 Total from investment operations 0.95 0.95 Less Distributions from: Net invest'\n2025-12-03 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=False :: 'Net asset value, beginning of period $ 10.10 $ 10.00 Income from Investment Operations: Net investment income (loss) 1 0.43 0.93 Net realized and unrealized gain 0.08 0.02 Total from investment operations 0.51 0.95 Less Distributions from: Net investment incom'" +} \ No newline at end of file diff --git a/fundlab/probe_batch2.json b/fundlab/probe_batch2.json new file mode 100644 index 0000000..40ee2bf --- /dev/null +++ b/fundlab/probe_batch2.json @@ -0,0 +1 @@ +{"ASA": "hts May 31, 2026 (Unaudited) Per share operating performance (1) For the six months ended May 31, 2026 (Unaudited) For the year ended November 30, 2025 For the year ended November 30, 2024 For the year ended November 30, 2023 For the year ended November 30, 2022 For the year ended November 30, 2021 Net asset value, beginning of period $ 58.54 $ 23.36 $ 17.36 $ 16.88 $ 24.98 $ 24.05 Net investment income/(loss) 0.03 (0.47 ) (0.22 ) (0.06 ) (0.07 ) (0.09 ) Net realized gain (loss) from investments 6.50 7.63 3.40 0.46 1.40 1.37 Net realized gain (loss) from foreign currency transactions (0.04 ) (0.05 ) 0.00 (2) 0.01 (0.01 ) (0.01 ) Net increase (decrease) in unrealized appreciation on investments 8.65 28.06 2.82 0.09 (9.40 ) (0.32 ) Net unrealized gain on translation of assets and liabilities in foreign currency 0.00 (2) 0.02 0.00 (2) 0.00 (2) 0.00 (2) 0.00 (2) Net increase (decrease) in net assets resulting from operations 15.14 35.19 6.00 0.50 (8.08 ) 0.95 Dividends From net investment ", "BXSY": "invested in accordance with the investment objectives and policies of the Fund. BEXIL INVESTMENT TRUST Semi-Annual Report 2026 13 FINANCIAL HIGHLIGHTS (Unaudited) Financial Statements Six Months Ended June 30, 2026 Year Ended December 31, 2025 2024 2023 2022 2021 Per Share Operating Performance (1) Net asset value, beginning of period $23.66 $19.60 $18.88 $16.56 $20.25 $16.16 Income from investment operations: Net investment income (loss) (0.03 ) (0.15 ) 0.01 0.07 0.21 0.14 Net realized and unrealized gain (loss) on investments 4.64 5.22 1.84 3.28 (2.87 ) 5.31 Total income (loss) from investment operations 4.61 5.07 1.85 3.35 (2.66 ) 5.45 Less distributions: Net investment income - - (0.16 ) (0.06 ) (0.20 ) (0.29 ) Capital gains (0.52 ) (1.00 ) (0.91 ) (0.94 ) (0.75 ) (0.98 ) Return of capital - - - - (0.05 ) (0.05 ) Total distributions (0.52 ) (1.00 ) (1.07 ) (1.00 ) (1.00 ) (1.32 ) Fund share transactions Effect of reinvestment of distributions - (0.01 ) (0.06 ) (0.03 ) (0.03 ) (0.04", "CLM": "or each period indicated. This information has been derived from information provided in the financial statements and market price data for the Fund's shares. For the Six Months Ended June 30, 2026 For the Years Ended December 31, (Unaudited) 2025 2024 2023 2022 2021 PER SHARE OPERATING PERFORMANCE Net asset value, beginning of period $ 6.73 $ 7.03 $ 6.77 $ 6.48 $ 10.23 $ 9.93 Net investment income (loss) # (0.00 ) + 0.02 0.02 0.03 0.02 0.01 Net realized and unrealized gain/(loss) on investments 0.44 1.07 1.54 1.74 (2.20 ) 1.86 Net increase/(decrease) in net assets resulting from operations 0.44 1.09 1.56 1.77 (2.18 ) 1.87 Dividends and distributions to stockholders: Net investment income (0.02 ) (0.02 ) (0.03 ) (0.03 ) (0.01 ) Net realized capital gains (0.44 ) (0.63 ) (0.48 ) (0.53 ) (0.22 ) (0.92 ) Return-of-capital (0.29 ) (0.82 ) (0.80 ) (0.92 ) (1.91 ) (0.99 ) Total dividends and distributions to stockholders (0.73 ) (1.47 ) (1.30 ) (1.48 ) (2.16 ) (1.92 ) Common stock transactio", "CRF": " for each year indicated. This information has been derived from information provided in the financial statements and market price data for the Fund's shares. For the Six Months Ended June 30, 2026 For the Years Ended December 31, (Unaudited) 2025 2024 2023 2022 2021 PER SHARE OPERATING PERFORMANCE Net asset value, beginning of period $ 6.52 $ 6.69 $ 6.49 $ 6.24 $ 9.88 $ 9.56 Net investment income (loss) # (0.01 ) 0.02 0.03 0.03 0.02 0.01 Net realized and unrealized gain/(loss) on investments 0.45 1.00 1.42 1.64 (2.00 ) 1.82 Net increase/(decrease) in net assets resulting from operations 0.44 1.02 1.45 1.67 (1.98 ) 1.83 Dividends and distributions to stockholders: Net investment income (0.02 ) (0.03 ) (0.03 ) (0.03 ) (0.01 ) Net realized capital gains (0.44 ) (0.59 ) (0.51 ) (0.51 ) (0.22 ) (1.12 ) Return-of-capital (0.27 ) (0.79 ) (0.71 ) (0.88 ) (1.83 ) (0.71 ) Total dividends and distributions to stockholders (0.71 ) (1.40 ) (1.25 ) (1.42 ) (2.08 ) (1.84 ) Common stock transactions:", "CET": "t price or net asset value, as applicable, on the payable date of the distribution. Distributions that may be taken in shares are assumed to be reinvested at the price designated by the Corporation. Six months ended June 30, 2026 (Unaudited) 2025 2024 2023 2022 2021 Per Share Operating Performance: Net asset value, beginning of period $ 60.50 $ 54.26 $ 46.49 $ 40.48 $ 48.87 $ 39.49 Net investment income (a) .83 .84 .54 .51 .54 .83 Net realized and unrealized gain (loss) on securities (a) 1.09 8.31 9.61 7.50 (6.35 ) 12.64 Total from investment operations 1.92 9.15 10.15 8.01 (5.81 ) 13.47 Less: Dividends from net investment income .06 .85 .61 .50 .55 .86 Distributions from capital gains .25 1.85 1.64 1.35 1.90 2.89 Total distributions .31 2.70 2.25 1.85 2.45 3.75 Net change from capital share transactions .00 (.21 ) (.13 ) (.15 ) (.13 ) (.34 ) Net asset value, end of period $ 62.11 $ 60.50 $ 54.26 $ 46.49 $ 40.48 $ 48.87 Per share market value, end of period $ 52.45 $ 50.71 $ 45.69 $ 37", "DXYZ": "pital $ 253,135 Total Non-cash Activities $ 253,135 See accompanying Notes to Financial Statements. 11 Destiny Tech100 Inc. Financial Highlights For the Year Ended December 31, 2025 For the Year Ended December 31, 2024 For the Year Ended December 31, 2023 For the Year Ended December 31, 2022 (1)(2) Net Asset Value, Beginning of Period $ 6.44 $ 4.84 $ 5.22 $ ( 1.60 ) Income from Investment Operations Net investment income/(loss) (3) (0.50) (0.34) (0.26) (0.27) Net realized and unrealized gain/(loss) on investments (3) 4.04 1.94 (0.44) (0.28) Change in unrealized fair value of warrants (see Note 4) 0.32 0.13 Change in unrealized fair value on SAFE note liabilities 0.06 Total increase/(decrease) in net assets resulting from operations 3.54 1.60 (0.38) (0.36) Capital Share Transactions Impact of at-the-market offering 9.95 Effect of shares issued from SAFE note conversion to Common Shares 7.18 Increase/(Decrease) in Net Asset Value 13.49 1.60 (0.38) 6.82 Net Asset Value, End of Period $ 19", "ECAT": "3,342,529 $ 47,207,012 $ 25,665,529 See notes to consolidated financial statements. Consolidated Financial Statements 79 Financial Highlights (For a share outstanding throughout each period) BCAT (a) Year Ended 12/31/25 Year Ended 12/31/24 Year Ended 12/31/23 Year Ended 12/31/22 Year Ended 12/31/21 Net asset value, beginning of year $ 16.43 $ 17.25 $ 16.84 $ 20.90 $ 21.05 Net investment income (b) 0.36 0.48 0.55 0.50 0.53 Net realized and unrealized gain (loss) 1.76 1.35 1.37 (3.31 ) 0.57 Net increase (decrease) from investment operations 2.12 1.83 1.92 (2.81 ) 1.10 Distributions (c) From net investment income (0.35 ) (0.54 ) (0.58 ) (0.99 ) (0.75 ) From net realized gain (0.03 ) Return of capital (2.97 ) (2.11 ) (0.93 ) (0.26 ) (0.47 ) Total distributions (3.32 ) (2.65 ) (1.51 ) (1.25 ) (1.25 ) Net asset value, end of year $ 15.23 $ 16.43 $ 17.25 $ 16.84 $ 20.90 Market price, end of year $ 14.16 $ 15.15 $ 14.95 $ 13.87 $ 19.45 Total Return (d) Based on net asset value 15.55 % 11.92 % ", "IGA": "ing Notes to Financial Statements 8 FINANCIAL HIGHLIGHTS Selected data for a share of beneficial interest outstanding throughout each year or period. Per Share Operating Performance Ratios and Supplemental Data Income (loss) from investment operations Less Distributions Ratios to average net assets Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net asset value due to tender offer Net asset value, end of year or period Market value, end of year or period Total investment return at net asset value (1) Total investment return at market value (2) Net assets, end of year or period 000's Gross expenses prior to expense waiver/ recoupment (3) Net expenses after expense waiver/ recoupment (3),(4) Net investment income (loss) (3),(4) Portfolio turnover rate Year or period ended ($) ($) ($) (", "LTCFX": " Strategies Income Fund - Class A FINANCIAL HIGHLIGHTS The table below sets forth financial data for one share of beneficial interest outstanding throughout each period presented. For the Six Months Ended For the Year Ended June 30, December 31, 2025 2025 2024(g) 2023(g) 2022(g) 2021(g) (Unaudited) Net Asset Value, Beginning of Period $ 14.57 $ 15.09 $ 19.40 $ 20.40 $ 25.80 $ 19.12 Increase (decrease) From Operations: Net investment income (a) 1.83 2.78 1.77 2.04 0.92 0.44 Net gain (loss) from investments (both realized and unrealized) (0.94 ) (0.47 ) (3.15 ) (0.84 ) (4.64 ) 7.76 Total from operations 0.89 2.31 (1.38 ) 1.20 (3.72 ) 8.20 Less Distributions: From net investment income (1.84 ) (2.83 ) (2.77 ) (2.04 ) (1.00 ) (0.08 ) From return of capital (0.16 ) (0.16 ) (0.68 ) (1.44 ) Total Distributions (1.84 ) (2.83 ) (2.93 ) (2.20 ) (1.68 ) (1.52 ) Net Asset Value, End of Period $ 13.62 (e) $ 14.57 (e) $ 15.09 (e) $ 19.40 (e) $ 20.40 (e) $ 25.80 (e) Total Return (b) 5.86 % (e),(h) 17", "MXF": "g of year 317,520,151 260,181,639 End of period $ 355,465,103 $ 317,520,151 28 | The Mexico Fund, Inc. See Notes to Financial Statements. FINANCIAL HIGHLIGHTS For the Six Months Ended April 30, 2026 (Unaudited) For the Year Ended October 31, 2025 2024 2023 2022 2021 Per Share Operating Performance: Net asset value, beginning of year $ 22.02 $ 17.61 $ 18.97 $ 17.62 $ 17.40 $ 12.66 Net investment income (a) 0.27 0.68 0.42 0.52 0.52 0.21 Net gain (loss) on investments and translation of foreign currency (a) 3.06 4.58 (0.90 ) 1.56 0.42 4.89 Total from investment operations 3.33 5.26 (0.48 ) 2.08 0.94 5.10 Less Dividends and Distributions: Dividends to stockholders from net investment income (0.29 ) (0.73 ) (0.39 ) (0.57 ) (0.57 ) (0.23 ) Distributions to stockholders from net realized gain on investments (0.37 ) (0.20 ) (0.41 ) (0.21 ) (0.10 ) (0.03 ) Tax return of capital (0.04 ) (0.01 ) (0.08 ) (0.02 ) (0.05 ) (0.10 ) Total dividends and distributions (0.70 ) (0.94 ) (0.88 ) (0.80 ) (0.7", "MCI": "g 12 31 25 - 20,525,807 12 31 24 - 20,404,204) See Notes to Consolidated Financial Statements 11 CONSOLIDATED FINANCIAL HIGHLIGHTS Barings Corporate Investors 2025 Annual Report Selected data for each share of beneficial interest outstanding For the years ended December 31, 2025 2024 2023 2022 2021 Net asset value Beginning of year 16.84 $ 16.77 $ 16.37 $ 16.68 $ 15.04 Net investment income (a) 1.33 1.71 1.61 1.03 0.93 Net realized and unrealized gain (loss) on investments 0.04 0.04 0.21 (0.32) 1.67 Total from investment operations 1.37 1.75 1.82 0.71 2.60 Dividends from net investment income to common shareholders (1.60) (1.69) (1.42) (0.88) (0.96) Dividends from realized gain on investments to common shareholders (0.14) Increase from dividends reinvested 0.02 0.01 Total dividends (1.58) (1.68) (1.42) (1.02) (0.96) Net asset value End of year $ 16.63 $ 16.84 $ 16.77 $ 16.37 $ 16.68 Per share market value End of year $ 18.15 $ 20.38 $ 18.43 $ 13.96 $ 15.98 Total investment return Net a", "MPV": " 31 25 - 10,755,832 12 31 24 - 10,680,267) See Notes to Consolidated Financial Statements 11 CONSOLIDATED FINANCIAL HIGHLIGHTS Barings Participation Investors 2025 Annual Report Selected data for each share of beneficial interest outstanding For the years ended December 31, 2025 2024 2023 2022 2021 Net asset value Beginning of year $ 15.46 $ 15.41 $ 14.99 $ 15.19 $ 13.60 Net investment income (a) 1.20 1.55 1.50 0.97 0.86 Net realized and unrealized gain (loss) on investments 0.03 0.07 0.21 (0.31) 1.53 Total from investment operations 1.23 1.62 1.71 0.66 2.39 Dividends from net investment income to common shareholders (1.48) (1.57) (1.29) (0.83) (0.80) Dividends from realized gain on investments to common shareholders (0.03) Increase from dividends reinvested 0.02 0.0 (b) 0.00 Total dividends (1.46) (1.57) (1.29) (0.86) (0.80) Net asset value End of year $ 15.23 $ 15.46 $ 15.41 $ 15.05 $ 15.19 Per share market value End of year $ 15.89 $ 17.09 $ 15.60 $ 12.32 $ 14.80 Total investment re", "NICHX": "d Financial Highlights Institutional Class Per share operating performance. For a capital share outstanding throughout each year. For the Year Ended April 30, 2026 For the Year Ended April 30, 2025 For the Year Ended April 30, 2024 For the Year Ended April 30, 2023 For the Year Ended April 30, 2022 Net asset value, beginning of year $ 26.74 $ 28.46 $ 28.93 $ 28.38 $ 26.96 Income from Investment Operations: Net investment income 1 2.44 2.35 2.64 2.22 1.89 Net realized and unrealized gain (loss) (0.63 ) (1.38 ) 0.03 0.06 1.21 Total from investment operations 1.81 0.97 2.67 2.28 3.10 Less Distributions: From net investment income (2.51 ) (2.53 ) (3.14 ) (1.53 ) (1.43 ) From return of capital (0.11 ) (0.16 ) (0.20 ) (0.25 ) Total distributions (2.62 ) (2.69 ) (3.14 ) (1.73 ) (1.68 ) Net asset value, end of year $ 25.93 $ 26.74 $ 28.46 $ 28.93 $ 28.38 Total return 7.01 % 3.70 % 9.62 % 8.28 % 11.79 % Ratios and Supplemental Data: Net assets, end of period (in thousands) $ 2,451,269 $ 2,733,1", "NXG": "ncome Fund Financial Highlights Period From December 1, 2025 through May 31, 2026 (Unaudited) Fiscal Year Ended November 30, 2025 Fiscal Year Ended November 30, 2024 Fiscal Year Ended November 30, 2023 Fiscal Year Ended November 30, 2022 Fiscal Year Ended November 30, 2021 Per Common Share Data (1) Net Asset Value, beginning of period $ 50.52 $ 51.30 $ 39.85 $ 54.75 $ 53.25 $ 45.87 Income from Investment Operations: Net investment income (loss) (0.30 ) (0.43 ) (0.63 ) 0.21 (0.06 ) 0.70 Net realized and unrealized gain (loss) on investments 16.06 6.13 18.56 (11.17 ) 4.12 9.24 Total increase (decrease) from investment operations 15.76 5.70 17.93 (10.96 ) 4.06 9.94 Less Distributions to Common Stockholders: Net investment income (0.50 ) (0.62 ) (2.18 ) Net realized gain Return of capital (3.24 ) (5.98 ) (5.86 ) (1.76 ) (2.56 ) (2.56 ) Total distributions to common stockholders (3.24 ) (6.48 ) (6.48 ) (3.94 ) (2.56 ) (2.56 ) Net Asset Value, end of period $ 63.04 $ 50.52 $ 51.30 $ 39.85 $ ", "RMT": "ghts This table is presented to show selected data for a share of Common Stock outstanding throughout each period, and to assist stockholders in evaluating the Fund's performance for the periods presented. SIX MONTHS YEARS ENDED ENDED 6/30/26 (UNAUDITED) 12/31/25 12/31/24 12/31/23 12/31/22 12/31/21 Net Asset Value, Beginning of Period $ 15.24 $ 12.55 $ 11.72 $ 10.25 $ 14.26 $ 14.95 INVESTMENT OPERATIONS: Net investment income (loss) 0.04 0.05 0.03 (0.05 ) 1 , 2 0.09 (0.01 ) Net realized and unrealized gain (loss) on investments and foreign currency 1.90 2.85 1.32 1.69 (3.96 ) 2.19 Net increase (decrease) in net assets from investment operations 1.94 2.90 1.35 1.64 (3.87 ) 2.18 DISTRIBUTIONS: Net investment income (0.13 ) (0.43 ) (0.10 ) (0.09 ) Net realized gain on investments and foreign currency (0.06 ) (0.04 ) (0.15 ) (0.03 ) (2.66 ) Return of capital (0.00 ) Total distributions (0.19 ) (0.47 ) (0.15 ) (0.13 ) (2.75 ) CAPITAL STOCK TRANSACTIONS: Effect of reinvestment of distributio", "SRV": "nergy Fund Financial Highlights Period From December 1, 2025 through May 31, 2026 (Unaudited) Fiscal Year Ended November 30, 2025 Fiscal Year Ended November 30, 2024 Fiscal Year Ended November 30, 2023 Fiscal Year Ended November 30, 2022 Fiscal Year Ended November 30, 2021 Per Common Share Data (1) Net Asset Value, beginning of period $ 43.26 $ 48.54 $ 38.81 $ 42.67 $ 37.04 $ 27.32 Income from Investment Operations: Net investment income (loss) 0.04 (0.13 ) (0.44 ) (0.10 ) (0.13 ) (0.03 ) Net realized and unrealized gain on investments 9.19 0.24 15.57 1.64 8.40 11.19 Total increase from investment operations 9.23 0.11 15.13 1.54 8.27 11.16 Less Distributions and Dividends to Common Stockholders: Net investment income (4.11 ) (3.72 ) (0.96 ) (0.73 ) (0.44 ) Net realized gain (0.31 ) (1.29 ) (1.68 ) Return of capital (2.70 ) (4.44 ) (1.91 ) (1.00 ) Total distributions and dividends to common stockholders (3.01 ) (5.40 ) (5.40 ) (5.40 ) (2.64 ) (1.44 ) Net Asset Value, end of period $ 49.", "KYN": "panying notes to financial statements. 17 KAYNE ANDERSON ENERGY INFRASTRUCTURE FUND, INC. FINANCIAL HIGHLIGHTS (amounts in 000 s, except share and per share amounts) For the Six Months Ended May 31, 2026 (Unaudited) For the Fiscal Year Ended November 30, 2025 2024 2023 Per Share of Common Stock (1) Net asset value, beginning of period $ 13.79 $ 15.03 $ 10.51 $ 10.64 Net investment income (loss) (2) 0.06 0.10 0.08 0.12 Net realized and unrealized gain (loss) 2.36 (0.38 ) 5.42 0.59 Total income (loss) from operations 2.42 (0.28 ) 5.50 0.71 Common dividends (3) (0.51) (0.74) (0.98 ) (0.83 ) Common distributions return of capital (3) (0.22 ) Total dividends and distributions common (0.51 ) (0.96 ) (0.98 ) (0.83 ) Offering expenses associated with the issuance of common stock (0.01 ) (4) Effect of shares issued in reinvestment of dividends and distributions Total capital stock transactions (0.01 ) Net asset value, end of period $ 15.70 $ 13.79 $ 15.03 $ 10.51 Market value per share of commo", "STEW": "common stock outstanding, total investment return, ratios to average net assets and other supplemental data for the periods indicated. This information has been determined based upon information provided in the financial statements and market price data for the Fund's shares. OPERATING PERFORMANCE: Net asset value Beginning of Period INCOME FROM INVESTMENT OPERATIONS: Net investment income (a) Net realized and unrealized gain/(loss) on investments Net Increase/(Decrease) from Operations Applicable to Common Stockholders DISTRIBUTIONS TO COMMON STOCKHOLDERS Distributable earnings Tax return of capital Total Distributions Paid to Common Stockholders CAPITAL SHARE TRANSACTIONS: Impact of Capital Share Transactions (a) Total Capital Share Transactions Net Increase/(Decrease) in Net Asset Value Common Share Net Asset Value End of Period Common Share Market Price End of Period Total Return, Common Share Net Asset Value (b) Total Return, Common Share Market Price (b) RATIOS TO AVERAGE NET ASS", "VCRDX": "le of non-cash activity: Interest and line of credit fees paid during the period $ 2,852,237 Reinvestment of distributions 7,618,412 See accompanying notes to financial statements. 14 Harrison Street INFRASTRUCTURE INCOME FUND Financial Highlights Year Ended March 31, 2026 Year Ended March 31, 2025 Net asset value, beginning of period $ 10.10 $ 10.00 Income from Investment Operations: Net investment income (loss) 1 0.98 0.93 Net realized and unrealized gain (loss) (0.03 ) 0.02 Total from investment operations 0.95 0.95 Less Distributions from: Net investment income and net realized gains (0.87 ) (0.83 ) Return of capital (0.08 ) (0.02 ) Total distributions (0.95 ) (0.85 ) Net asset value, end of period $ 10.10 $ 10.10 Total return 9.84 % 9.80 % Ratios and Supplemental Data: Net assets, end of period (in thousands) $ 352,117 $ 201,768 Ratio of expenses to average net assets: Ratios of gross expenses to average net assets 2.88 % 2.93 % Ratios of net expenses to average net assets 2.81 % "} \ No newline at end of file diff --git a/fundlab/probe_dbg.json b/fundlab/probe_dbg.json new file mode 100644 index 0000000..4d8f53e --- /dev/null +++ b/fundlab/probe_dbg.json @@ -0,0 +1,3 @@ +{ + "IGD": "2026-05-06 [N-CSR] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as'\n2025-11-10 [N-CSRS] ANCHOR 'net asset value[^.]{0,40}begin' share-in-pre=True :: 'Net asset value, beginning of year or period Net investment income (loss) Net realized and unrealized gain (loss) Total from investment operations From net investment income From net realized gains From return of capital Total distributions Accretion to net as'" +} \ No newline at end of file