122 lines
6.4 KiB
SQL
122 lines
6.4 KiB
SQL
-- ============================================================
|
||
-- 规则初始数据(对应当前 glms_risk_rule 数据库内容)
|
||
-- 依赖:seed_risk_engine_variables.sql(变量池数据需先插入)
|
||
--
|
||
-- 变量 ID 映射(seed_risk_engine_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;
|
||
-- 区间比较使用 Lower/UpperThresholdType、Lower/UpperValue、Lower/UpperThresholdVariableId、IncludeLower/IncludeUpper。
|
||
-- 修改原因:Operator 使用 gt/lt 等稳定 token,避免 >、< 在接口传输中发生 HTML 转义。
|
||
-- RuleExpr 保持现有简洁 C# 公式;编译前类型转换由 RiskEngineCompiler 负责。
|
||
-- 展示字段(VariableName/VariableType/Unit/ThresholdVariableName)从变量接口关联获取
|
||
-- ============================================================
|
||
|
||
|
||
-- ============================================================
|
||
-- 插入当前数据库中的 6 条规则,保留原始 ID 以匹配规则应用表 RuleIds
|
||
-- ============================================================
|
||
|
||
INSERT INTO `yltrs_ylcms`.`glms_risk_rule` (`id`, `RuleName`, `RuleText`, `ConditionJson`, `RuleExpr`, `Description`, `Status`, `Version`, `OptId`, `OptName`, `OptDate`, `UpdateOptId`, `UpdateOptName`, `UpdateDate`) VALUES
|
||
(3,
|
||
'名义本金超阈值',
|
||
'合约名义本金 > 1亿',
|
||
'[{"VariableId":1,"Operator":"gt","ThresholdType":"Fixed","Value":100000000}]',
|
||
'DbContext.trade.First(t => t.id == TradeId).StockEqvNotional > 100000000',
|
||
'',
|
||
2,
|
||
14,
|
||
0,
|
||
'SYSTEM',
|
||
'2026-06-24 15:51:47',
|
||
1,
|
||
'初始用户',
|
||
'2026-07-17 14:50:33'),
|
||
(12,
|
||
'债券类净价偏离',
|
||
'期初净价与上一收盘日中债估值净价绝对价差大于5元时触发审批',
|
||
'',
|
||
'Math.Abs(DbContext.swap_position.First(p => p.SwapTradeId == TradeId && p.IsInitial && !p.Invalid && p.PosiDirection == 2 && !string.IsNullOrEmpty(p.UnderlyingCode)).PosiNetNoFeePrice.Value * 100m - DbContext.china_bond_valuation.Where(v => v.bond_id == DbContext.swap_position.First(p => p.SwapTradeId == TradeId && p.IsInitial && !p.Invalid && p.PosiDirection == 2 && !string.IsNullOrEmpty(p.UnderlyingCode)).UnderlyingCode && v.valuation_date < DbContext.trade.First(t => t.id == TradeId).TradeDate.Value.Date).OrderBy(v => v.credibility).ThenByDescending(v => v.valuation_date).First().net_price.Value) > 5m',
|
||
NULL,
|
||
2,
|
||
9,
|
||
0,
|
||
'SYSTEM',
|
||
'2026-06-24 15:51:47',
|
||
1,
|
||
'初始用户',
|
||
'2026-07-17 14:50:29'),
|
||
(13,
|
||
'债券类收益率偏离',
|
||
'',
|
||
'',
|
||
'Math.Abs(DbContext.swap_position.First(p => p.SwapTradeId == TradeId && p.IsInitial && !p.Invalid && p.PosiDirection == 2 && !string.IsNullOrEmpty(p.UnderlyingCode)).InitYtm.Value * 100m - DbContext.china_bond_valuation.Where(v => v.bond_id == DbContext.swap_position.First(p => p.SwapTradeId == TradeId && p.IsInitial && !p.Invalid && p.PosiDirection == 2 && !string.IsNullOrEmpty(p.UnderlyingCode)).UnderlyingCode && v.valuation_date < DbContext.trade.First(t => t.id == TradeId).TradeDate.Value.Date).OrderBy(v => v.credibility).ThenByDescending(v => v.valuation_date).First().yield.Value) > 0.4m',
|
||
'',
|
||
2,
|
||
10,
|
||
0,
|
||
'SYSTEM',
|
||
'2026-06-24 15:51:47',
|
||
1,
|
||
'初始用户',
|
||
'2026-07-17 14:50:21'),
|
||
(14,
|
||
'非债券类价格偏离',
|
||
'TRS非债券价格偏离绝对值 > 5元',
|
||
'[{"VariableId":47,"Operator":"gt","ThresholdType":"Fixed","Value":5}]',
|
||
'Math.Abs(DbContext.swap_position.First(p => p.SwapTradeId == TradeId && p.IsInitial && !p.Invalid && p.PosiDirection == 2 && !string.IsNullOrEmpty(p.UnderlyingCode)).PosiGrossPrice * 100 - Convert.ToDecimal(DbContext.eod_commodity_future_price.Where(e => e.UnderlyingCode == DbContext.swap_position.First(p => p.SwapTradeId == TradeId && p.IsInitial && !p.Invalid && p.PosiDirection == 2 && !string.IsNullOrEmpty(p.UnderlyingCode)).UnderlyingCode && e.ValueDate < DbContext.trade.First(t => t.id == TradeId).TradeDate.Value.Date).OrderByDescending(e => e.ValueDate).First().ClosePrice)) > 5',
|
||
'',
|
||
2,
|
||
8,
|
||
0,
|
||
'SYSTEM',
|
||
'2026-06-24 15:51:47',
|
||
1,
|
||
'初始用户',
|
||
'2026-07-17 14:50:37'),
|
||
(15,
|
||
'单一交易对手累计标的数量超阈值',
|
||
'对手方累计标的数量 > 10个',
|
||
'[{"VariableId":32,"Operator":"gt","ThresholdType":"Fixed","Value":10}]',
|
||
'DbContext.swap_position.Where(p => !string.IsNullOrEmpty(p.UnderlyingCode) && !p.IsInitial && p.PosiQuantity > 0 && !p.Invalid && p.PosiDirection > 0 && DbContext.trade.Any(t => t.id == p.SwapTradeId && t.ValidState != "InValid" && t.ClientId == DbContext.trade.First(x => x.id == TradeId).ClientId)).Select(p => p.UnderlyingCode).Distinct().Count() > 10',
|
||
'',
|
||
2,
|
||
8,
|
||
0,
|
||
'SYSTEM',
|
||
'2026-06-24 15:51:47',
|
||
1,
|
||
'初始用户',
|
||
'2026-07-17 14:50:18'),
|
||
(16,
|
||
'多头支付固定端利率偏离',
|
||
'利息端利率与FR007偏离度 > 3%',
|
||
'[{"VariableId":48,"Operator":"gt","ThresholdType":"Fixed","Value":3}]',
|
||
'Math.Abs(DbContext.swap_position.First(p => p.SwapTradeId == TradeId && p.InterestDirection == 1).InterestRateDefault)*100m > 3',
|
||
'',
|
||
2,
|
||
5,
|
||
0,
|
||
'SYSTEM',
|
||
'2026-06-24 15:51:47',
|
||
1,
|
||
'初始用户',
|
||
'2026-07-17 14:54:18');
|