232 lines
15 KiB
Text
232 lines
15 KiB
Text
#!srfv1
|
|
# Underlying-fund weights for each plan portfolio, by era.
|
|
#
|
|
# GENERATED by tools/gen_model.py from the Plan Disclosure Booklet. Regenerate
|
|
# rather than hand-editing the projected rows; 21 eras is too many to retype
|
|
# reliably. Hand edits to the `fitted` rows are fine, but keep them in sync.
|
|
#
|
|
# These portfolios are unitized fund-of-funds trusts, not mutual funds. The Plan
|
|
# Disclosure Booklet is explicit that they "reflect changes in value from income
|
|
# and gains and losses on the sale of the Underlying Funds solely by increasing
|
|
# or decreasing their Unit Value" -- all income compounds into the unit value and
|
|
# nothing is distributed. That is why the reconstruction uses each underlying
|
|
# fund's dividend-adjusted (total-return) close, not its raw NAV.
|
|
#
|
|
# Source of the weights: the Plan Disclosure Booklet allocation tables at
|
|
# https://marcom.vestwell.com/program-description/oregon-college.html
|
|
# Corroborated for the current era by two live JSON endpoints that agree exactly:
|
|
# https://vss-api.vestwell.com/plans/oregon-college/portfolios (array form)
|
|
# https://vss-api.vestwell.com/plans/oregon-college (object form)
|
|
#
|
|
# `era_start` is inclusive: a weight row applies to every trading day >= its
|
|
# era_start, until superseded by a later era for the same symbol.
|
|
#
|
|
# `basis` records how much a row is worth trusting:
|
|
# fitted In effect now or in the past, and validated -- the reconstruction
|
|
# reproduces every observed anchor to within 0.08% using it.
|
|
# projected Not yet in effect. Read off the booklet forward table, so it is
|
|
# the plan's published intent, NOT an observed fact. The booklet
|
|
# reserves the right to "change the asset allocations ... and change
|
|
# the selection of Underlying Funds", so confirm before relying on
|
|
# one. `verify` flags any projected era that has become current.
|
|
#
|
|
# NOTE ON FEES: no fee or drag term appears here, and none is needed. The
|
|
# reconstruction pins the series at both ends of every anchor gap and distributes
|
|
# the residual geometrically, which absorbs the asset-based fee, cash drag,
|
|
# trade-date lag and securities-lending income together. `verify` reports the
|
|
# drag each gap implies, as a cross-check against the booklet's published cost
|
|
# table ($23.40 per $10,000/yr = 0.234% for ORCBI, $23.91 = 0.239% for ORC42).
|
|
|
|
# ORCBI -- "Balanced Index", a STATIC portfolio. The booklet: "Static Portfolio
|
|
# investments remain fixed, subject to periodic rebalancing". No glidepath, so
|
|
# one era covers its whole life. These weights change only by Board action.
|
|
symbol::ORCBI,era_start::2018-09-01,basis::fitted,ticker::VSMPX,weight:num:36
|
|
symbol::ORCBI,era_start::2018-09-01,basis::fitted,ticker::VTPSX,weight:num:24
|
|
symbol::ORCBI,era_start::2018-09-01,basis::fitted,ticker::VBMPX,weight:num:40
|
|
|
|
# ORC42 -- "College Enrollment Year 2042", a GLIDEPATH portfolio.
|
|
#
|
|
# The booklet publishes a full cross-section of every enrollment-year portfolio
|
|
# as of 2026-07-01. Because all of them follow one glidepath keyed on
|
|
# years-to-enrollment, that cross-section IS ORC42's forward path shifted in
|
|
# time: ORC42 in calendar year Y holds what enrollment-year row E = 4068 - Y
|
|
# holds today. Y=2026 gives E=2042, which matches ORC42's fitted current era, so
|
|
# the mapping checks out against observed data at the one point where it can.
|
|
#
|
|
# Two approximations in the projected rows:
|
|
# 1. The booklet table is annual, but the booklet also says allocations step
|
|
# QUARTERLY. So each projected era is up to three quarters coarse, and the
|
|
# intermediate quarterly steps are not published anywhere.
|
|
# 2. Era boundaries sit on 1 January. The current boundary was fitted to
|
|
# 2026-01-01 by grid search over quarter boundaries; every candidate from
|
|
# 2025-10-01 to 2026-04-01 gives rms <= 0.041%, so the fit cannot resolve
|
|
# it better than that.
|
|
#
|
|
# Neither approximation matters much. Future eras cannot affect a reconstruction
|
|
# that stops at today, and once daily feed values are appended to anchors.srf
|
|
# every gap is one session, where pinning makes the weights literally inert (see
|
|
# the test "weights are inert when anchors are one session apart"). They are
|
|
# prefilled so the model degrades gracefully instead of silently using 2026
|
|
# weights in 2035 if forward recording ever lapses.
|
|
#
|
|
# Era 1 is the booklet's max-equity plateau (its 2043/2044/2045 rows). ORC42
|
|
# launched 19 years out from enrollment, so it sat on the plateau from
|
|
# inception.
|
|
symbol::ORC42,era_start::2023-07-01,basis::fitted,ticker::VSMPX,weight:num:54
|
|
symbol::ORC42,era_start::2023-07-01,basis::fitted,ticker::VTPSX,weight:num:36
|
|
symbol::ORC42,era_start::2023-07-01,basis::fitted,ticker::VIPIX,weight:num:1.67
|
|
symbol::ORC42,era_start::2023-07-01,basis::fitted,ticker::VBMPX,weight:num:6.66
|
|
symbol::ORC42,era_start::2023-07-01,basis::fitted,ticker::VTIFX,weight:num:1.67
|
|
|
|
# Era 2 is the booklet current 2042 row. Validated: the reconstruction
|
|
# reproduces all nine ORC42 anchors to within 0.06% using it.
|
|
symbol::ORC42,era_start::2026-01-01,basis::fitted,ticker::VSMPX,weight:num:52.8
|
|
symbol::ORC42,era_start::2026-01-01,basis::fitted,ticker::VTPSX,weight:num:35.2
|
|
symbol::ORC42,era_start::2026-01-01,basis::fitted,ticker::VIPIX,weight:num:2
|
|
symbol::ORC42,era_start::2026-01-01,basis::fitted,ticker::VBMPX,weight:num:8
|
|
symbol::ORC42,era_start::2026-01-01,basis::fitted,ticker::VTIFX,weight:num:2
|
|
|
|
# Projected: calendar 2027 takes the booklet enrollment-year 2041 row.
|
|
symbol::ORC42,era_start::2027-01-01,basis::projected,ticker::VSMPX,weight:num:51.6
|
|
symbol::ORC42,era_start::2027-01-01,basis::projected,ticker::VTPSX,weight:num:34.4
|
|
symbol::ORC42,era_start::2027-01-01,basis::projected,ticker::VIPIX,weight:num:2.33
|
|
symbol::ORC42,era_start::2027-01-01,basis::projected,ticker::VBMPX,weight:num:9.34
|
|
symbol::ORC42,era_start::2027-01-01,basis::projected,ticker::VTIFX,weight:num:2.33
|
|
|
|
# Projected: calendar 2028 takes the booklet enrollment-year 2040 row.
|
|
symbol::ORC42,era_start::2028-01-01,basis::projected,ticker::VSMPX,weight:num:49.8
|
|
symbol::ORC42,era_start::2028-01-01,basis::projected,ticker::VTPSX,weight:num:33.2
|
|
symbol::ORC42,era_start::2028-01-01,basis::projected,ticker::VIPIX,weight:num:2.83
|
|
symbol::ORC42,era_start::2028-01-01,basis::projected,ticker::VBMPX,weight:num:11.34
|
|
symbol::ORC42,era_start::2028-01-01,basis::projected,ticker::VTIFX,weight:num:2.83
|
|
|
|
# Projected: calendar 2029 takes the booklet enrollment-year 2039 row.
|
|
symbol::ORC42,era_start::2029-01-01,basis::projected,ticker::VSMPX,weight:num:48
|
|
symbol::ORC42,era_start::2029-01-01,basis::projected,ticker::VTPSX,weight:num:32
|
|
symbol::ORC42,era_start::2029-01-01,basis::projected,ticker::VIPIX,weight:num:3.33
|
|
symbol::ORC42,era_start::2029-01-01,basis::projected,ticker::VBMPX,weight:num:13.34
|
|
symbol::ORC42,era_start::2029-01-01,basis::projected,ticker::VTIFX,weight:num:3.33
|
|
|
|
# Projected: calendar 2030 takes the booklet enrollment-year 2038 row.
|
|
symbol::ORC42,era_start::2030-01-01,basis::projected,ticker::VSMPX,weight:num:45.6
|
|
symbol::ORC42,era_start::2030-01-01,basis::projected,ticker::VTPSX,weight:num:30.4
|
|
symbol::ORC42,era_start::2030-01-01,basis::projected,ticker::VIPIX,weight:num:4
|
|
symbol::ORC42,era_start::2030-01-01,basis::projected,ticker::VBMPX,weight:num:16
|
|
symbol::ORC42,era_start::2030-01-01,basis::projected,ticker::VTIFX,weight:num:4
|
|
|
|
# Projected: calendar 2031 takes the booklet enrollment-year 2037 row.
|
|
symbol::ORC42,era_start::2031-01-01,basis::projected,ticker::VSMPX,weight:num:43.2
|
|
symbol::ORC42,era_start::2031-01-01,basis::projected,ticker::VTPSX,weight:num:28.8
|
|
symbol::ORC42,era_start::2031-01-01,basis::projected,ticker::VIPIX,weight:num:4.67
|
|
symbol::ORC42,era_start::2031-01-01,basis::projected,ticker::VBMPX,weight:num:18.66
|
|
symbol::ORC42,era_start::2031-01-01,basis::projected,ticker::VTIFX,weight:num:4.67
|
|
|
|
# Projected: calendar 2032 takes the booklet enrollment-year 2036 row.
|
|
symbol::ORC42,era_start::2032-01-01,basis::projected,ticker::VSMPX,weight:num:41.16
|
|
symbol::ORC42,era_start::2032-01-01,basis::projected,ticker::VTPSX,weight:num:27.44
|
|
symbol::ORC42,era_start::2032-01-01,basis::projected,ticker::VIPIX,weight:num:5.23
|
|
symbol::ORC42,era_start::2032-01-01,basis::projected,ticker::VBMPX,weight:num:20.94
|
|
symbol::ORC42,era_start::2032-01-01,basis::projected,ticker::VTIFX,weight:num:5.23
|
|
|
|
# Projected: calendar 2033 takes the booklet enrollment-year 2035 row.
|
|
symbol::ORC42,era_start::2033-01-01,basis::projected,ticker::VSMPX,weight:num:39.12
|
|
symbol::ORC42,era_start::2033-01-01,basis::projected,ticker::VTPSX,weight:num:26.08
|
|
symbol::ORC42,era_start::2033-01-01,basis::projected,ticker::VIPIX,weight:num:5.8
|
|
symbol::ORC42,era_start::2033-01-01,basis::projected,ticker::VBMPX,weight:num:23.2
|
|
symbol::ORC42,era_start::2033-01-01,basis::projected,ticker::VTIFX,weight:num:5.8
|
|
|
|
# Projected: calendar 2034 takes the booklet enrollment-year 2034 row.
|
|
symbol::ORC42,era_start::2034-01-01,basis::projected,ticker::VSMPX,weight:num:37.2
|
|
symbol::ORC42,era_start::2034-01-01,basis::projected,ticker::VTPSX,weight:num:24.8
|
|
symbol::ORC42,era_start::2034-01-01,basis::projected,ticker::VIPIX,weight:num:6.33
|
|
symbol::ORC42,era_start::2034-01-01,basis::projected,ticker::VBMPX,weight:num:25.34
|
|
symbol::ORC42,era_start::2034-01-01,basis::projected,ticker::VTIFX,weight:num:6.33
|
|
|
|
# Projected: calendar 2035 takes the booklet enrollment-year 2033 row.
|
|
symbol::ORC42,era_start::2035-01-01,basis::projected,ticker::VSMPX,weight:num:34.2
|
|
symbol::ORC42,era_start::2035-01-01,basis::projected,ticker::VTPSX,weight:num:22.8
|
|
symbol::ORC42,era_start::2035-01-01,basis::projected,ticker::VIPIX,weight:num:7.17
|
|
symbol::ORC42,era_start::2035-01-01,basis::projected,ticker::VBMPX,weight:num:28.66
|
|
symbol::ORC42,era_start::2035-01-01,basis::projected,ticker::VTIFX,weight:num:7.17
|
|
|
|
# Projected: calendar 2036 takes the booklet enrollment-year 2032 row.
|
|
symbol::ORC42,era_start::2036-01-01,basis::projected,ticker::VSMPX,weight:num:31.2
|
|
symbol::ORC42,era_start::2036-01-01,basis::projected,ticker::VTPSX,weight:num:20.8
|
|
symbol::ORC42,era_start::2036-01-01,basis::projected,ticker::VIPIX,weight:num:8
|
|
symbol::ORC42,era_start::2036-01-01,basis::projected,ticker::VBMPX,weight:num:32
|
|
symbol::ORC42,era_start::2036-01-01,basis::projected,ticker::VTIFX,weight:num:8
|
|
|
|
# Projected: calendar 2037 takes the booklet enrollment-year 2031 row.
|
|
symbol::ORC42,era_start::2037-01-01,basis::projected,ticker::VSMPX,weight:num:28.2
|
|
symbol::ORC42,era_start::2037-01-01,basis::projected,ticker::VTPSX,weight:num:18.8
|
|
symbol::ORC42,era_start::2037-01-01,basis::projected,ticker::VIPIX,weight:num:8.83
|
|
symbol::ORC42,era_start::2037-01-01,basis::projected,ticker::VBMPX,weight:num:35.34
|
|
symbol::ORC42,era_start::2037-01-01,basis::projected,ticker::VTIFX,weight:num:8.83
|
|
|
|
# Projected: calendar 2038 takes the booklet enrollment-year 2030 row.
|
|
symbol::ORC42,era_start::2038-01-01,basis::projected,ticker::VSMPX,weight:num:24.8
|
|
symbol::ORC42,era_start::2038-01-01,basis::projected,ticker::VTPSX,weight:num:16.53
|
|
symbol::ORC42,era_start::2038-01-01,basis::projected,ticker::VIPIX,weight:num:7.61
|
|
symbol::ORC42,era_start::2038-01-01,basis::projected,ticker::VBMPX,weight:num:30.45
|
|
symbol::ORC42,era_start::2038-01-01,basis::projected,ticker::VTIFX,weight:num:7.61
|
|
symbol::ORC42,era_start::2038-01-01,basis::projected,ticker::VBIPX,weight:num:7.5
|
|
symbol::ORC42,era_start::2038-01-01,basis::projected,ticker::VTSPX,weight:num:5.5
|
|
|
|
# Projected: calendar 2039 takes the booklet enrollment-year 2029 row.
|
|
symbol::ORC42,era_start::2039-01-01,basis::projected,ticker::VSMPX,weight:num:20.3
|
|
symbol::ORC42,era_start::2039-01-01,basis::projected,ticker::VTPSX,weight:num:13.53
|
|
symbol::ORC42,era_start::2039-01-01,basis::projected,ticker::VIPIX,weight:num:5.78
|
|
symbol::ORC42,era_start::2039-01-01,basis::projected,ticker::VBMPX,weight:num:23.11
|
|
symbol::ORC42,era_start::2039-01-01,basis::projected,ticker::VTIFX,weight:num:5.78
|
|
symbol::ORC42,era_start::2039-01-01,basis::projected,ticker::VBIPX,weight:num:20.5
|
|
symbol::ORC42,era_start::2039-01-01,basis::projected,ticker::VTSPX,weight:num:11
|
|
|
|
# Projected: calendar 2040 takes the booklet enrollment-year 2028 row.
|
|
symbol::ORC42,era_start::2040-01-01,basis::projected,ticker::VSMPX,weight:num:15
|
|
symbol::ORC42,era_start::2040-01-01,basis::projected,ticker::VTPSX,weight:num:10
|
|
symbol::ORC42,era_start::2040-01-01,basis::projected,ticker::VIPIX,weight:num:3.33
|
|
symbol::ORC42,era_start::2040-01-01,basis::projected,ticker::VBMPX,weight:num:13.34
|
|
symbol::ORC42,era_start::2040-01-01,basis::projected,ticker::VTIFX,weight:num:3.33
|
|
symbol::ORC42,era_start::2040-01-01,basis::projected,ticker::VBIPX,weight:num:35
|
|
symbol::ORC42,era_start::2040-01-01,basis::projected,ticker::VTSPX,weight:num:20
|
|
|
|
# Projected: calendar 2041 takes the booklet enrollment-year 2027 row.
|
|
symbol::ORC42,era_start::2041-01-01,basis::projected,ticker::VSMPX,weight:num:10.5
|
|
symbol::ORC42,era_start::2041-01-01,basis::projected,ticker::VTPSX,weight:num:7
|
|
symbol::ORC42,era_start::2041-01-01,basis::projected,ticker::VIPIX,weight:num:0.33
|
|
symbol::ORC42,era_start::2041-01-01,basis::projected,ticker::VBMPX,weight:num:1.34
|
|
symbol::ORC42,era_start::2041-01-01,basis::projected,ticker::VTIFX,weight:num:0.33
|
|
symbol::ORC42,era_start::2041-01-01,basis::projected,ticker::VBIPX,weight:num:50
|
|
symbol::ORC42,era_start::2041-01-01,basis::projected,ticker::VTSPX,weight:num:30.5
|
|
|
|
# Projected: calendar 2042 takes the booklet enrollment-year 2026 row.
|
|
symbol::ORC42,era_start::2042-01-01,basis::projected,ticker::VSMPX,weight:num:6
|
|
symbol::ORC42,era_start::2042-01-01,basis::projected,ticker::VTPSX,weight:num:4
|
|
symbol::ORC42,era_start::2042-01-01,basis::projected,ticker::VBIPX,weight:num:30
|
|
symbol::ORC42,era_start::2042-01-01,basis::projected,ticker::VTSPX,weight:num:30
|
|
symbol::ORC42,era_start::2042-01-01,basis::projected,ticker::VUSXX,weight:num:30
|
|
|
|
# Projected: calendar 2043 takes the booklet enrollment-year 2025 row.
|
|
symbol::ORC42,era_start::2043-01-01,basis::projected,ticker::VSMPX,weight:num:3
|
|
symbol::ORC42,era_start::2043-01-01,basis::projected,ticker::VTPSX,weight:num:2
|
|
symbol::ORC42,era_start::2043-01-01,basis::projected,ticker::VBIPX,weight:num:23
|
|
symbol::ORC42,era_start::2043-01-01,basis::projected,ticker::VTSPX,weight:num:23
|
|
symbol::ORC42,era_start::2043-01-01,basis::projected,ticker::VUSXX,weight:num:49
|
|
|
|
# Projected: calendar 2044 takes the booklet enrollment-year 2024 row.
|
|
symbol::ORC42,era_start::2044-01-01,basis::projected,ticker::VBIPX,weight:num:14.5
|
|
symbol::ORC42,era_start::2044-01-01,basis::projected,ticker::VTSPX,weight:num:14.5
|
|
symbol::ORC42,era_start::2044-01-01,basis::projected,ticker::VUSXX,weight:num:71
|
|
|
|
# Projected: calendar 2045 takes the booklet enrollment-year 2023 row.
|
|
symbol::ORC42,era_start::2045-01-01,basis::projected,ticker::VBIPX,weight:num:5
|
|
symbol::ORC42,era_start::2045-01-01,basis::projected,ticker::VTSPX,weight:num:5
|
|
symbol::ORC42,era_start::2045-01-01,basis::projected,ticker::VUSXX,weight:num:90
|
|
|
|
# Projected: calendar 2046 takes the booklet enrollment-year 2022 row.
|
|
symbol::ORC42,era_start::2046-01-01,basis::projected,ticker::VBIPX,weight:num:5
|
|
symbol::ORC42,era_start::2046-01-01,basis::projected,ticker::VTSPX,weight:num:5
|
|
symbol::ORC42,era_start::2046-01-01,basis::projected,ticker::VUSXX,weight:num:90
|
|
|
|
# Projected: calendar 2047 takes the booklet enrollment-year 2021 row.
|
|
symbol::ORC42,era_start::2047-01-01,basis::projected,ticker::VUSXX,weight:num:100
|