"""滚动窗口、两个收益间隔与样本/总体标准差的独立真值。""" import json from math import isclose, sqrt from statistics import mean, stdev, pstdev def matches(actual, expected): return isclose(actual, expected, rel_tol=0, abs_tol=1e-12) def calculate(closes): rows = [] for i, close in enumerate(closes): if i < 2: rows.append({'i': i, 'mean': None, 'return_two_intervals': None, 'sample_sd': None, 'population_sd': None, 'signal': 0}) continue window = closes[i-2:i+1] average = mean(window) rows.append({'i': i, 'mean': average, 'return_two_intervals': close / closes[i-2] - 1, 'sample_sd': stdev(window), 'population_sd': pstdev(window), 'signal': int(close > average)}) return rows xs = [10, 12, 14, 12, 10] rows = calculate(xs) assert [r['signal'] for r in rows] == [0, 0, 1, 0, 0] assert rows[2]['mean'] == 12 and matches(rows[2]['return_two_intervals'], .4) assert rows[2]['sample_sd'] == 2 and matches(rows[2]['population_sd'], sqrt(8/3)) assert matches(rows[3]['mean'], 38/3) and matches(rows[4]['return_two_intervals'], -2/7) assert matches(rows[3]['sample_sd'], sqrt(4/3)) assert matches(rows[3]['population_sd'], sqrt(8/9)) assert not matches(1000000, 1000000 + 1e-8) equal = calculate([10, 12, 11])[-1] above = calculate([10, 12, 11.01])[-1] below = calculate([10, 12, 10.99])[-1] assert equal['mean'] == 11 and equal['signal'] == 0 assert above['signal'] == 1 and below['signal'] == 0 assert not matches(stdev([10, 12, 14]), pstdev([10, 12, 14])) for cutoff in range(1, len(xs)): assert calculate(xs[:cutoff]) == rows[:cutoff] assert calculate(xs + [10000])[:len(xs)] == rows print(json.dumps({'truth_rows': rows, 'threshold_equal': equal, 'threshold_above': above, 'threshold_below': below, 'tolerance_absolute': 1e-12, 'sd_unit': 'price, not return volatility'}))