Asset Classes
Table of Contents
1. Summary
Wikipedia defines an asset class as "a group of marketable financial assets that have similar financial characteristics and behave similarly in the marketplace". However, there is no agreed upon taxonomy for asset classes. Seven classifications have been considered for our analysis, including ORE, ISDA, and Basel. No two classifications agree completely. They range from five values to nine, and disagree in both directions: some omit classes the others carry, and some subdivide a class the others treat as atomic.
Each of the analysed enumerations classifies a different subject - a product, a trade underlying, a market data series, a risk sensitivity - and each requires a different granularity. A single flat list cannot serve all seven subjects simultaneously. There is also a difference in cardinality, which cannot be collapsed into a single attribute: a product carries one class, while a trade's risk carries as many classes as it has kinds of sensitivity.
The objective of this document is to analyse prior art to come up with the key elements which need to be modeled for the purposes of ORE Studio. Our final result proposal is therefore one taxonomy of asset classes, referenced once by a product and many times by a trade's risk, with each use case selecting the classes it recognises.
Scope. This document treats the taxonomy: what the classes are and which values it should hold. Two neighbouring subjects are treated elsewhere, and both were examined before being set aside.
The aggregation buckets that SIMM, FRTB and ORE's reporting filter publish are covered in regulatory risk buckets. They call their values risk classes and draw on a similar vocabulary, but a bucket is fixed by a published methodology and exists to carry that framework's parameters, so it is evidence about a charge rather than about the domain.
Individual risk sensitivities are covered in market data requirement, with the greeks covering the derivative taken with respect to such an input. A sensitivity is taken with respect to one named curve or surface rather than a class, so it sits below this taxonomy rather than within it.
One relation crosses both boundaries and is stated where it bears on the argument: the class a sensitivity falls into is the asset class its requirement projects onto. Establishing how that projection is held is outside this document.
2. State of the Art
The current state was gleaned by analysing a selection of existing taxonomies within the domain of financial instruments, as summarised below. The table provides a clue to the large variation found.
| Classification | Values | Classifies |
|---|---|---|
| ISDA product taxonomy | 5 top level, then nested | OTC derivative products |
| FpML asset class scheme | 8 | Products |
ISDA SIMM ProductClass |
6 substantive | Products, for margin |
ISDA SIMM RiskClass |
6 | Risk sensitivities |
| FRTB risk classes | 6, with credit spread split three ways | Risk sensitivities, for regulatory capital |
ORE AssetClass |
9 | Trade underlyings |
ORE RiskClass |
6 | Risk sensitivities, for reporting |
Each classification is named an "asset class", a "product class" or a "risk
class", but the names bear little correspondence to the variation observed
amongst them. For example RiskClass is used in two different meanings; the
name is therefore not a reliable guide to a classification's subject or
granularity. Therefore a detailed analysis is necessary to understand the
semantics and perform an in depth taxonomic analysis.
Three of the seven classify risk sensitivities for a charge rather than
classifying anything in the domain: SIMM's RiskClass, FRTB's risk classes and
ORE's RiskClass. They are examined in regulatory risk buckets, and the
reasoning that separates them from this taxonomy is summarised under Analysis
below. The sections that follow treat the remaining four.
2.1. The ISDA Product Taxonomy
The ISDA product taxonomy, published as an FpML coding scheme, is hierarchical. Values are colon-separated paths that descend from an asset class through sub-category to instrument type and settlement method. Examples:
InterestRate:IRSwap:FixedFloatCredit:SingleName:Corporate:NorthAmericanCorporateCommodity:Agricultural:Dairy:Swap:CashForeignExchange:SimpleExotic:BarrierEquity:Option:ParameterReturnVolatility:SingleName
Its five top-level classes are:
CommodityCreditEquityForeignExchangeInterestRate
Two properties are of particular relevance. The taxonomy is open at the leaves: a consumer that needs only the asset class reads the first segment and ignores the rest, while a consumer that needs the instrument type reads further. Secondly, it covers OTC derivatives only, which is why it has no bond class: a bond is a security rather than a derivative contract, and falls outside the scope ISDA set.
2.2. The FpML Asset Class Scheme
FpML publishes a separate, flat asset class scheme, which ORE Studio registers
as FPML_ASSET_CLASS:
ForeignExchangeInterestRateCreditEquityCommodityInflationBondSecuritiesFinancing
It extends the ISDA taxonomy with three additional entries. Bond appears
because FpML covers securities as well as derivatives. SecuritiesFinancing
appears because repo and securities lending are a product family FpML
represents. Inflation appears as a sibling of InterestRate rather than
beneath it.
There are issues with this approach to modeling. Inflation is treated as a top-level class by FpML, as a top-level class by ORE's risk filter, and as no class at all by the ISDA taxonomy and by SIMM.
2.3. ORE's AssetClass
ORE holds enum class AssetClass { EQ, FX, COM, IR, INF, CR, BOND,
BOND_INDEX, PORTFOLIO_DETAILS } in ored/utilities/parsers.hpp.
It attaches this to underlyings, not to trades. Trade declares virtual
std::map<AssetClass, std::set<std::string>> underlyingIndices(...), so a trade
reports the indices it requires grouped by asset class, and one trade can report
under several classes at once.
ORE defines neither the concept nor a rationale for the values. The user guide
uses the term only descriptively, as in "depending on the underlying asset
class" when explaining why a barrier option is an FxGenericBarrierOption
rather than a CommodityGenericBarrierOption, and constrains some products so
that "all underlyings must be from the same asset class".
Three of the nine values are not asset classes in any other scheme here.
BOND_INDEX separates an index from a single bond; PORTFOLIO_DETAILS marks
portfolio-level data rather than a market. The user guide itself counts six
asset classes, listing IR, FX, EQ, COM, CR and INF as ORE's product coverage and
describing the scripted trade module as covering "five of the six asset classes
covered in ORE". The enumeration and the prose do not agree, and nothing
reconciles them.
2.4. The Common Domain Model
CDM defines a product from three attributes, one of which is a taxonomy that classifies it, alongside an identifier and the economic terms. It does not define its own asset class list, and delegates classification to a taxonomy reference.
CDM therefore treats classification as a property referencing an external scheme rather than as an enumeration embedded in the product, which is one structural response to the variation described above. Trade modeling covers CDM more fully.
3. Analysis
3.1. Identifying Variation Dimensions
The seven classifications differ along two independent dimensions. Treating the two as one accounts for much of the apparent disorder.
The first dimension is the subject classified. A product, a trade underlying,
a market data series and a risk sensitivity are four distinct subjects, and a
classification of one is not a classification of another. ORE's AssetClass and
ORE's RiskClass differ principally because the first classifies underlyings
and the second classifies sensitivities.
The second dimension is granularity. SIMM demonstrates it within a single
framework: RatesFX is one node where InterestRate and FX are two. A second
apparent instance, the division of credit, is examined below and proves to be a
property rather than a finer granularity.
3.2. Regulatory Risk Buckets Were Examined and Set Aside
SIMM, FRTB and ORE's reporting filter each publish an enumeration for grouping
exposures before charging them, and each calls its values risk classes. Because
those values resemble asset classes — InterestRate, Equity, FX,
Commodity, Credit — they were examined as prior art for this taxonomy.
They were found not to bear on it. A bucket exists to carry the parameters a framework applies, so its membership follows from which exposures that framework weights and correlates together rather than from which markets resemble one another. SIMM's own declaration makes the point: the enumeration's ordering "is used in indexing in to correlation matrices", so its values are positions in a published table. A framework may merge two asset classes, divide one, or omit one, and none of those decisions is evidence about the domain.
The two credit divisions settle it. SIMM divides credit by qualifying status and FRTB divides it by securitisation status, along incompatible axes, over the same trades. Neither division describes the credit market. Each describes which exposures its own framework charges together.
The buckets are therefore treated in regulatory risk buckets rather than folded into the taxonomy below. What the taxonomy owes them is a projection onto each enumeration, recorded in the correspondence table, not a change to its own membership.
3.3. Cardinality: One Class per Product, Many per Trade
Setting the buckets aside leaves a second question, which does bear on the model. A product must have exactly one product class, whereas a trade carries as many classes as it has sensitivities:
- A fixed-rate bond is a product of class
Bond. It is sensitive to interest rate risk in one currency and credit risk. - A cross-currency swap is a product of class
InterestRate. It is sensitive to interest rate risk in two currencies and FX risk. - An equity option denominated in a foreign currency is one product of class
Equity. It is sensitive to FX risk for a book based on a business centre which is not the same as that of the option.
ORE encodes the same distinction in a signature:
Trade::underlyingIndices() returns std::map<AssetClass,
std::set<std::string>>, a map keyed by class, because one trade reaches into
several classes. A classification held as a property of the trade would have
required a single return value.
The dimension is therefore a requirement: the class of a product and the classes its risk falls into are distinct attributes with distinct cardinality rather than distinct taxonomies. Thus, a single taxonomy referenced once by a product and many times by a trade's risk satisfies both use cases.
3.3.1. The ORE Studio realisation requires further analysis
The preceding argument establishes that a trade's risk references the taxonomy many times over. It does not establish how ORE Studio should hold those references, and two observations indicate that the question belongs to a different body of work.
The first concerns granularity. A sensitivity is taken with respect to a specific input: not interest rate risk in general, but the EUR discount curve. That input is a market data requirement, described in market data requirement. The class a sensitivity falls into is therefore the asset class of a requirement, and the set of classes a trade's risk touches is the projection of its requirements onto their asset classes.
The second concerns the shape of the underlying relation. The greeks records that a sensitivity is defined by the input it moves rather than by the instrument. A sensitivity is consequently a pairing of a requirement with a greek, and delta and gamma share one requirement because both are derivatives with respect to spot, differing only in order.
Both observations point to one relation, between a trade and the market data requirements it generates, from which the classes a trade's risk touches are derived by projection. Establishing that relation is the subject of the market data requirement work rather than of this taxonomy, and the taxonomy is complete without it: what remains is to determine how the derived attributes are stored, not which values they draw on.
3.4. What the disagreements actually are
Stripped of naming differences, the substantive disagreements are three.
- Inflation: a top-level class for FpML and ORE's risk filter, no class at all for the ISDA taxonomy and SIMM, where inflation sensitivity is interest rate sensitivity.
- Bond: a class for FpML and ORE's
AssetClass, absent from the ISDA taxonomy because it is not a derivative, and absent from both risk classifications because a bond's risk decomposes into interest rate and credit. - Credit subdivision: apparent rather than real, and doubly so. SIMM splits credit by qualifying status; FRTB splits it by securitisation status. Two frameworks needing two different subdivisions of one class means neither is a subclass. Both are properties of the exposure.
Each disagreement reflects a use case that recognises a different set of classes, or that carries a property alongside them, rather than a difference of opinion about the domain.
4. A proposed taxonomy
4.1. One taxonomy, two cardinalities
The proposal separates the taxonomy from what references it.
- The taxonomy is one list of asset classes, shared by every consumer.
- A product references exactly one class. That is its asset class.
- A risk sensitivity references exactly one class, and a trade's risk profile is therefore a set of classes, one per sensitivity.
No enumeration is named risk class under this arrangement. A risk class is the taxonomy read from a sensitivity rather than from a product, and the difference in cardinality is carried by the reference rather than by a second enumeration.
4.2. The shape
Seven asset classes, held as a flat list. Every consumer selects a cut through it: the subset of classes that consumer recognises. A scheme with no place for one of them leaves it out of its cut rather than filing it beneath another class.
interest_rates inflation fx equity commodity credit bond
Inflation is the class that separates the schemes. FpML, ORE's
AssetClass and ORE's RiskClass carry it. The ISDA taxonomy, SIMM's
RiskClass and FRTB do not, and report inflation sensitivity as
interest rate sensitivity instead.
That treatment is a projection those schemes apply rather than a
parent-child relation in the taxonomy, and the correspondence below
records it as one. SIMM states the projection most directly: its
RiskType declaration notes that "the risk type inflation has to be
treated as an additional, single tenor bucket in IRCurve". The note
describes where SIMM puts the exposure when it charges it, not where
inflation sits among the markets.
4.3. How each use case cuts it
| Use case | Cut |
|---|---|
| Product classification | All seven classes |
| Market data filtering | All seven |
| Risk reporting, ORE style | All minus bond |
| SIMM margin, product side | All minus bond and inflation, with interest_rates and fx grouped as RatesFX |
| SIMM margin, risk side | All minus bond and inflation, plus a qualifying property on credit |
| FRTB capital, sensitivities | All minus bond and inflation, plus a securitisation property on credit |
| ISDA product taxonomy | All minus bond and inflation, then deeper product levels |
All but one use case is a cut of the same list. The exception is SIMM's
RatesFX, which groups two classes, whereas a cut selects classes
without combining them. That case requires a grouping declared over the
list rather than a class in it.
4.4. Cross-asset is not a class
ORE Studio held cross_asset for market data that relates two classes,
documented as "cross-asset correlations". The taxonomy does not carry
it, because a correlation between an equity index and an FX rate is not
a third kind of thing: it is a relation between two classes.
A correlation series should therefore reference two asset classes rather than one special value. That removes the only value in the market data enumeration that has no counterpart in any external scheme, and removes the need to explain it.
4.5. How a correlation names its two classes
ORE does not carry the classes on the key. It names each operand after the factor class that operand belongs to, so the classes are recovered from the operand names:
| Operand begins with | Class | Example |
|---|---|---|
EQ- |
equity |
EQ-RIC:.SPX |
FX- |
fx |
FX-GENERIC-USD-EUR |
COMM- |
commodity |
COMM-NYMEX:CL |
contains -CMS- |
interest_rates |
EUR-CMS-10Y |
A rates operand takes the fourth form rather than a prefix. A swap rate
names its currency, not a class, and -CMS- is the part that marks it
as one. The exception is real in the corpus and not a special case we
introduced.
An operand matching no rule contributes no class. A correlation over two such operands therefore references no class at all, which the junction permits and a single not-null column would not. A pair whose two operands share a class references that class once, not twice.
This is a naming convention of the corpus rather than a published ORE
contract. series_classifier implements it, and the corpus test runs
every correlation pair the examples carry through it and pins the
outcome for a cross-class, a same-class and a rates pair, so a change
in the convention surfaces as a test failure rather than as a silently
wrong class.
4.6. Bond stays
Bond is absent from both risk classifications for a good reason: a bond's risk decomposes into interest rate and credit risk, so it earns no risk class of its own. It is nevertheless a product class in FpML and an underlying class in ORE, and ORE Studio holds 11 bond products.
The taxonomy keeps it, and the risk cuts drop it. That is precisely the case the taxonomy exists to handle.
4.7. The resulting list
The analysis yields seven classes, all at the same level.
| Code | Name | Covers |
|---|---|---|
interest_rates |
Interest Rate | Deposits, forward rate agreements, interest rate swaps and swaptions, caps and floors, and cross-currency swaps. The curve every other class discounts against |
inflation |
Inflation | Zero-coupon and year-on-year inflation swaps, inflation caps and floors, and inflation-linked bonds, with the index curve and its seasonality adjustment |
fx |
Foreign Exchange | FX spot, forwards, swaps, and vanilla and exotic options. Present as a secondary exposure wherever a position is denominated outside the book's base currency |
equity |
Equity | Equity spot and forward positions, and vanilla and exotic equity options, with dividend curves and volatility surfaces |
commodity |
Commodity | Commodity forwards, swaps and options, with forward curves driven by storage cost and convenience yield rather than interest-rate parity |
credit |
Credit | Credit default swaps, single-name and index, and credit-linked notes, with spread curves, hazard rates and recovery assumptions |
bond |
Bond | Fixed and floating-rate bonds, callable and convertible bonds, and bond futures and options, with issuer spread curves |
rates is renamed interest_rates. With inflation beside it rather
than beneath it, the bare word no longer reads as the interest rate
class on its own. fx keeps its present spelling, which is
unambiguous and universally used.
The external spellings are recorded in the correspondence below rather
than adopted. InterestRate and ForeignExchange buy nothing that
interest_rates and fx do not already say.
4.7.1. Correspondence with external schemes
| ORE Studio | FpML | ISDA taxonomy | ORE AssetClass |
ORE RiskClass |
SIMM RiskClass |
FRTB |
|---|---|---|---|---|---|---|
interest_rates |
InterestRate |
InterestRate |
IR |
InterestRate |
InterestRate |
GIRR |
inflation |
Inflation |
— | INF |
Inflation |
within InterestRate |
within GIRR |
fx |
ForeignExchange |
ForeignExchange |
FX |
FX |
FX |
FX |
equity |
Equity |
Equity |
EQ |
Equity |
Equity |
EQ |
commodity |
Commodity |
Commodity |
COM |
Commodity |
Commodity |
COMM |
credit |
Credit |
Credit |
CR |
Credit |
CreditQualifying, CreditNonQualifying |
CSR_NS, CSR_SNC, CSR_SC |
bond |
Bond |
— | BOND |
— | — | — |
Three cells record the findings of the analysis rather than a mapping. Credit maps to several values in SIMM and FRTB because both carry a property the taxonomy does not; inflation maps inside interest rate for both; and bond has no risk counterpart because its sensitivity decomposes.
4.7.2. What changed from the previous enumeration
The enumeration this replaced held eight values. Two changed.
cross_asset is gone. A correlation between two classes is a relation
between them rather than a third kind of thing, so a correlation series
references two classes. No external scheme surveyed here carries an equivalent
value.
rates became interest_rates, in the ores_refdata_asset_class_codes
table and everywhere the code carried the code. With inflation beside it,
the bare word states less than the class holds.
inflation keeps its position. SIMM and FRTB place inflation inside
interest rate when they charge it, which the correspondence above records as a
projection those schemes apply. A consumer that reports inflation separately
selects the class; one that does not leaves it out and reports the sensitivity
under interest rate.
5. Open questions
- Whether
SecuritiesFinancingshould be a root class. FpML carries it; no other scheme here does. It depends on whether repo and securities lending become products in ORE Studio. - How a grouping such as SIMM's
RatesFXis declared. It is not a node and not a cut, so it needs a third mechanism, or SIMM's product side is treated as outside the taxonomy. - Whether a trade's risk profile is stored or derived. Storing it duplicates what a sensitivity run computes; deriving it means the classification is unavailable before pricing.
- Whether the taxonomy should adopt the ISDA taxonomy's deeper levels wholesale for products, rather than stopping at the asset class. That would make the product classification and the ISDA taxonomy the same object, at the cost of adopting a scheme that covers only OTC derivatives.
6. Sources
The general definition is quoted from Wikipedia as retrieved on 15 September 2026: Asset classes.
The ISDA product taxonomy is read from the FpML coding scheme at fpml.org, retrieved on the same date.
ORE's enumerations are read from
OREData/ored/utilities/parsers.hpp, OREData/ored/portfolio/trade.hpp,
OREAnalytics/orea/engine/riskfilter.hpp,
OREAnalytics/orea/simm/simmconfiguration.hpp and
OREAnalytics/orea/simm/crifrecord.hpp. The user guide statements are
read from userguide_intro.tex and genericscriptedproducts.tex. No
ORE source defines the concept or states a rationale for its values.
The FRTB risk types, the CRIF record fields and the curvature scenario
are read from OREAnalytics/orea/simm/crifrecord.hpp.
The greeks covers the greek segment of those names.
The FpML asset class values registered here are read from
fpml_asset_class_artefact_populate.sql.
7. See also
- Trade — the structure note that orders this cluster, and where to read this page in it.
- Product Family — the contract shape a product type takes, independent of its market.
- Regulatory Risk Buckets — the aggregation buckets SIMM and FRTB charge against, examined here and set aside.
- Risk Classes — the set of classes a product is sensitive to, and why it is a second reference into this taxonomy.
- The Greeks — the named sensitivities; a risk type is a class crossed with a greek.
- Trade modeling — the four entities a trade is built from.
- ORE Products by Asset Class — the product pages, grouped by class.
- Coding Schemes — how a value records the scheme that issued it.
- Standard financial identifiers — the identifier schemes.
- Knowledge — the hub of all knowledge notes.