From 54d26939dc1b9c7cf7ca3884c837b0756cb7ecdc Mon Sep 17 00:00:00 2001 From: Greg Pomerantz Date: Wed, 26 Aug 2026 09:59:24 -0400 Subject: [PATCH] Fund Lab: N-PORT holdings page for the 16-fund shortlist - fundlab/nport.py: parse the fund's own category/percentage lines, as-of date, net assets and dollar-valued positions from N-PORT schedules of investments (handles per-fund and combined multi-fund family filings; conservative keyword bucketing of positions) - fundlab/nport_cache/.json: parsed snapshots for 15 of 16 funds (raw SOI HTML kept locally, gitignored; source URLs + filing dates in nport_manifest.json, md5-verified against EDGAR) - atesx: no current SOI found (Anchor's recent filings cover the Income fund) - listed with an honest note - app.py: new 'Fund Lab' tab - pick a fund, see objective, reported composition (bar + table), rough keyword buckets, top positions, and the prospectus strategy excerpt - tests: parser unit tests (section finding, category regex, buckets) --- .gitignore | 1 + app.py | 88 +++++- fundlab/nport.py | 341 +++++++++++++++++++++++ fundlab/nport_cache/atrfx.json | 297 ++++++++++++++++++++ fundlab/nport_cache/cosix.json | 492 +++++++++++++++++++++++++++++++++ fundlab/nport_cache/cvsix.json | 142 ++++++++++ fundlab/nport_cache/eagmx.json | 482 ++++++++++++++++++++++++++++++++ fundlab/nport_cache/egrsx.json | 482 ++++++++++++++++++++++++++++++++ fundlab/nport_cache/jlpsx.json | 268 ++++++++++++++++++ fundlab/nport_cache/lamhx.json | 98 +++++++ fundlab/nport_cache/lcorx.json | 35 +++ fundlab/nport_cache/lcrix.json | 35 +++ fundlab/nport_cache/mbxix.json | 259 +++++++++++++++++ fundlab/nport_cache/pmaix.json | 482 ++++++++++++++++++++++++++++++++ fundlab/nport_cache/pmfkx.json | 482 ++++++++++++++++++++++++++++++++ fundlab/nport_cache/pmorx.json | 186 +++++++++++++ fundlab/nport_cache/qspnx.json | 453 ++++++++++++++++++++++++++++++ fundlab/nport_cache/svarx.json | 148 ++++++++++ fundlab/nport_manifest.json | 67 +++++ tests/test_fundlab.py | 57 ++++ 20 files changed, 4893 insertions(+), 2 deletions(-) create mode 100644 fundlab/nport.py create mode 100644 fundlab/nport_cache/atrfx.json create mode 100644 fundlab/nport_cache/cosix.json create mode 100644 fundlab/nport_cache/cvsix.json create mode 100644 fundlab/nport_cache/eagmx.json create mode 100644 fundlab/nport_cache/egrsx.json create mode 100644 fundlab/nport_cache/jlpsx.json create mode 100644 fundlab/nport_cache/lamhx.json create mode 100644 fundlab/nport_cache/lcorx.json create mode 100644 fundlab/nport_cache/lcrix.json create mode 100644 fundlab/nport_cache/mbxix.json create mode 100644 fundlab/nport_cache/pmaix.json create mode 100644 fundlab/nport_cache/pmfkx.json create mode 100644 fundlab/nport_cache/pmorx.json create mode 100644 fundlab/nport_cache/qspnx.json create mode 100644 fundlab/nport_cache/svarx.json create mode 100644 fundlab/nport_manifest.json diff --git a/.gitignore b/.gitignore index 75a6dde..d443ec3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ __pycache__/ .cache/ settings.json funds.json +fundlab/nport_cache/*.html diff --git a/app.py b/app.py index cda97c1..ed204af 100644 --- a/app.py +++ b/app.py @@ -15,6 +15,7 @@ import streamlit as st import metrics as m from data import DEFAULT_ROOT, generation, load_bundle, search_symbols, up_to_date +from fundlab import nport from portfolio import parse_items, parse_weights, portfolio_returns from portfolios import Portfolio, delete as pf_delete, load_all as pf_load, save as pf_save from tax import after_tax_portfolio @@ -402,9 +403,9 @@ def rng(s): """Clip a price/return series (or frame) to the display range.""" return s[(s.index >= lo) & (s.index <= hi)] -tab_stats, tab_equity, tab_alloc, tab_tax, tab_corr = st.tabs( +tab_stats, tab_equity, tab_alloc, tab_tax, tab_corr, tab_fundlab = st.tabs( ["Statistics", "Equity curves", "Allocation", "Tax detail", - "Correlation"]) + "Correlation", "Fund Lab"]) with tab_stats: # one table per benchmark: same rows, but beta/alpha/bench-return are @@ -572,3 +573,86 @@ with tab_corr: st.caption("Pearson correlation of daily returns; pairs correlate over their " "common history. Benchmarks are prefixed with 'benchmark: '. " "The table is symmetric — column number i is the series of row i.") + +# ---------------------------------------------------------------- fund lab +# per-fund report mockup from N-PORT schedules of investments (fundlab) +with tab_fundlab: + try: + _FUNDS = json.loads((Path(__file__).parent / "funds.json").read_text()) + except Exception: + _FUNDS = {} + _MAN = nport.manifest() + _ORDER = list(nport.FUND_TOKENS) + _FL_LABELS = {s: f"{s.upper()} — {_FUNDS[s]['name']}" + for s in _ORDER if s in _FUNDS} + _fl_pick = st.selectbox("Fund (shortlist)", list(_FL_LABELS), + format_func=lambda s: _FL_LABELS[s], + key="fundlab_pick") + _f = _FUNDS.get(_fl_pick, {}) + _man = _MAN.get(_fl_pick, {}) + st.subheader(f"{_f.get('name', _fl_pick)} · {_fl_pick.upper()}") + st.write(_f.get("objective") or "_no objective on file_") + _src_bits = [] + if _f.get("category"): + _src_bits.append(f"category: **{_f['category']}**") + if _man.get("filed"): + _src_bits.append(f"N-PORT filed {_man['filed']}") + if _man.get("url"): + _src_bits.append(f"[source filing]({_man['url']})") + if _src_bits: + st.caption(" · ".join(_src_bits)) + + snap = nport.build(_fl_pick, nport.FUND_TOKENS[_fl_pick]) + if snap is None: + st.info("Holdings not available: " + + (_man.get("note") or "no cached N-PORT filing for this fund.")) + else: + c1, c2, c3, c4 = st.columns(4) + c1.metric("As of", snap.get("as_of") or "?") + c2.metric("Net assets", + f"${snap['net_assets']:,.0f}" if snap.get("net_assets") else "?") + c3.metric("Positions parsed", f"{snap['n_positions']}") + c4.metric("Categories", f"{len(snap['categories'])}") + + lc, rc = st.columns([3, 2]) + with lc: + st.markdown("**Reported composition** — the fund's own " + "category/percentage lines, in filing order") + if snap["categories"]: + cats = pd.DataFrame(snap["categories"]) + fig = go.Figure(go.Bar( + x=cats["pct"].head(20)[::-1], + y=cats["name"].head(20)[::-1], + orientation="h", marker_color="#4c78a8")) + fig.update_layout(height=380, margin=dict(l=0, r=0, t=8, b=8), + xaxis_title="% of net assets") + st.plotly_chart(fig, width="stretch") + with st.expander("All category lines"): + st.dataframe(cats, width="stretch") + else: + st.caption("No category lines could be parsed from this filing.") + with rc: + st.markdown("**Rough keyword buckets** — my coarse parse of the " + "position lines, *not* the fund's own classification") + if snap["buckets"]: + bks = pd.DataFrame(snap["buckets"]) + bks["value"] = bks["value"].map(lambda v: f"${v:,.0f}") + st.dataframe(bks, width="stretch") + else: + st.caption("No position values could be parsed.") + if snap["top"]: + with st.expander(f"Top positions ({len(snap['top'])})"): + top = pd.DataFrame(snap["top"]) + top["value"] = top["value"].map(lambda v: f"${v:,.0f}") + st.dataframe(top, width="stretch") + + if _f.get("strategy"): + st.markdown("**Strategy (excerpt from the prospectus)**") + st.write(_f["strategy"]) + st.caption( + "Mockup: category lines are taken verbatim from the filing and " + "parsed heuristically (each family formats its schedule " + "differently), so expect the odd mis-parse. Positions are only " + "counted where the layout exposes a dollar value; the bucket " + "table is a rough keyword classification. N-PORT holdings are " + "quarterly and up to ~60 days stale.") diff --git a/fundlab/nport.py b/fundlab/nport.py new file mode 100644 index 0000000..5396d4e --- /dev/null +++ b/fundlab/nport.py @@ -0,0 +1,341 @@ +"""N-PORT schedule-of-investments parsing for the Fund Lab page. + +The raw SOI HTML files live in ``nport_cache/.html`` (one per fund, +fetched from EDGAR; see ``nport_manifest.json`` for the source URL and +filing date of each). ``build()`` parses them into a compact JSON snapshot +(``nport_cache/.json``) that the Streamlit page renders. + +Parsing is deliberately conservative: each fund family formats its SOI +differently (tables, div layouts, combined multi-fund files), so we work +on a whitespace-normalized text *stream* and extract what is reliably +present: + +* the fund's own category/percentage lines (the fund's reported + composition — the star of the report), +* the as-of date and net assets, +* position rows carrying a dollar value (where the layout allows), +* a coarse keyword bucketing of those positions. + +Anything we cannot parse is simply absent from the snapshot — the page +shows what we have and flags the rest. +""" + +from __future__ import annotations + +import bisect +import html as _html +import json +import re +from pathlib import Path + +CACHE = Path(__file__).parent / "nport_cache" +MANIFEST = Path(__file__).parent / "nport_manifest.json" + +_MONTHS = ("January|February|March|April|May|June|July|August|September|" + "October|November|December") + +# " ... Schedule of Investments" (variants) +_SECTION = re.compile( + r"(?:CONSOLIDATED\s+)?(?:SCHEDULE\s+OF\s+(?:PORTFOLIO\s+)?INVESTMENTS|" + r"PORTFOLIO\s+OF\s+INVESTMENTS)", + re.I) + +# category: "NAME — 12.3%" / "NAME (12.3%)" / "NAME: 12.3%" / "NAME 12.3%" +# name: starts uppercase, letters and a few punctuation marks, 3..45 chars +# (the cap keeps merged table rows from spanning a whole line). +_CAT = re.compile( + r"(? str: + """Strip a mixed-case prefix (table header run-on) when the tail is an + all-caps category name: 'Maturity Fair Value CORPORATE BONDS' -> + 'CORPORATE BONDS'. Title-case names are kept whole.""" + parts = re.split(r"(?<=[a-z0-9\)-])\s+(?=[A-Z])", name) + if len(parts) > 1: + tail = parts[-1] + if tail.replace(" ", "").isupper() and len(tail) >= 4: + return tail + return name + +_DOLLAR = re.compile(r"\$\s?(\d{1,3}(?:,\d{3})*(?:\.\d+)?|\d{2,}(?:\.\d+)?)") +# a line ending in a (comma-grouped) number: position value without "$" +_TRAILNUM = re.compile(r"([\d,]{4,}(?:\.\d+)?)\s*$") + +_ASOF_LONG = re.compile(rf"\b((?:{_MONTHS}) \d{{1,2}}, \d{{4}})\b") +_ASOF_SHORT = re.compile(r"\b(\d{1,2}\.\d{1,2}\.\d{2,4})\b") + +_NET = re.compile(r"net assets", re.I) + + +def rows(html: str) -> list[str]: + """Row-aware HTML -> list of non-empty text lines (one per table row + / block). Div-wrapped words in some filings stay on separate rows; + that is why most parsing is done on the joined *stream* instead.""" + x = re.sub(r"(?i)|", "\n", html) + x = re.sub(r"<[^>]+>", " ", x) + x = _html.unescape(x).replace("\xa0", " ").replace("\r", " ") + out = [] + for ln in x.split("\n"): + ln = re.sub(r"[ \t]+", " ", ln).strip() + if ln: + out.append(ln) + return out + + +def find_section(text: str, tokens: list[str]) -> tuple[int, int] | None: + """Locate the fund's own SOI section (possibly in a multi-fund file). + + ``tokens`` are case-insensitive words that must appear in the section + header (a window around the "Schedule of Investments" phrase, which + contains or follows the fund name). The section extends over all + subsequent headers of the SAME fund (page-continuation footers) and + ends at the first header that no longer names all of the fund's + tokens. + """ + hits = list(_SECTION.finditer(text)) + if not hits: + return None + + def score(m: re.Match) -> int: + near = text[max(0, m.start() - 60): m.start()].lower() + before = text[max(0, m.start() - 150): m.start()].lower() + after = text[m.end(): m.end() + 80].lower() + s = sum(3 for t in tokens if t in near) + s += sum(1 for t in tokens + if t not in near and (t in before or t in after)) + return s + + def names_fund(m: re.Match) -> bool: + window = (text[max(0, m.start() - 150): m.start()] + + text[m.end(): m.end() + 80]).lower() + return all(t in window for t in tokens) + + best = None + for i, m in enumerate(hits): + s = score(m) + if s and (best is None or s > best[0]): + best = (s, i) + if best is None: + return None + start = max(0, hits[best[1]].start() - 200) + end = min(len(text), start + 400_000) + for j in range(best[1] + 1, len(hits)): + if names_fund(hits[j]): + continue + # cross-references never terminate, even mid-section + before = text[max(0, hits[j].start() - 30): hits[j].start()] + if before.strip().lower().endswith("see"): + continue + end = max(start, hits[j].start() - 150) + break + return start, end + + +def _to_float(s: str) -> float: + try: + return float(s.replace(",", "")) + except ValueError: + return 0.0 + + +def parse_section(stream: str, start: int, end: int, rs: list[str], + row_starts: list[int]) -> dict: + seg = stream[start:end] + # the rows that fall inside the section (plus the partial first row, + # which may carry the section header) + i1 = bisect.bisect_right(row_starts, end) + i0 = bisect.bisect_left(row_starts, start) + if i0 and row_starts[i0] > start: + i0 -= 1 + lines = [ln for ln in rs[i0:i1] if ln.strip()] + + as_of = None + head = seg[:1500] + m = _ASOF_LONG.search(head) or _ASOF_SHORT.search(head) + if m: + as_of = m.group(1) + + # -- categories (global, in order of appearance, deduplicated) + categories: list[dict] = [] + seen: set[str] = set() + pos = 0 + while len(categories) < 60: + cm = _CAT.search(seg, pos) + if cm is None: + break + name = _trim_name(cm.group(1).strip(" -–—:(")) + # reject table-run-on junk: digits inside a category name (bond + # series, dates, page refs), stray cell markers ("a a a"), or + # column headers absorbed into the name. On a reject, resume from + # just after the name start so a clean match inside the same + # run-on is still found. + if (re.search(r"\d", name) + or re.search(r"\ba\s+a\b", name, re.I) + or re.search(r"\b(shares value|value shares|security shares|" + r"principal amount|fair value)\b", name, re.I)): + pos = cm.start(1) + 1 + continue + key = name.lower() + if key not in seen: + seen.add(key) + categories.append({"name": name, + "pct": float(cm.group(2).replace(" ", ""))}) + pos = cm.end() + # drop total/net-asset summary lines from the list + categories = [c for c in categories + if not re.match(r"^(total\s+)?(net\s+assets|investments)$", + c["name"], re.I)] + + # -- positions: rows with a dollar value (last $ on the row) or, + # failing that, a trailing grouped number + positions: list[dict] = [] + current_cat = "" + for ln in lines: + cm = _CAT.search(ln) + if cm and not _DOLLAR.search(ln): + current_cat = cm.group(1).strip() + dollars = _DOLLAR.findall(ln) + value = None + if dollars: + value = _to_float(dollars[-1]) + elif _TRAILNUM.search(ln): + value = _to_float(_TRAILNUM.search(ln).group(1)) + if value is None or value <= 0: + continue + if _NET.search(ln) or len(ln) < 8: + continue + if re.fullmatch(r"[\d,$.()\s]+", ln): # a bare number row + continue + positions.append({"text": re.sub(r"\s+", " ", ln)[:160], + "value": value, "cat": current_cat}) + + # -- net assets: last "net assets" mention with a nearby number + net_assets = None + for nm in list(_NET.finditer(seg))[-3:]: + window = seg[nm.end(): nm.end() + 120] + dm = _DOLLAR.search(window) or re.search(r"([\d,]{8,}(?:\.\d+)?)", window) + if dm: + net_assets = _to_float(dm.group(1)) + break + return {"as_of": as_of, "categories": categories, + "positions": positions, "net_assets": net_assets} + + +# ------------------------------------------------------------------ buckets +_B_RE = [ + ("Futures", r"\b(futur|forward|swap)\b|\bOPEN (CURRENCY|FUTURES)\b|\bCURRENCY (EXCHANGE|FORWARD|OPTION)\b"), + ("Commodities", r"\b(gold|silver|copper|crude|natural gas|oil|energy|agricultur|commodit|palladium|platinum|wheat|corn)\b"), + ("Fund holdings", r"\b(fund|etf)\b, ?class |class [a-z0-9]{1,2}\b|\bexchange[- ]trad(?:ed)? (fund|funds|etf)|\b(open[- ]end|closed[- ]end) fund|\bmoney market fund\b|\bETF\b|\bFund\b(?!s of Investments)"), + ("Agency MBS", r"\bmortgage\b|\bgnma\b|\bfhlmc\b|\bfnma\b|\bagency\b|\bmbs\b"), + ("CMBS / ABS", r"\bcmo\b|commercial mortgage|collateralized mortgage|abs (?:trust|securitization)|asset[- ]?backed"), + ("High yield", r"high[- ]?yield"), + ("US govt", r"treasur|us govt|u\.s\. government|t-bill"), + ("IG credit / munis", r"corporate|sovereign|senior note|notes,|bonds,|munici|nonconvertible"), + ("Cash & T-bills", r"^\s*cash\b|cash item|bank deposit|money market"), + ("Equity (intl)", r"\b(foreign|non-?us|international|emerging|europe|japan|canada|\buk\b|german|french|austral|brazil|india|china|korea|switz|netherland|spain|italy)\b"), + ("Equity (US)", r"\b(inc|corp|corporation|ltd|plc|group|llc|lp)\.?|common stock|equity|stock"), +] +_BUCKETS = [(name, re.compile(rx, re.I)) for name, rx in _B_RE] + + +def classify(text: str, category: str) -> str: + """Keyword-bucket one position. Order matters: first match wins.""" + ctx = f"{category} | {text}" + for name, rx in _BUCKETS: + if rx.search(ctx): + return name + return "Other" + + +def build(sym: str, fund_tokens: list[str], force: bool = False) -> dict | None: + """Parse the cached SOI for ``sym``; returns the snapshot (or None). + + ``fund_tokens`` identifies this fund's section inside multi-fund + family files (e.g. ["mortgage", "opportunities"]). + """ + html_path = CACHE / f"{sym}.html" + json_path = CACHE / f"{sym}.json" + if not force and json_path.exists(): + try: + return json.loads(json_path.read_text()) + except Exception: + pass + if not html_path.exists(): + return None + rs = rows(html_path.read_text()) + stream = " ".join(rs) + row_starts: list[int] = [] + pos = 0 + for r in rs: + row_starts.append(pos) + pos += len(r) + 1 + sec = find_section(stream, fund_tokens) + if sec is None: + return None + seg = parse_section(stream, *sec, rs, row_starts) + buckets: dict[str, float] = {} + for p in seg["positions"]: + b = classify(p["text"], p["cat"]) + buckets[b] = buckets.get(b, 0.0) + p["value"] + total = sum(buckets.values()) or 1.0 + snap = { + "sym": sym, + "as_of": seg["as_of"], + "net_assets": seg["net_assets"], + "n_positions": len(seg["positions"]), + "categories": seg["categories"], + "buckets": [{"name": k, "value": v, "pct": 100.0 * v / total} + for k, v in sorted(buckets.items(), key=lambda kv: -kv[1])], + "top": sorted(seg["positions"], key=lambda p: -p["value"])[:40], + } + json_path.write_text(json.dumps(snap, indent=1)) + return snap + + +# ------------------------------------------------------------------ CLI +# fund-identifying tokens per ticker (used to find the fund's section in +# multi-fund family filings) +FUND_TOKENS = { + # atesx: no cached SOI (its family's current filings don't cover it); + # it still shows in the list with the manifest's note + "atesx": ["anchor", "risk", "equity"], + "atrfx": ["catalyst", "systematic"], + "cvsix": ["calamos", "market"], + "jlpsx": ["large cap core plus"], + "pmaix": ["victory", "pioneer"], + "pmfkx": ["victory", "pioneer"], + "pmorx": ["mortgage", "opportunities"], + "qspnx": ["style", "premia"], + "svarx": ["spectrum low volatility"], + "cosix": ["columbia strategic income"], + "mbxix": ["millburn", "hedge"], + "eagmx": ["global macro absolute return"], + "egrsx": ["global macro absolute return"], + "lcorx": ["leuthold core"], + "lcrix": ["leuthold core"], + "lamhx": ["dividend growth"], +} + + +def build_all(force: bool = False) -> dict: + """Build/return snapshots for every fund with a cached SOI file.""" + out = {} + for sym, tk in FUND_TOKENS.items(): + s = build(sym, tk, force=force) + if s: + out[sym] = s + return out + + +def manifest() -> dict: + return json.loads(MANIFEST.read_text()) + + +if __name__ == "__main__": + import sys + syms = sys.argv[1:] or list(FUND_TOKENS) + for s in syms: + r = build(s, FUND_TOKENS[s], force=True) + print(s, "->", "ok" if r else "FAILED") diff --git a/fundlab/nport_cache/atrfx.json b/fundlab/nport_cache/atrfx.json new file mode 100644 index 0000000..178b022 --- /dev/null +++ b/fundlab/nport_cache/atrfx.json @@ -0,0 +1,297 @@ +{ + "sym": "atrfx", + "as_of": "March 31, 2026", + "net_assets": 34268504.0, + "n_positions": 46, + "categories": [ + { + "name": "CORPORATE BONDS", + "pct": 53.9 + }, + { + "name": "ASSET MANAGEMENT", + "pct": 4.8 + }, + { + "name": "HEALTH CARE FACILITIES & SERVICES", + "pct": 4.7 + }, + { + "name": "INTERNET MEDIA & SERVICES", + "pct": 4.7 + }, + { + "name": "LEISURE PRODUCTS", + "pct": 5.8 + }, + { + "name": "OIL & GAS PRODUCERS", + "pct": 4.7 + }, + { + "name": "DISCRETIONARY", + "pct": 14.4 + }, + { + "name": "SEMICONDUCTORS", + "pct": 9.6 + }, + { + "name": "TECHNOLOGY SERVICES", + "pct": 5.2 + }, + { + "name": "GOVERNMENT & AGENCIES", + "pct": 36.2 + }, + { + "name": "TREASURY BILLS", + "pct": 36.2 + }, + { + "name": "SHORT-TERM INVESTMENTS", + "pct": 9.2 + }, + { + "name": "MONEY MARKET FUNDS", + "pct": 9.2 + }, + { + "name": "American Treasury Obligations Fund, Class X,", + "pct": 3.58 + }, + { + "name": "OTHER ASSETS IN EXCESS OF LIABILITIES", + "pct": 0.7 + } + ], + "buckets": [ + { + "name": "Cash & T-bills", + "value": 34127839.0, + "pct": 49.937744336213946 + }, + { + "name": "IG credit / munis", + "value": 18564680.0, + "pct": 27.164868057529933 + }, + { + "name": "US govt", + "value": 12404594.0, + "pct": 18.151089020507087 + }, + { + "name": "Fund holdings", + "value": 3158565.0, + "pct": 4.621787258176927 + }, + { + "name": "Other", + "value": 85092.0, + "pct": 0.12451132757210666 + } + ], + "top": [ + { + "text": "TOTAL INVESTMENTS - 99.3% (Cost $34,127,839)", + "value": 34127839.0, + "cat": "MONEY MARKET FUNDS" + }, + { + "text": "TOTAL CORPORATE BONDS (Cost $18,564,680)", + "value": 18564680.0, + "cat": "TECHNOLOGY SERVICES" + }, + { + "text": "TOTAL U.S. GOVERNMENT & AGENCIES (Cost $12,404,594)", + "value": 12404594.0, + "cat": "TREASURY BILLS" + }, + { + "text": "First American Treasury Obligations Fund, Class X, 3.58% (Cost $3,158,565) (d)", + "value": 3158565.0, + "cat": "MONEY MARKET FUNDS" + }, + { + "text": "12/7/2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "6/19/2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing May 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing May 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing May 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing May 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing May 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing May 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing May 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing May 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing May 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing May 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing June 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing June 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing June 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing June 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing July 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing July 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "S&P 500 Futures, Maturing April 2026", + "value": 2026.0, + "cat": "NET ASSETS" + } + ] +} \ No newline at end of file diff --git a/fundlab/nport_cache/cosix.json b/fundlab/nport_cache/cosix.json new file mode 100644 index 0000000..71232e2 --- /dev/null +++ b/fundlab/nport_cache/cosix.json @@ -0,0 +1,492 @@ +{ + "sym": "cosix", + "as_of": "May 31, 2026", + "net_assets": 46146833.0, + "n_positions": 1300, + "categories": [ + { + "name": "Mortgage-Backed Securities - Non-Agency", + "pct": 0.3 + }, + { + "name": "Common Stocks", + "pct": 0.0 + }, + { + "name": "Communication Services", + "pct": 0.0 + }, + { + "name": "Diversified Telecommunication Services", + "pct": 0.0 + }, + { + "name": "Wireless Telecommunication Services", + "pct": 0.0 + }, + { + "name": "Consumer Discretionary", + "pct": 0.0 + }, + { + "name": "Diversified Consumer Services", + "pct": 0.0 + }, + { + "name": "Household Durables", + "pct": 0.0 + }, + { + "name": "Industrials", + "pct": 0.0 + }, + { + "name": "Construction & Engineering", + "pct": 0.0 + }, + { + "name": "Machinery", + "pct": 0.0 + }, + { + "name": "Information Technology", + "pct": 0.0 + }, + { + "name": "Software", + "pct": 0.0 + }, + { + "name": "Materials", + "pct": 0.0 + }, + { + "name": "Containers & Packaging", + "pct": 0.0 + }, + { + "name": "Convertible Bonds", + "pct": 0.1 + }, + { + "name": "Electric", + "pct": 0.1 + }, + { + "name": "Convertible Preferred Stocks", + "pct": 0.0 + }, + { + "name": "Corporate Bonds & Notes", + "pct": 35.0 + }, + { + "name": "Aerospace & Defense", + "pct": 0.8 + }, + { + "name": "Airlines", + "pct": 0.0 + }, + { + "name": "Automotive", + "pct": 0.7 + }, + { + "name": "Banking", + "pct": 2.1 + }, + { + "name": "Brokerage/Asset Managers/Exchanges", + "pct": 0.4 + }, + { + "name": "Building Materials", + "pct": 0.6 + }, + { + "name": "Cable and Satellite", + "pct": 1.6 + }, + { + "name": "Chemicals", + "pct": 2.2 + }, + { + "name": "Construction Machinery", + "pct": 0.4 + }, + { + "name": "Consumer Cyclical Services", + "pct": 0.3 + }, + { + "name": "Consumer Products", + "pct": 0.2 + }, + { + "name": "Diversified Manufacturing", + "pct": 0.6 + }, + { + "name": "Environmental", + "pct": 0.1 + }, + { + "name": "Finance Companies", + "pct": 1.6 + }, + { + "name": "Food and Beverage", + "pct": 1.5 + }, + { + "name": "Gaming", + "pct": 0.9 + }, + { + "name": "Health Care", + "pct": 1.9 + }, + { + "name": "Healthcare Insurance", + "pct": 0.3 + }, + { + "name": "Independent Energy", + "pct": 1.0 + }, + { + "name": "Leisure", + "pct": 0.8 + }, + { + "name": "Life Insurance", + "pct": 0.2 + }, + { + "name": "Lodging", + "pct": 0.5 + }, + { + "name": "Media and Entertainment", + "pct": 1.5 + }, + { + "name": "Metals and Mining", + "pct": 0.7 + }, + { + "name": "Midstream", + "pct": 2.8 + }, + { + "name": "Oil Field Services", + "pct": 0.6 + }, + { + "name": "Other Industry", + "pct": 0.1 + }, + { + "name": "REIT", + "pct": 0.2 + }, + { + "name": "Packaging", + "pct": 0.4 + }, + { + "name": "Pharmaceuticals", + "pct": 0.4 + }, + { + "name": "Property & Casualty", + "pct": 1.6 + }, + { + "name": "Railroads", + "pct": 0.2 + }, + { + "name": "Restaurants", + "pct": 0.3 + }, + { + "name": "Retailers", + "pct": 0.5 + }, + { + "name": "Supermarkets", + "pct": 0.1 + }, + { + "name": "Technology", + "pct": 4.1 + }, + { + "name": "Transportation Services", + "pct": 0.3 + }, + { + "name": "Wireless", + "pct": 0.2 + }, + { + "name": "Wirelines", + "pct": 0.5 + }, + { + "name": "Exchange-Traded Fixed Income Funds", + "pct": 1.0 + }, + { + "name": "High Yield", + "pct": 1.0 + } + ], + "buckets": [ + { + "name": "Cash & T-bills", + "value": 7452305009.0, + "pct": 52.70513709557897 + }, + { + "name": "Other", + "value": 4244509800.0, + "pct": 30.018560786543414 + }, + { + "name": "Agency MBS", + "value": 2379029415.0, + "pct": 16.825273699957606 + }, + { + "name": "High yield", + "value": 57778840.0, + "pct": 0.4086308437115556 + }, + { + "name": "US govt", + "value": 5816251.0, + "pct": 0.041134428336882134 + }, + { + "name": "Commodities", + "value": 81298.0, + "pct": 0.0005749660313717279 + }, + { + "name": "Fund holdings", + "value": 81040.0, + "pct": 0.0005731413710345251 + }, + { + "name": "Equity (intl)", + "value": 16266.0, + "pct": 0.00011503846916643123 + } + ], + "top": [ + { + "text": "(Cost: $7,045,434,710)", + "value": 7045434710.0, + "cat": "Money Market Funds" + }, + { + "text": "(Cost $2,080,407,567)", + "value": 2080407567.0, + "cat": "Wirelines" + }, + { + "text": "(Cost $1,815,246,519)", + "value": 1815246519.0, + "cat": "Mortgage-Backed Securities - Agency" + }, + { + "text": "(Cost $943,102,272)", + "value": 943102272.0, + "cat": "Wireless" + }, + { + "text": "(Cost $624,403,760)", + "value": 624403760.0, + "cat": "United Arab Emirates" + }, + { + "text": "(Cost $532,097,396)", + "value": 532097396.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "(Cost $508,731,336)", + "value": 508731336.0, + "cat": "" + }, + { + "text": "(Cost $360,664,357)", + "value": 360664357.0, + "cat": "Money Market Funds" + }, + { + "text": "(Cost $57,778,840)", + "value": 57778840.0, + "cat": "High Yield" + }, + { + "text": "At May 31, 2026, securities and/or cash totaling $46,146,833 were pledged as collateral.", + "value": 46146833.0, + "cat": "Money Market Funds" + }, + { + "text": "(Cost $31,353,399)", + "value": 31353399.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "(Cost $30,447,374)", + "value": 30447374.0, + "cat": "Call Option Contracts Purchased" + }, + { + "text": "(Cost $25,000,000)", + "value": 25000000.0, + "cat": "Joint Ventures (p)" + }, + { + "text": "(Cost $14,182,068)", + "value": 14182068.0, + "cat": "Put Option Contracts Purchased" + }, + { + "text": "(Cost $7,357,975)", + "value": 7357975.0, + "cat": "Electric" + }, + { + "text": "(Cost $7,221,692)", + "value": 7221692.0, + "cat": "Turkey" + }, + { + "text": "(Cost $5,814,223)", + "value": 5814223.0, + "cat": "Treasury Obligations" + }, + { + "text": "(Cost $1,134,616)", + "value": 1134616.0, + "cat": "Containers & Packaging" + }, + { + "text": "(Cost $391,497)", + "value": 391497.0, + "cat": "Wireless Telecommunication Services" + }, + { + "text": "(Cost $84,955)", + "value": 84955.0, + "cat": "Diversified Telecommunication Services" + }, + { + "text": "(Cost $14,864)", + "value": 14864.0, + "cat": "Diversified Telecommunication Services" + }, + { + "text": "06/25/2071", + "value": 2071.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "04/27/2071", + "value": 2071.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "04/25/2071", + "value": 2071.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "04/25/2071", + "value": 2071.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "07/25/2070", + "value": 2070.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "05/25/2070", + "value": 2070.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "10/25/2070", + "value": 2070.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "07/25/2069", + "value": 2069.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "11/25/2067", + "value": 2067.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "11/25/2067", + "value": 2067.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "09/25/2066", + "value": 2066.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "10/25/2066", + "value": 2066.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "07/25/2066", + "value": 2066.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "11/15/2065", + "value": 2065.0, + "cat": "Media and Entertainment" + }, + { + "text": "09/26/2065", + "value": 2065.0, + "cat": "Technology" + }, + { + "text": "05/25/2065", + "value": 2065.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "05/25/2065", + "value": 2065.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "06/25/2065", + "value": 2065.0, + "cat": "Mortgage-Backed Securities - Non-Agency" + }, + { + "text": "04/17/2065", + "value": 2065.0, + "cat": "Money Market Funds" + } + ] +} \ No newline at end of file diff --git a/fundlab/nport_cache/cvsix.json b/fundlab/nport_cache/cvsix.json new file mode 100644 index 0000000..92d6024 --- /dev/null +++ b/fundlab/nport_cache/cvsix.json @@ -0,0 +1,142 @@ +{ + "sym": "cvsix", + "as_of": "January 31, 2026", + "net_assets": 17091405108.0, + "n_positions": 0, + "categories": [ + { + "name": "CONVERTIBLE BONDS", + "pct": 39.4 + }, + { + "name": "Communication Services", + "pct": 3.0 + }, + { + "name": "Consumer Discretionary", + "pct": 7.5 + }, + { + "name": "Consumer Staples", + "pct": 0.3 + }, + { + "name": "Energy", + "pct": 0.4 + }, + { + "name": "Financials", + "pct": 2.2 + }, + { + "name": "Health Care", + "pct": 2.9 + }, + { + "name": "Industrials", + "pct": 2.1 + }, + { + "name": "Information Technology", + "pct": 14.8 + }, + { + "name": "Materials", + "pct": 0.5 + }, + { + "name": "Other", + "pct": 0.4 + }, + { + "name": "Real Estate", + "pct": 0.5 + }, + { + "name": "Utilities", + "pct": 4.8 + }, + { + "name": "CORPORATE BONDS", + "pct": 0.2 + }, + { + "name": "VALUE a Information Technology", + "pct": 0.1 + }, + { + "name": "COMMON STOCKS", + "pct": 61.4 + }, + { + "name": "NUMBER OF SHARES b b VALUE b Real Estate", + "pct": 0.9 + }, + { + "name": "Special Purpose Acquisition Companies", + "pct": 0.7 + }, + { + "name": "CONVERTIBLE PREFERRED STOCKS", + "pct": 3.9 + }, + { + "name": "EXCHANGE-TRADED FUND", + "pct": 0.4 + }, + { + "name": "INVESTMENT IN AFFILIATED FUND", + "pct": 2.0 + }, + { + "name": "RIGHTS", + "pct": 0.0 + }, + { + "name": "WARRANTS", + "pct": 0.0 + }, + { + "name": "EXCHANGE-TRADED PURCHASED OPTIONS", + "pct": 0.1 + }, + { + "name": "OVER THE COUNTER PURCHASED OPTIONS", + "pct": 0.2 + }, + { + "name": "Communications", + "pct": 0.0 + }, + { + "name": "NOTIONAL AMOUNT c c VALUE c Materials", + "pct": 0.0 + }, + { + "name": "OF CASH COLLATERAL FOR SECURITIES LOANED", + "pct": 1.0 + }, + { + "name": "PAYABLE UPON RETURN OF SECURITIES ON LOAN", + "pct": 1.0 + }, + { + "name": "LIABILITIES, LESS OTHER ASSETS", + "pct": 7.6 + }, + { + "name": "COMMON STOCKS SOLD SHORT", + "pct": 23.0 + }, + { + "name": "SHARES b b VALUE b Consumer Discretionary", + "pct": 3.9 + }, + { + "name": "EXCHANGE-TRADED WRITTEN OPTIONS", + "pct": 8.6 + } + ], + "buckets": [], + "top": [] +} \ No newline at end of file diff --git a/fundlab/nport_cache/eagmx.json b/fundlab/nport_cache/eagmx.json new file mode 100644 index 0000000..42aab68 --- /dev/null +++ b/fundlab/nport_cache/eagmx.json @@ -0,0 +1,482 @@ +{ + "sym": "eagmx", + "as_of": "July 31, 2025", + "net_assets": null, + "n_positions": 74, + "categories": [ + { + "name": "Collateralized Mortgage Obligations", + "pct": 0.9 + }, + { + "name": "Class A,", + "pct": 6.5 + }, + { + "name": "Common Stocks", + "pct": 8.9 + }, + { + "name": "Value Argentina", + "pct": 0.4 + }, + { + "name": "Belgium", + "pct": 0.0 + }, + { + "name": "Brazil", + "pct": 0.3 + }, + { + "name": "Bulgaria", + "pct": 0.3 + }, + { + "name": "Canada", + "pct": 0.0 + }, + { + "name": "Chile", + "pct": 0.6 + }, + { + "name": "Cyprus", + "pct": 1.1 + }, + { + "name": "Georgia", + "pct": 0.3 + }, + { + "name": "Greece", + "pct": 1.0 + }, + { + "name": "Iceland", + "pct": 1.0 + }, + { + "name": "Luxembourg", + "pct": 0.1 + }, + { + "name": "Philippines", + "pct": 0.5 + }, + { + "name": "Puerto Rico", + "pct": 0.2 + }, + { + "name": "Slovenia", + "pct": 0.3 + }, + { + "name": "South Korea", + "pct": 1.1 + }, + { + "name": "Switzerland", + "pct": 0.0 + }, + { + "name": "United States", + "pct": 0.1 + }, + { + "name": "Vietnam", + "pct": 1.6 + }, + { + "name": "Convertible Bonds", + "pct": 0.0 + }, + { + "name": "Value China", + "pct": 0.0 + }, + { + "name": "Shimao Group Holdings Ltd.,", + "pct": 0.0 + }, + { + "name": "Sunac China Holdings Ltd.,", + "pct": 1.0 + }, + { + "name": "Foreign Corporate Bonds", + "pct": 6.9 + }, + { + "name": "Shimao Group Holdings Ltd.", + "pct": 2.0 + }, + { + "name": "Sunac China Holdings Ltd.", + "pct": 6.0 + }, + { + "name": "China (continued) Times China Holdings Ltd.", + "pct": 5.55 + }, + { + "name": "JSC,", + "pct": 9.5 + }, + { + "name": "PLC,", + "pct": 22.0 + }, + { + "name": "Hungary", + "pct": 0.4 + }, + { + "name": "MBH Bank Nyrt", + "pct": 5.25 + }, + { + "name": "Wow Air Hf.", + "pct": 0.0 + }, + { + "name": "India", + "pct": 0.5 + }, + { + "name": "Porteast Investment Pvt Ltd.,", + "pct": 0.0 + }, + { + "name": "Kazakhstan", + "pct": 1.5 + }, + { + "name": "Kaspi.KZ JSC,", + "pct": 6.25 + }, + { + "name": "Mexico", + "pct": 0.0 + }, + { + "name": "Alpha Holding SA de CV", + "pct": 9.0 + }, + { + "name": "Paraguay", + "pct": 0.3 + }, + { + "name": "Value Saint Lucia", + "pct": 0.0 + }, + { + "name": "Digicel International Finance Ltd./DIFL U.S.,", + "pct": 12.0 + }, + { + "name": "Supranational", + "pct": 0.4 + }, + { + "name": "Asian Development Bank,", + "pct": 14.5 + }, + { + "name": "Bank for Reconstruction & Development", + "pct": 17.2 + }, + { + "name": "Tunisia", + "pct": 0.2 + }, + { + "name": "Tunisian Republic,", + "pct": 3.28 + }, + { + "name": "Uzbekistan", + "pct": 1.4 + }, + { + "name": "ATIB,", + "pct": 20.5 + }, + { + "name": "Jscb Agrobank,", + "pct": 9.25 + }, + { + "name": "Uzbek Industrial & Construction Bank ATB", + "pct": 19.95 + }, + { + "name": "Venezuela", + "pct": 1.6 + }, + { + "name": "Insurance Linked Securities", + "pct": 1.6 + }, + { + "name": "Value Reinsurance Side Cars", + "pct": 0.6 + }, + { + "name": "Segregated Account/Funds", + "pct": 1.0 + }, + { + "name": "Loan Participation Notes", + "pct": 0.3 + }, + { + "name": "Value Uzbekistan", + "pct": 0.3 + }, + { + "name": "Senior Floating-Rate Loans", + "pct": 3.3 + }, + { + "name": "Suriname", + "pct": 2.1 + } + ], + "buckets": [ + { + "name": "Other", + "value": 11130037526.0, + "pct": 68.74069461458403 + }, + { + "name": "IG credit / munis", + "value": 3883548887.0, + "pct": 23.98535022352401 + }, + { + "name": "US govt", + "value": 680512560.0, + "pct": 4.20294234939211 + }, + { + "name": "Equity (US)", + "value": 455223324.0, + "pct": 2.8115239884340206 + }, + { + "name": "Fund holdings", + "value": 40732825.0, + "pct": 0.2515717200030484 + }, + { + "name": "Equity (intl)", + "value": 1281885.0, + "pct": 0.007917104062782478 + } + ], + "top": [ + { + "text": "(identified cost $4,835,737,180)", + "value": 4835737180.0, + "cat": "Total Investments" + }, + { + "text": "(identified cost $4,703,265,980)", + "value": 4703265980.0, + "cat": "Net Investments" + }, + { + "text": "(identified cost $3,167,077,385)", + "value": 3167077385.0, + "cat": "Zambia Government International Bonds," + }, + { + "text": "(identified cost $594,867,993)", + "value": 594867993.0, + "cat": "Treasury Obligations" + }, + { + "text": "(proceeds $448,682,933)", + "value": 448682933.0, + "cat": "Senegal Government International Bonds," + }, + { + "text": "(identified cost $343,427,431)", + "value": 343427431.0, + "cat": "Venezuela" + }, + { + "text": "(identified cost $327,096,803)", + "value": 327096803.0, + "cat": "Dated 7/18/25 with an interest rate of" + }, + { + "text": "(identified cost $308,000,793)", + "value": 308000793.0, + "cat": "Vietnam" + }, + { + "text": "(proceeds $221,887,271)", + "value": 221887271.0, + "cat": "Senegal Government International Bonds," + }, + { + "text": "(identified cost $150,534,320)", + "value": 150534320.0, + "cat": "Suriname" + }, + { + "text": "(proceeds $148,935,048)", + "value": 148935048.0, + "cat": "Blue Owl Credit Income Corp.," + }, + { + "text": "(identified cost $110,684,588)", + "value": 110684588.0, + "cat": "Tanzania" + }, + { + "text": "(identified cost $108,022,440)", + "value": 108022440.0, + "cat": "Uruguay" + }, + { + "text": "(identified cost $85,644,567)", + "value": 85644567.0, + "cat": "Treasury Obligations" + }, + { + "text": "(identified cost $74,104,183)", + "value": 74104183.0, + "cat": "Class," + }, + { + "text": "(identified cost $67,750,379)", + "value": 67750379.0, + "cat": "Segregated Account/Funds" + }, + { + "text": "(proceeds $44,748,272)", + "value": 44748272.0, + "cat": "Net Investments" + }, + { + "text": "(identified cost $40,732,825)", + "value": 40732825.0, + "cat": "Unison Trust, Series 2021-1, Class A," + }, + { + "text": "6.853%, due 3/28/54 and a market value, including accrued interest, of $40,541,656 (28)", + "value": 40541656.0, + "cat": "Dated 6/17/25 with an interest rate of" + }, + { + "text": "(proceeds $33,112,342)", + "value": 33112342.0, + "cat": "Blue Owl Credit Income Corp.," + }, + { + "text": "(identified cost $19,884,529)", + "value": 19884529.0, + "cat": "Small Business Administration Loans" + }, + { + "text": "(identified cost $17,472,767)", + "value": 17472767.0, + "cat": "Total Purchased Options" + }, + { + "text": "6.853%, due 3/28/54 and a market value, including accrued interest, of $16,409,627 (28)", + "value": 16409627.0, + "cat": "Dated 7/7/25 with an interest rate of" + }, + { + "text": "6.853%, due 3/28/54 and a market value, including accrued interest, of $16,409,627 (28)", + "value": 16409627.0, + "cat": "Dated 7/31/25 with an interest rate of" + }, + { + "text": "Government International Bonds, 7.75%, due 6/10/31 and a market value, including accrued interest, of $15,374,143 (28)", + "value": 15374143.0, + "cat": "Dated 7/18/25 with an interest rate of" + }, + { + "text": "Bonds, 2.75%, due 5/25/32 and a market value, including accrued interest, of $15,316,718 (28)", + "value": 15316718.0, + "cat": "Dated 7/7/25 with an interest rate of" + }, + { + "text": "7.50%, due 9/20/47 and a market value, including accrued interest, of $14,748,640 (28)", + "value": 14748640.0, + "cat": "Dated 7/7/25 with an interest rate of" + }, + { + "text": "4.875%, due 10/14/44 and a market value, including accrued interest, of $14,177,276 (28)", + "value": 14177276.0, + "cat": "Dated 5/9/25 with an interest rate of" + }, + { + "text": "(identified cost $14,024,310)", + "value": 14024310.0, + "cat": "Uzbekistan" + }, + { + "text": "3.50%, due 9/1/32 and a market value, including accrued interest, of $13,588,389 (28)", + "value": 13588389.0, + "cat": "Dated 6/24/25 with an interest rate of" + }, + { + "text": "5/17/31 and a market value, including accrued interest, of $13,431,351 (28)", + "value": 13431351.0, + "cat": "Dated 5/23/25 with an interest rate of" + }, + { + "text": "5/17/31 and a market value, including accrued interest, of $13,430,471 (28)", + "value": 13430471.0, + "cat": "Dated 6/9/25 with an interest rate of" + }, + { + "text": "4.50%, due 4/1/56 and a market value, including accrued interest, of $13,263,540 (28)", + "value": 13263540.0, + "cat": "Dated 2/24/25 with an interest rate of" + }, + { + "text": "7.75%, due 4/18/35 and a market value, including accrued interest, of $12,715,192 (28)", + "value": 12715192.0, + "cat": "Dated 2/19/25 with an interest rate of" + }, + { + "text": "4.50%, due 4/16/50 and a market value, including accrued interest, of $8,466,516 (28)", + "value": 8466516.0, + "cat": "Dated 3/19/25 with an interest rate of" + }, + { + "text": "7.50%, due 2/12/36 and a market value, including accrued interest, of $8,428,061 (28)", + "value": 8428061.0, + "cat": "Dated 4/17/25 with an interest rate of" + }, + { + "text": "6.853%, due 3/28/54 and a market value, including accrued interest, of $8,204,813 (28)", + "value": 8204813.0, + "cat": "Dated 4/3/25 with an interest rate of" + }, + { + "text": "5.625%, due 5/18/34 and a market value, including accrued interest, of $7,325,380 (28)", + "value": 7325380.0, + "cat": "Dated 12/19/24 with an interest rate of" + }, + { + "text": "3.60%, due 2/2/31 and a market value, including accrued interest, of $7,137,985 (28)", + "value": 7137985.0, + "cat": "Dated 12/19/24 with an interest rate of" + }, + { + "text": "6.00%, due 9/19/44 and a market value, including accrued interest, of $6,841,760 (28)", + "value": 6841760.0, + "cat": "Dated 12/19/24 with an interest rate of" + } + ] +} \ No newline at end of file diff --git a/fundlab/nport_cache/egrsx.json b/fundlab/nport_cache/egrsx.json new file mode 100644 index 0000000..331e922 --- /dev/null +++ b/fundlab/nport_cache/egrsx.json @@ -0,0 +1,482 @@ +{ + "sym": "egrsx", + "as_of": "July 31, 2025", + "net_assets": null, + "n_positions": 74, + "categories": [ + { + "name": "Collateralized Mortgage Obligations", + "pct": 0.9 + }, + { + "name": "Class A,", + "pct": 6.5 + }, + { + "name": "Common Stocks", + "pct": 8.9 + }, + { + "name": "Value Argentina", + "pct": 0.4 + }, + { + "name": "Belgium", + "pct": 0.0 + }, + { + "name": "Brazil", + "pct": 0.3 + }, + { + "name": "Bulgaria", + "pct": 0.3 + }, + { + "name": "Canada", + "pct": 0.0 + }, + { + "name": "Chile", + "pct": 0.6 + }, + { + "name": "Cyprus", + "pct": 1.1 + }, + { + "name": "Georgia", + "pct": 0.3 + }, + { + "name": "Greece", + "pct": 1.0 + }, + { + "name": "Iceland", + "pct": 1.0 + }, + { + "name": "Luxembourg", + "pct": 0.1 + }, + { + "name": "Philippines", + "pct": 0.5 + }, + { + "name": "Puerto Rico", + "pct": 0.2 + }, + { + "name": "Slovenia", + "pct": 0.3 + }, + { + "name": "South Korea", + "pct": 1.1 + }, + { + "name": "Switzerland", + "pct": 0.0 + }, + { + "name": "United States", + "pct": 0.1 + }, + { + "name": "Vietnam", + "pct": 1.6 + }, + { + "name": "Convertible Bonds", + "pct": 0.0 + }, + { + "name": "Value China", + "pct": 0.0 + }, + { + "name": "Shimao Group Holdings Ltd.,", + "pct": 0.0 + }, + { + "name": "Sunac China Holdings Ltd.,", + "pct": 1.0 + }, + { + "name": "Foreign Corporate Bonds", + "pct": 6.9 + }, + { + "name": "Shimao Group Holdings Ltd.", + "pct": 2.0 + }, + { + "name": "Sunac China Holdings Ltd.", + "pct": 6.0 + }, + { + "name": "China (continued) Times China Holdings Ltd.", + "pct": 5.55 + }, + { + "name": "JSC,", + "pct": 9.5 + }, + { + "name": "PLC,", + "pct": 22.0 + }, + { + "name": "Hungary", + "pct": 0.4 + }, + { + "name": "MBH Bank Nyrt", + "pct": 5.25 + }, + { + "name": "Wow Air Hf.", + "pct": 0.0 + }, + { + "name": "India", + "pct": 0.5 + }, + { + "name": "Porteast Investment Pvt Ltd.,", + "pct": 0.0 + }, + { + "name": "Kazakhstan", + "pct": 1.5 + }, + { + "name": "Kaspi.KZ JSC,", + "pct": 6.25 + }, + { + "name": "Mexico", + "pct": 0.0 + }, + { + "name": "Alpha Holding SA de CV", + "pct": 9.0 + }, + { + "name": "Paraguay", + "pct": 0.3 + }, + { + "name": "Value Saint Lucia", + "pct": 0.0 + }, + { + "name": "Digicel International Finance Ltd./DIFL U.S.,", + "pct": 12.0 + }, + { + "name": "Supranational", + "pct": 0.4 + }, + { + "name": "Asian Development Bank,", + "pct": 14.5 + }, + { + "name": "Bank for Reconstruction & Development", + "pct": 17.2 + }, + { + "name": "Tunisia", + "pct": 0.2 + }, + { + "name": "Tunisian Republic,", + "pct": 3.28 + }, + { + "name": "Uzbekistan", + "pct": 1.4 + }, + { + "name": "ATIB,", + "pct": 20.5 + }, + { + "name": "Jscb Agrobank,", + "pct": 9.25 + }, + { + "name": "Uzbek Industrial & Construction Bank ATB", + "pct": 19.95 + }, + { + "name": "Venezuela", + "pct": 1.6 + }, + { + "name": "Insurance Linked Securities", + "pct": 1.6 + }, + { + "name": "Value Reinsurance Side Cars", + "pct": 0.6 + }, + { + "name": "Segregated Account/Funds", + "pct": 1.0 + }, + { + "name": "Loan Participation Notes", + "pct": 0.3 + }, + { + "name": "Value Uzbekistan", + "pct": 0.3 + }, + { + "name": "Senior Floating-Rate Loans", + "pct": 3.3 + }, + { + "name": "Suriname", + "pct": 2.1 + } + ], + "buckets": [ + { + "name": "Other", + "value": 11130037526.0, + "pct": 68.74069461458403 + }, + { + "name": "IG credit / munis", + "value": 3883548887.0, + "pct": 23.98535022352401 + }, + { + "name": "US govt", + "value": 680512560.0, + "pct": 4.20294234939211 + }, + { + "name": "Equity (US)", + "value": 455223324.0, + "pct": 2.8115239884340206 + }, + { + "name": "Fund holdings", + "value": 40732825.0, + "pct": 0.2515717200030484 + }, + { + "name": "Equity (intl)", + "value": 1281885.0, + "pct": 0.007917104062782478 + } + ], + "top": [ + { + "text": "(identified cost $4,835,737,180)", + "value": 4835737180.0, + "cat": "Total Investments" + }, + { + "text": "(identified cost $4,703,265,980)", + "value": 4703265980.0, + "cat": "Net Investments" + }, + { + "text": "(identified cost $3,167,077,385)", + "value": 3167077385.0, + "cat": "Zambia Government International Bonds," + }, + { + "text": "(identified cost $594,867,993)", + "value": 594867993.0, + "cat": "Treasury Obligations" + }, + { + "text": "(proceeds $448,682,933)", + "value": 448682933.0, + "cat": "Senegal Government International Bonds," + }, + { + "text": "(identified cost $343,427,431)", + "value": 343427431.0, + "cat": "Venezuela" + }, + { + "text": "(identified cost $327,096,803)", + "value": 327096803.0, + "cat": "Dated 7/18/25 with an interest rate of" + }, + { + "text": "(identified cost $308,000,793)", + "value": 308000793.0, + "cat": "Vietnam" + }, + { + "text": "(proceeds $221,887,271)", + "value": 221887271.0, + "cat": "Senegal Government International Bonds," + }, + { + "text": "(identified cost $150,534,320)", + "value": 150534320.0, + "cat": "Suriname" + }, + { + "text": "(proceeds $148,935,048)", + "value": 148935048.0, + "cat": "Blue Owl Credit Income Corp.," + }, + { + "text": "(identified cost $110,684,588)", + "value": 110684588.0, + "cat": "Tanzania" + }, + { + "text": "(identified cost $108,022,440)", + "value": 108022440.0, + "cat": "Uruguay" + }, + { + "text": "(identified cost $85,644,567)", + "value": 85644567.0, + "cat": "Treasury Obligations" + }, + { + "text": "(identified cost $74,104,183)", + "value": 74104183.0, + "cat": "Class," + }, + { + "text": "(identified cost $67,750,379)", + "value": 67750379.0, + "cat": "Segregated Account/Funds" + }, + { + "text": "(proceeds $44,748,272)", + "value": 44748272.0, + "cat": "Net Investments" + }, + { + "text": "(identified cost $40,732,825)", + "value": 40732825.0, + "cat": "Unison Trust, Series 2021-1, Class A," + }, + { + "text": "6.853%, due 3/28/54 and a market value, including accrued interest, of $40,541,656 (28)", + "value": 40541656.0, + "cat": "Dated 6/17/25 with an interest rate of" + }, + { + "text": "(proceeds $33,112,342)", + "value": 33112342.0, + "cat": "Blue Owl Credit Income Corp.," + }, + { + "text": "(identified cost $19,884,529)", + "value": 19884529.0, + "cat": "Small Business Administration Loans" + }, + { + "text": "(identified cost $17,472,767)", + "value": 17472767.0, + "cat": "Total Purchased Options" + }, + { + "text": "6.853%, due 3/28/54 and a market value, including accrued interest, of $16,409,627 (28)", + "value": 16409627.0, + "cat": "Dated 7/7/25 with an interest rate of" + }, + { + "text": "6.853%, due 3/28/54 and a market value, including accrued interest, of $16,409,627 (28)", + "value": 16409627.0, + "cat": "Dated 7/31/25 with an interest rate of" + }, + { + "text": "Government International Bonds, 7.75%, due 6/10/31 and a market value, including accrued interest, of $15,374,143 (28)", + "value": 15374143.0, + "cat": "Dated 7/18/25 with an interest rate of" + }, + { + "text": "Bonds, 2.75%, due 5/25/32 and a market value, including accrued interest, of $15,316,718 (28)", + "value": 15316718.0, + "cat": "Dated 7/7/25 with an interest rate of" + }, + { + "text": "7.50%, due 9/20/47 and a market value, including accrued interest, of $14,748,640 (28)", + "value": 14748640.0, + "cat": "Dated 7/7/25 with an interest rate of" + }, + { + "text": "4.875%, due 10/14/44 and a market value, including accrued interest, of $14,177,276 (28)", + "value": 14177276.0, + "cat": "Dated 5/9/25 with an interest rate of" + }, + { + "text": "(identified cost $14,024,310)", + "value": 14024310.0, + "cat": "Uzbekistan" + }, + { + "text": "3.50%, due 9/1/32 and a market value, including accrued interest, of $13,588,389 (28)", + "value": 13588389.0, + "cat": "Dated 6/24/25 with an interest rate of" + }, + { + "text": "5/17/31 and a market value, including accrued interest, of $13,431,351 (28)", + "value": 13431351.0, + "cat": "Dated 5/23/25 with an interest rate of" + }, + { + "text": "5/17/31 and a market value, including accrued interest, of $13,430,471 (28)", + "value": 13430471.0, + "cat": "Dated 6/9/25 with an interest rate of" + }, + { + "text": "4.50%, due 4/1/56 and a market value, including accrued interest, of $13,263,540 (28)", + "value": 13263540.0, + "cat": "Dated 2/24/25 with an interest rate of" + }, + { + "text": "7.75%, due 4/18/35 and a market value, including accrued interest, of $12,715,192 (28)", + "value": 12715192.0, + "cat": "Dated 2/19/25 with an interest rate of" + }, + { + "text": "4.50%, due 4/16/50 and a market value, including accrued interest, of $8,466,516 (28)", + "value": 8466516.0, + "cat": "Dated 3/19/25 with an interest rate of" + }, + { + "text": "7.50%, due 2/12/36 and a market value, including accrued interest, of $8,428,061 (28)", + "value": 8428061.0, + "cat": "Dated 4/17/25 with an interest rate of" + }, + { + "text": "6.853%, due 3/28/54 and a market value, including accrued interest, of $8,204,813 (28)", + "value": 8204813.0, + "cat": "Dated 4/3/25 with an interest rate of" + }, + { + "text": "5.625%, due 5/18/34 and a market value, including accrued interest, of $7,325,380 (28)", + "value": 7325380.0, + "cat": "Dated 12/19/24 with an interest rate of" + }, + { + "text": "3.60%, due 2/2/31 and a market value, including accrued interest, of $7,137,985 (28)", + "value": 7137985.0, + "cat": "Dated 12/19/24 with an interest rate of" + }, + { + "text": "6.00%, due 9/19/44 and a market value, including accrued interest, of $6,841,760 (28)", + "value": 6841760.0, + "cat": "Dated 12/19/24 with an interest rate of" + } + ] +} \ No newline at end of file diff --git a/fundlab/nport_cache/jlpsx.json b/fundlab/nport_cache/jlpsx.json new file mode 100644 index 0000000..c7be043 --- /dev/null +++ b/fundlab/nport_cache/jlpsx.json @@ -0,0 +1,268 @@ +{ + "sym": "jlpsx", + "as_of": "March 31, 2026", + "net_assets": 3246987.0, + "n_positions": 6, + "categories": [ + { + "name": "Long Positions", + "pct": 121.6 + }, + { + "name": "Common Stocks", + "pct": 120.0 + }, + { + "name": "Aerospace & Defense", + "pct": 3.9 + }, + { + "name": "Air Freight & Logistics", + "pct": 0.1 + }, + { + "name": "Automobiles", + "pct": 0.7 + }, + { + "name": "Banks", + "pct": 4.1 + }, + { + "name": "Beverages", + "pct": 0.9 + }, + { + "name": "Biotechnology", + "pct": 3.3 + }, + { + "name": "Broadline Retail", + "pct": 5.1 + }, + { + "name": "Building Products", + "pct": 2.0 + }, + { + "name": "Capital Markets", + "pct": 3.7 + }, + { + "name": "Chemicals", + "pct": 1.5 + }, + { + "name": "Commercial Services & Supplies", + "pct": 0.2 + }, + { + "name": "Communications Equipment", + "pct": 0.3 + }, + { + "name": "Construction Materials", + "pct": 0.4 + }, + { + "name": "Consumer Finance", + "pct": 0.7 + }, + { + "name": "Consumer Staples Distribution & Retail", + "pct": 1.1 + }, + { + "name": "Diversified Telecommunication Services", + "pct": 0.8 + }, + { + "name": "Electric Utilities", + "pct": 4.4 + }, + { + "name": "Electrical Equipment", + "pct": 1.8 + }, + { + "name": "Equipment, Instruments & Components", + "pct": 1.5 + }, + { + "name": "Energy Equipment & Services", + "pct": 0.4 + }, + { + "name": "Entertainment", + "pct": 1.9 + }, + { + "name": "Financial Services", + "pct": 4.4 + }, + { + "name": "Ground Transportation", + "pct": 1.4 + }, + { + "name": "Health Care Equipment & Supplies", + "pct": 1.9 + }, + { + "name": "Health Care Providers & Services", + "pct": 1.3 + }, + { + "name": "Health Care REITs", + "pct": 0.9 + }, + { + "name": "Hotels, Restaurants & Leisure", + "pct": 4.1 + }, + { + "name": "Household Products", + "pct": 0.8 + }, + { + "name": "Industrial Conglomerates", + "pct": 1.2 + }, + { + "name": "Insurance", + "pct": 1.9 + }, + { + "name": "Interactive Media & Services", + "pct": 8.5 + }, + { + "name": "IT Services", + "pct": 0.2 + }, + { + "name": "Life Sciences Tools & Services", + "pct": 1.6 + }, + { + "name": "Machinery", + "pct": 2.3 + }, + { + "name": "Media", + "pct": 0.1 + }, + { + "name": "Multi-Utilities", + "pct": 1.7 + }, + { + "name": "Oil, Gas & Consumable Fuels", + "pct": 4.9 + }, + { + "name": "Passenger Airlines", + "pct": 0.1 + }, + { + "name": "Pharmaceuticals", + "pct": 3.8 + }, + { + "name": "Residential REITs", + "pct": 0.1 + }, + { + "name": "Semiconductors & Semiconductor Equipment", + "pct": 17.8 + }, + { + "name": "Software", + "pct": 8.3 + }, + { + "name": "Specialized REITs", + "pct": 1.3 + }, + { + "name": "Specialty Retail", + "pct": 4.8 + }, + { + "name": "Technology Hardware, Storage & Peripherals", + "pct": 6.7 + }, + { + "name": "Textiles, Apparel & Luxury Goods", + "pct": 0.1 + }, + { + "name": "Tobacco", + "pct": 0.6 + }, + { + "name": "Trading Companies & Distributors", + "pct": 0.4 + }, + { + "name": "Short-Term Investments", + "pct": 1.6 + }, + { + "name": "Investment Companies", + "pct": 1.6 + }, + { + "name": "Prime Money Market Fund Class IM Shares,", + "pct": 3.75 + }, + { + "name": "Amount rounds to less than", + "pct": 0.1 + } + ], + "buckets": [ + { + "name": "Other", + "value": 8058308.0, + "pct": 99.37170577135417 + }, + { + "name": "Fund holdings", + "value": 50950.0, + "pct": 0.6282942286458267 + } + ], + "top": [ + { + "text": "(Cost $2,617,496)", + "value": 2617496.0, + "cat": "Investment Companies" + }, + { + "text": "(Cost $2,566,546)", + "value": 2566546.0, + "cat": "Trading Companies & Distributors" + }, + { + "text": "(Cost $1,918,042)", + "value": 1918042.0, + "cat": "Total Investments" + }, + { + "text": "total value of securities segregated as collateral is $954,198.", + "value": 954198.0, + "cat": "Amount rounds to less than" + }, + { + "text": "JPMorgan Prime Money Market Fund Class IM Shares, 3.75% (b) (c) (Cost $50,950)", + "value": 50950.0, + "cat": "Investment Companies" + }, + { + "text": "Schedule of Portfolio Investments as of March 31, 2026", + "value": 2026.0, + "cat": "" + } + ] +} \ No newline at end of file diff --git a/fundlab/nport_cache/lamhx.json b/fundlab/nport_cache/lamhx.json new file mode 100644 index 0000000..5ecdc85 --- /dev/null +++ b/fundlab/nport_cache/lamhx.json @@ -0,0 +1,98 @@ +{ + "sym": "lamhx", + "as_of": "February 28, 2026", + "net_assets": null, + "n_positions": 1, + "categories": [ + { + "name": "LONG-TERM INVESTMENTS", + "pct": 98.7 + }, + { + "name": "COMMON STOCKS", + "pct": 98.7 + }, + { + "name": "Aerospace & Defense", + "pct": 3.4 + }, + { + "name": "Air Freight & Logistics", + "pct": 0.71 + }, + { + "name": "Banks", + "pct": 6.46 + }, + { + "name": "Beverages", + "pct": 1.76 + }, + { + "name": "Biotechnology", + "pct": 0.91 + }, + { + "name": "Building Products", + "pct": 0.77 + }, + { + "name": "Capital Markets", + "pct": 5.81 + }, + { + "name": "Chemicals", + "pct": 2.89 + }, + { + "name": "Value Commercial Services & Supplies", + "pct": 1.81 + }, + { + "name": "Communications Equipment", + "pct": 1.04 + }, + { + "name": "Construction Materials", + "pct": 1.96 + }, + { + "name": "Consumer Staples Distribution & Retail", + "pct": 3.53 + }, + { + "name": "Utilities", + "pct": 3.69 + }, + { + "name": "Electrical Equipment", + "pct": 0.81 + }, + { + "name": "Financial Services", + "pct": 1.43 + }, + { + "name": "Ground Transportation", + "pct": 1.21 + }, + { + "name": "Health Care Equipment & Supplies", + "pct": 1.82 + } + ], + "buckets": [ + { + "name": "Other", + "value": 2026.0, + "pct": 100.0 + } + ], + "top": [ + { + "text": "For the period ended February 28, 2026", + "value": 2026.0, + "cat": "" + } + ] +} \ No newline at end of file diff --git a/fundlab/nport_cache/lcorx.json b/fundlab/nport_cache/lcorx.json new file mode 100644 index 0000000..5295594 --- /dev/null +++ b/fundlab/nport_cache/lcorx.json @@ -0,0 +1,35 @@ +{ + "sym": "lcorx", + "as_of": "December 31, 2025", + "net_assets": 69463709.0, + "n_positions": 2, + "categories": [ + { + "name": "EXCHANGE TRADED FUNDS", + "pct": 91.7 + }, + { + "name": "Money Market Deposit Account", + "pct": 8.4 + } + ], + "buckets": [ + { + "name": "Fund holdings", + "value": 110547276.0, + "pct": 100.0 + } + ], + "top": [ + { + "text": "TOTAL EXCHANGE TRADED FUNDS (Cost $55,273,638)", + "value": 55273638.0, + "cat": "EXCHANGE TRADED FUNDS" + }, + { + "text": "TOTAL INVESTMENTS - 91.7% ( Cost $55,273,638 )", + "value": 55273638.0, + "cat": "EXCHANGE TRADED FUNDS" + } + ] +} \ No newline at end of file diff --git a/fundlab/nport_cache/lcrix.json b/fundlab/nport_cache/lcrix.json new file mode 100644 index 0000000..054e287 --- /dev/null +++ b/fundlab/nport_cache/lcrix.json @@ -0,0 +1,35 @@ +{ + "sym": "lcrix", + "as_of": "December 31, 2025", + "net_assets": 69463709.0, + "n_positions": 2, + "categories": [ + { + "name": "EXCHANGE TRADED FUNDS", + "pct": 91.7 + }, + { + "name": "Money Market Deposit Account", + "pct": 8.4 + } + ], + "buckets": [ + { + "name": "Fund holdings", + "value": 110547276.0, + "pct": 100.0 + } + ], + "top": [ + { + "text": "TOTAL EXCHANGE TRADED FUNDS (Cost $55,273,638)", + "value": 55273638.0, + "cat": "EXCHANGE TRADED FUNDS" + }, + { + "text": "TOTAL INVESTMENTS - 91.7% ( Cost $55,273,638 )", + "value": 55273638.0, + "cat": "EXCHANGE TRADED FUNDS" + } + ] +} \ No newline at end of file diff --git a/fundlab/nport_cache/mbxix.json b/fundlab/nport_cache/mbxix.json new file mode 100644 index 0000000..7b24dbc --- /dev/null +++ b/fundlab/nport_cache/mbxix.json @@ -0,0 +1,259 @@ +{ + "sym": "mbxix", + "as_of": "September 30, 2024", + "net_assets": 7537652760.0, + "n_positions": 223, + "categories": [ + { + "name": "EXCHANGE-TRADED FUNDS", + "pct": 50.3 + }, + { + "name": "EQUITY", + "pct": 50.3 + }, + { + "name": "U.S. GOVERNMENT & AGENCIES", + "pct": 38.4 + }, + { + "name": "TREASURY NOTES", + "pct": 38.4 + }, + { + "name": "SHORT-TERM INVESTMENTS", + "pct": 7.9 + }, + { + "name": "MONEY MARKET FUNDS", + "pct": 7.9 + }, + { + "name": "American Treasury Obligations Fund, Class X,", + "pct": 4.81 + }, + { + "name": "OTHER ASSETS IN EXCESS OF LIABILITIES", + "pct": 3.4 + } + ], + "buckets": [ + { + "name": "Fund holdings", + "value": 9478197061.0, + "pct": 76.60463621904158 + }, + { + "name": "US govt", + "value": 2894236165.0, + "pct": 23.39178085504241 + }, + { + "name": "Other", + "value": 443311.0, + "pct": 0.0035829259160092435 + } + ], + "top": [ + { + "text": "TOTAL INVESTMENTS - 96.6% (Cost $6,186,216,613)", + "value": 6186216613.0, + "cat": "American Treasury Obligations Fund, Class X," + }, + { + "text": "TOTAL U.S. GOVERNMENT & AGENCIES (Cost $2,894,236,165)", + "value": 2894236165.0, + "cat": "TREASURY NOTES" + }, + { + "text": "TOTAL EXCHANGE-TRADED FUNDS (Cost $2,699,965,147)", + "value": 2699965147.0, + "cat": "EQUITY" + }, + { + "text": "TOTAL SHORT-TERM INVESTMENTS (Cost $592,015,301)", + "value": 592015301.0, + "cat": "American Treasury Obligations Fund, Class X," + }, + { + "text": "03/17/2027", + "value": 2027.0, + "cat": "NET ASSETS" + }, + { + "text": "03/17/2027", + "value": 2027.0, + "cat": "NET ASSETS" + }, + { + "text": "03/16/2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "06/15/2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "09/14/2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "12/15/2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "03/17/2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "06/16/2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "09/15/2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "12/15/2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "03/17/2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "06/16/2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "09/15/2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "12/16/2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "06/16/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "09/15/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "12/15/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "01/01/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "01/01/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "02/28/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "01/30/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "09/16/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "12/16/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "09/16/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "12/16/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "01/01/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "02/03/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "03/03/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "04/01/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "01/13/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "01/30/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "02/27/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "02/21/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "03/21/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "01/22/2025", + "value": 2025.0, + "cat": "NET ASSETS" + }, + { + "text": "01/01/2025", + "value": 2025.0, + "cat": "NET ASSETS" + } + ] +} \ No newline at end of file diff --git a/fundlab/nport_cache/pmaix.json b/fundlab/nport_cache/pmaix.json new file mode 100644 index 0000000..040402e --- /dev/null +++ b/fundlab/nport_cache/pmaix.json @@ -0,0 +1,482 @@ +{ + "sym": "pmaix", + "as_of": "December 31, 2025", + "net_assets": 8096133510.0, + "n_positions": 45, + "categories": [ + { + "name": "UNAFFILIATED ISSUERS", + "pct": 99.5 + }, + { + "name": "Senior Secured Floating Rate Loan Interests", + "pct": 1.9 + }, + { + "name": "Advanced Materials", + "pct": 0.0 + }, + { + "name": "Advertising Sales", + "pct": 0.0 + }, + { + "name": "Outfront Media Capital Corp.), Term Loan,", + "pct": 5.73 + }, + { + "name": "Advertising Services", + "pct": 0.0 + }, + { + "name": "Aerospace & Defense", + "pct": 0.0 + }, + { + "name": "Airlines", + "pct": 0.0 + }, + { + "name": "Applications Software", + "pct": 0.0 + }, + { + "name": "Clearwater Analytics LLC, Initial Term Loan,", + "pct": 6.21 + }, + { + "name": "Auto Parts & Equipment", + "pct": 0.0 + }, + { + "name": "Value Auto Repair Centers", + "pct": 0.0 + }, + { + "name": "Auto-Truck Trailers", + "pct": 0.0 + }, + { + "name": "Batteries/Battery Systems", + "pct": 0.0 + }, + { + "name": "Beverages", + "pct": 0.0 + }, + { + "name": "Building Production", + "pct": 0.1 + }, + { + "name": "Loan,", + "pct": 6.22 + }, + { + "name": "Building-Heavy Construction", + "pct": 0.0 + }, + { + "name": "Cable & Satellite Television", + "pct": 0.1 + }, + { + "name": "Value Casino Services", + "pct": 0.0 + }, + { + "name": "Chemicals-Diversified", + "pct": 0.1 + }, + { + "name": "Chemicals-Specialty", + "pct": 0.1 + }, + { + "name": "Commercial Services", + "pct": 0.1 + }, + { + "name": "Value Computer Services", + "pct": 0.1 + }, + { + "name": "Computer Software", + "pct": 0.0 + }, + { + "name": "Computers-Memory Devices", + "pct": 0.0 + }, + { + "name": "Consulting Services", + "pct": 0.1 + }, + { + "name": "Containers-Metal & Glass", + "pct": 0.0 + }, + { + "name": "Cruise Lines", + "pct": 0.0 + }, + { + "name": "Disposable Medical Products", + "pct": 0.0 + }, + { + "name": "Value Distribution & Wholesale", + "pct": 0.1 + }, + { + "name": "Electric-Generation", + "pct": 0.1 + }, + { + "name": "Electric-Integrated", + "pct": 0.0 + }, + { + "name": "Energy-Alternate Sources", + "pct": 0.0 + }, + { + "name": "Engines", + "pct": 0.0 + }, + { + "name": "Enterprise Software & Services", + "pct": 0.0 + }, + { + "name": "Inc., First Amendment Refinancing Term Loan,", + "pct": 5.84 + }, + { + "name": "Entertainment Software", + "pct": 0.0 + }, + { + "name": "Finance-Investment Banker", + "pct": 0.1 + }, + { + "name": "Jefferies Finance LLC, Initial Term Loan,", + "pct": 6.5 + }, + { + "name": "Finance-Leasing Company", + "pct": 0.0 + }, + { + "name": "Food-Miscellaneous/Diversified", + "pct": 0.0 + }, + { + "name": "Gambling (Non-Hotel)", + "pct": 0.0 + }, + { + "name": "Hotels & Motels", + "pct": 0.0 + }, + { + "name": "Independent Power Producer", + "pct": 0.1 + }, + { + "name": "Insurance Brokers", + "pct": 0.0 + }, + { + "name": "Value Internet Content", + "pct": 0.0 + }, + { + "name": "Internet Gambling", + "pct": 0.1 + }, + { + "name": "Internet Security", + "pct": 0.0 + }, + { + "name": "Investment Management & Advisory Services", + "pct": 0.0 + }, + { + "name": "Lasers-System & Components", + "pct": 0.0 + }, + { + "name": "Medical Diagnostic Imaging", + "pct": 0.0 + }, + { + "name": "Medical Information Systems", + "pct": 0.0 + }, + { + "name": "Value Medical Labs & Testing Services", + "pct": 0.1 + }, + { + "name": "Refinancing Term Loan,", + "pct": 6.34 + }, + { + "name": "Medical-Drugs", + "pct": 0.1 + }, + { + "name": "Medical-Generic Drugs", + "pct": 0.0 + }, + { + "name": "Medical-Hospitals", + "pct": 0.0 + }, + { + "name": "LLC, Super-Priority Tranche B Term Loan,", + "pct": 4.97 + }, + { + "name": "Metal-Aluminum", + "pct": 0.1 + } + ], + "buckets": [ + { + "name": "Other", + "value": 10236101254.0, + "pct": 58.820261855027134 + }, + { + "name": "Fund holdings", + "value": 3661328281.0, + "pct": 21.03928858084314 + }, + { + "name": "Equity (US)", + "value": 2851388429.0, + "pct": 16.3850874353782 + }, + { + "name": "US govt", + "value": 336314818.0, + "pct": 1.9325840151058937 + }, + { + "name": "Agency MBS", + "value": 291926023.0, + "pct": 1.6775102833656157 + }, + { + "name": "Equity (intl)", + "value": 25280000.0, + "pct": 0.1452678302800116 + } + ], + "top": [ + { + "text": "(Cost $8,082,672,261)", + "value": 8082672261.0, + "cat": "TOTAL INVESTMENTS IN UNAFFILIATED ISSUERS" + }, + { + "text": "(Cost $2,650,086,199)", + "value": 2650086199.0, + "cat": "Truck Leasing Co. LP/PTL Finance Corp.," + }, + { + "text": "(Cost $2,028,997,984)", + "value": 2028997984.0, + "cat": "Funding 1 LLC, Series 2025-3A, Class A1," + }, + { + "text": "(Cost $1,107,277,051)", + "value": 1107277051.0, + "cat": "Institutional Shares," + }, + { + "text": "(Cost $863,903,591)", + "value": 863903591.0, + "cat": "Capital Loan Trust, Series 2024-2, Class A," + }, + { + "text": "(Cost $768,426,706)", + "value": 768426706.0, + "cat": "Mortgage Trust, Series 2020-4, Class XA," + }, + { + "text": "(Cost $467,915,134)", + "value": 467915134.0, + "cat": "Obligations" + }, + { + "text": "(Cost $157,694,946)", + "value": 157694946.0, + "cat": "Transportation Services" + }, + { + "text": "to be purchased on 1/2/26 for $150,032,083, collateralized by the following:", + "value": 150032083.0, + "cat": "Bank of America," + }, + { + "text": "to be purchased on 1/2/26 for $150,031,667, collateralized by the following:", + "value": 150031667.0, + "cat": "Bank of America," + }, + { + "text": "to be purchased on 1/2/26 for $144,660,212, collateralized by the following:", + "value": 144660212.0, + "cat": "RBC Dominion Securities Inc.," + }, + { + "text": "$131,238,495, Government National Mortgage Association, 3.00%-7.00%, 3/15/33-12/20/55", + "value": 131238495.0, + "cat": "Bank of America," + }, + { + "text": "(Proceeds $107,351,078)", + "value": 107351078.0, + "cat": "TOTAL INVESTMENTS IN UNAFFILIATED ISSUERS" + }, + { + "text": "$92,908,387, U.S. Treasury Strip Principal, 2/15/42-8/15/50", + "value": 92908387.0, + "cat": "Bank of America," + }, + { + "text": "to be purchased on 1/2/26 for $82,327,514, collateralized by $83,956,200, Government National Mortgage Association, 6.50%, 6/20/54", + "value": 83956200.0, + "cat": "Toronto-Dominion Bank," + }, + { + "text": "$82,129,620, U.S. Treasury Note, 3.38%-4.00%, 4/30/27-9/15/28", + "value": 82129620.0, + "cat": "RBC Dominion Securities Inc.," + }, + { + "text": "$65,423,810, U.S. Treasury Bond, 1.38%-4.25%, 11/15/41-2/15/54,", + "value": 65423810.0, + "cat": "RBC Dominion Securities Inc.," + }, + { + "text": "$60,091,613, U.S. Treasury Strip Coupon, 11/15/32,", + "value": 60091613.0, + "cat": "Bank of America," + }, + { + "text": "to be purchased on 1/2/26 for $56,642,018, collateralized by the following:", + "value": 56642018.0, + "cat": "Scotia Capital Inc.," + }, + { + "text": "to be purchased on 1/2/26 for $32,316,857, collateralized by $32,956,299, U.S. Treasury Note, 4.00%, 11/15/35", + "value": 32956299.0, + "cat": "Toronto-Dominion Bank," + }, + { + "text": "$30,292,585, Federal National Mortgage Association, 3.50%-6.50%, 4/1/40-10/1/55,", + "value": 30292585.0, + "cat": "Scotia Capital Inc.," + }, + { + "text": "(Cost $25,280,000)", + "value": 25280000.0, + "cat": "South Korea" + }, + { + "text": "$24,677,238, Federal Home Loan Mortgage Corporation, 4.00%-6.50%, 7/1/48-11/1/55,", + "value": 24677238.0, + "cat": "Scotia Capital Inc.," + }, + { + "text": "$13,293,624, Federal Home Loan Mortgage Corporation, 4.61%, 6/1/32,", + "value": 13293624.0, + "cat": "Bank of America," + }, + { + "text": "(Cost $13,090,650)", + "value": 13090650.0, + "cat": "Worldwide" + }, + { + "text": "$8,467,881, Federal National Mortgage Association, 3.42%-4.36%, 6/1/28-12/1/55,", + "value": 8467881.0, + "cat": "Bank of America," + }, + { + "text": "$2,805,089, U.S. Treasury Bond, 5.00%, 5/15/45", + "value": 2805089.0, + "cat": "Scotia Capital Inc.," + }, + { + "text": "Investments | December 31, 2025", + "value": 2025.0, + "cat": "" + }, + { + "text": "5/17/2024", + "value": 2024.0, + "cat": "Amount rounds to less than" + }, + { + "text": "5/17/2024", + "value": 2024.0, + "cat": "Amount rounds to less than" + }, + { + "text": "1/6/2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "Gleneagles Re 2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "1/18/2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "5/9/2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "5/13/2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "2/22/2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "3/22/2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "Thopas Re 2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "2/7/2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "7/1/2021", + "value": 2021.0, + "cat": "Amount rounds to less than" + } + ] +} \ No newline at end of file diff --git a/fundlab/nport_cache/pmfkx.json b/fundlab/nport_cache/pmfkx.json new file mode 100644 index 0000000..4f83a6e --- /dev/null +++ b/fundlab/nport_cache/pmfkx.json @@ -0,0 +1,482 @@ +{ + "sym": "pmfkx", + "as_of": "December 31, 2025", + "net_assets": 8096133510.0, + "n_positions": 45, + "categories": [ + { + "name": "UNAFFILIATED ISSUERS", + "pct": 99.5 + }, + { + "name": "Senior Secured Floating Rate Loan Interests", + "pct": 1.9 + }, + { + "name": "Advanced Materials", + "pct": 0.0 + }, + { + "name": "Advertising Sales", + "pct": 0.0 + }, + { + "name": "Outfront Media Capital Corp.), Term Loan,", + "pct": 5.73 + }, + { + "name": "Advertising Services", + "pct": 0.0 + }, + { + "name": "Aerospace & Defense", + "pct": 0.0 + }, + { + "name": "Airlines", + "pct": 0.0 + }, + { + "name": "Applications Software", + "pct": 0.0 + }, + { + "name": "Clearwater Analytics LLC, Initial Term Loan,", + "pct": 6.21 + }, + { + "name": "Auto Parts & Equipment", + "pct": 0.0 + }, + { + "name": "Value Auto Repair Centers", + "pct": 0.0 + }, + { + "name": "Auto-Truck Trailers", + "pct": 0.0 + }, + { + "name": "Batteries/Battery Systems", + "pct": 0.0 + }, + { + "name": "Beverages", + "pct": 0.0 + }, + { + "name": "Building Production", + "pct": 0.1 + }, + { + "name": "Loan,", + "pct": 6.22 + }, + { + "name": "Building-Heavy Construction", + "pct": 0.0 + }, + { + "name": "Cable & Satellite Television", + "pct": 0.1 + }, + { + "name": "Value Casino Services", + "pct": 0.0 + }, + { + "name": "Chemicals-Diversified", + "pct": 0.1 + }, + { + "name": "Chemicals-Specialty", + "pct": 0.1 + }, + { + "name": "Commercial Services", + "pct": 0.1 + }, + { + "name": "Value Computer Services", + "pct": 0.1 + }, + { + "name": "Computer Software", + "pct": 0.0 + }, + { + "name": "Computers-Memory Devices", + "pct": 0.0 + }, + { + "name": "Consulting Services", + "pct": 0.1 + }, + { + "name": "Containers-Metal & Glass", + "pct": 0.0 + }, + { + "name": "Cruise Lines", + "pct": 0.0 + }, + { + "name": "Disposable Medical Products", + "pct": 0.0 + }, + { + "name": "Value Distribution & Wholesale", + "pct": 0.1 + }, + { + "name": "Electric-Generation", + "pct": 0.1 + }, + { + "name": "Electric-Integrated", + "pct": 0.0 + }, + { + "name": "Energy-Alternate Sources", + "pct": 0.0 + }, + { + "name": "Engines", + "pct": 0.0 + }, + { + "name": "Enterprise Software & Services", + "pct": 0.0 + }, + { + "name": "Inc., First Amendment Refinancing Term Loan,", + "pct": 5.84 + }, + { + "name": "Entertainment Software", + "pct": 0.0 + }, + { + "name": "Finance-Investment Banker", + "pct": 0.1 + }, + { + "name": "Jefferies Finance LLC, Initial Term Loan,", + "pct": 6.5 + }, + { + "name": "Finance-Leasing Company", + "pct": 0.0 + }, + { + "name": "Food-Miscellaneous/Diversified", + "pct": 0.0 + }, + { + "name": "Gambling (Non-Hotel)", + "pct": 0.0 + }, + { + "name": "Hotels & Motels", + "pct": 0.0 + }, + { + "name": "Independent Power Producer", + "pct": 0.1 + }, + { + "name": "Insurance Brokers", + "pct": 0.0 + }, + { + "name": "Value Internet Content", + "pct": 0.0 + }, + { + "name": "Internet Gambling", + "pct": 0.1 + }, + { + "name": "Internet Security", + "pct": 0.0 + }, + { + "name": "Investment Management & Advisory Services", + "pct": 0.0 + }, + { + "name": "Lasers-System & Components", + "pct": 0.0 + }, + { + "name": "Medical Diagnostic Imaging", + "pct": 0.0 + }, + { + "name": "Medical Information Systems", + "pct": 0.0 + }, + { + "name": "Value Medical Labs & Testing Services", + "pct": 0.1 + }, + { + "name": "Refinancing Term Loan,", + "pct": 6.34 + }, + { + "name": "Medical-Drugs", + "pct": 0.1 + }, + { + "name": "Medical-Generic Drugs", + "pct": 0.0 + }, + { + "name": "Medical-Hospitals", + "pct": 0.0 + }, + { + "name": "LLC, Super-Priority Tranche B Term Loan,", + "pct": 4.97 + }, + { + "name": "Metal-Aluminum", + "pct": 0.1 + } + ], + "buckets": [ + { + "name": "Other", + "value": 10236101254.0, + "pct": 58.820261855027134 + }, + { + "name": "Fund holdings", + "value": 3661328281.0, + "pct": 21.03928858084314 + }, + { + "name": "Equity (US)", + "value": 2851388429.0, + "pct": 16.3850874353782 + }, + { + "name": "US govt", + "value": 336314818.0, + "pct": 1.9325840151058937 + }, + { + "name": "Agency MBS", + "value": 291926023.0, + "pct": 1.6775102833656157 + }, + { + "name": "Equity (intl)", + "value": 25280000.0, + "pct": 0.1452678302800116 + } + ], + "top": [ + { + "text": "(Cost $8,082,672,261)", + "value": 8082672261.0, + "cat": "TOTAL INVESTMENTS IN UNAFFILIATED ISSUERS" + }, + { + "text": "(Cost $2,650,086,199)", + "value": 2650086199.0, + "cat": "Truck Leasing Co. LP/PTL Finance Corp.," + }, + { + "text": "(Cost $2,028,997,984)", + "value": 2028997984.0, + "cat": "Funding 1 LLC, Series 2025-3A, Class A1," + }, + { + "text": "(Cost $1,107,277,051)", + "value": 1107277051.0, + "cat": "Institutional Shares," + }, + { + "text": "(Cost $863,903,591)", + "value": 863903591.0, + "cat": "Capital Loan Trust, Series 2024-2, Class A," + }, + { + "text": "(Cost $768,426,706)", + "value": 768426706.0, + "cat": "Mortgage Trust, Series 2020-4, Class XA," + }, + { + "text": "(Cost $467,915,134)", + "value": 467915134.0, + "cat": "Obligations" + }, + { + "text": "(Cost $157,694,946)", + "value": 157694946.0, + "cat": "Transportation Services" + }, + { + "text": "to be purchased on 1/2/26 for $150,032,083, collateralized by the following:", + "value": 150032083.0, + "cat": "Bank of America," + }, + { + "text": "to be purchased on 1/2/26 for $150,031,667, collateralized by the following:", + "value": 150031667.0, + "cat": "Bank of America," + }, + { + "text": "to be purchased on 1/2/26 for $144,660,212, collateralized by the following:", + "value": 144660212.0, + "cat": "RBC Dominion Securities Inc.," + }, + { + "text": "$131,238,495, Government National Mortgage Association, 3.00%-7.00%, 3/15/33-12/20/55", + "value": 131238495.0, + "cat": "Bank of America," + }, + { + "text": "(Proceeds $107,351,078)", + "value": 107351078.0, + "cat": "TOTAL INVESTMENTS IN UNAFFILIATED ISSUERS" + }, + { + "text": "$92,908,387, U.S. Treasury Strip Principal, 2/15/42-8/15/50", + "value": 92908387.0, + "cat": "Bank of America," + }, + { + "text": "to be purchased on 1/2/26 for $82,327,514, collateralized by $83,956,200, Government National Mortgage Association, 6.50%, 6/20/54", + "value": 83956200.0, + "cat": "Toronto-Dominion Bank," + }, + { + "text": "$82,129,620, U.S. Treasury Note, 3.38%-4.00%, 4/30/27-9/15/28", + "value": 82129620.0, + "cat": "RBC Dominion Securities Inc.," + }, + { + "text": "$65,423,810, U.S. Treasury Bond, 1.38%-4.25%, 11/15/41-2/15/54,", + "value": 65423810.0, + "cat": "RBC Dominion Securities Inc.," + }, + { + "text": "$60,091,613, U.S. Treasury Strip Coupon, 11/15/32,", + "value": 60091613.0, + "cat": "Bank of America," + }, + { + "text": "to be purchased on 1/2/26 for $56,642,018, collateralized by the following:", + "value": 56642018.0, + "cat": "Scotia Capital Inc.," + }, + { + "text": "to be purchased on 1/2/26 for $32,316,857, collateralized by $32,956,299, U.S. Treasury Note, 4.00%, 11/15/35", + "value": 32956299.0, + "cat": "Toronto-Dominion Bank," + }, + { + "text": "$30,292,585, Federal National Mortgage Association, 3.50%-6.50%, 4/1/40-10/1/55,", + "value": 30292585.0, + "cat": "Scotia Capital Inc.," + }, + { + "text": "(Cost $25,280,000)", + "value": 25280000.0, + "cat": "South Korea" + }, + { + "text": "$24,677,238, Federal Home Loan Mortgage Corporation, 4.00%-6.50%, 7/1/48-11/1/55,", + "value": 24677238.0, + "cat": "Scotia Capital Inc.," + }, + { + "text": "$13,293,624, Federal Home Loan Mortgage Corporation, 4.61%, 6/1/32,", + "value": 13293624.0, + "cat": "Bank of America," + }, + { + "text": "(Cost $13,090,650)", + "value": 13090650.0, + "cat": "Worldwide" + }, + { + "text": "$8,467,881, Federal National Mortgage Association, 3.42%-4.36%, 6/1/28-12/1/55,", + "value": 8467881.0, + "cat": "Bank of America," + }, + { + "text": "$2,805,089, U.S. Treasury Bond, 5.00%, 5/15/45", + "value": 2805089.0, + "cat": "Scotia Capital Inc.," + }, + { + "text": "Investments | December 31, 2025", + "value": 2025.0, + "cat": "" + }, + { + "text": "5/17/2024", + "value": 2024.0, + "cat": "Amount rounds to less than" + }, + { + "text": "5/17/2024", + "value": 2024.0, + "cat": "Amount rounds to less than" + }, + { + "text": "1/6/2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "Gleneagles Re 2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "1/18/2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "5/9/2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "5/13/2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "2/22/2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "3/22/2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "Thopas Re 2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "2/7/2022", + "value": 2022.0, + "cat": "Amount rounds to less than" + }, + { + "text": "7/1/2021", + "value": 2021.0, + "cat": "Amount rounds to less than" + } + ] +} \ No newline at end of file diff --git a/fundlab/nport_cache/pmorx.json b/fundlab/nport_cache/pmorx.json new file mode 100644 index 0000000..47ad673 --- /dev/null +++ b/fundlab/nport_cache/pmorx.json @@ -0,0 +1,186 @@ +{ + "sym": "pmorx", + "as_of": "February 28, 2026", + "net_assets": null, + "n_positions": 0, + "categories": [ + { + "name": "Asset-Backed Securities", + "pct": 7.2 + }, + { + "name": "Capital Markets", + "pct": 0.0 + }, + { + "name": "Financial Services", + "pct": 7.2 + }, + { + "name": "Commercial Mortgage-Backed Securities", + "pct": 26.3 + }, + { + "name": "XA , IO, FRN ,", + "pct": 1.19 + }, + { + "name": "FRN ,", + "pct": 5.08 + }, + { + "name": "AM ,", + "pct": 4.3 + }, + { + "name": "Mortgage-Backed Securities", + "pct": 143.6 + }, + { + "name": "Mortgage Association (FNMA) Fixed Rate", + "pct": 116.7 + }, + { + "name": "Uniform Mortgage-Backed Securities ,", + "pct": 2.5 + }, + { + "name": "Mortgage Association (GNMA) Fixed Rate", + "pct": 26.9 + }, + { + "name": "Year ,", + "pct": 5.5 + }, + { + "name": "Residential Mortgage-Backed Securities", + "pct": 18.9 + }, + { + "name": "Agency Commercial Mortgage-Backed Securities", + "pct": 36.4 + }, + { + "name": "IO,", + "pct": 2.5 + }, + { + "name": "EI , IO,", + "pct": 4.5 + }, + { + "name": "MI , IO,", + "pct": 4.5 + }, + { + "name": "IB , IO,", + "pct": 3.5 + }, + { + "name": "ID , IO,", + "pct": 3.5 + }, + { + "name": "JI , IO,", + "pct": 4.5 + }, + { + "name": "KI , IO,", + "pct": 4.5 + }, + { + "name": "OI , IO,", + "pct": 4.5 + }, + { + "name": "PI , IO,", + "pct": 3.5 + }, + { + "name": "IO, FRN ,", + "pct": 0.7 + }, + { + "name": "BI , IO, FRN ,", + "pct": 1.87 + }, + { + "name": "CI , IO,", + "pct": 2.5 + }, + { + "name": "CI , IO, FRN ,", + "pct": 2.38 + }, + { + "name": "HI , IO, FRN ,", + "pct": 2.71 + }, + { + "name": "IA , IO,", + "pct": 3.5 + }, + { + "name": "IB , IO, FRN ,", + "pct": 2.47 + }, + { + "name": "IK , IO,", + "pct": 5.5 + }, + { + "name": "JI , IO, FRN ,", + "pct": 2.3 + }, + { + "name": "NI , IO,", + "pct": 2.5 + }, + { + "name": "NI , IO, FRN ,", + "pct": 2.58 + }, + { + "name": "TI , IO,", + "pct": 2.5 + }, + { + "name": "UI , IO,", + "pct": 2.5 + }, + { + "name": "Short Term Investments", + "pct": 5.7 + }, + { + "name": "Shares a Management Investment Companies", + "pct": 5.2 + }, + { + "name": "Amount U.S. Government and Agency Securities", + "pct": 0.5 + }, + { + "name": "Treasury Bills ,", + "pct": 3.49 + }, + { + "name": "Rounds to less than", + "pct": 0.1 + }, + { + "name": "SOFR .............. Annual Pay Fixed", + "pct": 3.3 + }, + { + "name": "Receive Fixed", + "pct": 3.45 + }, + { + "name": "SOFR ........................", + "pct": 3.68 + } + ], + "buckets": [], + "top": [] +} \ No newline at end of file diff --git a/fundlab/nport_cache/qspnx.json b/fundlab/nport_cache/qspnx.json new file mode 100644 index 0000000..417ffb8 --- /dev/null +++ b/fundlab/nport_cache/qspnx.json @@ -0,0 +1,453 @@ +{ + "sym": "qspnx", + "as_of": "March 31, 2026", + "net_assets": 28667858.0, + "n_positions": 270, + "categories": [ + { + "name": "LONG POSITIONS", + "pct": 211.3 + }, + { + "name": "COMMON STOCKS", + "pct": 164.0 + }, + { + "name": "Australia", + "pct": 5.1 + }, + { + "name": "Austria", + "pct": 0.0 + }, + { + "name": "Belgium", + "pct": 0.7 + }, + { + "name": "Brazil", + "pct": 0.4 + }, + { + "name": "Burkina Faso", + "pct": 0.0 + }, + { + "name": "Canada", + "pct": 6.2 + }, + { + "name": "Chile", + "pct": 0.0 + }, + { + "name": "China", + "pct": 0.8 + }, + { + "name": "Denmark", + "pct": 1.3 + }, + { + "name": "Finland", + "pct": 1.2 + }, + { + "name": "France", + "pct": 5.0 + }, + { + "name": "Germany", + "pct": 5.0 + }, + { + "name": "Hong Kong", + "pct": 0.7 + }, + { + "name": "Italy", + "pct": 3.6 + }, + { + "name": "Ivory Coast", + "pct": 0.0 + }, + { + "name": "Japan", + "pct": 17.1 + }, + { + "name": "Luxembourg", + "pct": 0.1 + }, + { + "name": "Mexico", + "pct": 0.2 + }, + { + "name": "Netherlands", + "pct": 2.2 + }, + { + "name": "Norway", + "pct": 1.4 + }, + { + "name": "Portugal", + "pct": 0.0 + }, + { + "name": "Singapore", + "pct": 0.6 + }, + { + "name": "South Africa", + "pct": 0.1 + }, + { + "name": "Spain", + "pct": 2.6 + }, + { + "name": "Sweden", + "pct": 2.6 + }, + { + "name": "Switzerland", + "pct": 2.3 + }, + { + "name": "Turkiye", + "pct": 0.0 + }, + { + "name": "United Kingdom", + "pct": 7.2 + }, + { + "name": "United States", + "pct": 97.6 + }, + { + "name": "NO. OF RIGHTS RIGHTS", + "pct": 0.0 + }, + { + "name": "SHARES SHORT-TERM INVESTMENTS", + "pct": 47.0 + }, + { + "name": "INVESTMENT COMPANIES", + "pct": 26.8 + }, + { + "name": "Instruments Fund, Institutional Shares,", + "pct": 3.52 + }, + { + "name": "Limited Purpose Cash Investment Fund,", + "pct": 3.65 + }, + { + "name": "AMOUNT U.S. TREASURY OBLIGATIONS", + "pct": 20.2 + }, + { + "name": "Treasury Bills", + "pct": 3.77 + }, + { + "name": "TREASURY OBLIGATIONS", + "pct": 20.2 + }, + { + "name": "NO. OF CONTRACTS PURCHASED OPTIONS", + "pct": 0.3 + }, + { + "name": "Put Option s", + "pct": 0.3 + }, + { + "name": "Over-the-Counter Equity Index Options", + "pct": 0.3 + }, + { + "name": "NOTIONAL AMOUNT Interest Rate Swaptions", + "pct": 0.0 + }, + { + "name": "Rate Swap, Pays SOFR Quarterly, Receives", + "pct": 3.23 + }, + { + "name": "Quarterly JPMC Exercise Rate", + "pct": 3.23 + }, + { + "name": "TOTAL INVESTMENTS IN SECURITIES AT VALUE", + "pct": 62.2 + }, + { + "name": "OTHER ASSETS IN EXCESS OF LIABILITIES", + "pct": 37.8 + }, + { + "name": "Represents less than", + "pct": 0.05 + }, + { + "name": "SHORT-TERM INVESTMENTS", + "pct": 25.2 + }, + { + "name": "CORRA Semi", + "pct": 3.0 + }, + { + "name": "SOFR Annual", + "pct": 4.0 + }, + { + "name": "SONIA Annual", + "pct": 4.5 + }, + { + "name": "BBR Qtrly", + "pct": 4.0 + }, + { + "name": "NIBOR Semi", + "pct": 5.0 + }, + { + "name": "TONAR Annual", + "pct": 1.5 + }, + { + "name": "BBR Semi", + "pct": 5.0 + }, + { + "name": "EURIBOR Semi", + "pct": 3.0 + }, + { + "name": "SARON Annual", + "pct": 0.0 + }, + { + "name": "STIBOR Qtrly", + "pct": 2.0 + } + ], + "buckets": [ + { + "name": "Other", + "value": 547333.0, + "pct": 100.0 + } + ], + "top": [ + { + "text": "9/17/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "9/17/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "6/12/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "9/17/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "9/17/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "9/17/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "9/17/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "6/18/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "6/18/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "9/17/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "9/17/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "6/12/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "9/11/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "9/11/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "6/18/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "6/18/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "9/17/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "9/17/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "9/17/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "9/17/2036", + "value": 2036.0, + "cat": "" + }, + { + "text": "01/13/2031", + "value": 2031.0, + "cat": "" + }, + { + "text": "03/28/2031", + "value": 2031.0, + "cat": "" + }, + { + "text": "03/28/2031", + "value": 2031.0, + "cat": "" + }, + { + "text": "03/28/2031", + "value": 2031.0, + "cat": "" + }, + { + "text": "04/12/2030", + "value": 2030.0, + "cat": "" + }, + { + "text": "10/11/2030", + "value": 2030.0, + "cat": "" + }, + { + "text": "04/11/2030", + "value": 2030.0, + "cat": "" + }, + { + "text": "6/21/2028", + "value": 2028.0, + "cat": "" + }, + { + "text": "6/21/2028", + "value": 2028.0, + "cat": "" + }, + { + "text": "9/20/2028", + "value": 2028.0, + "cat": "" + }, + { + "text": "9/20/2028", + "value": 2028.0, + "cat": "" + }, + { + "text": "9/20/2028", + "value": 2028.0, + "cat": "" + }, + { + "text": "9/20/2028", + "value": 2028.0, + "cat": "" + }, + { + "text": "6/14/2028", + "value": 2028.0, + "cat": "" + }, + { + "text": "6/14/2028", + "value": 2028.0, + "cat": "" + }, + { + "text": "9/13/2028", + "value": 2028.0, + "cat": "" + }, + { + "text": "9/13/2028", + "value": 2028.0, + "cat": "" + }, + { + "text": "9/20/2028", + "value": 2028.0, + "cat": "" + }, + { + "text": "9/20/2028", + "value": 2028.0, + "cat": "" + }, + { + "text": "6/21/2028", + "value": 2028.0, + "cat": "" + } + ] +} \ No newline at end of file diff --git a/fundlab/nport_cache/svarx.json b/fundlab/nport_cache/svarx.json new file mode 100644 index 0000000..410a0a4 --- /dev/null +++ b/fundlab/nport_cache/svarx.json @@ -0,0 +1,148 @@ +{ + "sym": "svarx", + "as_of": "June 30, 2026", + "net_assets": 163240676.0, + "n_positions": 16, + "categories": [ + { + "name": "OPEN-END FUNDS", + "pct": 62.0 + }, + { + "name": "ALTERNATIVE", + "pct": 10.6 + }, + { + "name": "FIXED INCOME", + "pct": 51.4 + }, + { + "name": "U.S. GOVERNMENT & AGENCIES", + "pct": 16.1 + }, + { + "name": "TREASURY BILLS", + "pct": 16.1 + }, + { + "name": "SHORT-TERM INVESTMENTS", + "pct": 4.7 + }, + { + "name": "MONEY MARKET FUNDS", + "pct": 4.7 + }, + { + "name": "Fidelity Government Portfolio, Class I,", + "pct": 3.52 + }, + { + "name": "OTHER ASSETS IN EXCESS OF LIABILITIES", + "pct": 17.2 + } + ], + "buckets": [ + { + "name": "Cash & T-bills", + "value": 134901611.0, + "pct": 49.93996928288034 + }, + { + "name": "Fund holdings", + "value": 108694365.0, + "pct": 40.23816475640297 + }, + { + "name": "US govt", + "value": 26207246.0, + "pct": 9.701804526477366 + }, + { + "name": "Other", + "value": 324319.0, + "pct": 0.12006143423931734 + } + ], + "top": [ + { + "text": "TOTAL INVESTMENTS - 82.8% (Cost $134,901,611)", + "value": 134901611.0, + "cat": "MONEY MARKET FUNDS" + }, + { + "text": "TOTAL OPEN-END FUNDS (Cost $101,062,099)", + "value": 101062099.0, + "cat": "FIXED INCOME" + }, + { + "text": "TOTAL U.S. GOVERNMENT & AGENCIES (Cost $26,207,246)", + "value": 26207246.0, + "cat": "TREASURY BILLS" + }, + { + "text": "Fidelity Government Portfolio, Class I, 3.52% (Cost $7,632,266) (b)", + "value": 7632266.0, + "cat": "MONEY MARKET FUNDS" + }, + { + "text": "Zero coupon bond; rate disclosed is the effective yield as of June 30,2026", + "value": 302026.0, + "cat": "NET ASSETS" + }, + { + "text": "6/18/2029", + "value": 2029.0, + "cat": "NET ASSETS" + }, + { + "text": "4/27/2027", + "value": 2027.0, + "cat": "NET ASSETS" + }, + { + "text": "4/27/2027", + "value": 2027.0, + "cat": "NET ASSETS" + }, + { + "text": "4/27/2027", + "value": 2027.0, + "cat": "NET ASSETS" + }, + { + "text": "4/27/2027", + "value": 2027.0, + "cat": "NET ASSETS" + }, + { + "text": "June 30, 2026", + "value": 2026.0, + "cat": "" + }, + { + "text": "June 30, 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "Amount at June 30, 2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "6/4/2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "6/30/2026", + "value": 2026.0, + "cat": "NET ASSETS" + }, + { + "text": "4/27/2026", + "value": 2026.0, + "cat": "NET ASSETS" + } + ] +} \ No newline at end of file diff --git a/fundlab/nport_manifest.json b/fundlab/nport_manifest.json new file mode 100644 index 0000000..a127af2 --- /dev/null +++ b/fundlab/nport_manifest.json @@ -0,0 +1,67 @@ +{ + "mbxix": { + "url": "https://www.sec.gov/Archives/edgar/data/0001355064/000175272424272710/catalyst-nqs.htm", + "filed": "2024-11-27" + }, + "atrfx": { + "url": "https://www.sec.gov/Archives/edgar/data/0001355064/000091047226008781/catalyst_combined-nqs.htm", + "filed": "2026-06-01" + }, + "cvsix": { + "url": "https://www.sec.gov/Archives/edgar/data/0000826732/000141036826034378/NPORT_CVXM_73904120_0126.htm", + "filed": "2026-03-31" + }, + "jlpsx": { + "url": "https://www.sec.gov/Archives/edgar/data/0001217286/000207169126012768/JPMUSLCCPF.htm", + "filed": "2026-05-29" + }, + "pmaix": { + "url": "https://www.sec.gov/Archives/edgar/data/0002042316/000094040026007873/AAPI030AMU123125.htm", + "filed": "2026-02-25" + }, + "pmorx": { + "url": "https://www.sec.gov/Archives/edgar/data/0001005942/000207169126008603/PMOF.htm", + "filed": "2026-04-23" + }, + "qspnx": { + "url": "https://www.sec.gov/Archives/edgar/data/1444822/000207169126010957/primary-document.htm", + "filed": "2026-05-22" + }, + "svarx": { + "url": "https://www.sec.gov/Archives/edgar/data/0001556505/000091047226011625/spectrum_nport.htm", + "filed": "2026-08-14" + }, + "cosix": { + "url": "https://www.sec.gov/Archives/edgar/data/0000773757/000141036826076621/NPORT_652000_94123773_0526.htm", + "filed": "2026-07-29" + }, + "eagmx": { + "url": "https://www.sec.gov/Archives/edgar/data/0001493214/000141036825012467/NPORT_FS8A_89608502_0725.htm", + "filed": "2025-09-26" + }, + "lcorx": { + "url": "https://www.sec.gov/Archives/edgar/data/0001511699/000089418926004505/core-etf.htm", + "filed": "2026-02-24" + }, + "lamhx": { + "url": "https://www.sec.gov/Archives/edgar/data/0000887194/000141036826041319/NPORT_FDC7_25625056_0226.htm", + "filed": "2026-04-28" + }, + "pmfkx": { + "url": "https://www.sec.gov/Archives/edgar/data/0002042316/000094040026007873/AAPI030AMU123125.htm", + "filed": "2026-02-25" + }, + "lcrix": { + "url": "https://www.sec.gov/Archives/edgar/data/0001511699/000089418926004505/core-etf.htm", + "filed": "2026-02-24" + }, + "egrsx": { + "url": "https://www.sec.gov/Archives/edgar/data/0001493214/000141036825012467/NPORT_FS8A_89608502_0725.htm", + "filed": "2025-09-26" + }, + "atesx": { + "url": null, + "filed": null, + "note": "No current SOI found via EDGAR FTS (latest Anchor filings cover the Income fund only)" + } +} \ No newline at end of file diff --git a/tests/test_fundlab.py b/tests/test_fundlab.py index 444894e..5828005 100644 --- a/tests/test_fundlab.py +++ b/tests/test_fundlab.py @@ -183,6 +183,62 @@ def test_strategy() -> None: s2 is not None and "investment grade bonds" in s2, repr(s2)) +def test_nport() -> None: + print("nport parser", flush=True) + import fundlab.nport as np + # _CAT: dash / paren / bare-space separators, one & two decimals + check("cat dash sep", np._CAT.search("CORPORATE BONDS - 53.9%") + is not None, "") + m = np._CAT.search("Asset-Backed Securities 7.2%") + check("cat bare-space sep", bool(m) and m.group(2) == "7.2", repr(m)) + m = np._CAT.search("LONG-TERM INVESTMENTS 98.70%") + check("cat two decimals", bool(m) and m.group(2) == "98.70", repr(m)) + # _trim_name: strip a mixed-case table-header run-on, keep title case + check("trim caps tail", np._trim_name("Maturity Fair Value CORPORATE BONDS") + == "CORPORATE BONDS", np._trim_name("Maturity Fair Value CORPORATE BONDS")) + check("trim keeps title-case", np._trim_name("Asset-Backed Securities - Non-Agency") + == "Asset-Backed Securities - Non-Agency", "") + # classify: first-match keyword bucketing + check("classify us equity", np.classify("Apple Inc. 100 $5,000", "") + == "Equity (US)", np.classify("Apple Inc. 100 $5,000", "")) + check("classify mbs", np.classify("GNMA 5.10 03/15/28", "") + == "Agency MBS", "") + check("classify fund", np.classify("Vanguard Total Bond ETF 1,000 $20,000", "") + == "Fund holdings", "") + # find_section: multi-fund stream, pick the right fund's block + filler = ("Alpha Inc. $ 1,000 Beta Corp. $ 2,000 Gamma Ltd. $ 3,000 " * 8) + stream = ("Cover Page. Alpha Fund Schedule of Investments as of January 1, 2026 " + f"COMMON STOCKS - 40.0% Apple Inc. $ 1,000 {filler}" + "Beta Mortgage Opportunities Fund Schedule of Investments as of " + "February 2, 2026 Asset-Backed Securities 7.2% Some Bond $ 4,000 " + f"{filler}Notes to Schedule of Investments.") + sec = np.find_section(stream, ["mortgage", "opportunities"]) + check("find_section locates fund", sec is not None, "") + if sec: + seg = stream[sec[0]:sec[1]] + check("find_section excludes other fund", "Apple Inc." not in seg, + seg) + check("find_section excludes notes", "Notes to" not in seg, seg) + # parse_section end-to-end on a synthetic block + rs = ["Beta Mortgage Opportunities Fund", + "Schedule of Investments as of February 2, 2026", + "Asset-Backed Securities 7.2%", "Some Bond $ 2,000", "Net assets $ 50,000"] + st_ = " ".join(rs) + starts = [] + p = 0 + for r in rs: + starts.append(p) + p += len(r) + 1 + out = np.parse_section(st_, 0, len(st_), rs, starts) + check("parse as_of", out["as_of"] == "February 2, 2026", repr(out["as_of"])) + check("parse category", any(c["name"] == "Asset-Backed Securities" and + c["pct"] == 7.2 for c in out["categories"]), + repr(out["categories"])) + check("parse position", any(p["value"] == 2000 for p in out["positions"]), + repr(out["positions"])) + check("parse net assets", out["net_assets"] == 50000, repr(out["net_assets"])) + + def test_curated() -> None: print("curated", flush=True) import fundlab.fundinfo as fi @@ -202,6 +258,7 @@ def main() -> int: test_text_and_objective() test_classify() test_strategy() + test_nport() test_curated() test_edgar_live() print(f"\n{PASS} passed, {FAIL} failed")