Files
zszq-trs/YLErpDAL/QdpModule/Vol/SkewMapVolSurfaceInitializer.cs
T
2024-05-09 14:06:26 +08:00

65 lines
2.3 KiB
C#

using Qdp.Pricing.Library.Common.MathMethods.VolTermStructure;
namespace YLErp.QdpModule
{
/// <summary>
/// 光大光子的SkewMap模式的波动率曲面的初始化类
/// </summary>
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<string, double> 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);
}
}
}