Files
zszq-trs/Framework/YLErp.Core/DBModels/OtcOptionTradeFull.cs
T
2024-05-09 14:06:26 +08:00

790 lines
22 KiB
C#

using Newtonsoft.Json;
using YLErp.Models.Tag;
namespace YLErp.DBModels
{
/// <summary>
/// 包含所有期权交易要素的Model
/// 属性字段的转换在前端处理或者使用方法
/// </summary>
public class OtcOptionTradeFull : OtcTradeDto
{
/// <summary>
/// 定价计算时的映射数据
/// </summary>
public double? TTMDays { get; set; }
/// <summary>
/// 是否为系统自动的TTM
/// </summary>
public bool IsTTMSystem { get; set; }
/// <summary>
/// 目前东证专有 “Weekdays”——工作日,“Trading Days”——交易日, “Public Holidays”——公共假日
/// </summary>
public int? Weekdays { get; set; }
public int? TradingDays { get; set; }
public int? PublicHolidays { get; set; }
/// <summary>
/// 计算ID(用于定价计算V2)
/// </summary>
public string CalcId { get; set; }
/// <summary>
/// 定价日期
/// </summary>
public DateTime? ValueDate { get; set; }
/// <summary>
/// 定价模型名称
/// </summary>
public string EngineName { get; set; } = "";
/// <summary>
/// 交易对手方编号
/// </summary>
public string ClientNumber { get; set; }
#region----跨期权字段---
/// <summary>
/// 观察方式(障碍期权(Discrete)+双鲨期权(Discrete)+二元期权)
/// </summary>
public string MonitorType { get; set; }
/// <summary>
/// 障碍价格(障碍期权BarrierPrice+气囊结构Barrier+双鲨期权低障碍价格)
/// </summary>
public double BarrierLow { get; set; }
/// <summary>
/// 高障碍价格(障碍期权UpperBarrierPrice+双鲨期权)
/// </summary>
public double? BarrierHigh { get; set; }
#endregion
#region---障碍期权---
//Discrete映射自MonitorType
/// <summary>
/// 障碍类型(障碍期权)
/// </summary>
public string BarrierType { get; set; }
/// <summary>
/// 障碍价格(障碍期权)(BarrierLow)
/// </summary>
[JsonIgnore]
public double? BarrierPrice => BarrierLow;
/// <summary>
/// 高障碍价格(障碍期权)(BarrierHigh)
/// </summary>
[JsonIgnore]
public double? UpperBarrierPrice => BarrierHigh;
/// <summary>
/// 障碍偏移(障碍期权)
/// </summary>
public double? BarrierShift { get; set; }
/// <summary>
/// 补偿按敲出日年化
/// </summary>
public bool RebateAnnualizedAtKO { get; set; }
/// <summary>
/// 补偿计息规则
/// </summary>
public string RebateDayCount { get; set; }
#endregion
#region----障碍期权+双鲨期权----
/// <summary>
/// 补偿支付(障碍期权+双鲨期权)
/// </summary>
public string RebateType { get; set; }
/// <summary>
/// 补偿金额(障碍期权+双鲨期权)
/// </summary>
public double? Rebate { get; set; }
/// <summary>
/// 补偿金额(障碍期权+双鲨期权)
/// </summary>
public double? RebateRate { get; set; }
#endregion
#region----双鲨期权----
/// <summary>
/// 高行权价(双鲨期权)
/// </summary>
public double? StrikeHigh { get; set; }
/// <summary>
/// 高障碍补偿金额(双鲨期权)
/// </summary>
public double? RebateHigh { get; set; }
/// <summary>
/// 高障碍补偿金额(双鲨期权)
/// </summary>
public double? RebateHighRate { get; set; }
/// <summary>
/// 高参与率
/// </summary>
public double? CallParticipationRate { get; set; }
/// <summary>
/// 低参与率
/// </summary>
public double? PutParticipationRate { get; set; }
#endregion
#region----二元期权+亚式期权+累计期权----
/// <summary>
/// (二元期权)二元类型(亚式期权)均价计算
/// (累计期权)上端收益类型(浮动/固定(票息))
/// </summary>
public string PayoffType { get; set; }
#endregion
#region----二元期权----
//MonitorType + RebateType
/// <summary>
/// 高障碍价格(二元期权)(统一BarrierHigh)
/// </summary>
[JsonIgnore]
public double? UpperBarrier => BarrierHigh;
/// <summary>
/// 补偿金额(二元期权)
/// </summary>
public double? CashOrNothingAmount { get; set; }
/// <summary>
/// 高障碍补偿金额(二元期权)
/// </summary>
public double? CashOrNothingAmountHigh { get; set; }
/// <summary>
/// 补偿金额(二元期权)
/// </summary>
public double? CashOrNothingAmountRate { get; set; }
/// <summary>
/// 高障碍补偿金额(二元期权)
/// </summary>
public double? CashOrNothingAmountHighRate { get; set; }
#endregion
#region----亚式期权----
/// <summary>
/// (亚式期权)行权价类型
/// </summary>
public string StrikeType { get; set; }
/// <summary>
/// (亚式期权)结算类型
/// </summary>
public string SettleMode { get; set; }
/// <summary>
/// (亚式期权)杠杆率
/// (累购累沽)(国君)杠杆倍数,(其他)看涨/看跌乘数
/// </summary>
public double? StrikeGearingFactor { get; set; } = 1.0;
/// <summary>
/// (亚式期权)均价起算日
/// </summary>
public DateTime? AveragingPeriodStartDate { get; set; }
/// <summary>
/// (亚式期权)增强价格
/// </summary>
public double EnhancedPrice { get; set; }
#endregion
#region----区间累积期权----
/// <summary>
/// 区间下限(区间累积期权)
/// </summary>
public double LowerRange { get; set; }
/// <summary>
/// 区间上限(区间累积期权)
/// </summary>
public double UpperRange { get; set; }
/// <summary>
/// 区间收益率(区间累积期权)
/// </summary>
public double BonusRate { get; set; }
#endregion
#region----凤凰期权+雪球期权----
/// <summary>
/// 票息日历规则
/// </summary>
public string CouponDayCount { get; set; }
/// <summary>
/// (凤凰期权+雪球期权)敲出价格
/// </summary>
public double? KOBarrier { get; set; }
/// <summary>
///(凤凰期权+雪球期权)期权敲入价格
/// </summary>
public double KIBarrier { get; set; }
/// <summary>
/// 敲入期权行权价1(凤凰期权+雪球期权SpreadStrikeAtMaturity)
/// </summary>
public double? SpreadStrike1 { get; set; }
/// <summary>
/// 敲入期权行权价2(凤凰期权+雪球期权SpreadStrikeAtMaturity)
/// </summary>
public double? SpreadStrike { get; set; }
/// <summary>
/// (凤凰期权:票息)+(雪球期权:红利票息)
/// </summary>
public double Coupon { get; set; }
/// <summary>
/// (凤凰期权+雪球期权)票息是否年化(false:是,true:否)
/// </summary>
public bool IsFixedCoupon { get; set; }
/// <summary>
/// (凤凰期权+雪球期权)敲入到期支付类别
/// </summary>
public KIPayoffTypeEnum KIPayoffType { get; set; }
/// <summary>
/// (凤凰期权+雪球期权)是否为期权年化,默认false
/// </summary>
public bool IsAnnualized2 { get; set; }
/// <summary>
/// (凤凰期权+雪球期权)年化系数
/// </summary>
public double? AnnualizeFactor2 { get; set; }
/// <summary>
/// (凤凰期权+雪球期权)是否首日计息
/// </summary>
public bool? CouponIncludeStartDate { get; set; }
/// <summary>
/// (凤凰期权+雪球期权)是否使用支付日期计息
/// </summary>
public bool? CouponUsePaymentDate { get; set; }
#endregion
#region----凤凰期权----
/// <summary>
/// (凤凰期权)派息障碍价格
/// </summary>
public double CouponBarrier { get; set; }
/// <summary>
/// (凤凰期权)票息结算方式 -- 现金流交易,
/// </summary>
public CouponPayTypeEnum CouponPayType { get; set; }
/// <summary>
/// (凤凰期权)敲入未敲出仍支付票息
/// </summary>
public bool IncludeCouponAfterKI { get; set; }
#endregion
#region----雪球期权----
/// <summary>
/// (雪球期权)敲出赔付类别
/// </summary>
public KOPayoffTypeEnum KOPayoffType { get; set; }
/// <summary>
/// (雪球期权)年化期权费率
/// </summary>
public double? AnnualizedPremiumRate { get; set; }
/// <summary>
/// (雪球期权)票息
/// </summary>
public double KORebate { get; set; }
/// <summary>
/// (雪球期权)敲出支付方式
/// </summary>
public RebateTypeEnum KORebateType { get; set; }
/// <summary>
/// (雪球期权)敲出期权行权价1
/// </summary>
public double? SpreadStrikeAtKO1 { get; set; }
/// <summary>
/// (雪球期权)敲出期权行权价2
/// </summary>
public double? SpreadStrikeAtKO { get; set; }
/// <summary>
/// (雪球期权)[SpreadStrike]敲入期权行权价2
/// </summary>
[JsonIgnore]
public double? SpreadStrikeAtMaturity => SpreadStrike;
/// <summary>
/// (雪球期权)[SpreadStrike]敲入期权行权价1
/// </summary>
[JsonIgnore]
public double? SpreadStrikeAtMaturity1 => SpreadStrike1;
/// <summary>
/// 初始预付金率
/// </summary>
public double? InitialAdvance { get; set; }
/// <summary>
/// 期间预付金率
/// </summary>
public double? PeriodAdvance { get; set; }
/// <summary>
/// 前端收益费率
/// </summary>
public double? FontEarning { get; set; }
/// <summary>
/// 追保线
/// </summary>
public double? ConfirmedLine { get; set; }
/// <summary>
/// 追保比例下限
/// </summary>
public double? ConfirmedFloor { get; set; }
/// <summary>
/// 是否初始敲入
/// </summary>
public bool IsInitialKnockedIn { get; set; }
//SpreadStrikeAtMaturity映射自SpreadStrike
//SpreadStrikeAtMaturity1映射自SpreadStrike1
#endregion
#region----专业雪球期权----
/// <summary>
/// 预付金是否参与定价
/// </summary>
public bool PrepaymentUsed { get; set; }
/// <summary>
/// 预付金比例
/// </summary>
public double? PrepaymentRatio { get; set; }
/// <summary>
/// 预付金返息率
/// </summary>
public double? PrepaymentInterestRate { get; set; }
/// <summary>
/// 预付金折现率
/// </summary>
public double? PrepaymentConvertCashRate { get; set; }
/// <summary>
/// 终日是否计息
/// </summary>
public bool CouponIncludeEndDate { get; set; }
/// <summary>
/// 增强参与率
/// </summary>
public double EnhancedParticipationRate { get; set; }
///// <summary>
///// 敲入参与率
///// </summary>
//public double KiParticipationRate { get; set; }
/// <summary>
/// 保本比率
/// </summary>
public double PrincipalProtectionRate { get; set; }
/// <summary>
/// 敲入观察设置,0:手动,1:每日观察,2:仅到期日观察
/// </summary>
public KIObservationType KIObservationType { get; set; } = KIObservationType.EveryDay;
#endregion
#region----气囊结构----
/// <summary>
/// 障碍价格(气囊结构)(BarrierLow)
/// </summary>
[JsonIgnore]
public double Barrier => BarrierLow;
/// <summary>
/// 敲入后参与率(气囊结构)
/// </summary>
public double KIParticipationRate { get; set; }
/// <summary>
/// 收益封顶价(气囊结构)
/// </summary>
public double? HighStrike { get; set; }
/// <summary>
/// 是否收益封顶(气囊结构)
/// </summary>
public bool HasPayoffLimit { get; set; }
/// <summary>
/// 是否离散观察(气囊结构)
/// </summary>
public bool IsDiscreteMonitored { get; set; }
public double? NotKIParticipationRate { get; set; }
#endregion
#region---收益增强结构----
/// <summary>
/// 年化增强利率(收益增强结构)
/// </summary>
public double? AnnualizedEnhanceRate { get; set; }
#endregion
#region----现金流交易----
public double ProfitRate { get; set; }
public CashFlowRateTypeEnum RateType { get; set; }
public CashflowDepositTypeEnum DepositType { get; set; }
/// <summary>
/// 预付比例
/// </summary>
public double PrepayRatio { get; set; }
#endregion
#region----累计期权----
/// <summary>
/// 看涨乘数
/// </summary>
public double CallMultiplier { get; set; } = 1;
/// <summary>
/// 看跌乘数
/// </summary>
public double PutMultiplier { get; set; } = 1;
/// <summary>
/// 累计三段式 乘数1
/// </summary>
public double Multiplier { get; set; } = 1;
/// <summary>
/// 累计三段式 乘数2
/// </summary>
public double Multiplier2 { get; set; } = 1;
/// <summary>
/// 累计三段式 乘数3
/// </summary>
public double Multiplier3 { get; set; } = 1;
/// <summary>
/// 结算方式(现金当日/现金期末/实物交割)
/// </summary>
public string SettlementMode { get; set; }
/// <summary>
/// 累计三段式 结算方式2
/// </summary>
public string SettlementMode2 { get; set; }
/// <summary>
/// 累计三段式 结算方式3
/// </summary>
public string SettlementMode3 { get; set; }
/// <summary>
/// 敲出是否终止
/// </summary>
public bool EarlyTerminate { get; set; }
/// <summary>
/// 票息是否百分比格式
/// </summary>
public bool CouponPercent { get; set; } = true;
/// <summary>
/// 累计类型(子弹))
/// </summary>
public string AccumuType { get; set; }
/// <summary>
/// 累计类型
/// <para>标准</para>
/// <para>三段式</para>
/// </summary>
public AccumulatorStructureTypeEnum AccumulatorStructureType { get; set; }
/// <summary>
/// 沽购数量
/// </summary>
public double AccumuTradeAmount { get; set; } = 1.0;
public double OriginalAccumuTradeAmount { get; set; } = 1.0;
/// <summary>
/// 远期到期日类型
/// <para>标的到期日</para>
/// <para>期权到期日</para>
/// <para>标的交割月前一交易日</para>
/// </summary>
public string ForwardDateType { get; set; }
/// <summary>
/// 累计三段式 远期到期日类型2
/// </summary>
public string ForwardDateType2 { get; set; }
/// <summary>
/// 累计三段式 远期到期日类型3
/// </summary>
public string ForwardDateType3 { get; set; }
/// <summary>
/// 远期期初价类型
/// <para>期权期初价格</para>
/// <para>期权行权价格</para>
/// </summary>
public string ForwardPriceType { get; set; }
/// <summary>
/// 累计三段式 远期期初价类型2
/// </summary>
public string ForwardPriceType2 { get; set; }
/// <summary>
/// 累计三段式 远期期初价类型3
/// </summary>
public string ForwardPriceType3 { get; set; }
/// <summary>
/// 累计三段式 票息2
/// </summary>
public double Coupon2 { get; set; }
#endregion
#region----自定义观察日----
/// <summary>
/// 敲入观察日列表,一个或多个日期字符串,日期之间以逗号分隔
/// 例如:2019-07-16,2019-08-16
/// </summary>
public string ObservationDates { get; set; }
/// <summary>
/// 敲出观察日
/// </summary>
public string KOObservationDates { get; set; }
/// <summary>
/// 票息支付日期
/// </summary>
public string KOObservationSettleDates { get; set; }
#endregion
#region---Risky期权---
/// <summary>
/// 执行价格1
/// </summary>
public double? Strike1 { get; set; }
/// <summary>
/// 执行价格2
/// </summary>
public double? Strike2 { get; set; }
/// <summary>
/// 执行价格3
/// </summary>
public double? Strike3 { get; set; }
/// <summary>
/// 参与率1
/// </summary>
public double? ParticipationRate1 { get; set; }
/// <summary>
/// 参与率2
/// </summary>
public double? ParticipationRate2 { get; set; }
/// <summary>
/// 参与率3
/// </summary>
public double? ParticipationRate3 { get; set; }
#endregion
/// <summary>
/// 敲入敲出状态
/// </summary>
public string KnockInOutStatus { get; set; }
/// <summary>
/// 敲入敲出日期
/// </summary>
public DateTime? KnockInOutDate { get; set; }
public OtcOptionTradeFull Clone()
{
return (OtcOptionTradeFull)MemberwiseClone();
}
/// <summary>
/// 检查并尽可能修复此对象的数据
/// </summary>
public void CheckAndRepairValues()
{
//交易日期
if (!TradeDate.HasValue || TradeDate.Value == default)
{
TradeDate = StartDate.HasValue && StartDate.Value != default
? StartDate : throw new ServiceException("缺少交易日期");
}
else if (!StartDate.HasValue || StartDate.Value == default)
{
StartDate = TradeDate;
}
//交易方向
switch (BuySell?.ToLowerInvariant())
{
case "买入":
case "卖出": break;
case "buy": BuySell = "买入"; break;
case "sell": BuySell = "卖出"; break;
default:
if (string.IsNullOrWhiteSpace(BuySell))
{
BuySell = "买入";
}
else
{
throw new ServiceException("交易方向不支持:" + BuySell);
}
break;
}
//看涨看跌
switch (OptionType?.ToLowerInvariant())
{
case "看涨":
case "看跌": break;
case "call": OptionType = "看涨"; break;
case "put": OptionType = "看跌"; break;
default:
if (string.IsNullOrWhiteSpace(OptionType))
{
OptionType = "看涨";
}
else
{
throw new ServiceException("看涨看跌不支持:" + OptionType);
}
break;
}
//行权方式
switch (ExerciseMode?.ToLowerInvariant())
{
case "european":
case "american": break;
case "欧式": ExerciseMode = "European"; break;
case "美式": ExerciseMode = "American"; break;
default:
if (string.IsNullOrWhiteSpace(ExerciseMode))
{
ExerciseMode = "European";
}
else
{
throw new ServiceException("行权方式不支持:" + ExerciseMode);
}
break;
}
//亚式期权特定处理
if (TradeType == "亚式期权")
{
if (AveragingPeriodStartDate != null && AveragingPeriodStartDate.Value == default)
{
AveragingPeriodStartDate = null;
}
if (string.IsNullOrEmpty(PayoffType))
{
PayoffType = "ArithmeticAverage"; //算术平均
}
if (PayoffType == "EnhancedArithmeticAverage" && string.IsNullOrWhiteSpace(SettleMode))
{
SettleMode = "AtHit";
}
if (string.IsNullOrEmpty(StrikeType))
{
StrikeType = "Fixed"; //固定行权价
}
}
else if (TradeType == "二元期权")
{
if (string.IsNullOrEmpty(MonitorType))
{
MonitorType = "离散";
}
}
}
/// <summary>
/// 交易标签
/// </summary>
public List<TagDto> Tags { get; set; }
}
}