Gap Risk Guard · 隔夜跳变风险防护模块(USD 点差口径)

面向研发与测试:目标是在不预测行情的前提下,降低“隔夜/节假日后开盘价差跳变(Gap)”导致的被动深套与情绪割肉损失。
本模块与《自动挂单 V2(动态追踪开仓)》与《动态止盈 V2》同体系:采用状态机 + 行为确认 + 分层执行策略。

快速导航 1. 风险定义与模块定位(Gap / Whipsaw) 2. 变量与参数定义(USD 点差口径) 3. 状态机(NORMAL / OVERNIGHT_ARM / GAP_SHOCK / DISASTER / RECOVERY) 4. 事前保护:隔夜前降风险(减仓 + 硬线) 5. 事后处理:开盘后反锯齿(冷静期 + 分层减仓 + 二次确认) 6. 回归窗口脱困:Recovery Exit(减少“割在最差点”) 7. 与自动挂单V2/动态止盈V2的联动点 8. 日志埋点与复盘指标(开盘事件复盘必备) 9. 默认参数建议(第一版可上线) 10. 测试用例清单(含圣诞节案例复盘脚本)

1. 风险定义与模块定位(Gap / Whipsaw)

Gap 指跨交易时段(隔夜/节假日/跨市场休市错位)后,开盘价差相对昨收或持仓入场点出现显著跳变(例如从 1200 跳到 4000 USD 点差)。
Whipsaw 指开盘后短时间内出现“拉大 → 回归 → 再拉大”的锯齿波动,容易导致情绪割肉发生在最差点。

模块定位:
Gap Risk Guard 不做价格预测,只在“隔夜前/开盘后”对持仓风险做结构化处理:
① 隔夜前降低风险暴露(减仓/硬线);② 开盘后用反锯齿规则分层减仓;③ 回归窗口自动脱困,尽量降低割的亏损金额。

2. 变量与参数定义(USD 点差口径)

变量/参数 类型/单位 说明 工程落地建议
spread(t) number(USD 点差) 实时国内外价差(统一换算口径) 用于所有风险判断;必须与自动挂单 V2 使用同一口径
entrySpread number(USD 点差) 开仓时的价差(持仓均值) 分批开仓需保存加权均值
prevCloseSpread number(USD 点差) 上期所昨收/收盘前最后稳定价差 用于 Gap 计算的基准(必须记录)
gapAbs number(USD 点差) 开盘跳变绝对值:gapAbs = |openSpread - prevCloseSpread| 用于分层触发(Level1/2/3)
gapFromEntry number(USD 点差) 相对入场跳变:gapFromEntry = openSpread - entrySpread 用于判断“被套深度”
OvernightWindow 时间窗口 隔夜前触发风控的时间范围(收盘前 X 分钟) 如 10~30 分钟;节假日前可更早
OvernightReducePct % 隔夜前自动减仓比例 建议减到 30%~50% 规模
HardStopOvernight USD 点差 隔夜灾难线:触发则强制降风险(分批减仓/强制退出) 可按资金/手数换算成最大亏损等价阈值
CooldownOpen 开盘冷静期:避免第一波报价/流动性不稳导致误操作 建议 60~300 秒
ConfirmWindow N 次采样 确认窗口:连续 N 次满足条件才触发 与止盈/开仓模块同用一套实现
LadderLevels 分层阈值数组 Level1/2/3 风险层级阈值(按 gapAbs 或 gapFromEntry) 每层对应减仓比例(10%/20%/30%…)
RetestRule 规则 反锯齿:回归后若再次拉大并突破条件,则升级风控层级 避免“拉大→回归→再拉大”把人搞慌
RecoveryBand USD 点差 回归脱困带:价差回归到可接受区间时触发“补救式退出” 用于减少“割在最差点”

3. 状态机(核心:把隔夜当成风险状态)

状态 含义 进入条件(示例) 主要动作
NORMAL 日内常规风控 非隔夜窗口 & 非开盘冲击 按动态止盈 V2 / 常规止损运行
OVERNIGHT_ARM 隔夜风控就绪 进入隔夜窗口(收盘前 X 分钟)或遇到节假日前 自动减仓、设置隔夜硬线、生成开盘预案
GAP_SHOCK 开盘冲击期 开盘后 CooldownOpen 内或检测到 gapAbs 超阈值 启用冷静期 + 分层减仓策略 + 反锯齿规则
DISASTER 灾难模式 gapAbs 或 gapFromEntry 达到最高层级,且持续确认 强制把风险打下来(减到很小或退出)
RECOVERY 回归脱困窗口 价差回归到 RecoveryBand 区间 自动补救退出/降仓,避免后续再被拉大

4. 事前保护:隔夜前降风险(最有效、最稳)

4.1 隔夜前自动减仓(默认建议开启)

// 触发:进入 OvernightWindow(如收盘前 20 分钟)
// 目的:直接降低隔夜跳变的伤害半径(不依赖预测)

if (now in OvernightWindow && positionSize > targetOvernightSize) {
    reduceTo(targetOvernightSize)   // 例如减少到原仓位 40%
    log("OVERNIGHT_REDUCE", ...)
}
为什么它重要:
“4000 的跳变”无法预测,但仓位可以控制。把仓位减半,相当于把最坏亏损减半。

4.2 隔夜硬线(HardStopOvernight)

// 隔夜/开盘冲击期,启用更硬的风险线
// HardStopOvernight 可以按“最大可承受亏损”换算成对应的 USD 点差阈值

if (spread >= HardStopOvernight for N consecutive samples) {
    enterDisasterMode()
}
工程注意:
HardStopOvernight 建议采用“分批减仓”执行,而非一刀切平光(防止滑点/恐慌盘)。

5. 事后处理:开盘后反锯齿(冷静期 + 分层减仓 + 二次确认)

5.1 开盘冷静期(CooldownOpen)

目的:开盘最初报价/流动性往往不稳定,且容易出现第一波极端波动。冷静期内禁止“全仓情绪割”,只允许执行预设的分层规则。


if (marketJustOpened && timeSinceOpen <= CooldownOpen) {
    STATE = GAP_SHOCK
    // UI:显示“开盘冲击期,系统按预案分层处理”
}

5.2 分层减仓 Ladder Cut(把“割不割”变成“割多少”)

层级 触发条件(示例,按 gapAbs 或 gapFromEntry) 动作(示例) 设计意图
Level 1 gapAbs ≥ 600 且确认通过 减仓 10% 轻度冲击:先削峰,不做极端反应
Level 2 gapAbs ≥ 1500 且确认通过 累计减仓到 50%(再减 40%) 中度冲击:把风险暴露降到可控
Level 3 gapAbs ≥ 2500 且确认通过 累计减仓到 20% 或强制退出 重度冲击:优先生存,防止灾难亏损

// 伪代码:分层触发(注意:每层只触发一次,避免重复减仓)
for level in LadderLevels:
    if (!level.triggered && gapMetric >= level.threshold) {
        if (passConfirmWindow()) {
            reducePositionBy(level.reducePct)
            level.triggered = true
            log("LADDER_CUT", level=..., ...)
        }
    }
关键点:
分层减仓的目的不是“精准择时”,而是“风险削峰”。这样即使后面出现回归,也不至于全割在最差点。

5.3 反锯齿 RetestRule(解决“拉大→回归→再拉大”)

当出现一次回归后,系统需要防止第二次拉大把客户再次吓崩。建议引入“回归确认 + 再拉大升级”的规则:


// 关键运行变量
peak1 = maxSpreadAfterOpen   // 开盘后第一次峰值
trough1 = minSpreadAfterPeak // 峰值后第一次回归低点(可用窗口内最小值)

// 回归确认(避免瞬时回归)
if (spread <= troughConfirmLine for N samples) {
    markRegime("REGRESSION_CONFIRMED")
}

// 再拉大升级(retest):如果回归确认后再次拉大,并接近/突破 peak1 的某比例
if (regressionConfirmed && spread >= peak1 * (1 - retestTolerancePct)) {
    // 说明“第二次拉大”出现,升级风险层级(触发下一层减仓)
    escalateRiskLevel()
    log("RETEST_ESCALATE", ...)
}
解释给技术的直觉:
这相当于“识别两段式冲击”。第一次冲击不把仓位砍死,第二次冲击确认后再升级减仓,避免人被锯齿波动搞慌。

6. 回归窗口脱困:Recovery Exit(减少“割在最差点”)

你提到的案例里:下午价差回归到 1500 时,若能在“回归窗口”自动退出,亏损会明显更小。
因此建议:当价差回归到一个可接受区间时,系统自动执行“补救式退出/降仓”,把剩余仓位脱困。

6.1 RecoveryBand 的定义(USD 点差)

定义方式 示例 适用 备注
相对入场 spread ≤ entrySpread + 300 目标是“回到可接受亏损区间就走” 最容易解释
相对昨收 spread ≤ prevCloseSpread + 500 gap 回归策略 与 gapAbs 联动
分位数带 spread ≤ P70(近 N 天) 环境变化大时 需历史统计支持

6.2 Recovery Exit 伪代码(含确认)


// 在 GAP_SHOCK / DISASTER 状态下持续监测
if (spread <= recoveryLine) {
    if (passConfirmWindow()) {
        // 进入回归脱困:把剩余仓位按计划退出或降到极小
        executeRecoveryExitPlan()
        STATE = RECOVERY
        log("RECOVERY_EXIT", ...)
    }
}
这条规则的价值:
不需要你在 4000 割;只要市场给到“回归窗口”,系统就能自动把剩余仓位脱困,降低割的亏损金额。

7. 与自动挂单V2 / 动态止盈V2的联动点

8. 日志埋点与复盘指标(开盘事件复盘必备)


[GapRiskGuard]
timestamp
state_from -> state_to
spread
entrySpread
prevCloseSpread
openSpread
gapAbs
gapFromEntry
CooldownOpen
LadderLevels (thresholds + reducePct + triggered flags)
RetestRule params + triggered
RecoveryBand + recoveryLine
actions taken (reduce/exit) + qty + prices
latency_ms
executionMode
exitReason
复盘必须能回答:
① 当天开盘 gap 到底多大?② 系统在哪些点减了多少仓?③ 为什么没在回归到 1500 时自动脱困?(阈值/确认/执行失败?)

9. 默认参数建议(第一版可上线,USD 点差)

参数 建议默认 说明
OvernightWindow 收盘前 20 分钟 进入隔夜就绪状态,准备降风险
targetOvernightSize 40% 仓位 隔夜前自动减仓到 40%
CooldownOpen 120 秒 开盘冷静期
ConfirmWindow 3 连续 3 次采样确认
LadderLevels 600/1500/2500(示例) 按 gapAbs 分层;每层减 10%/40%/30%(示例)
RetestTolerancePct 2%~5% 回归后再次接近峰值则升级
RecoveryBand(相对入场) entrySpread + 300 回归到可接受区间就执行脱困退出
说明:
600/1500/2500 等阈值需要按你们历史 USD 点差分布标定。第一版可先用经验值跑,第二版用分位数(P70/P85/P95)自适应。

10. 测试用例清单(含圣诞节案例复盘脚本)

10.1 关键边界用例

10.2 “圣诞节案例”复盘脚本(用于离线回放测试)


// 构造价差序列(USD 点差):
t0: prevCloseSpread = 1200
open: 4000  (持续若干秒)
-> 回归到 2800(持续一段)
-> 再拉到 3500(持续一段)
-> 下午回归到 1500(持续)

// 预期系统行为:
1) 进入 GAP_SHOCK,冷静期内执行分层减仓(不允许全仓情绪割)
2) 回归到 2800:不立即“全退出”,但应标记回归确认(若持续)
3) 再拉到 3500:触发 RetestRule,升级减仓层级
4) 下午回归到 1500:触发 RecoveryExitPlan,把剩余仓位脱困退出或降到极小
建议:把上述序列做成“回放驱动器”,每次改参数都能自动跑一遍,快速验证模块稳定性与可解释性。