"""R622:合成运行分层快照,定位首次差异,保留后续影响。""" from copy import deepcopy from hashlib import sha256 import json from math import isclose from random import Random LAYERS = ["data", "config", "runtime", "signals", "fills", "equity"] def fingerprint(value): return sha256(json.dumps(value, sort_keys=True, separators=(",", ":")).encode()).hexdigest() def simulate(prices, hidden_fee=0): config = {"threshold": 0, "seed": 7, "initial_cash": 1000} rng = Random(config["seed"]) signals = [int(prices[t] / prices[t-1] - 1 > config["threshold"]) for t in range(1, len(prices)-1)] cash, shares, fills, equity = float(config["initial_cash"]), 0, [], [] for t, signal in enumerate(signals, 1): if signal: price = round(prices[t+1] + rng.random() / 100, 6) fills.append({"signal_t": t, "fill_t": t+1, "qty": 1, "price": price, "fee": hidden_fee}) cash -= price + hidden_fee shares += 1 equity.append(round(cash + shares * prices[t+1], 6)) return {"data": list(prices), "config": config, "runtime": {"engine": "synthetic-v1", "code": "frozen-example"}, "signals": signals, "fills": fills, "equity": equity} def first_difference(left, right): return next((layer for layer in LAYERS if left[layer] != right[layer]), None) def run(): base = simulate([100, 102, 101, 104]) repeat = simulate([100, 102, 101, 104]) assert first_difference(base, repeat) is None assert fingerprint(base) == fingerprint(repeat) revised = simulate([100, 102, 103, 104]) assert first_difference(base, revised) == "data" assert base["signals"] == [1, 0] and revised["signals"] == [1, 1] hidden = simulate([100, 102, 101, 104], hidden_fee=0.25) assert first_difference(base, hidden) == "fills" assert isclose(base["equity"][-1] - hidden["equity"][-1], 0.25, abs_tol=1e-9) # 不同文件外观也可能来自对象键次序,规范化摘要应相同。 reordered = {key: deepcopy(base[key]) for key in reversed(LAYERS)} assert fingerprint(base) == fingerprint(reordered) print("repeat_first_difference=None normalized_digest_equal=True") print("revised_first_difference=data signals=[1, 0]->[1, 1]") print("hidden_fee_first_difference=fills final_equity_delta=0.250000") print("reordered_keys_normalized_equal=True") if __name__ == "__main__": run()