{
  "slug": "cost-drag",
  "title": "Linear rebalance cost drag",
  "topic": "implementation",
  "summary": "Convert a symmetric per-side basis-point cost and traded weights into a one-period return approximation.",
  "version": "1.0.0",
  "published": "2026-10-16",
  "status": "Educational reference",
  "formula": "cost_fraction = gross_traded_weight * cost_bps / 10000; net_approx = gross_return - cost_fraction",
  "inputs": [
    [
      "before",
      "Aligned long-only weights summing to one",
      "Drifted pretrade fractions"
    ],
    [
      "after",
      "Same-length weights summing to one",
      "Targets before cost-funded cash adjustment"
    ],
    [
      "cost_bps",
      "0 to 1000 basis points per traded notional",
      "Same assumed rate for buys and sells"
    ],
    [
      "gross_return",
      "Decimal, -1 to 10",
      "One-period return before this assumed cost"
    ]
  ],
  "method": [
    "The default gross traded fraction is 0.4 and the per-side cost is ten basis points, or 0.001. The assumed drag is therefore 0.0004 of starting NAV, equal to four basis points. Subtracting it from 0.02 gives an approximate net return of 0.0196.",
    "Multiplying the same rate by one-way turnover would halve the stated per-side cost. Conversely, an already round-trip cost quote cannot be used as a per-side rate without adjustment. Record the quote convention before comparing outputs."
  ],
  "limits": [
    "This linear reference is not an execution estimate. It has no participation, spread, impact, tax, financing or order timing model, and does not re-solve holdings after fees. A net approximation below -100% is possible under extreme inputs and signals that the additive illustration is outside a feasible funded account."
  ],
  "checks": [
    "Basis-point conversion, gross-versus-one-way factor and zero-cost identity.",
    "Costs remain explicit in exports and never relabelled as actual broker charges."
  ],
  "related": [
    "transaction-cost-units",
    "turnover-definitions"
  ],
  "sources": [
    {
      "title": "Cvxportfolio: proportional transaction costs",
      "url": "https://www.cvxportfolio.com/en/1.5.0/costs.html"
    },
    {
      "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
    ],
    "cost_bps": 10,
    "gross_return": 0.02
  },
  "frozen_result": {
    "schema_version": 1,
    "model_id": "cost-drag",
    "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
      ],
      "cost_bps": 10,
      "gross_return": 0.02
    },
    "outputs": {
      "trades": [
        -0.19999999999999996,
        0.19999999999999996
      ],
      "gross_traded_weight": 0.3999999999999999,
      "one_way_turnover": 0.19999999999999996,
      "cost_fraction": 0.0003999999999999999,
      "net_return_approximation": 0.0196
    },
    "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.",
      "Symmetric basis-point cost per buy and sell notional. Linear one-period approximation; no spread/impact calibration, tax, financing or cash re-solve."
    ]
  }
}
