Skip to main content

Price Controls

Overview

A PriceControl record governs how Price Engine prices a single instrument. It specifies the pricing model, spread adjustments, workout methodology, and the source of market prices.

One PriceControl exists per instrument. Records are persisted in the database and republished on startup. The complementary ResolvedPriceControl is the fully-assembled, ready-to-compute view of a PriceControl that Price Engine derives in real time.

Users interact with these settings through the Prices view.

Field Reference

FieldDescriptionExample
instrumentIdPlatform instrument identifier. Read-only.BUSD00001
modelPricing model. One of: MANUAL, SOURCE, BENCHMARK, PASSTHROUGH, DISCOUNT_MARGIN.
See Pricing Models
SOURCE
sideDriver side. Controls which side is treated as primary and how adjustments map to bid/mid/ask. One of: BID, MID, ASK, SIDE, SIDE_SIDE.
See Pricing Models
MID
adjustment1Primary adjustment (driver). Interpretation depends on model and side.
See Pricing Models
50 (bps)
adjustment2Secondary adjustment — bid-ask spread width when side is MID/BID/ASK, or independent ask driver when side is SIDE_SIDE.
See Pricing Models
10 (bps)
spreadTypeHow adjustments are expressed. One of: YIELD (basis points), PRICE. For the SOURCE model, also controls whether source yield or source price drives the output.YIELD
workoutTypeMethodology for determining the redemption date. One of: MATURITY, NEXT_CALL, WORST, MANUAL. Fixed-maturity bonds always use maturity date regardless of this setting.WORST
workoutDateManual workout date override in YYYYMMDD format. Only used when workoutType = MANUAL.20260525
priceSourceNamed price source for incoming market prices. Required for SOURCE and PASSTHROUGH models, and for callable bonds that need a price to determine the workout date. See Configuration.TWEB
benchmarkPriceSourceNamed price source for benchmark instrument prices. If blank, PE uses its own internally-published price for the benchmark instrument. The benchmark is defined in the instrument's static data.TWEB
noteFree-text notes field. Not used in pricing calculations.

Pricing Models

Price Engine supports five pricing models. The model field, together with side, spreadType, and the adjustment values, determines how bid/mid/ask prices and yields are computed.

MANUAL

Prices are computed entirely from the supplied adjustment values — no external reference price is required.

  • adjustment1 (Driver) is the primary spread value in units defined by spreadType
  • adjustment2 (BidAsk Spread) defines the bid–ask width
  • Not supported for floating rate bonds with spreadType = YIELD — use DISCOUNT_MARGIN instead

SOURCE

Prices are driven by an external market price from the configured priceSource.

  • adjustment1 (Driver) is an incremental spread or price offset applied on top of the source value
  • spreadType controls whether the source yield (YIELD) or source price (PRICE) serves as the basis
  • Requires a valid priceSource subscription

BENCHMARK

Prices are derived from the yield of a benchmark instrument plus a spread.

  • The benchmark is defined in instrument.benchmarkInstrumentId (configured in Static Data Server)
  • adjustment1 (Driver) is the spread to benchmark yield in basis points
  • adjustment2 (BidAsk Spread) defines the bid–ask width
  • Requires spreadType = YIELD or SPREAD
  • Not supported for floating rate bonds — use DISCOUNT_MARGIN instead

PASSTHROUGH

The source price is copied verbatim without modification. All price, yield, discount, PV01, size, and reference spread fields are forwarded as received from priceSource. No Analytics Engine request is made, and no adjustments are applied.

  • Requires a valid priceSource
  • Spread calculations and yield conversion are bypassed

DISCOUNT_MARGIN

For floating rate bonds only. Prices are derived from discount margin (DM) spreads in basis points and converted to clean price via Analytics Engine.

  • adjustment1 (Driver) is the primary DM value in basis points
  • adjustment2 (BidAsk Spread) defines the bid–ask DM width
  • Requires spreadType = YIELD or SPREAD
  • Only supported for floating rate bonds (couponType = FLOAT)

Logical Model

The following diagram shows the user-facing spread values for each model and side combination. Blue cells are user-supplied inputs; the engine derives the rest.

Logical model values

The formula-level representation of how bid/mid/ask are computed from the user marks:

Logical model formulas

For any given model and side combination, two out of four adjustment slots are editable. These map to adjustment1 and adjustment2 in the data model:

Price control data model

The Prices view presents three columns (Driver, Driver2, BidAsk Spread), with visibility rules applied per Driver Side selection:

Trading view columns

Driver Side Reference

Driver SideEditable InputsDerived Outputs
MIDDriver (midSpread), BidAsk Spreadbid = mid − width/2, ask = mid + width/2
BIDDriver (bidSpread), BidAsk Spreadmid = bid + width/2, ask = bid + width
ASKDriver (askSpread), BidAsk Spreadbid = ask − width, mid = ask − width/2
SIDEDriver (bidSpread only)ask side set same as bid; no independent ask spread
SIDE_SIDEDriver (bidSpread), Driver2 (askSpread)bid and ask independently specified

Recalculation Triggers

Regardless of model or bond type, recalculation is triggered when any of the following change:

  • PriceControl settings
  • Instrument data (from Static Data Server)
  • Business date

Additional triggers by event type:

EventCondition
Source price updateModel is SOURCE, PASSTHROUGH, or workout type requires a source price
Benchmark price updateModel is BENCHMARK; also refreshes benchmark spread output in all models except PASSTHROUGH
FRN curve updateCoupon type is FLOAT and model is not PASSTHROUGH

Hard reset — clears all pending Analytics Engine requests and resets the workout date for callable bonds:

  • Workout type changes
  • Manual workout date changes when workoutType = MANUAL
  • Business date changes
  • Coupon type changes
  • Bond redemption schedule changes
  • Model changes from PASSTHROUGH to another model

Soft reset — clears prices but preserves pending Analytics Engine requests:

  • Pricing side changes
  • Model changes (except changes away from PASSTHROUGH)

Resolved Price Controls

A ResolvedPriceControl is the fully-assembled, ready-to-compute view of a PriceControl. It is built by Price Engine whenever any of its inputs change.

How It Is Assembled

The Resolved PriceControl combines data from four sources:

SourceContribution
PriceControlModel, side, adjustments, workout settings, price source names
Instrument (from SDS)Currency, benchmark instrument ID (resolved via ID reverse mapping), FRN reference index
PriceProfileYield conventions (bondYieldConvention, billYieldConvention), G-curve, Z-curve names
Topic resolutionpriceTopic and benchmarkPriceTopic resolved from source name + instrument

The computed spread values (bidSpread, midSpread, askSpread) are derived from adjustment1, adjustment2, side, and model using the same logical model shown above.

For floating rate bonds, the frnIndex and frnCurveTopic fields are populated from the instrument's reference index and the forecast curve configured for that index in Static Data Server.

Validation

Before Price Engine uses a ResolvedPriceControl for pricing, it is validated. If validation fails, the price is published with ok=false and the relevant message is visible in price.message.

All possible validation errors are listed here