-- ============================================================ -- 规则初始数据(对应设计文档 §4.9.1 通用规则预置参考) -- 依赖:seed_variables.sql(变量池数据需先插入,ID 1~44) -- -- 变量 ID 映射(seed_variables.sql 自增): -- 1=合约名义本金 2=合约起息日 3=合约到期日 4=合约平仓日 -- 5=合约支付日 6=期初净价 7=期初全价 8=期初收益率 -- 9=期初价格 10=期末全价 11=期末价格 12=保证金利率 -- 13=保证金比例 14=客户授信额度 -- 15=上一收盘日中债估值净价 16=上一收盘日中债估值全价 17=上一收盘日中债估值收益率 -- 18=上一日收盘价 19=借贷加权费率 20=FR007 21=当前日期 -- 22=挂钩标的到期日 23=标的发行余额 -- 24=挂钩标的集中度 25=授信占用率 26=合约期限 27=Delta -- 28=Gamma 29=Vega 30=Theta 31=利息端利率 -- 32=对手方累计标的数量 33=同一标的累计名义本金 34=同一客户累计名义本金 -- 35=总持仓名义本金 -- 36=到期日是否银行间交易日 37=平仓日是否银行间交易日 38=支付日是否银行间交易日 -- 39=利息端/浮动端方向是否同向 40=关键业务要素是否一致 -- 41=多空方向为多头 42=多空方向为空头 -- 43=保证金收支方向为支付 44=保证金收支方向为收取 -- 45=期初净价偏离度 46=期初收益率偏离度 47=期初价格偏离度 -- 48=利息端利率与FR007偏离度 49=利息端利率与借贷加权费率偏离度 -- 50=执行价偏离度 51=执行价 52=客户品种最低保证金率 53=参考价格 -- -- ConditionJson 精简设计:只存 VariableId/Operator/ThresholdType/Value/ThresholdVariableId -- 展示字段(VariableName/VariableType/Unit/ThresholdVariableName)从变量接口关联获取 -- ============================================================ -- ============================================================ -- 插入 21 条通用规则 -- ============================================================ -- 规则1:挂钩标的集中度超阈值(审批,全局) -- 条件:挂钩标的集中度(ID=24) > 30% INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('挂钩标的集中度超阈值', '挂钩标的集中度超过阈值(默认30%)时触发审批', JSON_ARRAY(JSON_OBJECT( 'VariableId', 24, 'Operator', '>', 'ThresholdType', 'Fixed', 'Value', 30 )), 'calc.UnderlyingConcentration > 30', 1, 1, 0, 'SYSTEM', NOW()); -- 规则2:挂钩标的到期日小于合约到期日(禁止,全局) -- 条件:挂钩标的到期日(ID=22) < 合约到期日(ID=3) INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('挂钩标的到期日小于合约到期日', '挂钩标的到期日早于合约到期日时禁止交易', JSON_ARRAY(JSON_OBJECT( 'VariableId', 22, 'Operator', '早于', 'ThresholdType', 'Variable', 'ThresholdVariableId', 3 )), 'market.UnderlyingMaturityDate < trade.ExerciseDate', 1, 1, 0, 'SYSTEM', NOW()); -- 规则3:名义本金超阈值(审批,账户/合约类型) -- 条件:合约名义本金(ID=1) > 100000000(1亿元) INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('名义本金超阈值', '合约名义本金超过阈值(默认1亿元)时触发审批', JSON_ARRAY(JSON_OBJECT( 'VariableId', 1, 'Operator', '>', 'ThresholdType', 'Fixed', 'Value', 100000000 )), 'trade.StockEqvNotional > 100000000', 1, 1, 0, 'SYSTEM', NOW()); -- 规则4:保证金支付比例超阈值(审批,账户/标的类型) -- 条件:保证金比例(ID=13) > 50% INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('保证金支付比例超阈值', '保证金比例超过阈值(默认50%)时触发审批', JSON_ARRAY(JSON_OBJECT( 'VariableId', 13, 'Operator', '>', 'ThresholdType', 'Fixed', 'Value', 50 )), 'trade.MarginRate > 50', 1, 1, 0, 'SYSTEM', NOW()); -- 规则5:保证金利率偏离(审批,账户) -- 条件:保证金利率(ID=12) 不介于 [2%, 5%] INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('保证金利率偏离', '保证金利率不在配置区间内(默认2%~5%)时触发审批', JSON_ARRAY(JSON_OBJECT( 'VariableId', 12, 'Operator', '不介于', 'ThresholdType', 'Fixed', 'Value', JSON_ARRAY(2, 5), 'IncludeLowerBound', true, 'IncludeUpperBound', true )), '!(client_marginrate.InitMarginRebateRate >= 2 && client_marginrate.InitMarginRebateRate <= 5)', 1, 1, 0, 'SYSTEM', NOW()); -- 规则6:保证金收取比例低于最低标准(审批,账户/标的类型) -- 条件:保证金比例(ID=13) < 客户品种最低保证金率(ID=52) INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('保证金收取比例低于最低标准', '保证金比例低于客户品种最低保证金率时触发审批', JSON_ARRAY(JSON_OBJECT( 'VariableId', 13, 'Operator', '<', 'ThresholdType', 'Variable', 'ThresholdVariableId', 52 )), 'trade.MarginRate < config.MinMarginRate', 1, 1, 0, 'SYSTEM', NOW()); -- 规则7:起息日早于当前日期(审批,全局) -- 条件:合约起息日(ID=2) < 当前日期(ID=21) INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('起息日早于当前日期', '合约起息日早于当前日期时触发审批', JSON_ARRAY(JSON_OBJECT( 'VariableId', 2, 'Operator', '早于', 'ThresholdType', 'Variable', 'ThresholdVariableId', 21 )), 'trade.StartDate < sys.CurrentDate', 1, 1, 0, 'SYSTEM', NOW()); -- 规则8:支付日为银行间交易日(审批,全局) -- 条件:支付日是否银行间交易日(ID=38) = 是 INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('支付日为银行间交易日', '支付日为银行间交易日时触发审批', JSON_ARRAY(JSON_OBJECT( 'VariableId', 38, 'Operator', '是', 'ThresholdType', 'Fixed', 'Value', true )), 'calc.IsSettlementDateTradingDay == true', 1, 1, 0, 'SYSTEM', NOW()); -- 规则9:到期日为银行间交易日(审批,全局) -- 条件:到期日是否银行间交易日(ID=36) = 是 INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('到期日为银行间交易日', '到期日为银行间交易日时触发审批', JSON_ARRAY(JSON_OBJECT( 'VariableId', 36, 'Operator', '是', 'ThresholdType', 'Fixed', 'Value', true )), 'calc.IsExerciseDateTradingDay == true', 1, 1, 0, 'SYSTEM', NOW()); -- 规则10:平仓日为银行间交易日(审批,全局) -- 条件:平仓日是否银行间交易日(ID=37) = 是 INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('平仓日为银行间交易日', '平仓日为银行间交易日时触发审批', JSON_ARRAY(JSON_OBJECT( 'VariableId', 37, 'Operator', '是', 'ThresholdType', 'Fixed', 'Value', true )), 'calc.IsUnwindDateTradingDay == true', 1, 1, 0, 'SYSTEM', NOW()); -- 规则11:合约期限超阈值(审批,账户) -- 条件:合约期限(ID=26) > 365天 INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('合约期限超阈值', '合约期限超过阈值(默认365天)时触发审批', JSON_ARRAY(JSON_OBJECT( 'VariableId', 26, 'Operator', '>', 'ThresholdType', 'Fixed', 'Value', 365 )), 'calc.MaturityDays > 365', 1, 1, 0, 'SYSTEM', NOW()); -- 规则12:债券类净价偏离(审批,全局) -- 条件:期初净价偏离度(ID=45) > 5% INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('债券类净价偏离', '期初净价与上一收盘日中债估值净价偏离度超阈值(默认5%)时触发审批', JSON_ARRAY(JSON_OBJECT( 'VariableId', 45, 'Operator', '>', 'ThresholdType', 'Fixed', 'Value', 5 )), 'Math.Abs(swap_position.PosiNetNoFeePrice - market.CBValuationNetPrice) / market.CBValuationNetPrice * 100 > 5', 1, 1, 0, 'SYSTEM', NOW()); -- 规则13:债券类收益率偏离(审批,全局) -- 条件:期初收益率偏离度(ID=46) > 5% INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('债券类收益率偏离', '期初收益率与上一收盘日中债估值收益率偏离度超阈值(默认5%)时触发审批', JSON_ARRAY(JSON_OBJECT( 'VariableId', 46, 'Operator', '>', 'ThresholdType', 'Fixed', 'Value', 5 )), 'Math.Abs(trade.InitYtm - market.CBValuationYtm) / market.CBValuationYtm * 100 > 5', 1, 1, 0, 'SYSTEM', NOW()); -- 规则14:非债券类价格偏离(审批,全局) -- 条件:期初价格偏离度(ID=47) > 5% INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('非债券类价格偏离', '期初价格与上一日收盘价偏离度超阈值(默认5%)时触发审批', JSON_ARRAY(JSON_OBJECT( 'VariableId', 47, 'Operator', '>', 'ThresholdType', 'Fixed', 'Value', 5 )), 'Math.Abs(trade.SpotPrice - market.LastClosePrice) / market.LastClosePrice * 100 > 5', 1, 1, 0, 'SYSTEM', NOW()); -- 规则15:单一交易对手累计标的数量超阈值(审批,对手方) -- 条件:对手方累计标的数量(ID=32) > 10个 INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('单一交易对手累计标的数量超阈值', '对手方累计标的数量超过阈值(默认10个)时触发审批', JSON_ARRAY(JSON_OBJECT( 'VariableId', 32, 'Operator', '>', 'ThresholdType', 'Fixed', 'Value', 10 )), 'calc.CounterpartyUnderlyingCount > 10', 1, 1, 0, 'SYSTEM', NOW()); -- 规则16:多头支付固定端利率偏离(审批,账户) -- 条件:多空方向为多头(ID=41) AND 利息端利率与FR007偏离度(ID=48) > 3% INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('多头支付固定端利率偏离', '多头方向支付固定端场景下,利息端利率与FR007偏离度超阈值(默认3%)时触发审批', JSON_ARRAY( JSON_OBJECT( 'VariableId', 41, 'Operator', '是', 'ThresholdType', 'Fixed', 'Value', true ), JSON_OBJECT( 'VariableId', 48, 'Operator', '>', 'ThresholdType', 'Fixed', 'Value', 3 ) ), 'calc.IsLongDirection == true && Math.Abs(calc.InterestRate - market.FR007) / market.FR007 * 100 > 3', 1, 1, 0, 'SYSTEM', NOW()); -- 规则17:空头利率减点借贷加权偏离(审批,账户) -- 条件:多空方向为空头(ID=42) AND 利息端利率与借贷加权费率偏离度(ID=49) > 2% INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('空头利率减点借贷加权偏离', '空头方向场景下,利息端利率与借贷加权费率偏离度超阈值(默认2%)时触发审批', JSON_ARRAY( JSON_OBJECT( 'VariableId', 42, 'Operator', '是', 'ThresholdType', 'Fixed', 'Value', true ), JSON_OBJECT( 'VariableId', 49, 'Operator', '>', 'ThresholdType', 'Fixed', 'Value', 2 ) ), 'calc.IsShortDirection == true && Math.Abs(calc.InterestRate - market.BondLendingRate) / market.BondLendingRate * 100 > 2', 1, 1, 0, 'SYSTEM', NOW()); -- 规则18:账户授权收支方向不匹配(禁止,账户) -- 条件:保证金收支方向为支付(ID=43)(实际需结合账户授权方向判断,此处简化) INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('账户授权收支方向不匹配', '保证金收支方向与账户授权方向不匹配时禁止交易', JSON_ARRAY(JSON_OBJECT( 'VariableId', 43, 'Operator', '是', 'ThresholdType', 'Fixed', 'Value', true )), 'calc.IsMarginPay == true', 1, 1, 0, 'SYSTEM', NOW()); -- 规则19:执行价偏离超阈值(审批,账户) -- 条件:执行价偏离度(ID=50) > 5% INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('执行价偏离超阈值', '执行价与参考价格偏离度超阈值(默认5%)时触发审批', JSON_ARRAY(JSON_OBJECT( 'VariableId', 50, 'Operator', '>', 'ThresholdType', 'Fixed', 'Value', 5 )), 'Math.Abs(trade.StrikePrice - market.ReferencePrice) / market.ReferencePrice * 100 > 5', 1, 1, 0, 'SYSTEM', NOW()); -- 规则20:希腊字母限额超阈值(提示,预留接口,一期不纳入) INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('希腊字母限额超阈值', 'Delta/Gamma/Vega/Theta任一超阈值时提示(预留接口,一期不纳入)', NULL, NULL, 1, 1, 0, 'SYSTEM', NOW()); -- 规则21:接近/触发敲入敲出价(提示,预留接口,需确认具体判断逻辑) INSERT INTO `glms_risk_rule` (`RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`) VALUES ('接近/触发敲入敲出价', '标的价格接近敲入/敲出价时提示(预留接口,需确认具体判断逻辑)', NULL, NULL, 1, 1, 0, 'SYSTEM', NOW());