using YLErp.Models; namespace YLErp.Modules.TradeRiskCalcModule { static class TradeRiskHelper { /// /// 计算每笔期权的盈亏 /// public static void CalculateOptionTradePnlWithHedge(IEnumerable list) { //计算每个标的期权的Delta总值 var optionDeltaTotalDict = new Dictionary(); var optionList = list.Where(x => x.IsOption).ToArray(); foreach (var option in optionList) { if (!string.IsNullOrEmpty(option.UnderlyingCode)) { if (optionDeltaTotalDict.ContainsKey(option.UnderlyingCode)) { optionDeltaTotalDict[option.UnderlyingCode] += option.Delta; } else { optionDeltaTotalDict[option.UnderlyingCode] = option.Delta; } } } //计算每个标的对冲交易的总盈亏汇总 var hedgeTradeTotalPnlDict = new Dictionary(); var hedgeTradeList = list.Where(x => !x.IsOption).ToArray(); foreach (var trade in hedgeTradeList) { if (hedgeTradeTotalPnlDict.ContainsKey(trade.UnderlyingCode)) { hedgeTradeTotalPnlDict[trade.UnderlyingCode] += trade.TotalPnl; } else { hedgeTradeTotalPnlDict[trade.UnderlyingCode] = trade.TotalPnl; } } //计算每个标的期权交易单位Delta的对冲盈亏值 var hedgePnlPerDelta = new Dictionary(); foreach (var kv in optionDeltaTotalDict) { if (!hedgePnlPerDelta.ContainsKey(kv.Key) && kv.Value != 0 && hedgeTradeTotalPnlDict.ContainsKey(kv.Key)) { hedgePnlPerDelta[kv.Key] = hedgeTradeTotalPnlDict[kv.Key] / kv.Value; } } foreach (var item in list) { if (item.IsOption) { item.TotalPnlWithHedge = item.TotalPnl; if (!string.IsNullOrEmpty(item.UnderlyingCode) && hedgePnlPerDelta.ContainsKey(item.UnderlyingCode) && item.TradeType != "收益互换") { item.PnlWithHedge = hedgePnlPerDelta[item.UnderlyingCode] * item.Delta; item.TotalPnlWithHedge += hedgePnlPerDelta[item.UnderlyingCode] * item.Delta; } } } } /// /// 是否计算T+1日Delta /// public static bool IsCalcDeltaT1() { //光子在15点以后计算T+1日Delta return PS.Config.Company == Configuration.CompanyEnum.光大光子 || PS.Config.Company == Configuration.CompanyEnum.润和; } } }