using Qdp.Foundation.Implementations; using Qdp.Pricing.Base.Enums; using Qdp.Pricing.Base.Implementations; using Qdp.Pricing.Library.Equity.Engines.Analytical; using YLErp.BLL; using YLErp.Modules.VolatilityModule; namespace YLErp.Modules.ExcelAddinModule { /// /// /// public static class ExcelVolatilityService { /// /// /// public static double? GetUnderlyingVol(YLContext db, string optionCode, DateTime valueDate, string userGroup = null) { if (PS.Config.Is光大光子) { return null; } var exUm = DataCacheProvider.GetExchangeListOptionDataSource().GetData(optionCode); if (exUm == null) { return null; } var um = DataCacheProvider.GetUnderlyingDataSource().GetData(exUm.UnderlyingCode); if (um == null) { return null; } var price = um.Price ?? 0; if (valuedateBLL.SystemDate.ValueDate > valueDate) { if (ConsGlobal.InstrumentType.IsStock(um.UnderlyingInstrumentType)) { price = (db.eod_stock_price.Where(O => O.ValueDate <= valueDate && O.UnderlyingCode == um.UnderlyingCode) .OrderByDescending(n => n.ValueDate).Select(n => (double?)n.ClosePrice).FirstOrDefault()) ?? 0; } else { price = (db.eod_commodity_future_price.Where(O => O.ValueDate <= valueDate && O.UnderlyingCode == um.UnderlyingCode) .OrderByDescending(n => n.ValueDate).Select(n => (double?)n.ClosePrice).FirstOrDefault()) ?? 0; } } var req = new SingleVolReq { VolType = "交易", Strike = exUm.Strike, SpotPrice = price, TradeDate = valueDate, ExerciseDate = exUm.MaturityDate, IsMoneynessOption = "否", //req.CallPut = trade.CallPut; UnderlyingId = exUm.id, UnderlyingCode = exUm.UnderlyingCode, UnderlyingName = um.UnderlyingName, UnderlyingTypeId = um.UnderlyingTypeId, UserGroup = userGroup }; var vol = SingleVolService.GetSingleVol(req, 0); return vol; } /// /// /// public static HandleResult>> GetTradeVol(DateTime date, List tradeNumbers) { var result = new Dictionary>(); using (var context = new YLContext()) { var trades = context.trade.Where(O => tradeNumbers.Contains(O.TradeNumber)).ToList(); if (trades == null || trades.Count == 0) { return new HandleResult>>("交易代码不存在"); } for (var i = 0; i < trades.Count; i++) { if (!result.ContainsKey(trades[i].TradeNumber)) { result.Add(trades[i].TradeNumber, new Dictionary()); } result[trades[i].TradeNumber]["TradeOpenVolatility"] = trades[i].TradeOpenVolatility; result[trades[i].TradeNumber]["TradeCloseVolatility"] = trades[i].TradeCloseVolatility; result[trades[i].TradeNumber]["NumOfSmoothingDays"] = trades[i].NumOfSmoothingDays; if (trades[i].StartDate > date) { result[trades[i].TradeNumber]["TradeVol"] = null; } else { result[trades[i].TradeNumber]["TradeVol"] = AnalyticalOptionTradeVolInterp.tradeVolLinearInterp( new Date(date), trades[i].TradeOpenVolatility.GetValueOrDefault(), trades[i].TradeCloseVolatility.GetValueOrDefault(), new Date(trades[i].StartDate.GetValueOrDefault()), new Date(trades[i].ExerciseDate.GetValueOrDefault()), trades[i].NumOfSmoothingDays.GetValueOrDefault(), DayCountMode.TradingDay, CalendarImpl.Get("chn") ); } } } return new HandleResult>>(result); } } }