{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://optionincometools.com/research/schemas/transparent-wheel-benchmark.json",
  "title": "Transparent wheel benchmark — backtest cycle observation",
  "description": "One observation = one wheel cycle (CSP opened, CSP closed/expired/assigned; or CC opened, CC closed/expired/assigned). Multiple cycles compose a full backtest run with documented rules. Used to publish a transparent, reproducible wheel benchmark on a fixed universe vs total-return references. See https://optionincometools.com/research/transparent-wheel-benchmark/ for the methodology.",
  "type": "object",
  "required": [
    "runId",
    "rulesVersion",
    "underlying",
    "cycleStartDate",
    "cycleEndDate",
    "cycleType",
    "entryStrike",
    "entryPremium",
    "exitOutcome",
    "realizedPnl",
    "capitalDeployed",
    "methodologyVersion"
  ],
  "properties": {
    "observationId": { "type": "string" },
    "runId": { "type": "string", "description": "Identifier for the parent backtest run (groups all cycles in one run together)." },
    "rulesVersion": {
      "type": "object",
      "required": ["targetDelta", "dteMin", "dteMax"],
      "properties": {
        "targetDelta": { "type": "number", "enum": [0.15, 0.20, 0.25, 0.30, 0.35] },
        "dteMin": { "type": "integer" },
        "dteMax": { "type": "integer" },
        "profitTakingPolicy": {
          "type": "string",
          "enum": ["hold-to-expiry", "close-at-50pct-profit", "close-at-25pct-profit", "roll-when-itm-and-21-dte"]
        },
        "rollPolicy": { "type": "string" },
        "universe": { "type": "string", "enum": ["SPY-only", "QQQ-only", "fixed-30-large-cap", "fixed-100-mid-cap"] },
        "commissionPerLeg": { "type": "number", "default": 0.65 },
        "slippageFraction": { "type": "number", "default": 0.25 },
        "dividendsReinvested": { "type": "boolean", "default": false }
      }
    },
    "underlying": { "type": "string" },
    "cycleStartDate": { "type": "string", "format": "date" },
    "cycleEndDate": { "type": "string", "format": "date" },
    "cycleType": { "type": "string", "enum": ["csp", "cc", "assignment-event", "share-disposition"] },
    "entryStrike": { "type": "number" },
    "entryPremium": { "type": "number" },
    "exitOutcome": {
      "type": "string",
      "enum": ["expired-otm", "expired-itm", "assigned", "closed-early-profit", "closed-early-loss", "rolled-forward"]
    },
    "exitPrice": { "type": ["number", "null"] },
    "realizedPnl": { "type": "number" },
    "capitalDeployed": { "type": "number", "minimum": 0 },
    "cycleReturnOnCapital": { "type": "number", "description": "realizedPnl / capitalDeployed" },
    "dividendsReceived": { "type": ["number", "null"] },
    "underlyingTotalReturnSamePeriod": { "type": ["number", "null"], "description": "Buy-and-hold total return on the underlying over the same cycle window." },
    "drawdownDuringCycle": { "type": ["number", "null"] },
    "methodologyVersion": { "type": "string" },
    "dataProvider": { "type": "string", "default": "polygon.io" },
    "notes": { "type": ["string", "null"] }
  },
  "additionalProperties": false
}
