面向研发与测试:目标是在不预测行情的前提下,降低“隔夜/节假日后开盘价差跳变(Gap)”导致的被动深套与情绪割肉损失。
本模块与《自动挂单 V2(动态追踪开仓)》与《动态止盈 V2》同体系:采用状态机 + 行为确认 + 分层执行策略。
Gap 指跨交易时段(隔夜/节假日/跨市场休市错位)后,开盘价差相对昨收或持仓入场点出现显著跳变(例如从 1200 跳到 4000 USD 点差)。
Whipsaw 指开盘后短时间内出现“拉大 → 回归 → 再拉大”的锯齿波动,容易导致情绪割肉发生在最差点。
| 变量/参数 | 类型/单位 | 说明 | 工程落地建议 |
|---|---|---|---|
| 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 点差 | 回归脱困带:价差回归到可接受区间时触发“补救式退出” | 用于减少“割在最差点” |
| 状态 | 含义 | 进入条件(示例) | 主要动作 |
|---|---|---|---|
| NORMAL | 日内常规风控 | 非隔夜窗口 & 非开盘冲击 | 按动态止盈 V2 / 常规止损运行 |
| OVERNIGHT_ARM | 隔夜风控就绪 | 进入隔夜窗口(收盘前 X 分钟)或遇到节假日前 | 自动减仓、设置隔夜硬线、生成开盘预案 |
| GAP_SHOCK | 开盘冲击期 | 开盘后 CooldownOpen 内或检测到 gapAbs 超阈值 | 启用冷静期 + 分层减仓策略 + 反锯齿规则 |
| DISASTER | 灾难模式 | gapAbs 或 gapFromEntry 达到最高层级,且持续确认 | 强制把风险打下来(减到很小或退出) |
| RECOVERY | 回归脱困窗口 | 价差回归到 RecoveryBand 区间 | 自动补救退出/降仓,避免后续再被拉大 |
// 触发:进入 OvernightWindow(如收盘前 20 分钟)
// 目的:直接降低隔夜跳变的伤害半径(不依赖预测)
if (now in OvernightWindow && positionSize > targetOvernightSize) {
reduceTo(targetOvernightSize) // 例如减少到原仓位 40%
log("OVERNIGHT_REDUCE", ...)
}
// 隔夜/开盘冲击期,启用更硬的风险线
// HardStopOvernight 可以按“最大可承受亏损”换算成对应的 USD 点差阈值
if (spread >= HardStopOvernight for N consecutive samples) {
enterDisasterMode()
}
目的:开盘最初报价/流动性往往不稳定,且容易出现第一波极端波动。冷静期内禁止“全仓情绪割”,只允许执行预设的分层规则。
if (marketJustOpened && timeSinceOpen <= CooldownOpen) {
STATE = GAP_SHOCK
// UI:显示“开盘冲击期,系统按预案分层处理”
}
| 层级 | 触发条件(示例,按 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=..., ...)
}
}
当出现一次回归后,系统需要防止第二次拉大把客户再次吓崩。建议引入“回归确认 + 再拉大升级”的规则:
// 关键运行变量
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", ...)
}
你提到的案例里:下午价差回归到 1500 时,若能在“回归窗口”自动退出,亏损会明显更小。
因此建议:当价差回归到一个可接受区间时,系统自动执行“补救式退出/降仓”,把剩余仓位脱困。
| 定义方式 | 示例 | 适用 | 备注 |
|---|---|---|---|
| 相对入场 | spread ≤ entrySpread + 300 | 目标是“回到可接受亏损区间就走” | 最容易解释 |
| 相对昨收 | spread ≤ prevCloseSpread + 500 | gap 回归策略 | 与 gapAbs 联动 |
| 分位数带 | spread ≤ P70(近 N 天) | 环境变化大时 | 需历史统计支持 |
// 在 GAP_SHOCK / DISASTER 状态下持续监测
if (spread <= recoveryLine) {
if (passConfirmWindow()) {
// 进入回归脱困:把剩余仓位按计划退出或降到极小
executeRecoveryExitPlan()
STATE = RECOVERY
log("RECOVERY_EXIT", ...)
}
}
[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
| 参数 | 建议默认 | 说明 |
|---|---|---|
| OvernightWindow | 收盘前 20 分钟 | 进入隔夜就绪状态,准备降风险 |
| targetOvernightSize | 40% 仓位 | 隔夜前自动减仓到 40% |
| CooldownOpen | 120 秒 | 开盘冷静期 |
| ConfirmWindow | 3 | 连续 3 次采样确认 |
| LadderLevels | 600/1500/2500(示例) | 按 gapAbs 分层;每层减 10%/40%/30%(示例) |
| RetestTolerancePct | 2%~5% | 回归后再次接近峰值则升级 |
| RecoveryBand(相对入场) | entrySpread + 300 | 回归到可接受区间就执行脱困退出 |
// 构造价差序列(USD 点差):
t0: prevCloseSpread = 1200
open: 4000 (持续若干秒)
-> 回归到 2800(持续一段)
-> 再拉到 3500(持续一段)
-> 下午回归到 1500(持续)
// 预期系统行为:
1) 进入 GAP_SHOCK,冷静期内执行分层减仓(不允许全仓情绪割)
2) 回归到 2800:不立即“全退出”,但应标记回归确认(若持续)
3) 再拉到 3500:触发 RetestRule,升级减仓层级
4) 下午回归到 1500:触发 RecoveryExitPlan,把剩余仓位脱困退出或降到极小