{
  "slug": "turnover",
  "title": "Two-sided and one-way turnover",
  "topic": "implementation",
  "summary": "Measure traded capital fractions from aligned drifted and target weights under a stated convention.",
  "version": "1.0.0",
  "published": "2026-10-16",
  "status": "Educational reference",
  "formula": "trade_i = after_i - before_i; gross = sum(abs(trade_i)); one_way = gross/2",
  "inputs": [
    [
      "before",
      "2-50 nonnegative weights summing to one",
      "Drifted pretrade weights at the measurement time"
    ],
    [
      "after",
      "Same-length weights summing to one",
      "Posttrade targets on the same NAV basis"
    ]
  ],
  "method": [
    "Moving 60/40 to 40/60 sells 20% of NAV in one exposure and buys 20% in the other. Gross traded weight is 40%; the half-sum convention reports 20% one-way turnover. Both are retained because cost formulas and reports can use different denominators.",
    "The before vector must describe holdings immediately before the rebalance. Comparing today with an older target omits price drift and can understate or overstate the actual rebalance. An asset-order mismatch can also create fictitious trades even when totals look correct."
  ],
  "limits": [
    "The half-sum convention presumes a fully invested, self-financing comparison on one NAV basis. External flows, leverage changes, cash accounting and derivatives require a richer trade ledger. The card never silently normalizes weights to hide those differences."
  ],
  "checks": [
    "No trade, full rotation and partial balanced reallocation.",
    "Sum-one, alignment and unsigned-weight constraints tested."
  ],
  "related": [
    "turnover-definitions",
    "transaction-cost-units"
  ],
  "sources": [
    {
      "title": "Cvxportfolio: turnover constraints and cash conventions",
      "url": "https://www.cvxportfolio.com/en/1.5.0/constraints.html"
    }
  ],
  "example": {
    "before": [
      0.6,
      0.4
    ],
    "after": [
      0.4,
      0.6
    ]
  },
  "frozen_result": {
    "schema_version": 1,
    "model_id": "turnover",
    "model_version": "1.0.0",
    "engine_version": "1.0.0",
    "published_at": "2026-10-16",
    "scope": "Synthetic educational reference calculation. Not a fitted investment strategy, forecast, provider model or client return.",
    "inputs": {
      "before": [
        0.6,
        0.4
      ],
      "after": [
        0.4,
        0.6
      ]
    },
    "outputs": {
      "trades": [
        -0.19999999999999996,
        0.19999999999999996
      ],
      "gross_traded_weight": 0.3999999999999999,
      "one_way_turnover": 0.19999999999999996
    },
    "notes": [
      "Both vectors use the same pretrade NAV and asset order, sum to one, and exclude external flows. before means drifted pretrade weights, not an earlier target."
    ]
  }
}
