"""Curated longlist of candidate funds for the alpha search. Universe rationale: we cannot meaningfully screen all ~10k registered funds (most are small, illiquid or strategy-unstable and would not deserve portfolio consideration anyway). So the UNIVERSE is curated by reputation — large, liquid, long-tracked funds in the buckets where idiosyncratic alpha lives (market-neutral/quant, multi-strategy, global macro, dynamic TA, dynamic credit/convertibles) — and the SELECTION is data-driven (fundlab/search.py). Tickers are resolved from the fund NAME via Yahoo search with a precision gate; a candidate that cannot be resolved cleanly is dropped, never guessed. The 13-fund shortlist already in funds.json is screened with the same code so the ranking is consistent (qspnx/pmaix are the user's current holdings and act as controls). """ from __future__ import annotations # (fund name as searched, strategy bucket, ticker guess or None) LONGLIST: list[tuple[str, str, str | None]] = [ # --- market-neutral / quant / pure alpha / event-driven ------------ ("AQR Diversified Event-Driven Fund", "event_driven", None), ("Bridgewater Pure Alpha II Fund", "pure_alpha", None), ("Winton Global Quantitative Fund", "cta_quant", None), ("Two Sigma Dynamic Strategy Fund", "systematic", None), ("Brevan Howard Dymon Asia Fund", "macro_relative_value", None), ("Marshall Wace Global Opportunities Fund", "macro_relative_value", None), # --- multi-strategy ------------------------------------------------- ("ExodusPoint Diversified Fund", "multi_strategy", None), ("Verition Dynamic Risk Fund", "multi_strategy", None), ("Millennium Focus Fund", "multi_strategy", None), ("Balyasny Absolute Return Multi-Strategy Fund", "multi_strategy", None), ("Schonfeld Strategic Opportunities Fund", "multi_strategy", None), # --- global macro / risk parity ------------------------------------ # (T. Rowe Price New Global Opportunity: fund terminated - no data) ("Bridgewater All Weather Fund", "risk_parity", None), ("Oak Hill Tactical Allocation Fund", "tactical_allocation", None), # --- multi-asset / dynamic TA open-ends (the accessible alpha pool) - ("Fidelity Multi-Asset Income Fund", "tactical_allocation", None), ("Janus Henderson Global Dynamic Dividend Fund", "dynamic_equity", None), ("Wellington Dynamic Global Diversified Fund", "tactical_allocation", None), ("Lord Abbett Global Opportunities Fund", "tactical_allocation", None), ("BlackRock Multi-Asset Income Fund", "tactical_allocation", None), ("PIMCO Income Strategy Fund", "tactical_allocation", None), ("JPMorgan Diversified Return Fund", "tactical_allocation", None), ("Invesco Diversified Equity and Income Fund", "tactical_allocation", None), ("T. Rowe Price Global Allocation Fund", "tactical_allocation", None), ("Morgan Stanley Global Multi Asset Fund", "tactical_allocation", None), ("Fidelity Diversified Multi-Asset Fund", "tactical_allocation", None), # --- controls: credit (expected to classify as sleeve mix) # (Calamos Dynamic Convertible CCD is a CEF - excluded) ("PIMCO Dynamic Income Fund", "dynamic_credit", None), ] # the 13 unique shortlist funds (share classes resolved once) SHORTLIST = ["atesx", "atrfx", "cvsix", "jlpsx", "pmaix", "pmorx", "qspnx", "svarx", "cosix", "mbxix", "eagmx", "lcorx", "lamhx"] # broad sleeve set used by the screen (same 21 axes for every fund - # nothing is tuned to a specific fund, so selection is comparable) BROAD_SLEEVES = ["qqq", "ivv", "iwm", "vea", "efa", "vwo", "vnq", "bil", "shv", "ief", "tlt", "vblix", "agg", "vweax", "vmbix", "finux", "djp", "gsg", "gld", "fxe", "fxy"] # the user's current portfolio + benchmark mix (settings.json) PORTFOLIO = {"qspnx": 0.5, "pmaix": 0.5} BENCHMARKS = {"spy": 1 / 3, "agg": 1 / 3, "tlt": 1 / 3}