FA-61696 / Options payoff and settlement / Open access
Lookback option payoff: the fixed-strike put uses the path maximum · case 01
Fixed-strike puts rarely pay.
ROOT CAUSE
The put branch uses max(path) instead of min(path).
VERIFIED REPAIR
Use the path minimum.
Unsuccessful approach: Using only the final price turns it into a vanilla put.
Case contract
Inputs kind, the observed path including initial and final prices, and strike. float-call pays final - min(path); float-put pays max(path) - final; fixed-call pays max(max(path) - K, 0); fixed-put pays max(K - min(path), 0). Round to 6.
Why this case matters
Option expiry, exercise and settlement engines move cash and shares; a wrong branch misstates obligations.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(kind, path, strike):
final = path[-1]
if kind == 'float-call':
pay = final - min(path)
elif kind == 'float-put':
pay = max(path) - final
elif kind == 'fixed-call':
pay = max(max(path) - strike, 0)
else:
pay = max(strike - max(path), 0)
return round(pay, 6)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression fixed put extreme 1', ['fixed-put', [100.0, 95.0, 85.5, 94.05, 103.45, 107.59], 90], 4.5], ['regression fixed put extreme 2', ['fixed-put', [100.0, 90.0, 85.5, 88.92, 88.92, 80.03], 90], 9.97], ['partial repair probe 1', ['fixed-put', [100.0, 90.0, 81.0, 72.9, 80.19, 72.17, 75.06], 100], 27.83], ['partial repair probe 2', ['fixed-put', [100.0, 104.0, 104.0], 115], 15.0], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-call', [100.0, 104.0, 114.4], 90], 24.4], ['normal control 2', ['float-put', [97.81, 108.68, 114.4, 110.0, 110.0, 100.0], 115], 14.4], ['normal control 3', ['float-put', [84.47, 88.92, 93.6, 104.0, 100.0], 100], 4.0]], [['regression fixed put extreme 1', ['fixed-put', [100.0, 95.0, 90.25, 93.86, 89.17, 80.25, 88.28], 100], 19.75], ['regression fixed put extreme 2', ['fixed-put', [72.9, 81.0, 90.0, 100.0], 100], 27.1], ['partial repair probe 1', ['fixed-put', [118.11, 124.33, 119.55, 114.95, 104.5, 95.0, 100.0], 100], 5.0], ['partial repair probe 2', ['fixed-put', [83.63, 92.92, 84.47, 81.22, 85.5, 90.0, 100.0], 100], 18.78], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['float-call', [95.0, 100.0], 90], 5.0], ['normal control 2', ['float-call', [87.85, 84.47, 88.92, 98.8, 104.0, 100.0], 105], 15.53], ['normal control 3', ['fixed-call', [100.0, 110.0, 114.4, 108.68, 108.68, 103.25, 113.58], 90], 24.4]], [['regression fixed put extreme 1', ['fixed-put', [100.0, 100.0, 110.0, 114.4, 125.84, 119.55], 105], 5.0], ['regression fixed put extreme 2', ['fixed-put', [100.0, 104.0, 114.4, 125.84, 125.84], 105], 5.0], ['partial repair probe 1', ['fixed-put', [100.0, 90.0, 99.0, 108.9, 113.26], 105], 15.0], ['partial repair probe 2', ['fixed-put', [90.0, 90.0, 90.0, 100.0], 105], 15.0], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['float-put', [100.0, 104.0, 93.6, 88.92], 105], 15.08], ['normal control 2', ['float-put', [100.0, 100.0, 95.0, 85.5, 81.22, 73.1], 105], 26.9], ['normal control 3', ['float-put', [114.4, 104.0, 100.0], 105], 14.4]], [['regression fixed put extreme 1', ['fixed-put', [100.0, 95.0, 98.8, 98.8, 108.68, 119.55], 115], 20.0], ['regression fixed put extreme 2', ['fixed-put', [100.0, 90.0, 81.0, 76.95, 84.65, 93.12], 105], 28.05], ['partial repair probe 1', ['fixed-put', [98.8, 95.0, 95.0, 100.0], 100], 5.0], ['partial repair probe 2', ['fixed-put', [100.0, 100.0, 100.0, 104.0, 114.4, 118.98, 123.74], 105], 5.0], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-call', [100.0, 95.0, 95.0], 115], 0], ['normal control 2', ['float-call', [100.0, 110.0, 104.5, 99.27, 89.34], 105], 0.0], ['normal control 3', ['float-call', [100.0, 90.0, 90.0, 90.0, 99.0, 108.9], 115], 18.9]], [['regression fixed put extreme 1', ['fixed-put', [104.5, 110.0, 100.0], 115], 15.0], ['regression fixed put extreme 2', ['fixed-put', [100.0, 90.0, 85.5], 100], 14.5], ['partial repair probe 1', ['fixed-put', [100.0, 95.0, 90.25, 93.86, 103.25, 113.58, 102.22], 115], 24.75], ['partial repair probe 2', ['fixed-put', [100.0, 104.0, 108.16, 102.75, 106.86], 115], 15.0], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-put', [110.0, 100.0], 100], 0.0], ['normal control 2', ['float-put', [100.0, 104.0], 100], 0.0], ['normal control 3', ['fixed-call', [100.0, 90.0, 90.0, 81.0], 105], 0]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression fixed put extreme 1 | 0 | 4.5 | Failed |
| regression fixed put extreme 2 | 0 | 9.97 | Failed |
| partial repair probe 1 | 0.0 | 27.83 | Failed |
| partial repair probe 2 | 11.0 | 15.0 | Failed |
| boundary control 1 | 5.0 | 5.0 | Passed |
| normal control 1 | 24.4 | 24.4 | Passed |
| normal control 2 | 14.4 | 14.4 | Passed |
| normal control 3 | 4.0 | 4.0 | Passed |
SHA-256 / 833471dd23acf6c4cca223fa40768b574d4bc0c589177671bd6b7a069d957915
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(kind, path, strike):
final = path[-1]
if kind == 'float-call':
pay = final - min(path)
elif kind == 'float-put':
pay = max(path) - final
elif kind == 'fixed-call':
pay = max(max(path) - strike, 0)
else:
pay = max(strike - final, 0)
return round(pay, 6)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression fixed put extreme 1', ['fixed-put', [100.0, 95.0, 85.5, 94.05, 103.45, 107.59], 90], 4.5], ['regression fixed put extreme 2', ['fixed-put', [100.0, 90.0, 85.5, 88.92, 88.92, 80.03], 90], 9.97], ['partial repair probe 1', ['fixed-put', [100.0, 90.0, 81.0, 72.9, 80.19, 72.17, 75.06], 100], 27.83], ['partial repair probe 2', ['fixed-put', [100.0, 104.0, 104.0], 115], 15.0], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-call', [100.0, 104.0, 114.4], 90], 24.4], ['normal control 2', ['float-put', [97.81, 108.68, 114.4, 110.0, 110.0, 100.0], 115], 14.4], ['normal control 3', ['float-put', [84.47, 88.92, 93.6, 104.0, 100.0], 100], 4.0]], [['regression fixed put extreme 1', ['fixed-put', [100.0, 95.0, 90.25, 93.86, 89.17, 80.25, 88.28], 100], 19.75], ['regression fixed put extreme 2', ['fixed-put', [72.9, 81.0, 90.0, 100.0], 100], 27.1], ['partial repair probe 1', ['fixed-put', [118.11, 124.33, 119.55, 114.95, 104.5, 95.0, 100.0], 100], 5.0], ['partial repair probe 2', ['fixed-put', [83.63, 92.92, 84.47, 81.22, 85.5, 90.0, 100.0], 100], 18.78], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['float-call', [95.0, 100.0], 90], 5.0], ['normal control 2', ['float-call', [87.85, 84.47, 88.92, 98.8, 104.0, 100.0], 105], 15.53], ['normal control 3', ['fixed-call', [100.0, 110.0, 114.4, 108.68, 108.68, 103.25, 113.58], 90], 24.4]], [['regression fixed put extreme 1', ['fixed-put', [100.0, 100.0, 110.0, 114.4, 125.84, 119.55], 105], 5.0], ['regression fixed put extreme 2', ['fixed-put', [100.0, 104.0, 114.4, 125.84, 125.84], 105], 5.0], ['partial repair probe 1', ['fixed-put', [100.0, 90.0, 99.0, 108.9, 113.26], 105], 15.0], ['partial repair probe 2', ['fixed-put', [90.0, 90.0, 90.0, 100.0], 105], 15.0], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['float-put', [100.0, 104.0, 93.6, 88.92], 105], 15.08], ['normal control 2', ['float-put', [100.0, 100.0, 95.0, 85.5, 81.22, 73.1], 105], 26.9], ['normal control 3', ['float-put', [114.4, 104.0, 100.0], 105], 14.4]], [['regression fixed put extreme 1', ['fixed-put', [100.0, 95.0, 98.8, 98.8, 108.68, 119.55], 115], 20.0], ['regression fixed put extreme 2', ['fixed-put', [100.0, 90.0, 81.0, 76.95, 84.65, 93.12], 105], 28.05], ['partial repair probe 1', ['fixed-put', [98.8, 95.0, 95.0, 100.0], 100], 5.0], ['partial repair probe 2', ['fixed-put', [100.0, 100.0, 100.0, 104.0, 114.4, 118.98, 123.74], 105], 5.0], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-call', [100.0, 95.0, 95.0], 115], 0], ['normal control 2', ['float-call', [100.0, 110.0, 104.5, 99.27, 89.34], 105], 0.0], ['normal control 3', ['float-call', [100.0, 90.0, 90.0, 90.0, 99.0, 108.9], 115], 18.9]], [['regression fixed put extreme 1', ['fixed-put', [104.5, 110.0, 100.0], 115], 15.0], ['regression fixed put extreme 2', ['fixed-put', [100.0, 90.0, 85.5], 100], 14.5], ['partial repair probe 1', ['fixed-put', [100.0, 95.0, 90.25, 93.86, 103.25, 113.58, 102.22], 115], 24.75], ['partial repair probe 2', ['fixed-put', [100.0, 104.0, 108.16, 102.75, 106.86], 115], 15.0], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-put', [110.0, 100.0], 100], 0.0], ['normal control 2', ['float-put', [100.0, 104.0], 100], 0.0], ['normal control 3', ['fixed-call', [100.0, 90.0, 90.0, 81.0], 105], 0]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression fixed put extreme 1 | 0 | 4.5 | Failed |
| regression fixed put extreme 2 | 9.97 | 9.97 | Passed |
| partial repair probe 1 | 24.94 | 27.83 | Failed |
| partial repair probe 2 | 11.0 | 15.0 | Failed |
| boundary control 1 | 5.0 | 5.0 | Passed |
| normal control 1 | 24.4 | 24.4 | Passed |
| normal control 2 | 14.4 | 14.4 | Passed |
| normal control 3 | 4.0 | 4.0 | Passed |
SHA-256 / 699ed7e522981f38fc32a54bf31023fd62a12a6f76da33b829638b993fbdd3dd
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(kind, path, strike):
final = path[-1]
if kind == 'float-call':
pay = final - min(path)
elif kind == 'float-put':
pay = max(path) - final
elif kind == 'fixed-call':
pay = max(max(path) - strike, 0)
else:
pay = max(strike - min(path), 0)
return round(pay, 6)
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression fixed put extreme 1', ['fixed-put', [100.0, 95.0, 85.5, 94.05, 103.45, 107.59], 90], 4.5], ['regression fixed put extreme 2', ['fixed-put', [100.0, 90.0, 85.5, 88.92, 88.92, 80.03], 90], 9.97], ['partial repair probe 1', ['fixed-put', [100.0, 90.0, 81.0, 72.9, 80.19, 72.17, 75.06], 100], 27.83], ['partial repair probe 2', ['fixed-put', [100.0, 104.0, 104.0], 115], 15.0], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-call', [100.0, 104.0, 114.4], 90], 24.4], ['normal control 2', ['float-put', [97.81, 108.68, 114.4, 110.0, 110.0, 100.0], 115], 14.4], ['normal control 3', ['float-put', [84.47, 88.92, 93.6, 104.0, 100.0], 100], 4.0]], [['regression fixed put extreme 1', ['fixed-put', [100.0, 95.0, 90.25, 93.86, 89.17, 80.25, 88.28], 100], 19.75], ['regression fixed put extreme 2', ['fixed-put', [72.9, 81.0, 90.0, 100.0], 100], 27.1], ['partial repair probe 1', ['fixed-put', [118.11, 124.33, 119.55, 114.95, 104.5, 95.0, 100.0], 100], 5.0], ['partial repair probe 2', ['fixed-put', [83.63, 92.92, 84.47, 81.22, 85.5, 90.0, 100.0], 100], 18.78], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['float-call', [95.0, 100.0], 90], 5.0], ['normal control 2', ['float-call', [87.85, 84.47, 88.92, 98.8, 104.0, 100.0], 105], 15.53], ['normal control 3', ['fixed-call', [100.0, 110.0, 114.4, 108.68, 108.68, 103.25, 113.58], 90], 24.4]], [['regression fixed put extreme 1', ['fixed-put', [100.0, 100.0, 110.0, 114.4, 125.84, 119.55], 105], 5.0], ['regression fixed put extreme 2', ['fixed-put', [100.0, 104.0, 114.4, 125.84, 125.84], 105], 5.0], ['partial repair probe 1', ['fixed-put', [100.0, 90.0, 99.0, 108.9, 113.26], 105], 15.0], ['partial repair probe 2', ['fixed-put', [90.0, 90.0, 90.0, 100.0], 105], 15.0], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['float-put', [100.0, 104.0, 93.6, 88.92], 105], 15.08], ['normal control 2', ['float-put', [100.0, 100.0, 95.0, 85.5, 81.22, 73.1], 105], 26.9], ['normal control 3', ['float-put', [114.4, 104.0, 100.0], 105], 14.4]], [['regression fixed put extreme 1', ['fixed-put', [100.0, 95.0, 98.8, 98.8, 108.68, 119.55], 115], 20.0], ['regression fixed put extreme 2', ['fixed-put', [100.0, 90.0, 81.0, 76.95, 84.65, 93.12], 105], 28.05], ['partial repair probe 1', ['fixed-put', [98.8, 95.0, 95.0, 100.0], 100], 5.0], ['partial repair probe 2', ['fixed-put', [100.0, 100.0, 100.0, 104.0, 114.4, 118.98, 123.74], 105], 5.0], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-call', [100.0, 95.0, 95.0], 115], 0], ['normal control 2', ['float-call', [100.0, 110.0, 104.5, 99.27, 89.34], 105], 0.0], ['normal control 3', ['float-call', [100.0, 90.0, 90.0, 90.0, 99.0, 108.9], 115], 18.9]], [['regression fixed put extreme 1', ['fixed-put', [104.5, 110.0, 100.0], 115], 15.0], ['regression fixed put extreme 2', ['fixed-put', [100.0, 90.0, 85.5], 100], 14.5], ['partial repair probe 1', ['fixed-put', [100.0, 95.0, 90.25, 93.86, 103.25, 113.58, 102.22], 115], 24.75], ['partial repair probe 2', ['fixed-put', [100.0, 104.0, 108.16, 102.75, 106.86], 115], 15.0], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-put', [110.0, 100.0], 100], 0.0], ['normal control 2', ['float-put', [100.0, 104.0], 100], 0.0], ['normal control 3', ['fixed-call', [100.0, 90.0, 90.0, 81.0], 105], 0]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression fixed put extreme 1 | 4.5 | 4.5 | Passed |
| regression fixed put extreme 2 | 9.97 | 9.97 | Passed |
| partial repair probe 1 | 27.83 | 27.83 | Passed |
| partial repair probe 2 | 15.0 | 15.0 | Passed |
| boundary control 1 | 5.0 | 5.0 | Passed |
| normal control 1 | 24.4 | 24.4 | Passed |
| normal control 2 | 14.4 | 14.4 | Passed |
| normal control 3 | 4.0 | 4.0 | Passed |
SHA-256 / d2a5d4b631b6841dc4dc3ecf4d1de50c734332ba07bcd20a595bbb671e598079
Verification & scope
A deterministic toy contract stated explicitly in the contract field; no claim of conformance to any exchange or clearing rulebook. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:46:57.722419+00:00.
Case digest / 08e0898eea1cf937e49ef6c82fee69730264027f5828b92073238d6c146f1624