Benchmarking
In Cinnamon Core, benchmarking and strategies are tied together. Both are based on a strategic asset allocation, i.e. the pursued weights of asset categories according to some segmentation or segmentations.
This page explains how to set up strategies, benchmarks and strategy assignments, so that Cinnamon Core can serve an API call like the following:
GET /reporting/consolidation/00001/kpis?fromDate=2025-01-01&toDate=2025-06-30&strategyType=primary
{
"period": { "startDate": "2025-01-01", "endDate": "2025-06-30" },
"startMarketValueCns": 16513689.91991,
"endMarketValueCns": 16310043.836779997,
"avgInvestedCapitalCns": 16513689.91991,
"changeInAssetsCns": -203646.08313000388,
"flowsCns": -1.3472112314616425e-11,
"profitLossCns": -203646.08313000388,
"modifiedMwr": -0.012331955130420286,
"simpleMwr": -0.012331955130420286,
"twr": -0.01233195513042032,
"maximumTwrDrawdown": {
"period": { "startDate": "2025-02-13", "endDate": "2025-04-09" },
"twrAtStart": 0.01725246269015303,
"twrAtEnd": -0.04535764892902163
},
"annualizedTWR": -0.02471243903073539,
"volatility": 0.04737286521475408,
"ratioAtRisk95": -0.003183825763017567,
"activeReturn": -0.032349907391765347,
"trackingError": 0.0025367887072259517,
"informationRatio": -0.07161952418685431,
"strategy": "plainVanilla",
"benchmarkKPIs": {
"period": { "startDate": "2025-01-01", "endDate": "2025-06-30" },
"startValue": 1,
"endValue": 1.0206871806392201,
"avgInvestedValue": 1,
"flows": 0,
"modifiedMwr": 0.02068718063922015,
"simpleMwr": 0.02068718063922015,
"twr": 0.020687180639220534,
"maximumTwrDrawdown": {
"period": { "startDate": "2025-02-13", "endDate": "2025-04-09" },
"twrAtStart": 0.02367652814830207,
"twrAtEnd": -0.031167761832204193
},
"volatility": 0.05947880770722002,
"ratioAtRisk95": -0.00342847564449289
}
}
Defining Strategies
Consider the following plain vanilla strategy definition with associated benchmark:
Investment Category | Weight | Minimum | Maximum | Benchmark |
|---|---|---|---|---|
Swiss Shares | 30% | 20% | 40% | SPI |
Foreign Shares | 20% | 10% | 30% | MSCI World ex CH |
CHF Bonds | 25% | 20% | 30% | SBI AAA-BBB Total Return |
FX Bonds | 15% | 5% | 25% | BB Global Aggregate Total Return ex CHF |
Cash & Money Market | 10% | 7% | 12% | – |
Assuming this strategy is valid since Jan 1st 2024, we can model this as an IStrategy object as follows:
{
"id": "plainVanilla",
"description": {
"de": "08/15-Strategie",
"en": "Plain Vanilla Strategy"
},
"segmentationIds": [
"investmentCategory"
],
"definitions": [
{
"validFrom": "2024-01-01",
"rebalancing": "monthly",
"rebalancingDates": [],
"positions": [
{ "segments": { "investmentCategory": "swissShares" }, "weight": 0.3, "minWeight": 0.2, "maxWeight": 0.4, "benchmark": "spi" },
{ "segments": { "investmentCategory": "foreignShares" }, "weight": 0.2, "minWeight": 0.1, "maxWeight": 0.3, "benchmark": "msciWorldExCH" },
{ "segments": { "investmentCategory": "chfBonds" }, "weight": 0.25, "minWeight": 0.2, "maxWeight": 0.3, "benchmark": "sbi" },
{ "segments": { "investmentCategory": "fxBonds" }, "weight": 0.15, "minWeight": 0.05, "maxWeight": 0.25, "benchmark": "bbGlobAggTRExCHF" },
{ "segments": { "investmentCategory": "liquidity" }, "weight": 0.1, "minWeight": 0.07, "maxWeight": 0.12 }
]
}
]
}
A few remarks about this definition:
A strategy can be based on multiple segmentations (e.g. asset type and asset currency). They can also be used hierarchically by omitting certain segmentations in some positions.
A strategy has temporal definitions, which are always valid from a given date until the temporally following definition.
Benchmarks must be rebalanced regularly, i.e. bring their over time divergent values back to the strategic weights. The rebalancing frequency is thus part of each strategy definition with benchmarks. Irregular, explicit rebalancing dates are also supported.
Strategies can be used as standalone objects. For instance, to get the KPIs of the plainVanilla benchmark for the 2nd quarter of 2024 in CHF:
GET /benchmarks/strategy/plainVanilla/kpis?fromDate=2024-04-01&toDate=2024-06-30¤cy=CHF
{
"startValue": 1,
"endValue": 1,
"avgInvestedValue": 1.03761279332,
"flows": 0.121286241572,
"period": { "startDate": "2024-04-01", "endDate": "2024-06-30" },
"modifiedMwr": -0.116889693683,
"simpleMwr": -0.114351603471,
"twr": -0.117103376343,
"maximumTwrDrawdown": {
"period": { "startDate": "2024-04-03", "endDate": "2024-06-17" },
"twrAtStart": 0.00371303175068,
"twrAtEnd": -0.136025629914
},
"volatility": 0.135627732994,
"ratioAtRisk95": -0.0133734380163,
"positions": [...]
}
Assigning Strategies to Consolidations
The purpose of strategies in reporting and analysis is to compare them with an actual investment portfolio. In Cinnamon Core, the consolidation is the normal unit of reporting and analysis. Hence, strategies are assigned to consolidations.
A consolidation may have multiple types of strategy, and the assignments may change over time, e.g. because a client decides to pursue a different strategy. Strategy assignments therefore always have a type and are valid from a given date until the next assignment of the same type.
A consolidation 00001 with a primary plainVanilla strategy from April 2024 to June 2025, then a primary strawberry strategy from October 2025, would model these assignments with the following IConsolidationStrategy[]:
{
"id": "00001",
...
"strategies": [
{ "type": "primary", "validFrom": "2024-04-01", "strategy": "plainVanilla" },
{ "type": "primary", "validFrom": "2025-07-01" },
{ "type": "primary", "validFrom": "2025-10-01", "strategy": "strawberry" }
]
}
The triple consolidation, (reporting) date and strategy type uniquely identify the strategy to be applied:
Consolidation | Date | Strategy Type | Applicable Strategy |
|---|---|---|---|
|
|
| – |
|
|
|
|
|
|
| – |
|
|
|
|
|
|
| – |
Strategy Types
Strategy types are entirely solution defined. Cinnamon Core does not provide or enforce any standard strategy types. For instance, a solution could define separate types for benchmarking and asset allocation:
"strategyTypes": [
{
"id": "benchmarking",
"description": { "de": "Benchmarking", "en": "Benchmarking" }
},
{
"id": "allocation",
"description": { "de": "Anlagestrategie", "en": "Asset Allocation" }
}
]
Defining Benchmarks
In Cinnamon Core, a benchmark is a recipe on how to produce a time series of values and flows (i.e. the standard ITargetReturns). From this, TWR series can be computed.
Cinnamon Core’s terminology may be confusing regarding benchmarks:
The primary object used for benchmarking is the
Strategy. By design, overall benchmark and strategy are merged into a singleStrategyobject.A
Benchmarkobject is referenced by aStrategy. It is often simply a benchmark index, but it can be far more complex than that.
In the simplest (and very frequent) case, a benchmark referenced by a strategy or strategy definition position simply represents a benchmark index. In Cinnamon Core, a benchmark index is modelled as a security with prices corresponding to the index values (in fact, any security can serve as a benchmark).
For instance, the spi benchmark could be defined as follows:
{
"id": "spi",
"description": {
"*": "Swiss Performance Index Total Return (SPI® TR)"
},
"currency": "CHF",
"components": [
{ "component": "CH0009987501", "weight": 1, "segments": {}, "componentClass": "security" }
],
"relativeReturnOffset": 0,
"rebalancing": "explicit",
"rebalancingDates": []
}
A few remarks about this definition:
A benchmark has a currency, which is the currency of the time series it produces. Benchmarking against a consolidation in a different currency (or mixing benchmarks with different currencies) leads to implicit spot rate conversions of the benchmark values.
A benchmark can consist of multiple components with their respective weight.
A benchmark is NOT temporal. Changing benchmarking must be expressed by temporal strategy definitions.
A benchmark can be modified by a relative return offset. This annual return is added to the returns produced by the components on a daily basis (without considering business calendars or day count conventions).
Like benchmarked strategies, multi-component benchmarks must be rebalanced regularly.
Benchmarks can be used as standalone objects. For instance, to get the KPIs of the spi benchmark for the 2nd quarter of 2024 in CHF:
GET /benchmarks/benchmark/spi/kpis?fromDate=2024-04-01&toDate=2024-06-30
{
"startValue": 15442.86,
"endValue": 15974.09,
"avgInvestedValue": 15442.86,
"flows": 0,
"period": { "startDate": "2024-04-01", "endDate": "2024-06-30" },
"modifiedMwr": 0.03439971611476109,
"simpleMwr": 0.03439971611476109,
"twr": 0.03439971611476087,
"maximumTwrDrawdown": {
"period": { "startDate": "2024-04-01", "endDate": "2024-04-16" },
"twrAtStart": 0,
"twrAtEnd": -0.03758759711607831
},
"volatility": 0.08350937497710985,
"ratioAtRisk95": -0.009335651301877967
}
The ITargetReturns these KPIs are computed from:
GET /benchmarks/benchmark/spi/returns?fromDate=2024-04-01&toDate=2024-06-30
{
"returns": {
"623": {
"dayReturns": {
"2024-03-31": { "marketValue": 15442.86, "flows": 0 },
"2024-04-01": { "marketValue": 15442.86, "flows": 0 },
"2024-04-02": { "marketValue": 15267.17, "flows": 0 },
...
"2024-06-30": { "marketValue": 15974.09, "flows": 0 }
}
}
},
"period": { "startDate": "2024-04-01", "endDate": "2024-06-30" }
}
623 is the key of the only benchmark constituent (SPI security in this case):
GET /benchmarks/benchmark/spi/constituents
[
{
"key": 623,
"id": "CH0009987501",
"description": { "*": "Swiss Performance Index Total Return" },
"segments": { "securityClass": "base", "investmentType": "index", "currency": "CHF" },
"weight": 1
}
]
Benchmark Components and Constituents
Not only securities can serve as benchmark components. The following objects can serve as benchmark components:
Component Class | Time Series produced | Constituents | Implicit Constituent Segments |
|---|---|---|---|
| Series of security prices as values, zero flows. | The security. | The segments of the security. |
| Series of spot rates from component currency to benchmark currency as values, zero flows. | The currency. |
|
| For each target, market value and flows. Overall, the market value and flows series of the consolidation. The return of this component equals the return of the consolidation. Consolidation components produce multiple, segmentable constituents. They are therefore suitable as a segmentable benchmark at strategy level. Example applications:
| All consolidation targets. | For each target, its segments. |
| A builtin index producing value 1 and zero flows on every day. This is often used together with a relative return offset. | A pseudo-constituent with key 0. | – |