FA-61686 / Options payoff and settlement / Open access
Lookback option payoff: the floating put subtracts the maximum from the final price · case 01
Floating-strike puts produce negative payoffs.
ROOT CAUSE
The operands are reversed.
VERIFIED REPAIR
Pay max(path) - final.
Unsuccessful approach: Taking an absolute value over a maximum that excludes the initial fixing still misses early highs.
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 = final - max(path)
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 floating put orientation 1', ['float-put', [98.01, 98.01, 89.1, 99.0, 110.0, 110.0, 100.0], 115], 10.0], ['regression floating put orientation 2', ['float-put', [119.55, 125.84, 121.0, 121.0, 110.0, 110.0, 100.0], 115], 25.84], ['partial repair probe 1', ['float-put', [100.0, 90.0, 90.0, 81.0], 100], 19.0], ['partial repair probe 2', ['float-put', [100.0, 95.0, 98.8], 90], 1.2], ['boundary control 1', ['fixed-put', [100.0, 80.0, 100.0], 100], 20.0], ['boundary control 2', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-put', [100.0, 110.0, 121.0, 125.84], 115], 15.0], ['normal control 2', ['float-call', [100.0, 100.0, 110.0, 110.0, 110.0], 115], 10.0]], [['regression floating put orientation 1', ['float-put', [100.0, 104.0, 114.4, 108.68], 90], 5.72], ['regression floating put orientation 2', ['float-put', [100.0, 90.0, 93.6, 88.92, 88.92], 90], 11.08], ['partial repair probe 1', ['float-put', [100.0, 95.0], 100], 5.0], ['partial repair probe 2', ['float-put', [118.98, 114.4, 110.0, 100.0], 100], 18.98], ['boundary control 1', ['fixed-put', [100.0, 80.0, 100.0], 100], 20.0], ['boundary control 2', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-call', [113.8, 103.45, 94.05, 104.5, 95.0, 100.0], 100], 13.8], ['normal control 2', ['fixed-call', [100.0, 104.0], 105], 0]], [['regression floating put orientation 1', ['float-put', [100.0, 104.0, 104.0, 93.6, 84.24, 75.82], 100], 28.18], ['regression floating put orientation 2', ['float-put', [100.0, 90.0, 81.0, 76.95, 69.26, 72.03, 79.23], 115], 20.77], ['partial repair probe 1', ['float-put', [100.0, 95.0, 90.25, 93.86, 84.47, 76.02, 76.02], 100], 23.98], ['partial repair probe 2', ['float-put', [100.0, 90.0, 85.5, 76.95, 80.03, 88.03], 90], 11.97], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['boundary control 2', ['fixed-put', [100.0, 80.0, 100.0], 100], 20.0], ['normal control 1', ['float-call', [104.0, 104.0, 100.0], 115], 0.0], ['normal control 2', ['float-call', [100.0, 90.0, 85.5, 81.22, 81.22], 105], 0.0]], [['regression floating put orientation 1', ['float-put', [100.0, 104.0, 114.4, 125.84, 130.87, 136.1, 122.49], 105], 13.61], ['regression floating put orientation 2', ['float-put', [100.0, 104.0, 108.16, 102.75, 97.61, 107.37, 96.63], 90], 11.53], ['partial repair probe 1', ['float-put', [100.0, 90.0, 81.0, 81.0, 81.0, 76.95], 105], 23.05], ['partial repair probe 2', ['float-put', [100.0, 90.0, 81.0, 84.24, 80.03], 90], 19.97], ['boundary control 1', ['fixed-put', [100.0, 80.0, 100.0], 100], 20.0], ['boundary control 2', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-put', [100.0, 90.0, 93.6], 115], 25.0], ['normal control 2', ['float-call', [75.82, 84.24, 81.0, 90.0, 100.0, 100.0], 115], 24.18]], [['regression floating put orientation 1', ['float-put', [124.33, 119.55, 114.95, 114.95, 121.0, 110.0, 100.0], 105], 24.33], ['regression floating put orientation 2', ['float-put', [100.0, 95.0, 98.8, 93.86, 93.86], 105], 6.14], ['partial repair probe 1', ['float-put', [100.0, 90.0, 85.5, 76.95, 80.03, 88.03, 79.23], 90], 20.77], ['partial repair probe 2', ['float-put', [110.0, 100.0], 100], 10.0], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['boundary control 2', ['fixed-put', [100.0, 80.0, 100.0], 100], 20.0], ['normal control 1', ['float-call', [117.55, 123.74, 118.98, 114.4, 104.0, 100.0], 90], 0.0], ['normal control 2', ['fixed-put', [100.0, 90.0, 93.6, 97.34], 115], 25.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 floating put orientation 1 | -10.0 | 10.0 | Failed |
| regression floating put orientation 2 | -25.84 | 25.84 | Failed |
| partial repair probe 1 | -19.0 | 19.0 | Failed |
| partial repair probe 2 | -1.2 | 1.2 | Failed |
| boundary control 1 | 20.0 | 20.0 | Passed |
| boundary control 2 | 5.0 | 5.0 | Passed |
| normal control 1 | 15.0 | 15.0 | Passed |
| normal control 2 | 10.0 | 10.0 | Passed |
SHA-256 / 8196ef09e2a0a75f7291ba8dcdd3dfec1d8da83db79c339f00784f2b92a7da42
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 = abs(final - max(path[1:]))
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 floating put orientation 1', ['float-put', [98.01, 98.01, 89.1, 99.0, 110.0, 110.0, 100.0], 115], 10.0], ['regression floating put orientation 2', ['float-put', [119.55, 125.84, 121.0, 121.0, 110.0, 110.0, 100.0], 115], 25.84], ['partial repair probe 1', ['float-put', [100.0, 90.0, 90.0, 81.0], 100], 19.0], ['partial repair probe 2', ['float-put', [100.0, 95.0, 98.8], 90], 1.2], ['boundary control 1', ['fixed-put', [100.0, 80.0, 100.0], 100], 20.0], ['boundary control 2', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-put', [100.0, 110.0, 121.0, 125.84], 115], 15.0], ['normal control 2', ['float-call', [100.0, 100.0, 110.0, 110.0, 110.0], 115], 10.0]], [['regression floating put orientation 1', ['float-put', [100.0, 104.0, 114.4, 108.68], 90], 5.72], ['regression floating put orientation 2', ['float-put', [100.0, 90.0, 93.6, 88.92, 88.92], 90], 11.08], ['partial repair probe 1', ['float-put', [100.0, 95.0], 100], 5.0], ['partial repair probe 2', ['float-put', [118.98, 114.4, 110.0, 100.0], 100], 18.98], ['boundary control 1', ['fixed-put', [100.0, 80.0, 100.0], 100], 20.0], ['boundary control 2', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-call', [113.8, 103.45, 94.05, 104.5, 95.0, 100.0], 100], 13.8], ['normal control 2', ['fixed-call', [100.0, 104.0], 105], 0]], [['regression floating put orientation 1', ['float-put', [100.0, 104.0, 104.0, 93.6, 84.24, 75.82], 100], 28.18], ['regression floating put orientation 2', ['float-put', [100.0, 90.0, 81.0, 76.95, 69.26, 72.03, 79.23], 115], 20.77], ['partial repair probe 1', ['float-put', [100.0, 95.0, 90.25, 93.86, 84.47, 76.02, 76.02], 100], 23.98], ['partial repair probe 2', ['float-put', [100.0, 90.0, 85.5, 76.95, 80.03, 88.03], 90], 11.97], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['boundary control 2', ['fixed-put', [100.0, 80.0, 100.0], 100], 20.0], ['normal control 1', ['float-call', [104.0, 104.0, 100.0], 115], 0.0], ['normal control 2', ['float-call', [100.0, 90.0, 85.5, 81.22, 81.22], 105], 0.0]], [['regression floating put orientation 1', ['float-put', [100.0, 104.0, 114.4, 125.84, 130.87, 136.1, 122.49], 105], 13.61], ['regression floating put orientation 2', ['float-put', [100.0, 104.0, 108.16, 102.75, 97.61, 107.37, 96.63], 90], 11.53], ['partial repair probe 1', ['float-put', [100.0, 90.0, 81.0, 81.0, 81.0, 76.95], 105], 23.05], ['partial repair probe 2', ['float-put', [100.0, 90.0, 81.0, 84.24, 80.03], 90], 19.97], ['boundary control 1', ['fixed-put', [100.0, 80.0, 100.0], 100], 20.0], ['boundary control 2', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-put', [100.0, 90.0, 93.6], 115], 25.0], ['normal control 2', ['float-call', [75.82, 84.24, 81.0, 90.0, 100.0, 100.0], 115], 24.18]], [['regression floating put orientation 1', ['float-put', [124.33, 119.55, 114.95, 114.95, 121.0, 110.0, 100.0], 105], 24.33], ['regression floating put orientation 2', ['float-put', [100.0, 95.0, 98.8, 93.86, 93.86], 105], 6.14], ['partial repair probe 1', ['float-put', [100.0, 90.0, 85.5, 76.95, 80.03, 88.03, 79.23], 90], 20.77], ['partial repair probe 2', ['float-put', [110.0, 100.0], 100], 10.0], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['boundary control 2', ['fixed-put', [100.0, 80.0, 100.0], 100], 20.0], ['normal control 1', ['float-call', [117.55, 123.74, 118.98, 114.4, 104.0, 100.0], 90], 0.0], ['normal control 2', ['fixed-put', [100.0, 90.0, 93.6, 97.34], 115], 25.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 floating put orientation 1 | 10.0 | 10.0 | Passed |
| regression floating put orientation 2 | 25.84 | 25.84 | Passed |
| partial repair probe 1 | 9.0 | 19.0 | Failed |
| partial repair probe 2 | 0.0 | 1.2 | Failed |
| boundary control 1 | 20.0 | 20.0 | Passed |
| boundary control 2 | 5.0 | 5.0 | Passed |
| normal control 1 | 15.0 | 15.0 | Passed |
| normal control 2 | 10.0 | 10.0 | Passed |
SHA-256 / 7eb772b2cf56219d14d00729931f505df81c1b8833189efa30ce6c55d335d867
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 floating put orientation 1', ['float-put', [98.01, 98.01, 89.1, 99.0, 110.0, 110.0, 100.0], 115], 10.0], ['regression floating put orientation 2', ['float-put', [119.55, 125.84, 121.0, 121.0, 110.0, 110.0, 100.0], 115], 25.84], ['partial repair probe 1', ['float-put', [100.0, 90.0, 90.0, 81.0], 100], 19.0], ['partial repair probe 2', ['float-put', [100.0, 95.0, 98.8], 90], 1.2], ['boundary control 1', ['fixed-put', [100.0, 80.0, 100.0], 100], 20.0], ['boundary control 2', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-put', [100.0, 110.0, 121.0, 125.84], 115], 15.0], ['normal control 2', ['float-call', [100.0, 100.0, 110.0, 110.0, 110.0], 115], 10.0]], [['regression floating put orientation 1', ['float-put', [100.0, 104.0, 114.4, 108.68], 90], 5.72], ['regression floating put orientation 2', ['float-put', [100.0, 90.0, 93.6, 88.92, 88.92], 90], 11.08], ['partial repair probe 1', ['float-put', [100.0, 95.0], 100], 5.0], ['partial repair probe 2', ['float-put', [118.98, 114.4, 110.0, 100.0], 100], 18.98], ['boundary control 1', ['fixed-put', [100.0, 80.0, 100.0], 100], 20.0], ['boundary control 2', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-call', [113.8, 103.45, 94.05, 104.5, 95.0, 100.0], 100], 13.8], ['normal control 2', ['fixed-call', [100.0, 104.0], 105], 0]], [['regression floating put orientation 1', ['float-put', [100.0, 104.0, 104.0, 93.6, 84.24, 75.82], 100], 28.18], ['regression floating put orientation 2', ['float-put', [100.0, 90.0, 81.0, 76.95, 69.26, 72.03, 79.23], 115], 20.77], ['partial repair probe 1', ['float-put', [100.0, 95.0, 90.25, 93.86, 84.47, 76.02, 76.02], 100], 23.98], ['partial repair probe 2', ['float-put', [100.0, 90.0, 85.5, 76.95, 80.03, 88.03], 90], 11.97], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['boundary control 2', ['fixed-put', [100.0, 80.0, 100.0], 100], 20.0], ['normal control 1', ['float-call', [104.0, 104.0, 100.0], 115], 0.0], ['normal control 2', ['float-call', [100.0, 90.0, 85.5, 81.22, 81.22], 105], 0.0]], [['regression floating put orientation 1', ['float-put', [100.0, 104.0, 114.4, 125.84, 130.87, 136.1, 122.49], 105], 13.61], ['regression floating put orientation 2', ['float-put', [100.0, 104.0, 108.16, 102.75, 97.61, 107.37, 96.63], 90], 11.53], ['partial repair probe 1', ['float-put', [100.0, 90.0, 81.0, 81.0, 81.0, 76.95], 105], 23.05], ['partial repair probe 2', ['float-put', [100.0, 90.0, 81.0, 84.24, 80.03], 90], 19.97], ['boundary control 1', ['fixed-put', [100.0, 80.0, 100.0], 100], 20.0], ['boundary control 2', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['normal control 1', ['fixed-put', [100.0, 90.0, 93.6], 115], 25.0], ['normal control 2', ['float-call', [75.82, 84.24, 81.0, 90.0, 100.0, 100.0], 115], 24.18]], [['regression floating put orientation 1', ['float-put', [124.33, 119.55, 114.95, 114.95, 121.0, 110.0, 100.0], 105], 24.33], ['regression floating put orientation 2', ['float-put', [100.0, 95.0, 98.8, 93.86, 93.86], 105], 6.14], ['partial repair probe 1', ['float-put', [100.0, 90.0, 85.5, 76.95, 80.03, 88.03, 79.23], 90], 20.77], ['partial repair probe 2', ['float-put', [110.0, 100.0], 100], 10.0], ['boundary control 1', ['float-call', [90.0, 100.0, 95.0], 100], 5.0], ['boundary control 2', ['fixed-put', [100.0, 80.0, 100.0], 100], 20.0], ['normal control 1', ['float-call', [117.55, 123.74, 118.98, 114.4, 104.0, 100.0], 90], 0.0], ['normal control 2', ['fixed-put', [100.0, 90.0, 93.6, 97.34], 115], 25.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 floating put orientation 1 | 10.0 | 10.0 | Passed |
| regression floating put orientation 2 | 25.84 | 25.84 | Passed |
| partial repair probe 1 | 19.0 | 19.0 | Passed |
| partial repair probe 2 | 1.2 | 1.2 | Passed |
| boundary control 1 | 20.0 | 20.0 | Passed |
| boundary control 2 | 5.0 | 5.0 | Passed |
| normal control 1 | 15.0 | 15.0 | Passed |
| normal control 2 | 10.0 | 10.0 | Passed |
SHA-256 / 876666090ef88a65dafcec7cfc2c5bf962fc609353dbddd8159cd2f876ea922b
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.507044+00:00.
Case digest / d4283dfc84f756b75a6e14008350ca37278ba21430e009bf65004726b9181e3d