using Qdp.Pricing.Library.Common.MathMethods.VolTermStructure; namespace YLErp.QdpModule { /// /// 光大光子的SkewMap模式的波动率曲面的初始化类 /// public class SkewMapVolSurfaceInitializer : IVolSurfaceInitializer { public void InitializeMarketProxy(VolSurfaceInitParams initParams) { var marketProxy = QdpMarketManager.Instance.GetPrebuiltMarketProxy(initParams.userId); InitializeMarketProxy(marketProxy, initParams); } public void InitializeMarketProxy(IQdpMarketProxy marketProxy, VolSurfaceInitParams initParams) { if (string.IsNullOrWhiteSpace(initParams.valueDate)) { throw new ArgumentException("缺少valueDate", nameof(initParams.valueDate)); } marketProxy.CreateMarket(initParams.valueDate); Dictionary baseVols = null; try { baseVols = initParams.vols.ToDictionary(x => x.Expire, x => x.Vol * (1.0 + initParams.addVolRate)); } catch (Exception ex) { throw new Exception($"{initParams.UnderlyingCode}的BaseVol格式不正确", ex); } if (baseVols == null) { throw new Exception($"{initParams.UnderlyingCode}的BaseVol为空"); } if (!baseVols.ContainsKey("BidVar") || !baseVols.ContainsKey("AskVar")) { throw new Exception($"{initParams.UnderlyingCode}的BidVar或AskVar缺失"); } var baseVolSurface = new SkewMapBaseVolSurface { BaseVol = baseVols, BidVar = baseVols["BidVar"], AskVar = baseVols["AskVar"] }; var surfaceType = (initParams.volSurfaceMode != null && initParams.volSurfaceMode == "MoneynessVol") ? "MoneynessVol" : "StrikeVol"; var volSurfaceName = initParams.volSurfaceNameKey; if (string.IsNullOrWhiteSpace(volSurfaceName)) { volSurfaceName = initParams.UnderlyingCode; } marketProxy.SaveSkewMapBaseVolSurface( initParams.valueDate, volSurfaceName, baseVolSurface); } } }