行情风控阈值分析:做市滑点保护机制

视角:做市商(Market Maker)风控。分析范围限定在已获得真实数据的 7 类指标(index_type1/2/3/4/5/6/7)。
前置文档:market_wind_tables.md(4 张表的字段结构与基础调用链)。本文聚焦阈值本身的设计逻辑与做市保护效果,不重复表结构细节。
数据来源:market_wind_config全局默认配置(symbol_id=0)截图数据 + 代码静态分析,未跑线上 SQL 核对,如有出入以线上为准。
1. 问题背景:为什么做市商需要"动态滑点"
做市商在撮合引擎里挂单/对手价成交时,面对的核心风险是信息不对称下的逆向选择(adverse selection):当行情发生剧烈单边波动或盘口流动性骤降时,做市商的报价会滞后于真实市场价,被套利者/高频交易者用滞后报价薄利甚至倒贴成交,也就是常说的"被扫单""被撸滑点"。
固定滑点表(仅按保证金规模分档,见 contract_symbol_step_slippage)无法应对这种风险——平静行情下滑点太大会劝退正常用户,剧烈行情下滑点太小则做市商被反复收割。
行情风控体系(market_wind_* 4 表)的作用就是给"行情异常程度"打分,再把分数转换成滑点加成倍率,实现滑点随行情动态收紧/放松,本质上是做市商对冲逆向选择风险的一层自动化保护机制。
2. 阈值设计总览(已知 7 类指标)
market_wind_config 把行情异常拆成 7 个独立维度,每个维度用 2-4 个区间给出阶梯权重(0 分 = 正常,权重越高越异常)。全局默认配置(symbol_id=0)截图数据如下:
| index_type | 指标 | 区间 1 | 区间 2 | 区间 3 | 区间 4 | 权重梯度特征 |
|---|---|---|---|---|---|---|
| 1 | 日涨跌幅 | 0-5% → 0 | 5-10% → 5 | 10-100% → 10 | — | 梯度最平缓,日级别波动容忍度最高 |
| 2 | 小时涨跌幅 | 0-3% → 0 | 3-8% → 15 | 8-100% → 30 | — | 中等梯度 |
| 3 | 分钟涨跌幅 | 0-0.3% → 0 | 0.3-1.2% → 40 | 1.2-100% → 90 | — | 梯度最陡,短周期波动一旦超阈值直接给到接近满分 |
| 4 | 盘口价格间隔数量 | 0-10 → 0 | 10-50 → 40 | 50-999万 → 90 | — | 反映盘口"跳价"档位数,跳价越多流动性越差 |
| 5 | 5% 深度(万U) | 20-1万 → 0 | 5-10 → 30 | 0-5 → 60 | — | 注意:区间顺序是反的(详见 §3.1),数值越小权重越高 |
| 6 | 盘口价格万分比 | 0-20‱ → 0 | 20-60‱ → 50 | 60-10000‱ → 90 | — | 价差越大权重越高,梯度陡峭 |
| 7 | 15分钟涨跌幅 | 0-0.5% → 0 | 0.5-1.5% → 30 | 1.5-3% → 45 | 3-100% → 60 | 4 档最细,介于分钟线和小时线之间的"缓冲带" |
单交易对可覆盖全局默认(如 symbol_id=1012 trx 对分钟 15 线单独配置到 90 分,但该记录 status=2 已停用),说明规则支持"全局兜底 + 币种定制"两级,为流动性差/波动大的长尾币种预留了单独收紧的能力。
3. 各维度设计逻辑解读
3.1 短周期指标(day / hour / minute / minute_15):捕捉"速度"而非"幅度"
四个涨跌幅指标本质上是同一件事(价格波动)在不同时间尺度下的采样,但权重梯度差异巨大:
- 日涨跌幅 10% 只给 10 分,分钟涨跌幅 1.2% 就给 90 分。
- 这不是"厚此薄彼",而是做市商真正关心的是波动速度:10% 的日内累计涨跌可能是缓慢趋势,用户/套利者难以利用;但 1 分钟内涨跌 1.2%,说明存在瞬时冲击(大单/插针/极端行情事件),做市商挂出的报价大概率已经"过期",被扫损失的确定性极高。
minute_15_change(15 分钟线)是分钟线和小时线之间的缓冲带,4 档设计比其他指标更细(0.5/1.5/3 三个切点),推测是为了避免"分钟级噪音"和"小时级趋势"之间出现风控空窗——15 分钟窗口能过滤单笔大单造成的瞬时抖动,同时又能在真正的中期趋势启动时及时响应。
做市保护作用:分钟级指标一旦触发高权重,slippageByWeight() 会让滑点迅速放大,等价于做市商在极端行情下自动"拉宽报价点差",减少继续按旧价成交的敞口——这是做市商标准的"行情剧烈波动时主动走宽点差"策略的自动化实现。
3.2 盘口指标(ab_price_num / ab_price_rate / depth_5p):捕捉"流动性质量"
三个盘口维度与涨跌幅维度正交,衡量的不是价格变化本身,而是当前盘口能不能承接正常交易:
ab_price_num(盘口价格间隔数量):买卖一档之间隔了多少个最小变动单位的"空档"。空档越多说明挂单稀疏,正常成交容易直接打穿到远价,属于流动性枯竭信号。ab_price_rate(盘口价格万分比):把价差换算成相对幅度(‱),解决了ab_price_num在不同精度/不同价格量级交易对之间不可比的问题。代码里MarketWindRiskRating::run()有一个关键判断:sign_price_rate < 1‱时用ab_price_num口径,否则用ab_price_rate口径——即单笔最小变动单位本身占比很小时用绝对数量判断,占比较大时用相对比例判断,避免了低价高精度币种(数量维度虚高)和高价币种(数量维度虚低)之间的口径失真。depth_5p(5% 深度额):买卖两侧价格 ±5% 区间内的挂单总额,取买卖较小值("木桶短板"逻辑)。这是最直接的"承接能力"指标——深度越薄,做市商自己的大额平仓/对冲单也越容易打穿盘口造成滑点损失。
做市保护作用:这三个维度共同构成"流动性质量护城河"。即使价格本身没有剧烈波动(涨跌幅维度权重为 0),只要盘口变薄、价差拉大,风控权重依然会上升——防止在"横盘但流动性枯竭"场景下按正常滑点成交,这类场景恰恰是做市商最容易被隐蔽吃单(比如对手方分批试探流动性上限)的场景,靠涨跌幅指标是发现不了的。
3.3 depth_5p 区间顺序反常,是特意设计还是笔误?
对比其他 6 个维度(数值越大权重越高),depth_5p 是唯一一个数值越小权重越高的维度(20-10000万→0,0-5万→60),逻辑自洽——深度额本身就是"越多越安全",与其他"异常程度指标"方向相反是必然的,不是配置错误。但这也意味着运营在新增/修改此维度阈值时容易因惯性按其他维度的思维配反,属于人工维护该表时的风险点,建议在后台配置页面对该字段做特殊说明或独立校验。
4. 权重汇总与滑点转换:从"异常分数"到"实际保护动作"
4.1 汇总公式
total_weight = day_weight + hour_weight + minute_weight
+ minute_15_weight + ab_price_weight + depth_5p_weight六个维度简单相加、无归一化、无最大值封顶,意味着:
- 多个维度同时触发中高权重时会产生叠加放大效应(例如分钟线 90 + 盘口价差 90 + 深度 60 = 240),风控response 会比单一维度异常更激进,这是有意为之——多维度共振通常代表更高确定性的极端行情。
- 但也意味着理论上限没有硬约束,
market_weight_slippage_config的max_weight若配置不当(比如最高档区间上限过低),超出配置范围的极端权重会落不到任何区间,multipleSlippageRate()返回0(详见 §4.3 风险点)。
4.2 滑点转换公式
最终滑点 = 基础滑点 + 基础滑点 × 权重倍率
= 基础滑点 × (1 + multipleSlippageRate(total_weight))(Service\Monitor\MarketDepthService::slippageByWeight(),script/src/Service/Monitor/MarketDepthService.php:190-203)
基础滑点来自 contract_symbol_step_slippage 表(按保证金规模分档,与本文风控体系是两套独立配置),风控倍率是乘法叠加而非替换——即无论保证金多大,风控异常时都会等比例放大滑点,大额仓位在极端行情下获得的绝对滑点保护也更大,这与做市商在大额敞口下更需要保护的直觉一致。
4.3 潜在风险点(非本次改动范围,仅供风控/运营参考)
- 权重表和滑点倍率表是两套独立人工维护的配置(
market_wind_config和market_weight_slippage_config),两者之间没有校验联动——如果market_wind_config上调了某档权重上限(如把 90 分改到 150 分),但market_weight_slippage_config的max_weight最高档仍停留在 100,超出部分会匹配不到任何区间,multipleSlippageRate()直接返回0(详见SlippageConfigModel.php:26-42循环逻辑,无区间兜底),相当于风控在最极端行情下反而失效,属于配置耦合的隐藏风险,建议两表联动检查或加最高档兜底区间(max_weight设为无穷大等价值)。 market_wind_index是定时任务覆盖式更新(existUpdate)而非流水表,CheckMarketKline/CheckMarketDepth的采集频率决定了风控的响应时延——如果定时任务间隔较长(需查具体 cron 配置,本次未在代码中找到调度频率定义),分钟级指标的"瞬时冲击捕捉"能力会打折扣,风控存在滞后窗口。market_wind_weight无权重历史,只有最新快照,无法做"权重持续上升趋势"这类更精细的预警(比如权重从 20 分钟内匀速上升到 80,和权重突然从 0 跳到 80,风险性质不同,但当前机制无法区分)。
5. 对做市策略的实际意义总结
| 维度组 | 捕捉的风险类型 | 做市侧对应动作 |
|---|---|---|
| 涨跌幅四件套(日/时/分/15分) | 价格剧烈波动、报价滞后 | 分钟级触发权重 → 滑点迅速放大 → 等价于自动拉宽点差 |
| 盘口价差(数量/万分比) | 盘口稀疏、跳价异常 | 即使价格未剧烈波动,盘口质量下降也会推高滑点保护 |
| 5% 深度 | 流动性枯竭、木桶短板 | 深度不足时收紧滑点,防止大单/对冲单打穿盘口 |
整体来看,这套机制让做市商的滑点策略从"静态、只看保证金规模"升级为"动态、感知行情异常 + 流动性质量"的双因子模型,核心价值是把逆向选择风险的敞口控制自动化,减少人工盯盘/手动调整滑点表的运营成本,同时把响应速度压缩到定时任务的采集周期级别。
局限性在于:两套配置表(阈值权重 + 滑点倍率)依赖人工联动维护,且当前无权重趋势/历史追踪能力,属于"基于快照的被动响应"而非"基于趋势的主动预测",如需进一步提升保护能力,可考虑引入权重变化率或滑动窗口预警。
附录:涉及表结构(内部参考,字段名据代码读写推断,未跑线上 DDL 核对)
market_wind_config — 风控指标阈值配置表
| 字段 | 说明 |
|---|---|
mwc_id | 主键 |
symbol_id | 交易对 ID,0 为全局默认配置 |
index_type | 指标类型:1=day_change 2=hour_change 3=minute_change 4=ab_price_num 5=depth_5p 6=ab_price_rate 7=minute_15_change |
condition | 阈值区间,"min-max" 字符串 |
weight | 该区间对应权重分 |
status | 1=open 2=close |
market_wind_index — 交易对行情原始指标表
| 字段 | 说明 |
|---|---|
mwi_id | 主键 |
symbol_id / symbol_type | 交易对 ID + 类型(1=现货 3=U本位合约 5=币本位合约),唯一性条件 |
remark | 类型-交易所-交易对 拼接说明 |
day_change / day_change_time / day_change_index | 日涨跌幅(%)/ K线时间 / 涨跌绝对值 |
hour_change / hour_change_time / hour_change_index | 小时涨跌幅同上 |
minute_change / minute_change_time / minute_change_index | 分钟涨跌幅同上 |
minute_15_change / minute_15_change_time / minute_15_change_index | 15分钟涨跌幅同上 |
ask_price / bid_price | 卖一价 / 买一价 |
ab_price_num | 盘口价格差数量 |
ab_price_rate | 盘口价格差万分比 |
ask_5p_volume / bid_5p_volume | 卖/买盘深度 5% 区间成交额 |
depth_5p_volume | min(ask_5p_volume, bid_5p_volume) |
sign_price_rate | 单价格跳动万分比 |
market_wind_weight — 交易对风控权重结果表
| 字段 | 说明 |
|---|---|
mww_id | 主键 |
symbol_id / symbol_type | 交易对 ID + 类型,唯一性条件 |
day_weight / hour_weight / minute_weight / minute_15_weight | 对应涨跌幅指标权重分 |
ab_price_weight | 盘口价差权重 |
depth_5p_weight | 深度权重 |
status | 1=open 2=close |
total_weight 为运行时 SQL 表达式现算(六字段求和),非落库字段。
market_weight_slippage_config — 权重-滑点倍率映射配置表
| 字段 | 说明 |
|---|---|
mwsc_id | 主键 |
min_weight / max_weight | 权重区间 [min_weight, max_weight) |
slippage_rate | 该权重区间对应滑点倍率 |
status | 1=open 2=close |
相关推荐
- 暂无相关推荐,看看别的吧。
0 评论