/** * 回测陷阱检测(Backtest trap detection)—— dsh-strategy 域。 * * 来源:A 股策略研究过程中实际踩到的**五个陷阱**,每一个都让一个"好结果"变成假的。 * 本模块把它们的检测逻辑固化成代码 —— 因为人工检查会漏、会忘。 * * | # | 陷阱 | 表面数字 | 真实情况 | 检测函数 | * |---|---|---|---|---| * | 1 | 隐性杠杆 | Calmar 132 | 0.134 | {@link detectHiddenLeverage} | * | 2 | 极端值主导 | t=2.28 显著 | 剔除1窗口失效 | {@link detectOutlierDependence} | * | 3 | 幸存者偏差 | +197pp 超额 | −45pp | {@link detectSurvivorshipBias} | * | 4 | 跳空不可交易 | +0.477% 次日 | −0.256% | {@link detectGapDependence} | * | 5 | 逆向选择 | 封死涨停 +5.74% | 买不到 | {@link detectAdverseSelection} | * * 共同规律:**统计量度量的不是「决策者实际能拿到的东西」**。 */ /** 单条陷阱检测结果。 */ export interface TrapFinding { /** 是否检出该陷阱 */ detected: boolean; /** 严重程度:none / mild / severe */ severity: 'none' | 'mild' | 'severe'; /** 实测证据(人类可读) */ evidence: string; } /** 陷阱 1:隐性杠杆 —— 信号总权重长期超过 1。 */ export declare function detectHiddenLeverage(maxGrossRaw: number, cap?: number): TrapFinding; /** 陷阱 2:极端值主导 —— 剔除最好/最差窗口后结论翻转。 */ export declare function detectOutlierDependence(perWindowValues: readonly number[], options?: { dropCount?: number; threshold?: number; }): TrapFinding; /** * 陷阱 3:幸存者偏差 —— 用有偏票池(如"当前指数成分股")回溯历史。 * * 无法从单一结果检测,需要**两个票池的对照**。 * * @param excessBiased 有偏票池上的超额收益(百分点) * @param excessUnbiased 较无偏票池上的超额收益(百分点) */ export declare function detectSurvivorshipBias(excessBiased: number, excessUnbiased: number): TrapFinding; /** * 陷阱 4:跳空依赖 —— 收益主要来自隔夜跳空(无法在信号价成交)。 * * @param closeToClose 收盘→次日收盘的平均收益 * @param overnightGap 隔夜跳空(收盘→次日开盘)的平均收益 * @param intraday 日内(次日开盘→次日收盘)的平均收益 */ export declare function detectGapDependence(closeToClose: number, overnightGap: number, intraday: number): TrapFinding; /** * 陷阱 5:逆向选择 —— 能成交的样本系统性劣于不能成交的。 * * @param fillable 可成交样本的平均收益(如盘中开板的涨停) * @param unfillable 不可成交样本的平均收益(如封死的一字板) */ export declare function detectAdverseSelection(fillable: number, unfillable: number): TrapFinding; /** 全部陷阱的汇总报告。 */ export interface TrapReport { /** 检出的陷阱数 */ detectedCount: number; /** 是否存在严重陷阱 */ hasSevere: boolean; /** 逐条结果 */ findings: Record; /** 结论 */ verdict: string; } /** * 汇总运行全部陷阱检测。 * * @param input 各检测所需的输入(能提供多少就检测多少) */ export declare function auditBacktest(input: { maxGrossRaw?: number; perWindowValues?: readonly number[]; survivorship?: { biased: number; unbiased: number; }; gap?: { closeToClose: number; overnightGap: number; intraday: number; }; adverseSelection?: { fillable: number; unfillable: number; }; }): TrapReport;