Files
zszq-trs/YLErpDAL/Model/RiskLimit.cs
T
2024-05-09 14:06:26 +08:00

357 lines
12 KiB
C#

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace YLErp.Model
{
/// <summary>
/// 风控限额配置
/// </summary>
[Table("Risk_Limit")]
public class RiskLimit
{
[Key]
public int id { get; set; }
/// <summary>
/// 限额配置名称
/// <para>范围+"_"+类型;如:RB1910_deltacash</para>
/// </summary>
public string LimitName { get; set; }
/// <summary>
/// 限额指标类型
/// <para>0:绝对值</para>
/// <para>1:相对值</para>
/// </summary>
public byte LimitValueType { get; set; }
/// <summary>
/// 限额指标
/// <para>当limitValueType=1时,改值为百分比</para>
/// </summary>
public decimal LimitValue { get; set; }
/// <summary>
/// 基准
/// <para>当limitValueType=1时,改值为limitValue的基准</para>
/// </summary>
public string LimitBenchmark { get; set; }
/// <summary>
/// 操作时间
/// </summary>
public DateTime OptTime { get; set; }
/// <summary>
/// 操作人
/// </summary>
public string OptName { get; set; }
}
public class RiskDailyReportLimit
{
public static List<string> Names = new List<string>() {
"风控日报_年盈亏限额",
"风控日报_日盈亏限额",
"场外期权_Delta限额",
"场外期权_Gamma限额",
"场外期权_DeltaCash",
"场外期权_GammaCash"
};
/// <summary>
/// 风控日报_年盈亏限额
/// </summary>
public RiskLimit YearPnlLimit { get; set; }
/// <summary>
/// 风控日报_日盈亏限额
/// </summary>
public RiskLimit DailyPnlLimit { get; set; }
/// <summary>
/// 场外期权_Delta限额
/// </summary>
public RiskLimit DeltaPnlLimit { get; set; }
/// <summary>
/// 场外期权_DeltaCash
/// </summary>
public RiskLimit DeltaCashPercent { get; set; }
/// <summary>
/// 场外期权_Gamma限额
/// </summary>
public RiskLimit GammaPnlLimit { get; set; }
/// <summary>
/// 场外期权_GammaCash
/// </summary>
public RiskLimit GammaCashPercent { get; set; }
public RiskDailyReportLimit()
{
this.YearPnlLimit = new RiskLimit();
this.YearPnlLimit.LimitName = "风控日报_年盈亏限额";
this.YearPnlLimit.LimitValueType = 0;
this.YearPnlLimit.LimitValue = 0;
this.YearPnlLimit.LimitBenchmark = "";
this.DailyPnlLimit = new RiskLimit();
this.DailyPnlLimit.LimitName = "风控日报_日盈亏限额";
this.DailyPnlLimit.LimitValueType = 0;
this.DailyPnlLimit.LimitValue = 0;
this.DailyPnlLimit.LimitBenchmark = "";
this.DeltaPnlLimit = new RiskLimit();
this.DeltaPnlLimit.LimitName = "场外期权_Delta限额";
this.DeltaPnlLimit.LimitValueType = 0;
this.DeltaPnlLimit.LimitValue = 0;
this.DeltaPnlLimit.LimitBenchmark = "";
this.GammaPnlLimit = new RiskLimit();
this.GammaPnlLimit.LimitName = "场外期权_Gamma限额";
this.GammaPnlLimit.LimitValueType = 0;
this.GammaPnlLimit.LimitValue = 0;
this.GammaPnlLimit.LimitBenchmark = "";
this.DeltaCashPercent = new RiskLimit();
this.DeltaCashPercent.LimitName = "场外期权_DeltaCash";
this.DeltaCashPercent.LimitValueType = 1;
this.DeltaCashPercent.LimitValue = 0;
this.DeltaCashPercent.LimitBenchmark = "DeltaCash";
this.GammaCashPercent = new RiskLimit();
this.GammaCashPercent.LimitName = "场外期权_GammaCash";
this.GammaCashPercent.LimitValueType = 1;
this.GammaCashPercent.LimitValue = 0;
this.GammaCashPercent.LimitBenchmark = "GammaCash";
}
public RiskDailyReportLimit(List<RiskLimit> riskLimits) : this()
{
for (int i = 0; i < riskLimits.Count; i++)
{
switch (riskLimits[i].LimitName)
{
case "风控日报_年盈亏限额":
this.YearPnlLimit = riskLimits[i];
break;
case "风控日报_日盈亏限额":
this.DailyPnlLimit = riskLimits[i];
break;
case "场外期权_Delta限额":
this.DeltaPnlLimit = riskLimits[i];
break;
case "场外期权_Gamma限额":
this.GammaPnlLimit = riskLimits[i];
break;
case "场外期权_DeltaCash":
this.DeltaCashPercent = riskLimits[i];
break;
case "场外期权_GammaCash":
this.GammaCashPercent = riskLimits[i];
break;
}
}
}
}
#region 风险日报表结构
public class RiskLimitOptionModel
{
/// <summary>
/// 场外期权
/// </summary>
public RiskLimitValueModel Option { get; set; } = new RiskLimitValueModel();
/// <summary>
/// 场内期权
/// </summary>
public RiskLimitValueModel Exchange { get; set; } = new RiskLimitValueModel();
/// <summary>
/// 汇总
/// </summary>
public RiskLimitValueModel Summary
{
get =>
new RiskLimitValueModel()
{
AuxiliaryValue = Option.AuxiliaryValue + Exchange.AuxiliaryValue,
BaseValue = Option.BaseValue + Exchange.BaseValue
};
}
/// <summary>
/// 差异值
/// </summary>
public double DiffValue { get { return Math.Abs(Summary.BaseValue - Summary.AuxiliaryValue); } }
}
public class RiskLimitValueModel
{
/// <summary>
/// 光子波动率计算
/// </summary>
public double BaseValue { get; set; }
/// <summary>
/// 光证波动率计算
/// </summary>
public double AuxiliaryValue { get; set; }
}
/// <summary>
/// 场外期权盈亏概况
/// </summary>
public class RiskLimitOptionPnlSummary
{
/// <summary>
/// 场内期权已完结盈亏
/// </summary>
public double ExchangeEndPnl { get; set; }
/// <summary>
/// 场外期权已完结盈亏
/// </summary>
public double OptionEndPnl { get; set; }
/// <summary>
/// 已完结盈亏
/// </summary>
public double EndPnl { get => ExchangeEndPnl + OptionEndPnl; }
/// <summary>
/// 持仓盈亏
/// </summary>
public RiskLimitOptionModel Position { get; set; } = new RiskLimitOptionModel();
/// <summary>
/// 总盈亏
/// </summary>
public RiskLimitOptionModel Total { get; set; } = new RiskLimitOptionModel();
}
/// <summary>
/// 合计概况
/// </summary>
public class RiskLimitSummary
{
/// <summary>
/// 已完结盈亏
/// </summary>
public double EndPnl { get; set; }
/// <summary>
/// 持仓盈利
/// </summary>
public RiskLimitValueModel Option { get; set; } = new RiskLimitValueModel();
/// <summary>
/// 总盈亏
/// </summary>
public RiskLimitValueModel Total { get; set; } = new RiskLimitValueModel();
}
/// <summary>
/// 期货盈亏概况
/// </summary>
public class RiskLimitFuturePnlSummary
{
/// <summary>
/// 已完结盈亏
/// </summary>
public double EndPnl { get; set; }
/// <summary>
/// 持仓盈亏
/// </summary>
public double Pnl { get; set; }
/// <summary>
/// 总盈亏
/// </summary>
public double TotalPnl { get; set; }
}
/// <summary>
/// 盈亏概况
/// </summary>
public class RiskLimitPnlSummary
{
/// <summary>
/// 限额
/// </summary>
public double LimitValue { get; set; }
/// <summary>
/// 期权盈亏概况
/// </summary>
public RiskLimitOptionPnlSummary Option { get; set; } = new RiskLimitOptionPnlSummary();
/// <summary>
/// 期货盈亏概况
/// </summary>
public RiskLimitFuturePnlSummary Future { get; set; } = new RiskLimitFuturePnlSummary();
/// <summary>
/// 合计
/// </summary>
public RiskLimitSummary Summary { get; set; } = new RiskLimitSummary();
public void SetSummary()
{
this.Summary.EndPnl = this.Option.EndPnl + this.Future.EndPnl;
this.Summary.Option.BaseValue = this.Option.Position.Summary.BaseValue + this.Future.Pnl;
this.Summary.Option.AuxiliaryValue = this.Option.Position.Summary.AuxiliaryValue + this.Future.Pnl;
this.Summary.Total.BaseValue = this.Option.Total.Summary.BaseValue + this.Future.TotalPnl;
this.Summary.Total.AuxiliaryValue = this.Option.Total.Summary.AuxiliaryValue + this.Future.TotalPnl;
}
}
/// <summary>
/// 希腊值概况
/// </summary>
public class RiskLimitGreeksValueSummary : RiskLimitValueModel
{
/// <summary>
/// 限额
/// </summary>
public double LimitValue { get; set; }
public RiskLimitOptionModel Option { get; set; } = new RiskLimitOptionModel();
public double FutureValue { get; set; }
public RiskLimitValueModel Summary
{
get => new RiskLimitValueModel
{
BaseValue = Option.Summary.BaseValue + FutureValue,
AuxiliaryValue = Option.Summary.AuxiliaryValue + FutureValue
};
}
}
/// <summary>
/// 风险日报表
/// </summary>
public class RiskLimitDailySummary
{
/// <summary>
/// 期货预付金占用
/// </summary>
public double HoldingDeposit { get; set; }
/// <summary>
/// 期货客户权益
/// </summary>
public double Amount { get; set; }
/// <summary>
/// 期货风险度
/// </summary>
public double Risk { get; set; }
/// <summary>
/// 期权名义本金
/// </summary>
public double StockEqvNotional { get => OptionStockEqvNotional + ExchangeStockEqvNotional; }
/// <summary>
/// 场外期权名义本金
/// </summary>
public double OptionStockEqvNotional { get; set; }
/// <summary>
/// 场内期权名义本金
/// </summary>
public double ExchangeStockEqvNotional { get; set; }
/// <summary>
/// 持仓市值
/// </summary>
public RiskLimitOptionModel PositionValue { get; set; } = new RiskLimitOptionModel();
/// <summary>
/// 年盈亏概况
/// </summary>
public RiskLimitPnlSummary YearPnl { get; set; } = new RiskLimitPnlSummary();
/// <summary>
/// 日盈亏
/// </summary>
public RiskLimitPnlSummary DailyPnl { get; set; } = new RiskLimitPnlSummary();
/// <summary>
/// DeltaCash
/// </summary>
public RiskLimitGreeksValueSummary DeltaCashLimit { get; set; } = new RiskLimitGreeksValueSummary();
/// <summary>
/// GammaCash
/// </summary>
public RiskLimitGreeksValueSummary GammaCashLimit { get; set; } = new RiskLimitGreeksValueSummary();
}
#endregion
}