65 lines
2.3 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|