{
  "tool_id": "art-329-tvm-bond-duration",
  "note": "golden_hash is empty until first golden-parity.test.mjs --update. Standard semiannual bullet-bond example (6% coupon, 5yr, $1000 face, 8% YTM) shared with art-330 (DV01) and art-331 (convexity) so all three can be chain-fixture-cross-checked against the same bond. Cross-checked independently: modified_duration * price * 0.0001 = 4.193709 * 918.89 * 0.0001 = 0.3853, matching art-330's measured DV01 (0.385356) to 3 decimal places.",
  "vectors": [
    {
      "name": "duration_semiannual_bullet",
      "description": "6% coupon, $1000 face, 5yr to maturity, semiannual, YTM 8%. Price $918.89, Macaulay duration 4.361458 years, modified duration 4.193709 years.",
      "policy_parameters": {
        "face_value": 1000,
        "coupon_rate_pct": 6,
        "ytm_pct": 8,
        "years_to_maturity": 5,
        "periods_per_year": 2
      },
      "output_payload": {
        "price": 918.89,
        "macaulay_duration_years": 4.361458,
        "modified_duration_years": 4.193709,
        "face_value": 1000,
        "coupon_rate_pct": 6,
        "ytm_pct": 8,
        "years_to_maturity": 5,
        "periods_per_year": 2,
        "num_periods": 10,
        "day_count_convention": "30/360",
        "regulatory_basis": "Standard bullet-bond Macaulay and modified duration, textbook definition (Fabozzi, Bond Markets)",
        "note": "Even-period bullet-bond schedule only (no odd first coupon / stub-period support, declared limitation). Macaulay duration = weighted-average time to cash flows (in years) using PV weights at the periodic yield; modified duration = Macaulay / (1 + periodic yield). day_count_convention is echoed for receipt transparency but the schedule itself assumes even periods."
      },
      "golden_hash": "cbe8ff3fd8ee23c1e965e4ad110ed35b4d109ab1c7a7eba588ebfd1421d18300"
    }
  ]
}
