Skip to content

v0.7.0

Choose a tag to compare

@ptu-gh ptu-gh released this 24 Oct 21:03
· 111 commits to main since this release

wealthdb now shows what the holdings earn and how they move with
interest rates. The new yield report gives each holding's income
yield, implied yield and realized yield, its duration and DV01, and a
cash balance against its currency's benchmark, per currency and entity,
as of any day. income gains forward views: what the holdings are
expected to pay, month by month, beside what was received, and cashflow projection sets that income against the household's average outflows to
project the months ahead. A dividend calendar read from the fund
issuers, FINRA, SIX, JPX and the SEC gives each payment the day that
decides who is paid. exposure groups the debt by credit, maturity and
coupon, the stocks by cycle, and everything by issuer. Privacy mode
names every value a person typed by a pseudonym. All of it is on the
command line, over MCP, in the read-only skill and on the dashboards.

Upgrading

  1. Rebuild with make all. Gold migrations 0134 to 0149 apply on the
    first read-write open. Two collectors re-parse their documents on
    their next load: fidelity-web its supplied statements, and svb
    every statement, which runs OCR again on the deposit and mortgage
    statements and takes a while.
  2. Fetch the reference data the reports read.
    • refdata: its silver moves to version 3. Run
      ./collectors/refdata/refdata load --force once to re-read the
      bronze already kept into the new columns, then download --backfill for the facts the wanted list names. sec-nmfp (SEC
      money-market filings, the same terms as the other SEC providers)
      is one more provider to enable in refdata.cfg. To read the
      dividend calendar, also name vanguard beside the issuers and
      finra, six and jpx after sec-edgar. Enabling one accepts
      its source's terms, quoted in the collector's README. finra
      needs a free FINRA Public API credential in
      ~/.secrets/finra.env (FINRA_CLIENT_ID, FINRA_CLIENT_SECRET);
      without it the provider asks FINRA nothing. Then refdata download, refdata load and wealthdb load refdata.
    • fred fetches the Treasury curve beside the exchange rates:
      ./collectors/fred/fred download --lookback 2015-01-01, load,
      then wealthdb load fred.
    • curves, a new collector, fetches the euro and franc curves from
      the ECB and SNB data portals. It needs no key. Add a curves
      silver source to wealthdb.cfg, then ./collectors/curves/curves download --lookback 2015-01-01, load and wealthdb load curves. Enabling it accepts the portals' terms, quoted in its
      README (the SNB's: non-commercial use, with the source named).
  3. Add a yield block to wealthdb.cfg: curves names the series
    per currency and tenor. withholding, rating_funds,
    conventions, cycles, settlement_cycles and horizon_months
    are optional, as is cashflow.projection.lookback_months. Without
    a block the reports still run: a currency with no curve has no
    benchmark and no forward path, and says so.
  4. Describe what no source states, if you want: the declarations
    ledger takes rate, rating, dividend and terms records.
    wealthdb yield coverage -f ndjson prints a skeleton for every
    holding still missing one.
  5. Run wealthdb reload fidelity and wealthdb reload ubs. They link,
    gross and reverse what is already loaded, and book a UBS
    confirmation's function, rates and copies anew. Reload UBS before
    its next incremental load. An installation with the svb sideload
    also runs ./collectors/svb/svb load and wealthdb reload svb: the
    month-end workbook's marks are renamed, and a config or ledger
    entry that named the mark's gold key moves to the new one,
    fidelity-hist:5b9a9118c2681265.
  6. Run a wealthdb load (wealthdb load refdata will do) before
    wealthdb web refresh: the load builds the learned record-day
    gaps. Then wealthdb web refresh and wealthdb mcp restart. The
    refresh fills the yield and projection tables and takes a
    few minutes more.
  7. make demo rebuilds the demo household, which holds every kind the
    reports read and now states a dividend calendar.

Breaking for scripts and config

  • A Schwab fund whose name abbreviates "Fixed Income" ("Fxd Inc",
    "Fixed Inc") reads as fixed income. wealthdb reload schwab applies
    it to the snapshots already loaded.
  • The refdata wanted list is version 3. The collector and the engine
    must come from the same build. refdata holds one credential,
    FINRA's, read from the environment only.
  • -p prints a typed name, key or id as a pseudonym (manual-1,
    cointracking-2, nickname-1, category-1, angellist-1), stable
    within one run or one MCP call. Before, some printed in full and
    others as ***.
  • wealthdb cashflow has a sixth view, projection, and the flags
    --rates, --maturing and --shift. The other views refuse them.
  • exposure credit, maturities, coupons and cycles gain a
    class_share column. exposure --period refuses issuers, as it
    refuses securities and funds.
  • yield coverage gains a payments column and a record_day
    section: stated, derived, learned, lag, none and the
    readings the window drops.
  • The Income dashboard has no Window picker. "Income by month" and
    "Income by account" are retired.
  • MCP refusals of the income and yield tools read as the command
    line's do, and start with the tool's name.
  • The svb sideload's derived mark carries the marker
    derived-workbook-mark and the description ACCOUNT VALUE (WORKBOOK MARK); its gold instrument key changes with the description.

Yield

  • wealthdb yield <view>: global, sources, portfolios and
    accounts, one row per entity and currency with a value-weighted
    total; positions; securities through funds; funds; cash
    against its benchmark; curve, DV01 by tenor and by what holds it;
    and coverage. --converted gives one row per entity, --period a
    series. See wealthdb/docs/YIELD.md.
  • A bond's yield, duration and DV01 come from its terms: coupon,
    maturity, frequency, call and rating, read from its source, its
    statement, its description, OpenFIGI and the market's convention.
    Bills, zeros, callable and floating notes, term deposits, tiered
    savings, money-market funds, bond and equity funds, stocks and
    mortgages each read the figures that fit them.
  • A cash rate is the one its bank states (UBS, Raiffeisen, VIAC,
    Plaid), else a ledger record's. A stock's dividend is a ledger
    record's, else its last payment at its frequency, else its filings'.
    A payment counts per share of what its account held on the record
    day, in today's units after a split or a depositary ratio change. A
    special dividend stays out of the rate. A payer twice a year pays its
    interim and its final, and reads its one rate once a year, tagged
    partial, where the other half has no rate.
  • A dividend meets its holding under every id the source or the config
    gives the instrument. A security held at several sources pools its
    income and days. A bank's trades booked on a cash account move the
    holding of their portfolio.
  • A fund's kind follows what it holds: filed rate risk or mostly debt
    makes a bond fund, whatever the broker calls it. A floating-rate
    fund floats: it resets with the curve and moves with --shift and
    --rates forward. A multi-asset fund has its rate risk measured as a
    bond fund's and its income as an equity fund's. DV01 lands on the
    currency of the rate it moves with.
  • Realized yield divides the year's income by the mean daily balance.
    A position's is its security's, over every account, on the days
    held, and reads partial where that is less than the year. A
    balance that is thin most of the year reads no figure and the tag
    thin. A holding that rounds to no cent has no row.
  • A floating rate never earns below zero, in the projection, under a
    rate path or a shift, and on the dashboards. A balance a bank
    charges for reads nothing, not a charge.
  • A quality column says what each figure rests on, and coverage
    what is still missing. -p hides amounts and ids.

Income

  • wealthdb income projection, calendar, sources, portfolios,
    accounts and positions put the expected income beside what was
    received, over last year, this year or the coming months: interest,
    coupons, dividends, distributions, rent and pensions, and maturing
    principal on request. income positions lists each holding's
    expected payments, so it sums to income projection.
  • --rates constant|forward holds today's rates or follows the forward
    curve, --maturing cash|idle|roll says what principal does at
    maturity, and --shift moves every floating rate. The withholding
    table gives what is withheld at source.
  • A distribution's frequency counts the months of the calendar paid per
    month held. Two halves of a payer twice a year read as such; a fund
    held under a year reads its stated or trailing yield; a quarterly
    floating fund pays on its own days.

Dividend calendar

  • refdata reads each held fund's distributions from its issuer:
    iShares (US and Swiss sites), SPDR (US and EMEA), Invesco (US, and
    UCITS from run to run), Xtrackers, Amundi and Vanguard (US). It reads
    an OTC depositary receipt's dividends from FINRA's OTC Daily List, a
    Swiss share's from SIX, a Japanese share's from JPX's ex-rights list,
    and the dividend dates a US company's filings tag from EDGAR. The
    EDGAR reader parses a filing's inline XBRL documents only.
  • FINRA asks only the receipts held, only the fields it reads and only
    the days after the newest event it has. It keeps a tally of each
    month's bytes and stops before 8 GB of the 10 GB cap. login --check
    prints it.
  • A payment rates on what was held as its ex day began, where the
    calendar dates it, so a trade near the record day no longer drops
    the reading. A record day derives from an ex day by the market's
    settlement cycle, set in yield.settlement_cycles with built-in
    defaults. Hong Kong derives none.
  • A payment with no record day from the calendar takes one from its
    issuer's gap: the median business days from record day to pay day
    over the distributions the calendar states for it. A company's share
    classes learn together; a fund with no gap of its own takes the gap
    of its market's funds. The rest reads its market's lag. yield coverage counts each payment's record day by its source.

Cash flow

  • wealthdb cashflow projection [FROM [TO]] [--period P] [--rates R] [--maturing M] [--shift BP] projects whole months from next month
    on. It is a projection from today's holdings and the past months,
    not a plan.
    Each row has the investment income and the principal the income
    projection expects, the other income, the operating outflows and the
    vehicles' flows as monthly averages of the trailing months, the debt
    service, the net and what each part rests on. See
    wealthdb/docs/CASHFLOW.md.
  • The investment income and the principal are the income projection's
    on the cash pool's accounts. What it expects on any other account (a
    vehicle's, a giving account's, or one cashflow.accounts excludes)
    is vehicles_income, which stays there and is not in the net. The
    three sum to wealthdb income projection's expected and principal,
    to the cent. The outflows are cashflow summary's over the
    look-back, spread evenly. A mortgage's instalment continues to its
    maturity where its terms state one, and through the window where
    they do not.
  • A mortgage's end follows its own cadence: the median gap between its
    reports, a month for one reported once. Reported monthly beside a
    nightly feed, it no longer reads as repaid between its own reports.

Exposure

  • Five more views look every fund through: credit (AAA to B,
    unrated, investment grade against high yield), maturities,
    coupons (fixed, floating, inflation-linked, zero), cycles
    (cyclical, sensitive, defensive) and issuers (stock, bonds and
    deposits together, largest first). Each sums to net worth, and the
    first four also give each bucket's share of its class.

Reference data

  • N-PORT filings give a fund's rate and credit-spread sensitivities and
    each debt line's flags. A new sec-nmfp provider reads money-market
    funds' seven-day yields and maturities. EDGAR gives each company's
    earnings and dividends by period.
  • iShares, SPDR, Invesco and Xtrackers fund pages give a held fund's
    duration, yields and credit and maturity breakdowns. An issuer's
    holdings file gives each bond line's duration and yield where it
    states them. Only an ETF or a fund wants fund characteristics; a load
    re-reads each kind of reference over its own span; a US fund known
    by its ISIN alone finds its SEC series through OpenFIGI.

Privacy

  • -p hides every name a person typed: a typed account or portfolio
    name, a nickname, an id that holds typed words, a manual holding's
    name and key, a manual transaction id, a config category, an
    AngelList account's id. Each prints as a pseudonym, so rows stay
    apart. Public names stay as they are.

Dashboards

  • A Yield dashboard: the yields, projected income, yield by currency,
    cash against its benchmark, yield against duration, DV01 along each
    currency's curve tenor by tenor, and the yields over time, with a
    privacy twin.
  • Income: the Time range picks what was received, the Horizon what is
    expected; Withholding reads the tax booked, and the withholding
    table's model where one exists, and says "received" in its title
    where none does. The tiles and cards follow one order, and the
    privacy twin mirrors it.
  • Exposure gains four cards: "Debt by credit rating, share of debt and
    cash", "Debt by maturity", "Debt by coupon kind" and "Public equity
    by cycle". Each shows its class as 100, with a description of what
    it counts. A share under 0.01% leaves the bars and stays in the
    table.
  • Allocation gains "Top 100 issuers" below the top positions: the
    hundred largest issuers of the whole book, a company's stock, bonds
    and deposits in one row, as of the dashboard's day.
  • Cash Flow gains a projection section: the cash flow projection by
    month and as a table, under the Horizon, Rate path, Maturing and
    Shift pickers. The vehicles' income is a line of its own. The
    privacy twin shows each part as a share of all the expected income.

MCP and skill

  • A yield tool with the command's views; the income tool takes the
    forward views and their assumptions; the cashflow tool takes the
    cash flow projection. The read-only skill has recipes for all
    three.
  • The gains tool's views without a window read their own default
    window again, not the income projection's forward one.

Collectors and the engine

  • Every report at a date reads each account from its own newest
    snapshot, and an account's last observation ends one and a half of
    its own cadences after it, so a quarterly account no longer drops
    out between its statements. The one-year horizon stays the backstop.
  • Fidelity statement rows that named no security take the key their
    security trades under: the ticker they print, else the name.
  • A UBS dividend names its security, by its confirmation, its valor or
    its ticker; where the confirmation or the export row states the
    gross, the dividend reads the gross, and the tax withheld is its own
    row. A cancelled or reversed confirmation books nothing; a cash leg
    folds its export copy; each reversal takes back its own credit.
  • The svb sideload names its month-end workbook and its derived marks
    for the data they hold.

Demo

  • The household holds callable, zero and floating bonds, a ladder of
    discount notes, a money-market fund, a term deposit, tiered savings,
    a rating-sliced fund, the ledger's yield records and a dividend
    calendar, so every view and card has figures.

Getting started

  • The README has a yield quickstart. YIELD.md shows a worked
    withholding table and how to start the ledger from yield coverage -f ndjson. refdata's README says how to turn on the dividend
    calendar.