Model parameters
Reference for ModelParams, the set of model coefficients an Engine runs, and for every entry in it. A preset is a named set of coefficients that ships with the package. The values shown are for preset pt-v20, the shipped default. The release notes list what each preset changed, and tf.model_preset() prints the default preset's dictionary at run time.
ModelParams
A set of coefficients. Build one from a shipped preset, optionally overriding settable entries, and pass it to Engine(model=...). Instances are immutable. There is no setter, and every constructor returns a new object.
ModelParams.from_preset
Build a coefficient set from a shipped preset, optionally overriding settable entries.
ModelParams.from_preset(
name: str = "pt-v20",
**overrides: float,
) -> ModelParams
| Argument | Type | Default | Meaning |
|---|---|---|---|
| name | str | pt-v20 | A shipped preset name, pt-v1 to pt-v20. If you leave it out, you get the shipped default, the same one Engine runs. |
| **overrides | float | - | Settable parameter names, from the table below. Any other name is refused. |
Returns ModelParams.
Raises ValidationError on an unknown preset name, an unknown parameter name, a compile-time entry, or an override that breaks an identity the preset claims. An identity is a fixed relationship between parameters, and only pt-v19 claims any: garch_beta is 0.9416 - garch_alpha - garch_gamma / 2, vix_return_level_exponent is vix_return_exponent - 1, and vix_target_shock_cap is the ceiling the VIX return dials imply. So from_preset("pt-v19", garch_alpha=0.07) raises unless garch_beta moves to match. The message names the identity, both values and the tolerance.
ModelParams.from_preset_unchecked
Works like from_preset but skips the preset's identity checks. It is for measuring a derived parameter moved away from the value its identity gives, and any number it produces should state that the checks were skipped.
ModelParams.from_preset_unchecked(
name: str = "pt-v20",
**overrides: float,
) -> ModelParams
| Argument | Type | Default | Meaning |
|---|---|---|---|
| name | str | pt-v20 | Same as from_preset. |
| **overrides | float | - | Same as from_preset. |
Returns ModelParams, the same immutable type, bit for bit what from_preset would build. An override fingerprints as custom-<digest> as usual.
Raises ValidationError on everything from_preset refuses except a broken identity. The rules that apply to every preset are still checked.
ModelParams.identity_breaks
Checks a set of coefficients against the identities a preset claims.
ModelParams.identity_breaks(
params: ModelParams,
preset: str = "pt-v20",
) -> list[dict[str, Any]]
| Argument | Type | Default | Meaning |
|---|---|---|---|
| params | ModelParams | required | The coefficients to check. |
| preset | str | pt-v20 | The preset whose identities to check. Each preset has its own, so pass the one you mean. |
Returns list[dict], one per identity that does not hold, with dial, identity, expected, actual, tolerance and claimed_by, or an empty list when all hold.
Raises Nothing for a shipped preset name.
ModelParams.from_dict
Rebuild a coefficient set from a to_dict() mapping.
ModelParams.from_dict(
values: dict[str, float | str],
) -> ModelParams
| Argument | Type | Default | Meaning |
|---|---|---|---|
| values | dict[str, float | str] | required | A mapping as to_dict() returns it, including the compile-time entries and name. |
Returns ModelParams. A round trip through to_dict() recovers the preset fingerprint when no value was changed. from_dict does not check preset identities, so run identity_breaks on a rebuilt set if you need that check.
Raises ValidationError when a required entry is missing or a value is the wrong type.
ModelParams.settable
The names accepted as overrides.
ModelParams.settable() -> list[str]
| Argument | Type | Default | Meaning |
|---|
Returns list[str], sorted. The same set the tables below document.
Raises Nothing.
ModelParams.to_dict
Every entry the model carries, settable or not.
params.to_dict() -> dict[str, float | str]
| Argument | Type | Default | Meaning |
|---|
Returns dict[str, float | str]. Every value is a float except name, which is the fingerprint as a str.
Raises Nothing.
ModelParams.fingerprint
The model fingerprint. It is the preset name for an unmodified preset, or custom-<digest> after any override.
params.fingerprint -> str
| Argument | Type | Default | Meaning |
|---|
Returns str. A shipped preset's name when nothing was overridden, otherwise 'custom-' and an eight-hex-digit hash of the whole set.
Raises Nothing.
Parameter classes
| Class | Count | Runtime override | In to_dict() | Fingerprinted |
|---|---|---|---|---|
| settable | 214 | Yes, as a keyword to from_preset() | Yes | Yes |
| derived | 2 | No, recomputed at construction | Yes | Yes |
| compile-time | 27 | No, refused by name | Yes | Yes |
| hidden | 2 | No | No | Yes |
Two struct fields, breaker_down and breaker_up, are model parameters that to_dict() does not return. You cannot read them back from a model, and the tables below do not list them.
Fingerprint behavior
A model built from a preset has that preset's name as its fingerprint. If you override any settable entry, the name becomes custom- plus a hash of the whole coefficient set, so a run with changed coefficients cannot be cited as the preset. Every preset shows what each shipped set measured, and RunManifest shows what a manifest records.
import tradefloor as tf
tf.ModelParams.from_preset("pt-v14").fingerprint
# 'pt-v14'
tf.ModelParams.from_preset(
"pt-v14", momentum_theta=0.05).fingerprint
# 'custom-b0a8c73d'
The hash covers every entry to_dict() returns, so a release that adds entries changes the hash of the same override: the example gives custom-b0a8c73d on 0.8.5 and 0.8.6. A shipped preset keeps its name across releases. When you cite a custom set of coefficients, give the package version with it, or the full to_dict().
Preset records
The measurements taken for each shipped preset, read from JSON files included in the package. tf.preset_names() lists the presets the engine knows, and tf.preset_records() lists the ones with a record, which is all of them.
tf.preset_record(name: str | None = None) -> dict[str, Any] tf.preset_records() -> list[str]
name=None reads the shipped default, pt-v20. An unknown name raises LookupError, and the message lists the names that exist. The record is a plain dict with these keys.
| Key | What it holds |
|---|---|
| preset, fingerprint | The preset's name. A record exists for every shipped preset. |
| coefficients, coefficient_digest | The coefficients that were measured, and their hash, so you can check that a record describes the coefficients your build runs. |
| default_since | The release the preset became the default in, or None. |
| measured | The release, commit, roster, seeds and band tables the run used. |
| panel_252, panel_504 | The fixed-roster panel at one and two trading years: the median of each statistic over thirty seeds. From pt-v19 it includes crisis_sector_dispersion, the median over the seeds that read it. |
| in_band, misses, unreadable | Per cell, the number of rows inside their band (the range real markets show for that statistic), the rows outside their band by name, and the rows the band table has no band for. A row in unreadable counts as neither a pass nor a miss and is left out of the count. |
| absent, dispersion | pt-v19 and pt-v20 only. The rows a cell measured but could not read, and how many seeds produced a reading of crisis_sector_dispersion. That statistic needs crisis days, which a calm run may not have. |
| level_protocol | The level and crisis rows, measured on a new roster drawn for each seed. pt-v18 to pt-v20. |
| mechanism_252, mechanism_heldout_seeds | Whether each row shows its mechanism, tested with a sign test against a reading with the mechanism switched off. |
| structure_252, structure_heldout_seeds, structure_rise | The VIX persistence check at one year, and whether persistence rises from one year to two as it does in real market data. |
| crisis_lever | Annualized volatility with VIX held at 65, divided by annualized volatility with VIX held at 5, next to the real ratio of 6.16. |
| long_run | pt-v19 and pt-v20 only. The long-run rows: the 40 registered for pt-v20, which it passes, and the 17 of pt-v19's record, of which it meets 15. Its keys are criteria, verdict, passed, of, rows and measured. Each entry in rows has id, words, value, real, rule and pass, and measured names the commit, the seeds and the years. |
tf.preset_record()["long_run"]["rows"] returns the long-run rows with the real value beside each reading.
Settable parameters
Every name accepted as a keyword override, grouped by the part of the model it belongs to, with the file that implements that part. Every settable and derived entry is a Rust f64, a float from Python.
The seven agent-facing book entries are 0.0 on every preset before pt-v20, which leaves the book there as it was, and pt-v20 sets all seven. They change what Engine.submit and Portfolio.execute meet and nothing in a market no agent trades. Engine and data says what each one does to an order.
The agent-facing book
agent_book.rs, engine.rs · 7 parameters| Name | pt-v20 | Description |
|---|---|---|
| book_depth_coefficient | 0.75 | Coefficient Y of the square-root law that sets the latent depth behind the maker's ladder. |
| book_depth_exponent | 0.5 | The exponent delta of the latent depth's price-for-size law. |
| book_depth_reach | 1 | How far the latent depth reaches, in multiples of the name's average daily volume per side. |
| book_refill_half_life | 27 | Half-life in ticks at which consumed LATENT depth refills. |
| book_resting | 1 | Switch for whether an agent's unfilled limit order rests in the book: 1.0 on, 0.0 off. |
| book_shared | 1 | Switch for whether agents' orders consume the book they share: 1.0 on, 0.0 off. |
| fill_impact_coefficient | 0.314 | Permanent impact of an agent's fills, linear in size: gamma in ds = gamma * sigma * (bought - sold) / V, applied to the name's mispricing s once, on the first tick after the fills. |
Market-factor variance process
market/factor_vol.rs · 67 parameters| Name | pt-v20 | Description |
|---|---|---|
| buyback_payout_share | 0.75 | The share of earnings a company returns as net buybacks, paid as a yield on the price. |
| cascade_gain | 0.1 | A scale on the whole forced-flow term: the short squeeze and both stop ladders (cascade_symmetry). |
| cascade_symmetry | 1 | How much of the direction in the stop-cascade ladders is removed, from 0.0 (the original asymmetric ladders) to 1.0 (mirror images). |
| cycle_hazard_per_month | 1 | Reads the business cycle's hazard as a rate per month: at 1.0 the monthly transition probability is divided by 30 before the daily draw. |
| cycle_stationary_opening | 1 | Switch (0.0 or 1.0) that draws the day-zero cycle phase and its age from the cycle's own stationary law, instead of opening every run at the start of an expansion. |
| cycle_us_calibration | 1 | Switch for the business-cycle phase table derived from NBER and BEA data (economy::state::us_phase_characteristics). |
| earnings_nominal_growth | 1 | How much of nominal output growth the valuation's earnings carry, from 0.0 (earnings fixed at construction) to 1.0 (the earnings share of nominal output held constant). |
| fair_value_book_floor | 0 | Switch that applies the loss-maker book floor to profitable companies too, making fair value continuous at zero earnings. |
| fed_liftoff_rule | 1 | Switch for a lift-off branch in the central bank's rate ladder. |
| garch_cascade_components | 0 | How many components a name's variance cascade carries. |
| garch_cascade_ratio | 3 | Half-life spacing between cascade components: component k has a half-life ratio^k times component 0's. |
| garch_cascade_weight | 1 | How much of the variance comes from the cascade rather than from the single-component process. |
| jump_mean_compensated | 1 | How much of the drift the market jump's mean carries is given back, from 0.0 (none) to 1.0, which subtracts the compensator and makes the jump a martingale. |
| macro_burn_in_days | 755 | Days the economy is advanced alone, before day zero, so a run opens on settled macro fields. |
| macro_calendar_days_per_year | 252 | Economy steps per macro year for the rest of the macro calendar: months, quarters, the seasonal year and central-bank meetings. |
| macro_compound_days_per_year | 252 | Economy steps per year used to compound annual GDP and CPI growth. |
| market_beta_down_asym | 0.025 | Extra transmission of the market factor on a down tick: every name receives beta * factor * (1 + this). |
| market_beta_down_asym_lag | 0.46 | The lagged downside transmission: on the session after a down day, every name receives beta * factor * (1 + this) whatever the tick's own sign. |
| market_beta_down_asym_lag_live | 1 | Where the lagged wire's down-day condition is sampled: at the open (0.0), live through the session (1.0), or with the sign reversed as a diagnostic (2.0). |
| market_beta_down_asym_lag_recentre | 0 | How much of the extra mean that the lagged down-day wire adds to the tilt is given back, from 0.0 (none) to 1.0 (all of it). |
| market_beta_down_asym_recentre | 1 | How much of the mean that market_beta_down_asym injects is given back, from 0.0 (none) to 1.0 (all of it). |
| market_burn_in_sessions | 0 | Sessions of warm-up given to the market factor's variance components before session one. |
| market_idio_down_suppress | 0 | Shrinks a name's idiosyncratic shock on a down tick of the market factor and inflates it on an up tick, so same-day down-market co-movement rises while the unconditional variance is held exactly. |
| market_pe_buybacks | 1 | Switch that includes buybacks in the earnings behind market_pe. |
| market_vol_alpha | 0.0066 | The market factor's own GARCH reaction term: how sharply market-wide variance responds to the last market-wide shock. |
| market_vol_alpha_excursion | 0 | How far the common factor's shock share moves with the factor's own variance excursion. |
| market_vol_beta | 0.8946 | The market factor's variance persistence. |
| market_vol_ceiling_multiple | 32 | Cap on the market factor's variance, as a multiple of its calm level. |
| market_vol_floor_multiple | 0.05 | Floor on the market factor's variance, as a multiple of its calm level. |
| market_vol_gamma | 0.1556 | GJR leverage on the market factor's variance update: the extra weight a down day's squared shock gets. |
| market_vol_level_persistence | 0 | Session-to-session persistence of a slow multiplier on the market factor's variance target, in (0, 1). |
| market_vol_level_sigma | 0 | Per-session innovation of the slow variance level, in log units. |
| market_vol_slow_gain | 0.05 | How much of each day's variance surprise the slow component takes up. |
| market_vol_slow_persistence | 0.9913 | Daily persistence of the slow component of the market factor's variance (Engle-Lee style). |
| market_vol_slow_weight | 0.35 | Weight of the slow variance component in the market factor's two-component mixture, from 0.0 (single component) to 1.0. |
| market_vol_vix_anchor | 15.9843 | VIX level at which a coupled target equals the baseline variance. |
| market_vol_vix_coupling | 0.95405 | How far the market factor's variance target follows the VIX, from 0.0 (a fixed target) to 1.0 (fully proportional to the VIX response, the squared VIX ratio at the default market_vol_vix_exponent). |
| market_vol_vix_exponent | 4 | Exponent on the market variance target's VIX ratio. |
| market_vol_vix_exponent_below | 2.5 | Exponent on the market variance target's VIX ratio when that ratio is below one, where the VIX sits under the ratio's denominator (the derived anchor under the level form, the read-back under the excursion form). |
| market_vol_vix_smooth | 0 | Days of EMA smoothing on the VIX that the market variance target reads. |
| neutral_discount_rate | 0.0482 | The corporate bond yield at which the target multiple sits exactly on its sector anchor, as a fraction (0.04 is 4 per cent). |
| oil_opec_symmetry | 1 | Removes the direction from the OPEC production rule while keeping its size. |
| oil_seasonality_target | 1 | Where oil's seasonal shape acts: on the price level itself (0.0) or on the price the process reverts toward (1.0). |
| oil_supply_response | 1 | How much of oil demand is answered by supply on the daily step, from 0.0 (none) to 1.0 (supply equals demand in expectation). |
| phase_target_range_draw | 0 | Whether a phase's growth target is drawn from its declared range (1.0) or fixed at the range's midpoint (0.0). |
| trough_growth_floor | 0 | Raises the bottom of the trough phase's GDP growth range from -1.0 (at 0.0) to 0.0 (at 1.0), moving proportionally in between; the top stays at 0.5. |
| vix_anchor_centre | 0.1515 | Log offset below the identity's derived anchor that the anchor weight pulls toward: the blend and the memory's reference use L * anchor * exp(-c). |
| vix_anchor_memory | 0.0555556 | Per-session rate at which the anchor's memory of the read-back updates. |
| vix_anchor_reversion | 0 | Per-session rate at which the VIX reverts toward the identity's anchor, as a share of the distance in [0, 1). |
| vix_anchor_weight | 0.375 | Share of the VIX's target taken by the identity's anchor, as a geometric weight in [0, 1). |
| vix_anchor_weight_level | 1 | How the anchor weight rises with the VIX's level, as an exponent. |
| vix_anchor_weight_level_below | 0 | Switch that also runs the level law below the knee, where it lowers the anchor weight toward zero. |
| vix_anchor_weight_level_cap | 2.2159 | Multiple of the knee above which the level law stops raising the anchor weight. |
| vix_anchor_weight_level_knee | 0.3888 | Where the level law starts raising the anchor weight, as a log offset below L * anchor. |
| vix_anchor_weight_level_knee_fixed | 0 | Switch that fixes the level law's knee to the anchor alone, without the slow regime level: K = anchor exp(-k) in place of K = L anchor exp(-k). |
| vix_level_loop_gain | 1.79 | The VIX loop's own gain on the slow VIX level, which the level's innovation is divided by. |
| vix_level_persistence | 0.9979 | Session-to-session persistence of the VIX's own slow log-level, a lognormal AR(1) multiplier on the VIX target under vix_level_identity. |
| vix_level_sigma | 0.0181 | Per-session innovation of the VIX's own slow log-level, in log units. |
| volume_idio_persistence | 0 | Daily persistence of a per-name volume state, so each name has busy and quiet spells of its own. |
| volume_idio_sigma | 0 | Innovation size of the per-name volume state. |
| volume_idio_variance_gain | 0.2 | Gain that makes a name's volume follow its own conditional variance, so a name trades more when its own volatility is high. |
| volume_move_cap | 12 | Where the volume response to a move saturates, in units of one percent. |
| volume_move_floor | 0.6 | Base volume multiplier for a name on a day it does not move at all. |
| volume_move_jump_share | 1 | How much of a jump's share of the day's move the volume scale counts, from 0.0 (none) to 1.0. |
| volume_move_noise | 0.2 | Amplitude of the return-unrelated noise in a name's daily volume. |
| volume_move_response | 0.6 | How much more a name trades per one percent it has moved today. |
| volume_variance_gain | 0.0284038 | How strongly realized volume tracks the market factor's variance. |
Factor structure
market/tick.rs, market/factors.rs · 63 parameters| Name | pt-v20 | Description |
|---|---|---|
| buyback_yield_cap | 0.15 | A ceiling on the annual buyback yield buyback_payout_share * eps / price that the buyback term compounds over the elapsed years. |
| closing_auction | 1 | Whether the session closes with a cross at the model price, a switch. |
| corporate_yield_daily | 1 | Whether the corporate yield moves between central-bank meetings, a switch. |
| crash_amplifier_conditional_sigma | 1 | Switch for the sigma the crash amplifier measures a shock in: 0.0 uses the baseline constant, any nonzero value the tick's own conditional sigma. |
| crash_amplifier_slope | 0.2 | Extra market loading the crash amplifier adds per baseline sigma of shock beyond crash_amplifier_threshold. |
| crash_amplifier_threshold | 2 | Market-shock size, in baseline sigmas, above which the crash amplifier fires. |
| crisis_blend_cap | 0.98 | Ceiling of the crisis correlation blend. |
| crisis_blend_gain | 0 | How hard a crisis loads every name onto the market factor, as a multiplier on the crisis spike. |
| crisis_blend_ramp | 1.4 | VIX points past CRISIS_VIX_THRESHOLD for the sector-to-market crisis blend to reach 1.0 before its cap. |
| crisis_blend_source | 1 | Where the crisis correlation injection comes from. |
| crisis_blend_variance_damp | 0 | How far the crisis blend's market injection is decoupled from the market factor's own magnitude, from 0.0 (fully coupled) to 1.0 (fully decoupled). |
| cycle_publication_lag | 252 | Sessions between a turn of the business cycle and its publication. |
| earnings_anticipation_half_life | 126 | Half-life, in sessions, of the discount the valuation puts on the earnings cycle's expected path. |
| earnings_cycle_depth | 0.2 | The aggregate earnings cycle's depth: the log level every company's earnings are pulled toward in a contraction or a trough, beyond what nominal output alone gives them. |
| earnings_cycle_half_life | 60 | Half-life in sessions of the pull toward the phase's level, 60 on every shipped preset. |
| earnings_cycle_sigma | 0 | The daily sd of the earnings level's own noise; 0.0 is the phase path alone and takes no draw. |
| earnings_cycle_upside | 0.09 | The earnings cycle's upside share: every phase other than a contraction or a trough pulls earnings toward +depth * upside, which centers the level over a cycle so the cycle moves earnings around the nominal-output path without shifting it. |
| endogenous_news_intensity | 0.05 | Daily probability that a company generates its own news event. |
| endogenous_news_sigma | 0.01751 | Standard deviation of an endogenous news event's price impact, in the units NewsEvent::price_impact carries. |
| fair_value_market_linear | 1 | Which part of a market shock fair_value_market_share makes permanent, a switch. |
| fair_value_market_share | 1 | The share of each market-wide shock that moves fair value for good, in [0, 1]: the name's loading on the market factor's draw, market-wide news and the market jump. |
| fair_value_market_vol_cap | 1.5 | A ceiling, in multiples of market_factor_sigma, on the market volatility whose shocks fair_value_market_share makes permanent, in [0, 32]. |
| fair_value_news_share | 1 | The share of each idiosyncratic shock that moves the name's fair value for good instead of its mispricing, in [0, 1]. |
| fair_value_vix_discount | 0.35 | Volatility feedback: a discount on every name's fair value while the VIX is above fair_value_vix_knee, exp(-this * beta * ln(vix / knee)), in [0, 1]. |
| fair_value_vix_half_life | 5 | Half-life, in sessions, of the VIX exposure the volatility-feedback discount reads. |
| fair_value_vix_knee | 40 | The VIX level, in points, above which fair_value_vix_discount applies. |
| fear_greed_published_inputs | 1 | Switch that makes the fear/greed index read the business cycle and GDP growth as published instead of as they are. |
| flight_to_quality_day | 1 | Which return the flight to quality reads, a switch. |
| flight_to_quality_gain | 0.008 | The flight to quality's size: percentage points of 10-year yield per percent of index return, down with the market when inflation is under 3 percent and up when it is over 4. |
| gdp_publication_lag | 21 | Sessions between the end of a quarter and the publication of its GDP growth, as the BEA's advance estimate comes about a month after the quarter. |
| idio_sigma_beta_exponent | 0 | How strongly a name's idiosyncratic volatility follows its market beta, as an exponent. |
| idio_sigma_scale | 0.512598 | Multiplier on every name's idiosyncratic GARCH sigma. |
| inflation_ceiling | 6 | The hard ceiling on endogenous inflation, in percent. |
| inflation_floor | -1 | The hard floor on endogenous inflation, in percent. |
| inflation_reversion | 0.55 | How fast endogenous inflation reverts toward its 2% target each month, as a fraction of the gap. |
| informed_flow_fraction | 0.35 | Share of order-flow impact that is permanent (information), from 0 to 1. |
| macro_publication_repricing | 1 | Whether a name's price takes the change the close's macro step makes to its fair value at the moment the step is published, a switch. |
| market_factor_sigma | 0.00645407 | Baseline daily sigma of the shared market factor. |
| market_vol_vix_excursion | 0 | Switch for the VIX reading the market factor's variance target uses: 0.0 reads the VIX level against a fixed anchor, any nonzero value reads only the excursion above the level the index's own conditional variance implies. |
| news_absorption_drift_half_life | 42 | The half-life in ticks of the post-news drift part, h_d in news_absorption_half_life's profile. |
| news_absorption_drift_share | 0.12 | The share of an endogenous news event's move that arrives as post-news drift, after the fast part: d in news_absorption_half_life's profile. |
| news_absorption_half_life | 0.6 | How fast the market prices an endogenous news event, as the half-life in ticks (minutes) of the fast part of its move. |
| news_market_weight | 0.3 | Weight of market-wide news on every name. |
| news_peer_vix_coupling | 8 | How much harder news transfers to a peer in a crisis. |
| news_peer_weight | 0.05 | Weight of one company's good news on its sector peers. |
| news_peer_weight_down | 0.05 | Weight of one company's bad news on its sector peers. |
| news_quote_revision | 1 | Whether the market maker re-quotes on public news, a switch. |
| news_sector_weight | 0.5 | Weight on sector-wide news, an event tagged with a sector and no company. |
| opening_market_sigma | 0.001 | The sd of the market's common opening mispricing, the index's own premium over fair value on day zero. |
| opening_mispricing_sigma | 0.016 | The cross-sectional sd of each name's opening mispricing. |
| order_flow_coefficient | 50 | Order-flow impact coefficient: the scale of the price move that injected order flow causes, before informed_flow_fraction splits it. |
| order_flow_impact_law | 0 | Which participation law the order-flow impact multiplier follows, a switch. |
| qe_pe_gain | 0 | Gain on the QE valuation channel, where the target P/E takes 1 + qe_pe_gain * qe_pe_boost. |
| qe_pe_stock_gain | 0 | Gain on the QE stock channel: the target P/E takes + qe_pe_stock_gain * ln(qe_assets_ratio), concave in the level of holdings and zero at the neutral baseline. |
| quote_model_weight | 1 | Where the market maker centers its book, as a weight in [0, 1] on the model price. |
| rate_pe_sensitivity | 3 | P/E compression per unit of discount rate above neutral, times a name's growth duration: the target multiple's rate adjustment is 1 - (yield - neutral) * rate_pe_sensitivity * duration. |
| sector_factor_sigma | 0.00858305 | Daily sigma of each shared sector factor, loaded at sector_loading by every member of the sector (market/factors.rs). |
| sector_loading | 0.6 | How hard a name loads on its own sector's factor, as a multiplier on the sector draw. |
| sector_loading_beta_slope | 0.7 | How much a name's sector loading follows its market beta. |
| sector_vix_coupling | 1 | How much the sector draw's variance follows VIX, on the same (VIX / anchor)^2 target the market factor's variance uses (factor_vol.rs). |
| treasury_10y_noise | 0.038 | The 10-year Treasury yield's daily noise, in percentage points. |
| treasury_2y_noise | 0.022 | The 2-year Treasury yield's own daily noise, in percentage points. |
| unemployment_adjustment_half_life | 84 | The half-life, in sessions, of unemployment's response to its cyclical drivers. |
Crisis gates
economy/daily.rs, market/tick.rs, engine.rs · 38 parameters| Name | pt-v20 | Description |
|---|---|---|
| crisis_epicentre_end_sessions | 21 | How many consecutive sessions under crisis_vix_threshold end a crisis episode. |
| crisis_epicentre_extra | 1.93 | How much more volatile the crisis epicentre sector's names are than the other sectors' at the same VIX, as a ratio of total volatility. |
| crisis_vix_threshold | 30.8833 | VIX level at which crisis behavior begins. |
| daily_credit_floor_gain | 1 | How strongly the credit spread floors are re-applied on every daily step, from 0.0 (off) to 1.0 (both floors in full). |
| forced_flow_beta_exponent | 0 | How unevenly forced selling lands across names, as an exponent on beta. |
| forced_flow_gain | 0 | Common forced-selling flow in stress: a log-shock per VIX point above forced_flow_threshold, per day, applied identically to every name. |
| forced_flow_replenish | 0 | Fraction of the spent forced-selling budget recovered on each day the VIX is at or below forced_flow_threshold (deleveraging capacity rebuilds in calm). |
| forced_flow_reservoir | 0 | Total forced-selling budget, in VIX-point-days. |
| forced_flow_threshold | 40 | VIX level, in points, above which forced flow applies. |
| jump_idio_excitation | 0 | Self-excitation of a name's idiosyncratic jumps: after a jump the name's arrival rate is lambda (1 + h) with h' = decay h + this. |
| jump_idio_excitation_decay | 0 | The excitation's daily decay, 0.72 [0.48, 0.79] (half-life two sessions) by the same measurement. |
| jump_idio_vix_decoupled | 0 | Switch that takes the VIX-squared scaling (jump_vix_coupling) off the idiosyncratic arrival rate, leaving it on the market jump. |
| sector_vol_alpha | 0.067 | Shock weight (alpha) of the per-sector GARCH(1,1) variance state. |
| sector_vol_beta | 0.837 | The per-sector variance state's persistence term, 0.837 by the same measurement, which pt-v19 and pt-v20 ship. |
| usd_crisis_vix_threshold | 25.5 | The VIX above which the dollar catches a safe-haven bid. |
| vix_ceiling | 181.329 | Upper bound on the VIX state itself, in points. |
| vix_cycle_amplitude | 0.85 | How much of the VIX's level comes from the business cycle, from 0.0 (none) to 1.0 (the full per-phase constants). |
| vix_decay_ratio | 1 | Multiplier on the VIX mean reversion on days the target sits below the current VIX, so fear can decay more slowly than it arrives. |
| vix_innovation_return_sigma | 0.0175 | The part of the innovation scale that rises with the session return, per percent: see vix_innovation_sigma. |
| vix_innovation_sigma | 0 | Base scale of the VIX's own daily innovation, as a fraction of its level. |
| vix_jump_intensity | 0 | Rate of exogenous fear events, per year, each a jump in the VIX level. |
| vix_jump_level_scale | 1.7 | A fear event's mean size in units of the day's innovation scale (VIX * sqrt(s0^2 + (c r)^2), or VIX when the innovation dials are off), exponential draw. |
| vix_jump_return_intensity | 6.199 | The part of the fear-event arrival rate, per year per percent of down session, that rises with the session: the daily probability is (vix_jump_intensity + this * max(0, -r)) / 252. |
| vix_jump_scale | 0 | Mean size of a fear event, in VIX points (exponential draw). |
| vix_level_identity | 1 | Switch that sets the VIX level from the index's own conditional variance instead of a table of per-phase constants. |
| vix_mean_reversion | 0.27 | How fast VIX reverts toward its target, as the fraction of the gap closed each day. |
| vix_realised_vol_weight | 0.3 | Weight of the market's own volatility in the VIX target, from 0.0 to 1.0. |
| vix_return_clamp | 15 | The index return is clamped to +/- this before it drives the VIX, in the units of the return source. |
| vix_return_exponent | 1.4483 | Exponent of the VIX's response to a down day's return: 1.0 is linear, above 1.0 is convex. |
| vix_return_exponent_up | 0.5433 | The up side's own exponent: the spike on an up session is -gain_up * |r|^this * VIX^(-vix_return_level_exponent_up). |
| vix_return_gain | 8.83 | VIX points added to its target per unit of a down day's index return, before the clamp and cap below. |
| vix_return_gain_up | 0.049 | The up-day counterpart of vix_return_gain: how far an up day's index return moves the VIX target. |
| vix_return_level_exponent | 0.4483 | How the down-side fear response falls with the VIX the session opened from: the spike is gain * |r|^p * VIX^(-this). |
| vix_return_level_exponent_up | -1 | How the up-side response scales with the level. |
| vix_return_source | 1 | Which index return the VIX reacts to: the session's final minute (0.0, pt-v1 through pt-v8) or the whole day's (1.0, pt-v9 onward), blended in between. |
| vix_target_offset | 0 | A constant added to the VIX target, in points. |
| vix_target_shock_cap | 158.852 | Ceiling on the VIX target's whole excursion, in points: the return spike plus the inflation and shock adjustments. |
| vix_variance_premium | 0.252 | The variance risk premium pi: how far a real VIX sits above the realized volatility of its own index, as a fraction. |
Mispricing dynamics
mispricing.rs, market/tick.rs · 6 parameters| Name | pt-v20 | Description |
|---|---|---|
| crowd_lean_cap | 0.02 | Bound on the crowd's daily log-price shock. |
| crowd_momentum_gain | 0.02 | Crowd herding gain per day on yesterday's change in s. |
| crowd_valuation_gain | 0.006 | Crowd valuation gain per day on s. |
| mispricing_cap | 0.9 | Hard bound on |s|. |
| mispricing_half_life_days | 60 | Trading days for half of a mispricing to decay. |
| momentum_theta | 0.0185516 | Herding: fraction of yesterday's re-rating that continues today. |
Per-name GJR-GARCH
market/garch.rs · 11 parameters| Name | pt-v20 | Description |
|---|---|---|
| garch_alpha | 0.0595072 | Weight on yesterday's squared shock: how sharply a name's variance reacts to its own last move. |
| garch_beta | 0.7905 | Weight on yesterday's variance: how long a name's volatility remembers. |
| garch_ceiling_multiple | 5 | Ceiling on a name's GARCH variance, as a multiple of the sector's long-run variance. |
| garch_floor_multiple | 0.25 | Floor on a name's GARCH variance, as a multiple of the sector's long-run variance. |
| garch_gamma | 0.183185 | GJR leverage-effect asymmetry: the extra weight a negative shock gets in a name's next variance. |
| garch_innovation_commensurate | 0 | Feeds the per-name GJR-GARCH the name's own noise, in the units the coefficients were fitted in, in place of the whole random_noise column. |
| garch_omega | 0.000002 | The GJR-GARCH constant: the variance a name reverts toward when neither yesterday's shock nor yesterday's variance pulls it. |
| garch_omega_sector_scaled | 0 | Switch that scales garch_omega by each sector's base variance in place of one constant for every sector. |
| garch_vix_coupling | 0.142196 | How much a name's own variance follows the VIX, on the market factor's own target shape. |
| garch_vix_exponent | 2 | Exponent on the VIX ratio in a name's variance reference. |
| idio_sigma_floor | 0.0001 | The absolute floor under a name's daily variance in the tick and in the overnight path, in daily variance units. |
Endogenous jumps
engine.rs, applied at the day close · 10 parameters| Name | pt-v20 | Description |
|---|---|---|
| garch_beta_dispersion | 0 | Cross-sectional spread in volatility persistence, in raw beta units. |
| jump_intensity_idio | 0.00688953 | Daily probability that a per-name idiosyncratic jump fires. |
| jump_intensity_market | 0.0282877 | Daily probability that a market-wide jump fires. |
| jump_market_variance_share | 0 | How much of the market jump's log return joins the day's factor innovation, so the GJR variance update sees a crash day. |
| jump_mean_market | -0.00852183 | Mean of the market jump in log-return units. |
| jump_momentum_share | 0 | How much of a jump the herding term is allowed to continue, in [0, 1]. |
| jump_sigma_idio | 0.075208 | Standard deviation of the idiosyncratic jump, in log-return units. |
| jump_sigma_market | 0.00245976 | Standard deviation of the market jump, in log-return units. |
| jump_vix_coupling | 0.2626 | How much a jump's arrival rate follows the VIX. |
| overnight_variance_ratio | 0 | The variance of the overnight move as a fraction of a session's, per name. |
Universe memory
market/tick.rs, engine.rs · 4 parameters| Name | pt-v20 | Description |
|---|---|---|
| market_vol_slow_vix_damp | 0.374 | How far the slow variance component's target is decoupled from VIX, in [0, 1]. |
| regime_stress_points | 0 | Stress the business cycle adds to the correlation blend, in VIX-equivalent points at full intensity (a contraction). |
| universe_stress_decay | 0 | Daily decay factor of the universe's remembered stress level, which keeps crisis correlation elevated after the VIX falls back. |
| universe_stress_weight | 0 | How much of the remembered stress reaches the correlation blend. |
Session guards
market/tick.rs · 2 parameters| Name | pt-v20 | Description |
|---|---|---|
| price_breaker_fraction | 0.25 | Circuit-breaker band as a fraction of the session open (+/-25% shipped). |
| price_hard_cap | 50000 | Absolute cap on any model price (50,000 shipped). |
Continuous size effect
market/factors.rs · 4 parameters| Name | pt-v20 | Description |
|---|---|---|
| size_effect_exponent | 0.15 | Exponent of the continuous size effect: (cap / 25B) ^ -exponent. |
| size_effect_smoothness | 0 | Blend from the four-tier size step toward a continuous power law, in [0, 1]. |
| spread_size_exponent | 0.455 | Exponent of the continuous spread curve. |
| spread_size_smoothness | 0 | Blend from the four-tier spread step toward a continuous power law, in [0, 1]. |
Persistent volume
engine.rs close, market/tick.rs phase 3 · 2 parameters| Name | pt-v20 | Description |
|---|---|---|
| volume_innovation_sigma | 0.21 | Standard deviation of the daily log-volume innovation. |
| volume_persistence | 0.7 | Day-to-day persistence of the shared volume component, in [0, 1). |
Derived parameters
These appear in to_dict() and are covered by the fingerprint, but you cannot override them, because they are computed from other entries when the model is built.
| Name | pt-v20 | Description |
|---|---|---|
| mispricing_phi | 0.988514 | Daily AR(1) coefficient of the mispricing, derived from mispricing_half_life_days. |
| s_phi_tick | 0.99997 | Per-tick decay, mispricing_phi^(1/390). |
Compile-time entries
Constants fixed when the engine is compiled. They appear in to_dict() and are covered by the fingerprint. An override is refused by name, because the engine would ignore it and the fingerprint would then record a change the run did not make.
| Name | pt-v20 |
|---|---|
| book_levels | 10 |
| daily_shock_cap | 0.15 |
| default_sector_anchor_pe | 18 |
| fair_value_floor | 0.01 |
| fiscal_multiplier | 0.3 |
| gold_equilibrium_base | 2200 |
| gold_mean_reversion | 0.002 |
| growth_duration_scale | 2 |
| inflation_target | 2 |
| inventory_limit_levels | 12 |
| loss_making_price_to_book | 1.2 |
| name | pt-v20 |
| oil_baseline | 75 |
| phillips_curve_coeff | 0.2 |
| rate_adjustment_floor | 0.5 |
| sector_daily_sigma_consumer_discretionary | 0.018 |
| sector_daily_sigma_consumer_staples | 0.008 |
| sector_daily_sigma_energy | 0.015 |
| sector_daily_sigma_financial_services | 0.015 |
| sector_daily_sigma_healthcare | 0.018 |
| sector_daily_sigma_industrials | 0.015 |
| sector_daily_sigma_materials | 0.015 |
| sector_daily_sigma_real_estate | 0.008 |
| sector_daily_sigma_technology | 0.025 |
| sector_daily_sigma_telecommunications | 0.01 |
| sector_daily_sigma_transportation | 0.015 |
| sector_daily_sigma_utilities | 0.008 |
See also
Every preset lists the shipped coefficient sets and what each measured. Engine and data documents the Engine that runs one, and How it is measured says what the default preset reproduces.