Skip to main content
Skip table of contents

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

JSON
{
  "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:

JSON
{
  "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&currency=CHF

JSON
{
  "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[]:

CODE
{
  "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

00001

2023-12-31

primary

00001

2024-12-31

primary

plainVanilla

00001

2025-09-30

primary

00001

2025-12-31

primary

strawberry

00001

2025-12-31

secondary

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:

CODE
"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 single Strategy object.

  • A Benchmark object is referenced by a Strategy. 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:

JSON
{
  "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

JSON
{
  "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

JSON
{
  "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

JSON
[
  {
    "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

security

Series of security prices as values, zero flows.

The security.

The segments of the security.

currency

Series of spot rates from component currency to benchmark currency as values, zero flows.

The currency.

currency

consolidation

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:

  • A consolidation representing a model portfolio serving as a benchmark.

  • The comparison of similar real portfolios.

All consolidation targets.

For each target, its segments.

constant

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.

Advanced Concepts

Hierarchical Strategies

Explicit Rebalancing

Multi-Constituent Benchmarks

Segmentable Benchmarks

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.