#EQD-6669 国联民生-期权希腊值计算步长和细节调整(定价引擎部分)

This commit is contained in:
yexuzhong
2026-07-31 10:35:25 +08:00
parent ca74095e0c
commit 5d580960d8
17 changed files with 236 additions and 63 deletions
@@ -1,4 +1,4 @@
using System.Linq;
using System.Linq;
using System.Linq.Dynamic.Core;
using YLErp.Modules.DataProviderModule;
@@ -48,7 +48,7 @@ namespace YLErp.Modules.EodModule.SettlementModule
if (request.IsSettleOtcTrades)
{
var tradePredicate = _context.PredicateBuilder.GetOtcTradePredicate()
.And(t => t.TradeType != "自定义交易" && t.TradeType != "收益互换" && t.UnderlyingCode != null);
.And(t => t.TradeType != "自定义交易" && t.UnderlyingCode != null);
//新增客户筛选 tw
if (clienIds != null)
@@ -58,6 +58,11 @@ namespace YLErp.Modules.EodModule.SettlementModule
allQuery = DbContext.trade.Where(tradePredicate).Select(n => n.UnderlyingCode).Distinct();
if (PS.Config.ErpElement.ForwardTradePriceModel == Configuration.Enums.ForwardTradePriceModel.STANDARD)
{
allQuery = allQuery.Union(DbContext.trade.Where(tradePredicate).Where(x => x.BasisUnderlyingCode != null && x.BasisUnderlyingCode != "").Select(n => n.BasisUnderlyingCode).Distinct());
}
var clientProductPredicate = _context.PredicateBuilder.GetClientProductPredicate();
//新增客户筛选 tw
@@ -74,26 +79,28 @@ namespace YLErp.Modules.EodModule.SettlementModule
}
//检查场内标的
//if (request.IsSettleExchangeTrades)
//{
// var exTradePredicate = _context.PredicateBuilder.GetExchangeTradePredicate();
if (request.IsSettleExchangeTrades)
{
var exTradePredicate = _context.PredicateBuilder.GetExchangeTradePredicate();
// var exTradeQuery = DbContext.ExchangeTrade.Where(exTradePredicate).Select(n => n.UnderlyingCode);
var exTradeQuery = DbContext.ExchangeTrade.Where(exTradePredicate).Select(n => n.UnderlyingCode);
// allQuery = allQuery == null ? exTradeQuery.Distinct() : allQuery.Union(exTradeQuery.Distinct());
allQuery = allQuery == null ? exTradeQuery.Distinct() : allQuery.Union(exTradeQuery.Distinct());
// var preSettleDate = _context.PreSettleDate;
// //最后一个交易日持仓信息
// var futureTypes = ConsGlobal.InstrumentType.GetFutureTypes();
// var positionQuery = from t in DbContext.eod_trade_position
// join um in DbContext.underlying_manager on t.UnderlyingCode equals um.UnderlyingCode
// where t.ValueDate == preSettleDate && t.Amount != 0
// && ConsTrade.TradeTypesForHedge.Contains(t.TradeType)
// && (!futureTypes.Contains(um.UnderlyingInstrumentType) || um.MaturityDate >= settleDate)
// select t.UnderlyingCode;
var preSettleDate = _context.PreSettleDate;
//最后一个交易日持仓信息
var futureTypes = ConsGlobal.InstrumentType.GetFutureTypes();
var positionQuery = from t in DbContext.eod_trade_position
join um in DbContext.underlying_manager on t.UnderlyingCode equals um.UnderlyingCode
where t.ValueDate == preSettleDate && t.Amount != 0
&& ConsTrade.TradeTypesForHedge.Contains(t.TradeType)
&& (!futureTypes.Contains(um.UnderlyingInstrumentType) || um.MaturityDate >= settleDate)
select t.UnderlyingCode;
// allQuery = allQuery.Union(positionQuery.Distinct());
//}
allQuery = allQuery.Union(positionQuery.Distinct());
}
if (allQuery == null)
{
@@ -103,12 +110,10 @@ namespace YLErp.Modules.EodModule.SettlementModule
//检查是否所有标的都在结算日有结算价格
var umCodeArr = allQuery.ToArray();
var swapUmCodeArr = GetSwapUnderlyingCodes();
var codeArr = umCodeArr.Union(swapUmCodeArr);
var eodPriceProvider = _context.GetEodPriceProvider().Initialize(codeArr);
// var preEodPriceProvidaer = _context.GetPreEodPriceProvider().Initialize(swapUmCodeArr);
var umCodes = codeArr.Where(n => !string.IsNullOrEmpty(n) && !eodPriceProvider.HasValue(n)).ToHashSet(StringComparer.OrdinalIgnoreCase);
//var swapUmCodes= swapUmCodeArr.Where(n => !string.IsNullOrEmpty(n) && !preEodPriceProvidaer.HasValue(n)).ToHashSet(StringComparer.OrdinalIgnoreCase);
var eodPriceProvider = _context.GetEodPriceProvider().Initialize(umCodeArr);
var umCodes = umCodeArr.Where(n => !string.IsNullOrEmpty(n) && !eodPriceProvider.HasValue(n)).ToHashSet(StringComparer.OrdinalIgnoreCase);
//排除掉节假日不需要结算的交易
foreach (var t in _context.HolidayTrades)
{