79 lines
3.0 KiB
C#
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.润和;
|
|
}
|
|
}
|
|
}
|