Trek Model administration
Sign out
Model register: how this page works
What this page is
Every model the system knows about, its risk class, fee, strategist and status. Creating a model here makes it available everywhere else.
Status
Active appears on the intranet and is written to each night. Review and Proposed are visible here only. Archived is retained for history and excluded from everything.
StratiFi id
Without it the Model Overview and Compare buttons do not render on the intranet cards, and nothing reports that they are missing except the Health tab.

Model Register

Loading…

Holdings editor: how this page works
Snapshots are periods, not points
A snapshot is in force from its date until the next one. Editing the 1 July snapshot changes what the model is considered to have held for all of July.
Correct existing against New rebalance
Correcting replaces a snapshot. New rebalance adds one from a date you choose. The line under the switch states which is about to happen and what it supersedes.
Reprice shares
Recalculates share counts at the as-of date prices, in the grid only. Nothing is written until you save.
Daily returns are never changed here
Composition and performance are separate records. Use the Returns editor for figures.

Holdings Editor

Weights must total 100% within 0.05% before a snapshot can be saved. The tolerance exists because equal weights rarely divide evenly: sixty positions at 1.6667% each come to 100.0020%, and there is no four-decimal weight that makes sixty of them exact.

What each control does, and what it overwrites
As of
The rebalance date this composition belongs to. Saving replaces any existing snapshot for that date entirely, so changing it to a date that already has a snapshot overwrites it. Changing it also reprices every row at that date's close, which is what makes share counts correct for the day the change actually took effect rather than for today.
Add row
Appends an empty row. Type a ticker and press Tab: the name, asset class and price fill in from the provider. The weight starts at zero, so the total will not balance until you set it.
Rebalance
Recomputes every share count from the weights and the prices on the as-of date, as floor(notional x (1 - cash) x weight / price). Share counts are a record of what the model held, not a live figure, so they change only when you press this. Editing a weight shows what the count would become without changing it.
Save snapshot
Writes the composition against the as-of date and logs every change to the audit trail. Disabled until the weights total exactly 100.0000%.

A correction to an existing rebalance keeps the same as-of date. A new rebalance gets a new one. Getting this wrong is the one action here that loses data.

Total weight
Add row and Reprice shares change this grid only.
Returns editor: how this page works
Values are decimal fractions
0.0042 is up 0.42 percent. Anything beyond 50 percent is refused as a typo, because a percentage typed where a fraction belongs would corrupt the index permanently.
Saving rebuilds the index
The index is a running product, so changing a return in 2019 changes every figure after it. The rebuild happens automatically from the earliest date you touched.
Missing sessions
Trading days absent from the loaded window are listed above the grid. A gap is invisible in a list of dates, so it is computed against the market calendar.
Add a missing date
Refused on weekends, market closures and dates that already exist. Only for a session that was genuinely never written.

Returns Editor

Correct daily return values and add trading days that were never written. Every change is logged with who made it, when, and the previous value, and the index is rebuilt forward from the earliest date touched.

Leave the dates empty for the last ninety days. Returns are decimal fractions, so 0.0042 is up 0.42 percent.

Choose a model and load rows to begin.

Add a missing date

Only for a trading day that was never written. The date is checked against the market calendar and refused if it is a weekend, a closure, or already present.

Edit history

Every saved change. Filtered to the selected model when one is chosen.

Imports: file formats and what each mode does

Returns

File format
Kwanti return exports. One model per file, or one wide sheet with a column per model. A date column plus either a return or an index value; where both are present the return is used and the index checked against it.
Or the Master Returns Sheet, which is where the hedged models come from — they are not in Kwanti and never will be. Its Hedged and Enhanced tabs carry fourteen models each, as daily decimal returns rather than index levels. Any other tab in that workbook is ignored.
The two are told apart from the file itself, by whether it has a Hedged or Enhanced tab. There is nothing to select. Declaring the format would be one more thing to get wrong on a monthly job, and getting it wrong would not fail — it would read returns as index levels and produce plausible nonsense.
Hedged model columns
The Master Sheet's headers are not always model codes: two versions of the same workbook are in circulation, one using HTC-100-0 and one using HETF 100. Both are mapped in dbo.MasterReturnsColumnMap, so either works. A column that is not mapped is reported and skipped, never guessed at from a resemblance.
A blank cell is not a zero. These series start at different dates, and writing zero for a period a model did not exist would put a flat line in its history and drag every trailing return computed across it. Blanks produce no row.
Dates
Read from the file. Weekends and NYSE closures are filtered out automatically, so an export that includes them will not write rows on days the market was shut.
What happens on commit
Rows are appended. Existing dates are reported as conflicts in the reconciliation and are not overwritten unless you choose to.

Holdings

File format
Two columns: ticker and weight. Nothing else is read. CSV or XLSX. Headings are recognised from a list that includes Ticker, Symbol, Weight, Target and Allocation; if none are recognised the columns are inferred from the data and the preview says so, so check it.
Sheet names
Ignored. The first sheet is read. If a workbook has more than one, the preview warns you which was used and how many were skipped, because a Kwanti export with a summary tab first would otherwise import the summary.
Which model
From the filename, matched against the model register: SAS.csv, Core60_40.xlsx. Case does not matter and extra text is tolerated, so SAS (1).csv and core100_0 export.xlsx both work. A name matching no model, or two models, is refused rather than guessed.
Which date
From the form, once, for the whole batch. Deliberately not from the file: a wrong ticker fails at lookup and a wrong weight fails the balance check, but a wrong date succeeds silently and rewrites what a model held for a whole period. If models rebalanced on different dates, run one batch per date.
Percentages or fractions
Either. The scale is detected from the column total: near 100 is percentages, near 1 is fractions. Anything else is rejected rather than guessed, because being wrong here is wrong by a factor of a hundred.
Weights must balance
To 100% within 0.05%. Sixty equal positions at 1.6667% come to 100.0020% and are fine. A file at 99.2% is refused with its total shown, because a snapshot that does not balance corrupts every return computed from it.
Shares
Derived, never imported: floor(notional x (1 - cash) x weight / price) at that date's close. The same formula the Holdings editor uses, so an import and a manual rebalance of the same composition produce identical rows.
Duplicate tickers
Combined, and the preview says which. Two rows for the same symbol usually means two lots of one position, and keeping only one would understate it.
What happens on commit
The composition at that date is replaced entirely, not merged. A snapshot is in force until the next one, so this changes what the model is considered to have held for the whole period after it. Daily returns are not changed.
All or none
If any file fails, nothing is written. A rebalance where eleven of twenty models updated is harder to unpick than one that never ran.

Both modes

Nothing commits without review
Files are parsed and reconciled against what is stored, and you approve before anything is written. The commit sends back what you reviewed rather than re-reading the files, so what was on screen is what lands.
Limits
40 files per batch, 2 MB each.
Audit
Every write is logged with your name, the file it came from and the row count. Returns go to the returns edit log, holdings to the holdings edit log.

Imports

Nothing commits without review.

Drop returns or holdings files here, or

Kwanti exports, one model per file or one wide sheet with many model columns. Or the Master Returns Sheet, whose Hedged and Enhanced tabs carry the 28 hedged models — recognised automatically, no need to say which you are uploading. Weekends and NYSE closures are filtered either way.

Batches

Anything not committed can be resumed or rejected here. A batch that failed part way through was previously unreachable from this page and could only be cleared with SQL.

Loading…

Health: how this page works
What this page is for
Every data quality check in one place. A section only appears when it has something to report, so an empty page is the goal rather than a sign the checks did not run.
The tiles across the top
Integrity issues and Models with gaps are blocking. Stale models counts series that have stopped updating. Awaiting lookup counts symbols queued for provider enrichment, which clears itself. Checked is when this snapshot was taken, not when the pipeline last ran.
Blocking: fix before publishing
Holdings Integrity covers two unrelated conditions in one table, which is why the Why listed column exists. Weights not totalling 100 percent is an error. Flagged rows are migration review items, not errors. Return Series Gaps and Missing Sessions are holes in the middle of a series, invisible everywhere else and quietly wrong in every trailing calculation. Index Does Not Match Returns means the stored index has drifted from what the daily returns imply, so one of the two was written without the other. Duplicate Holdings is the same symbol twice in one snapshot. Active Models With No Composition is a model advisors can reach that has nothing to show.
A decision, not an error
Returns on Market Closures lists rows dated to days the market was shut. There is no defensible default, so nothing is filtered automatically. Only the non-zero rows change any calculation. Review opens the Returns editor at that model with closure dates flagged, so the decision stays visible in the data afterwards rather than disappearing into it.
Pipeline state
Nothing written for N sessions means the nightly append has not run or has been failing silently, and is the first thing to check when several other sections light up at once. Models Behind and Stale Return Series are individual series that stopped while others kept going, which usually points at the model rather than the pipeline.
Securities
Incomplete Security Details and Holdings Not In Security Master are the securities editor, documented in its own help block in that section. Neither is cosmetic: a holding with no name renders as a bare ticker, and one with no asset class drops out of the allocation chart entirely.
Worth a look, not necessarily wrong
Large Daily Returns flags outliers, which are usually real and occasionally a decimal point. Incomplete Model Setup lists register fields left empty, which affects display rather than arithmetic.
Every row links to its fix
The button opens the tool that corrects that problem with the model and date already filled in.

Pipeline Health

Anything listed here blocks publication.

Reference: how this page works
What this page is for
The two lookup tables the model form reads. Both used to be hardcoded in the console, which meant a new hedge level or a changed risk band needed a code change and a deploy.
Hedge levels
A hedged model's fee is joined from this table through its level, never stored on the model row. So a repricing is one edit here instead of a figure typed on sixty rows, where the failure mode is the handful you miss quietly charging the old rate.
The fee is charged on the equity portion and is separate from the model fee. HUSQE pays 27 basis points of manager fee and 20 of hedge, and the calculator shows both, so this is not an either/or.
The code prefix builds the offering code the advisors see: H plus SAS is HSAS. Two levels cannot share a prefix, because that would generate two offerings claiming one code.
A level cannot be deleted while any model carries it. Adding one makes it selectable when creating a model straight away — no deploy.
Risk bands
The StratiFi score range each classification covers. Before this table the boundary between Moderate and Moderate Aggressive existed only in the head of whoever was assigning it, and a model whose StratiFi score disagreed with its stored classification was not something anything could detect.
Bands are contiguous at 0.1, which is the granularity StratiFi quotes. 3.3 followed by 3.4 is not a gap: no score falls between them. Overlaps are refused, because a score has to map to exactly one classification.
Renaming a band carries every model on the old name with it. Nothing in the database enforces that link, so the rename is done here or not at all.
Deactivating hides a band from the selector but keeps the name valid for models already carrying it. Deleting is refused while any model is classified that way.

Reference Data

Hedge levels and risk bands. Editing these changes what the model form offers.