Files
2024-05-09 14:06:26 +08:00

79 lines
3.0 KiB
C#

using YLErp.Models;
namespace YLErp.Modules.TradeRiskCalcModule
{
static class TradeRiskHelper
{
/// <summary>
/// 计算每笔期权的盈亏
/// </summary>
public static void CalculateOptionTradePnlWithHedge(IEnumerable<TradingRiskParameter> list)
{
//计算每个标的期权的Delta总值
var optionDeltaTotalDict = new Dictionary<string, double>();
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<string, double>();
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<string, double>();
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;
}
}
}
}
/// <summary>
/// 是否计算T+1日Delta
/// </summary>
public static bool IsCalcDeltaT1()
{
//光子在15点以后计算T+1日Delta
return PS.Config.Company == Configuration.CompanyEnum.光大光子 || PS.Config.Company == Configuration.CompanyEnum.润和;
}
}
}