Files
zszq-trs/UnitTestProject/Modules/RiskModule/RealtimeRiskTest.cs
2024-05-09 14:06:26 +08:00

2571 lines
167 KiB
C#

using Qdp.Pricing.Base.Enums;
using Qdp.Pricing.Base.Implementations;
using YLErp.BLL.Calculation;
using YLErp.BLL.Calculation.V2;
using YLErp.BLL.Calculation.V2.Parameter;
using YLErp.Enums;
using YLErp.Modules.CalculationModule;
using YLErp.Modules.ClientModule;
using YLErp.Modules.PricingModule;
using YLErp.Modules.TQuoteModule;
using YLErp.Modules.TradeRiskCalcModule;
using YLErp.Modules.TradeRiskCalcModule.TaskRunner;
using YLErp.Modules.VolatilityModule;
using YLErp.OldVersion;
using YLErp.QdpModule;
namespace YLErp.Modules.RiskModule
{
[TestClass]
public class RealtimeRiskTest
{
/// <summary>
/// 构造一些典型的交易数据,测试风险对冲2的计算逻辑
/// </summary>
[TestMethod]
public void RealtimeRiskStaticDataTest()
{
//等待数据初始化,等法见改进数据加载后可去掉
Thread.Sleep(3000);
Assert.AreEqual(2.5, valuedateBLL.RiskFreeRate, 1e-8, "无风险利率设置不正确");
Assert.AreEqual("Bus244", valuedateBLL.TradeDayCount, "TradeDayCount 设置不正确");
var now = DateTime.Now;
Assert.IsTrue(now.Hour >= 12 && now.Hour < 15, "运行的时间不正确,为保证计算结果可比较,请在12点到15点之间运行");
var volType = "对冲";
var valueDate = new DateTime(2019, 6, 17);
var lastSettleDate = new DateTime(2019, 6, 14);
var initializer = new DataInitializer
{
SpecialValueDate = valueDate
};
initializer.Init(out _);
var context = new TradeRiskCalcContext(volType, false, valueDate, lastSettleDate, initializer.DataProvider);
var tradeDataSource = initializer.TradeDataSource;
var calcService = new TradeRiskCalcService(context, null);
PS.ResetConfig("{\"ShowAccruedTotalPnL\":\"true\"}");
var results = calcService.Calculate(tradeDataSource, null);
#region RB 香草期权
var result = results.FirstOrDefault(x => x.TradeId == 1);
Assert.AreEqual(0.121, result.Vol, 1e-8, "trade 1 vol");
Assert.AreEqual(-8135.2970075410021, result.Pv, 1e-8, "trade 1 Pv");
Assert.AreEqual(-69.373394608192029, result.Delta, 1e-8, "trade 1 Delta");
Assert.AreEqual(-279227.91329797293, result.DeltaCash, 1e-8, "trade 1 DeltaCash");
Assert.AreEqual(-6.9373394608192029, result.DeltaInLots, 1e-8, "trade 1 DeltaInLots");
Assert.AreEqual(-0.34161641451646574, result.Gamma, 1e-8, "trade 1 Gamma");
Assert.AreEqual(-55343.994254258185, result.GammaCash, 1e-8, "trade 1 GammaCash");
Assert.AreEqual(-0.034161641451646574, result.GammaInLots, 1e-8, "trade 1 GammaInLots");
Assert.AreEqual(-530.60707905442541, result.Vega, 1e-8, "trade 1 Vega");
Assert.AreEqual(167.35648498901173, result.Theta, 1e-8, "trade 1 Theta");
Assert.AreEqual(6.44574499358896, result.Rho, 1e-8, "trade 1 Rho");
Assert.AreEqual(114.70299245899787, result.TotalPnl, 1e-8, "trade 1 TotalPnl");
Assert.AreEqual(1185.2296981627578, result.DailyPnl, 1e-8, "trade 1 DailyPnl");
result = results.FirstOrDefault(x => x.TradeId == 2);
Assert.AreEqual(0.122, result.Vol, 1e-8, "trade 2 vol");
Assert.AreEqual(4328.5847257567975, result.Pv, 1e-8, "trade 2 Pv");
Assert.AreEqual(-42.043990200818371, result.Delta, 1e-8, "trade 2 Delta");
Assert.AreEqual(-169227.06055829395, result.DeltaCash, 1e-8, "trade 2 DeltaCash");
Assert.AreEqual(-4.2043990200818371, result.DeltaInLots, 1e-8, "trade 2 DeltaInLots");
Assert.AreEqual(0.28242289772606455, result.Gamma, 1e-8, "trade 2 Gamma");
Assert.AreEqual(45754.274574733245, result.GammaCash, 1e-8, "trade 2 GammaCash");
Assert.AreEqual(0.028242289772606455, result.GammaInLots, 1e-8, "trade 2 GammaInLots");
Assert.AreEqual(442.29230318387636, result.Vega, 1e-8, "trade 2 Vega");
Assert.AreEqual(-140.9125090211528, result.Theta, 1e-8, "trade 2 Theta");
Assert.AreEqual(-3.4296170501875167, result.Rho, 1e-8, "trade 2 Rho");
Assert.AreEqual(-3861.4152742432025, result.TotalPnl, 1e-8, "trade 2 TotalPnl");
Assert.AreEqual(509.31366932939636, result.DailyPnl, 1e-8, "trade 2 DailyPnl");
result = results.FirstOrDefault(x => x.TradeId == 3);
Assert.AreEqual(0.123, result.Vol, 1e-8, "trade 3 vol");
Assert.AreEqual(6867.8725374983105, result.Pv, 1e-8, "trade 3 Pv");
Assert.AreEqual(57.706012582639232, result.Delta, 1e-8, "trade 3 Delta");
Assert.AreEqual(232266.70064512291, result.DeltaCash, 1e-8, "trade 3 DeltaCash");
Assert.AreEqual(5.7706012582639232, result.DeltaInLots, 1e-8, "trade 3 DeltaInLots");
Assert.AreEqual(0.28020042009302415, result.Gamma, 1e-8, "trade 3 Gamma");
Assert.AreEqual(45394.219307695494, result.GammaCash, 1e-8, "trade 3 GammaCash");
Assert.AreEqual(0.028020042009302415, result.GammaInLots, 1e-8, "trade 3 GammaInLots");
Assert.AreEqual(442.4091285698978, result.Vega, 1e-8, "trade 3 Vega");
Assert.AreEqual(-141.84965329371062, result.Theta, 1e-8, "trade 3 Theta");
Assert.AreEqual(-5.44154134558994, result.Rho, 1e-8, "trade 3 Rho");
Assert.AreEqual(-1327.1274625016895, result.TotalPnl, 1e-8, "trade 3 TotalPnl");
Assert.AreEqual(-987.21648518817256, result.DailyPnl, 1e-8, "trade 3 DailyPnl");
result = results.FirstOrDefault(x => x.TradeId == 4);
Assert.AreEqual(0.124, result.Vol, 1e-8, "trade 4 vol");
Assert.AreEqual(-11175.742786933908, result.Pv, 1e-8, "trade 4 Pv");
Assert.AreEqual(76.3514164604203, result.Delta, 1e-8, "trade 4 Delta");
Assert.AreEqual(307314.45125319168, result.DeltaCash, 1e-8, "trade 4 DeltaCash");
Assert.AreEqual(7.63514164604203, result.DeltaInLots, 1e-8, "trade 4 DeltaInLots");
Assert.AreEqual(-0.27352030883776024, result.Gamma, 1e-8, "trade 4 Gamma");
Assert.AreEqual(-44311.999533647395, result.GammaCash, 1e-8, "trade 4 GammaCash");
Assert.AreEqual(-0.027352030883776024, result.GammaInLots, 1e-8, "trade 4 GammaInLots");
Assert.AreEqual(-435.36997378178057, result.Vega, 1e-8, "trade 4 Vega");
Assert.AreEqual(139.81100055834213, result.Theta, 1e-8, "trade 4 Theta");
Assert.AreEqual(8.854745936369, result.Rho, 1e-8, "trade 4 Rho");
Assert.AreEqual(-2975.7427869339081, result.TotalPnl, 1e-8, "trade 4 TotalPnl");
Assert.AreEqual(-1017.3011650851695, result.DailyPnl, 1e-8, "trade 4 DailyPnl");
result = results.FirstOrDefault(x => x.TradeId == 5);
Assert.AreEqual(0.125, result.Vol, 1e-8, "trade 5 vol");
Assert.AreEqual(6970.1704398118181, result.Pv, 1e-8, "trade 5 Pv");
Assert.AreEqual(57.7187468570628, result.Delta, 1e-8, "trade 5 Delta");
Assert.AreEqual(232317.95609967777, result.DeltaCash, 1e-8, "trade 5 DeltaCash");
Assert.AreEqual(5.77187468570628, result.DeltaInLots, 1e-8, "trade 5 DeltaInLots");
Assert.AreEqual(0.27640635380521417, result.Gamma, 1e-8, "trade 5 Gamma");
Assert.AreEqual(44779.55685615597, result.GammaCash, 1e-8, "trade 5 GammaCash");
Assert.AreEqual(0.027640635380521417, result.GammaInLots, 1e-8, "trade 5 GammaInLots");
Assert.AreEqual(443.512080180426, result.Vega, 1e-8, "trade 5 Vega");
Assert.AreEqual(-145.21962543790323, result.Theta, 1e-8, "trade 5 Theta");
Assert.AreEqual(-5.5225938493913418, result.Rho, 1e-8, "trade 5 Rho");
Assert.AreEqual(-1129.8295601881819, result.TotalPnl, 1e-8, "trade 5 TotalPnl");
Assert.AreEqual(-989.30960923635212, result.DailyPnl, 1e-8, "trade 5 DailyPnl");
result = results.FirstOrDefault(x => x.TradeId == 6);
Assert.AreEqual(0.126, result.Vol, 1e-8, "trade 6 vol");
Assert.AreEqual(-6810.5367598768225, result.Pv, 1e-8, "trade 6 Pv");
Assert.AreEqual(-65.524466149508953, result.Delta, 1e-8, "trade 6 Delta");
Assert.AreEqual(-263735.97625177354, result.DeltaCash, 1e-8, "trade 6 DeltaCash");
Assert.AreEqual(-6.5524466149508953, result.DeltaInLots, 1e-8, "trade 6 DeltaInLots");
Assert.AreEqual(-0.41324034100398421, result.Gamma, 1e-8, "trade 6 Gamma");
Assert.AreEqual(-66947.517994776717, result.GammaCash, 1e-8, "trade 6 GammaCash");
Assert.AreEqual(-0.041324034100398421, result.GammaInLots, 1e-8, "trade 6 GammaInLots");
Assert.AreEqual(-668.37968810414168, result.Vega, 1e-8, "trade 6 Vega");
Assert.AreEqual(219.92643141441931, result.Theta, 1e-8, "trade 6 Theta");
Assert.AreEqual(5.39611315763068, result.Rho, 1e-8, "trade 6 Rho");
Assert.AreEqual(1189.4632401231775, result.TotalPnl, 1e-8, "trade 6 TotalPnl");
Assert.AreEqual(1189.4632401231775, result.DailyPnl, 1e-8, "trade 6 DailyPnl");
result = results.FirstOrDefault(x => x.TradeId == 7);
Assert.AreEqual(0.127, result.Vol, 1e-8, "trade 7 vol");
Assert.AreEqual(7780.7617181414962, result.Pv, 1e-8, "trade 7 Pv");
Assert.AreEqual(-65.7418387368125, result.Delta, 1e-8, "trade 7 Delta");
Assert.AreEqual(-264610.90091567033, result.DeltaCash, 1e-8, "trade 7 DeltaCash");
Assert.AreEqual(-6.57418387368125, result.DeltaInLots, 1e-8, "trade 7 DeltaInLots");
Assert.AreEqual(0.35966915675089695, result.Gamma, 1e-8, "trade 7 Gamma");
Assert.AreEqual(58268.651325875, result.GammaCash, 1e-8, "trade 7 GammaCash");
Assert.AreEqual(0.035966915675089695, result.GammaInLots, 1e-8, "trade 7 GammaInLots");
Assert.AreEqual(586.348476881767, result.Vega, 1e-8, "trade 7 Vega");
Assert.AreEqual(-194.36242502044115, result.Theta, 1e-8, "trade 7 Theta");
Assert.AreEqual(-6.1648401827915222, result.Rho, 1e-8, "trade 7 Rho");
Assert.AreEqual(-319.2382818585038, result.TotalPnl, 1e-8, "trade 7 TotalPnl");
Assert.AreEqual(-319.2382818585038, result.DailyPnl, 1e-8, "trade 7 DailyPnl");
result = results.FirstOrDefault(x => x.TradeId == 8);
Assert.AreEqual(0.128, result.Vol, 1e-8, "trade 8 vol");
Assert.AreEqual(-8750.8659508510173, result.Pv, 1e-8, "trade 8 Pv");
Assert.AreEqual(-75.538359720121662, result.Delta, 1e-8, "trade 8 Delta");
Assert.AreEqual(-304041.89787348971, result.DeltaCash, 1e-8, "trade 8 DeltaCash");
Assert.AreEqual(-7.5538359720121662, result.DeltaInLots, 1e-8, "trade 8 DeltaInLots");
Assert.AreEqual(-0.39833332266425714, result.Gamma, 1e-8, "trade 8 Gamma");
Assert.AreEqual(-64532.4878548763, result.GammaCash, 1e-8, "trade 8 GammaCash");
Assert.AreEqual(-0.039833332266425714, result.GammaInLots, 1e-8, "trade 8 GammaInLots");
Assert.AreEqual(-654.490843824351, result.Vega, 1e-8, "trade 8 Vega");
Assert.AreEqual(219.53295966470432, result.Theta, 1e-8, "trade 8 Theta");
Assert.AreEqual(6.9334715548939139, result.Rho, 1e-8, "trade 8 Rho");
Assert.AreEqual(-750.86595085101726, result.TotalPnl, 1e-8, "trade 8 TotalPnl");
Assert.AreEqual(-750.86595085101726, result.DailyPnl, 1e-8, "trade 8 DailyPnl");
#endregion
#region RB 商品期货
//result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_商品期货_long_RB1909");
//Assert.AreEqual(1180, result.Notional, 1e-8, "1_商品期货_long_RB1909 Notional");
//Assert.AreEqual(4749500, result.Pv, 1e-8, "1_商品期货_long_RB1909 Pv");
//Assert.AreEqual(-3223.975, result.DailyPnl, 1e-8, "1_商品期货_long_RB1909 DailyPnl");
//Assert.AreEqual(44280.775, result.TotalPnl, 1e-8, "1_商品期货_long_RB1909 TotalPnl");
//Assert.AreEqual(4705219.225, result.Cost.Value, 1e-8, "1_商品期货_long_RB1909 Cost");
//result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_商品期货_short_RB1909");
//Assert.AreEqual(30, result.Notional, 1e-8, "1_商品期货_short_RB1909 Notional");
//Assert.AreEqual(120750, result.Pv, 1e-8, "1_商品期货_short_RB1909 Pv");
//Assert.AreEqual(5392.75, result.DailyPnl, 1e-8, "1_商品期货_short_RB1909 DailyPnl");
//Assert.AreEqual(5392.75, result.TotalPnl, 1e-8, "1_商品期货_short_RB1909 TotalPnl");
//Assert.AreEqual(115357.25, result.Cost.Value, 1e-8, "1_商品期货_short_RB1909 Cost");
#endregion
#region RB 场内期权
//result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_场内期权_long_RB1909C4000");
//Assert.AreEqual(60, result.Notional, 1e-8, "1_场内期权_long_RB1909C4000 Notional");
//Assert.AreEqual(0.1, result.Vol, 1e-8, "1_场内期权_long_RB1909C4000 Vol");
//Assert.AreEqual(3512.45066692385, result.Pv, 1e-8, "1_场内期权_long_RB1909C4000 Pv");
//Assert.AreEqual(1512.45066692385, result.DailyPnl, 1e-8, "1_场内期权_long_RB1909C4000 DailyPnl");
//Assert.AreEqual(1512.45066692385, result.TotalPnl, 1e-8, "1_场内期权_long_RB1909C4000 TotalPnl");
//Assert.AreEqual(2000, result.Cost.Value, 1e-8, "1_场内期权_long_RB1909C4000 Cost");
//result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_场内期权_long_RB1909C3950");
//Assert.AreEqual(70, result.Notional, 1e-8, "1_场内期权_long_RB1909C3950 Notional");
//Assert.AreEqual(0.101, result.Vol, 1e-8, "1_场内期权_long_RB1909C3950 Vol");
//Assert.AreEqual(6446.50859145755, result.Pv, 1e-8, "1_场内期权_long_RB1909C3950 Pv");
//Assert.AreEqual(1546.50859145755, result.DailyPnl, 1e-8, "1_场内期权_long_RB1909C3950 DailyPnl");
//Assert.AreEqual(1546.50859145755, result.TotalPnl, 1e-8, "1_场内期权_long_RB1909C3950 TotalPnl");
//Assert.AreEqual(4900, result.Cost.Value, 1e-8, "1_场内期权_long_RB1909C3950 Cost");
//result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_场内期权_short_RB1909P4100");
//Assert.AreEqual(-80, result.Notional, 1e-8, "1_场内期权_short_RB1909P4100 Notional");
//Assert.AreEqual(0.102, result.Vol, 1e-8, "1_场内期权_short_RB1909P4100 Vol");
//Assert.AreEqual(-7451.78254457061, result.Pv, 1e-8, "1_场内期权_short_RB1909P4100 Pv");
//Assert.AreEqual(-1051.78254457061, result.DailyPnl, 1e-8, "1_场内期权_short_RB1909P4100 DailyPnl");
//Assert.AreEqual(-1051.78254457061, result.TotalPnl, 1e-8, "1_场内期权_short_RB1909P4100 TotalPnl");
//Assert.AreEqual(-6400, result.Cost.Value, 1e-8, "1_场内期权_short_RB1909P4100 Cost");
//result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_场内期权_short_RB1909P4200");
//Assert.AreEqual(-60, result.Notional, 1e-8, "1_场内期权_short_RB1909P4200 Notional");
//Assert.AreEqual(0.103, result.Vol, 1e-8, "1_场内期权_short_RB1909P4200 Vol");
//Assert.AreEqual(-10704.1875197521, result.Pv, 1e-8, "1_场内期权_short_RB1909P4200 Pv");
//Assert.AreEqual(-2304.1875197521, result.DailyPnl, 1e-8, "1_场内期权_short_RB1909P4200 DailyPnl");
//Assert.AreEqual(-2304.1875197521, result.TotalPnl, 1e-8, "1_场内期权_short_RB1909P4200 TotalPnl");
//Assert.AreEqual(-8400, result.Cost.Value, 1e-8, "1_场内期权_short_RB1909P4200 Cost");
#endregion
#region JD 香草期权
result = results.FirstOrDefault(x => x.TradeId == 1001);
Assert.AreEqual(0.129, result.Vol, 1e-8, "trade 1001 vol");
Assert.AreEqual(-18881.938346775569, result.Pv, 1e-8, "trade 1001 Pv");
Assert.AreEqual(-87.96759689830651, result.Delta, 1e-8, "trade 1001 Delta");
Assert.AreEqual(-393830.93131371826, result.DeltaCash, 1e-8, "trade 1001 DeltaCash");
Assert.AreEqual(-8.796759689830651, result.DeltaInLots, 1e-8, "trade 1001 DeltaInLots");
Assert.AreEqual(-0.13973236491438001, result.Gamma, 1e-8, "trade 1001 Gamma");
Assert.AreEqual(-28007.297083999583, result.GammaCash, 1e-8, "trade 1001 GammaCash");
Assert.AreEqual(-0.013973236491438001, result.GammaInLots, 1e-8, "trade 1001 GammaInLots");
Assert.AreEqual(-263.09952668088954, result.Vega, 1e-8, "trade 1001 Vega");
Assert.AreEqual(86.425659544744121, result.Theta, 1e-8, "trade 1001 Theta");
Assert.AreEqual(1.8526530574672506, result.Rho, 1e-8, "trade 1001 Rho");
Assert.AreEqual(-13631.938346775569, result.TotalPnl, 1e-8, "trade 1001 TotalPnl");
Assert.AreEqual(3819.6334732789692, result.DailyPnl, 1e-8, "trade 1001 DailyPnl");
result = results.FirstOrDefault(x => x.TradeId == 1002);
Assert.AreEqual(0.130, result.Vol, 1e-8, "trade 1002 vol");
Assert.AreEqual(891.49146952448359, result.Pv, 1e-8, "trade 1002 Pv");
Assert.AreEqual(-10.589403102585493, result.Delta, 1e-8, "trade 1002 Delta");
Assert.AreEqual(-47408.757690275248, result.DeltaCash, 1e-8, "trade 1002 DeltaCash");
Assert.AreEqual(-1.0589403102585493, result.DeltaInLots, 1e-8, "trade 1002 DeltaInLots");
Assert.AreEqual(0.10415321867185412, result.Gamma, 1e-8, "trade 1002 Gamma");
Assert.AreEqual(20875.980588926497, result.GammaCash, 1e-8, "trade 1002 GammaCash");
Assert.AreEqual(0.010415321867185412, result.GammaInLots, 1e-8, "trade 1002 GammaInLots");
Assert.AreEqual(217.03733477865512, result.Vega, 1e-8, "trade 1002 Vega");
Assert.AreEqual(-72.102324115425176, result.Theta, 1e-8, "trade 1002 Theta");
Assert.AreEqual(-0.28428024221511805, result.Rho, 1e-8, "trade 1002 Rho");
Assert.AreEqual(-4088.5085304755166, result.TotalPnl, 1e-8, "trade 1002 TotalPnl");
Assert.AreEqual(351.3805111689519, result.DailyPnl, 1e-8, "trade 1002 DailyPnl");
result = results.FirstOrDefault(x => x.TradeId == 1003);
Assert.AreEqual(0.131, result.Vol, 1e-8, "trade 1003 vol");
Assert.AreEqual(-25178.826003618018, result.Pv, 1e-8, "trade 1003 Pv");
Assert.AreEqual(-86.3413192484586, result.Delta, 1e-8, "trade 1003 Delta");
Assert.AreEqual(-386550.08627534914, result.DeltaCash, 1e-8, "trade 1003 DeltaCash");
Assert.AreEqual(-8.63413192484586, result.DeltaInLots, 1e-8, "trade 1003 DeltaInLots");
Assert.AreEqual(-0.047397115849889815, result.Gamma, 1e-8, "trade 1003 Gamma");
Assert.AreEqual(-9500.0546605362615, result.GammaCash, 1e-8, "trade 1003 GammaCash");
Assert.AreEqual(-0.0047397115849889815, result.GammaInLots, 1e-8, "trade 1003 GammaInLots");
Assert.AreEqual(-99.460958276904421, result.Vega, 1e-8, "trade 1003 Vega");
Assert.AreEqual(32.5409403759586, result.Theta, 1e-8, "trade 1003 Theta");
Assert.AreEqual(-2053.0174556343627, result.Rho, 1e-8, "trade 1003 Rho");
Assert.AreEqual(-20078.826003618018, result.TotalPnl, 1e-8, "trade 1003 TotalPnl");
Assert.AreEqual(3666.4893877908544, result.DailyPnl, 1e-8, "trade 1003 DailyPnl");
result = results.FirstOrDefault(x => x.TradeId == 1004);
Assert.AreEqual(0.132, result.Vol, 1e-8, "trade 1004 vol");
Assert.AreEqual(664.58072634923155, result.Pv, 1e-8, "trade 1004 Pv");
Assert.AreEqual(-8.66937456839878, result.Delta, 1e-8, "trade 1004 Delta");
Assert.AreEqual(-38812.789942721342, result.DeltaCash, 1e-8, "trade 1004 DeltaCash");
Assert.AreEqual(-0.866937456839878, result.DeltaInLots, 1e-8, "trade 1004 DeltaInLots");
Assert.AreEqual(0.096788407972780988, result.Gamma, 1e-8, "trade 1004 Gamma");
Assert.AreEqual(19399.812620662669, result.GammaCash, 1e-8, "trade 1004 GammaCash");
Assert.AreEqual(0.0096788407972780988, result.GammaInLots, 1e-8, "trade 1004 GammaInLots");
Assert.AreEqual(204.65243817582746, result.Vega, 1e-8, "trade 1004 Vega");
Assert.AreEqual(-68.390399111310671, result.Theta, 1e-8, "trade 1004 Theta");
Assert.AreEqual(24.446118771464853, result.Rho, 1e-8, "trade 1004 Rho");
Assert.AreEqual(-4335.4192736507684, result.TotalPnl, 1e-8, "trade 1004 TotalPnl");
Assert.AreEqual(-4335.4192736507684, result.DailyPnl, 1e-8, "trade 1004 DailyPnl");
result = results.FirstOrDefault(x => x.TradeId == 1005);
Assert.AreEqual(0.133, result.Vol, 1e-8, "trade 1005 vol");
Assert.AreEqual(-39319.005944028089, result.Pv, 1e-8, "trade 1005 Pv");
Assert.AreEqual(-117.26072473247768, result.Delta, 1e-8, "trade 1005 Delta");
Assert.AreEqual(-524976.26462730253, result.DeltaCash, 1e-8, "trade 1005 DeltaCash");
Assert.AreEqual(-11.726072473247768, result.DeltaInLots, 1e-8, "trade 1005 DeltaInLots");
Assert.AreEqual(-0.035720877349376678, result.Gamma, 1e-8, "trade 1005 Gamma");
Assert.AreEqual(-7159.7244105767459, result.GammaCash, 1e-8, "trade 1005 GammaCash");
Assert.AreEqual(-0.0035720877349376678, result.GammaInLots, 1e-8, "trade 1005 GammaInLots");
Assert.AreEqual(-76.099462055572076, result.Vega, 1e-8, "trade 1005 Vega");
Assert.AreEqual(20.891020308095904, result.Theta, 1e-8, "trade 1005 Theta");
Assert.AreEqual(31.421720464059032, result.Rho, 1e-8, "trade 1005 Rho");
Assert.AreEqual(-34019.005944028089, result.TotalPnl, 1e-8, "trade 1005 TotalPnl");
Assert.AreEqual(-34019.005944028089, result.DailyPnl, 1e-8, "trade 1005 DailyPnl");
#endregion
#region JD 商品期货
//result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_商品期货_long_JD1909");
//Assert.AreEqual(1260, result.Notional, 1e-8, "1_商品期货_long_JD1909 Notional");
//Assert.AreEqual(5641020, result.Pv, 1e-8, "1_商品期货_long_JD1909 Pv");
//Assert.AreEqual(-85982.2, result.DailyPnl, 1e-8, "1_商品期货_long_JD1909 DailyPnl");
//Assert.AreEqual(316561.55, result.TotalPnl, 1e-8, "1_商品期货_long_JD1909 TotalPnl");
//Assert.AreEqual(5324458.45, result.Cost.Value, 1e-8, "1_商品期货_long_JD1909 Cost");
//result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_商品期货_short_JD1909");
//Assert.AreEqual(-250, result.Notional, 1e-8, "1_商品期货_short_JD1909 Notional");
//Assert.AreEqual(-1119250, result.Pv, 1e-8, "1_商品期货_short_JD1909 Pv");
//Assert.AreEqual(345207.5, result.DailyPnl, 1e-8, "1_商品期货_short_JD1909 DailyPnl");
//Assert.AreEqual(73505.9, result.TotalPnl, 1e-8, "1_商品期货_short_JD1909 TotalPnl");
//Assert.AreEqual(-1192755.9, result.Cost.Value, 1e-8, "1_商品期货_short_JD1909 Cost");
#endregion
#region JD 场内期权
//result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_场内期权_long_JD1909C4300");
//Assert.AreEqual(160, result.Notional, 1e-8, "1_场内期权_long_JD1909C4300 Notional");
//Assert.AreEqual(0.104, result.Vol, 1e-8, "1_场内期权_long_JD1909C4300 Vol");
//Assert.AreEqual(29066.4901782639, result.Pv, 1e-8, "1_场内期权_long_JD1909C4300 Pv");
//Assert.AreEqual(21066.4901782639, result.DailyPnl, 1e-8, "1_场内期权_long_JD1909C4300 DailyPnl");
//Assert.AreEqual(21066.4901782639, result.TotalPnl, 1e-8, "1_场内期权_long_JD1909C4300 TotalPnl");
//Assert.AreEqual(8000, result.Cost.Value, 1e-8, "1_场内期权_long_JD1909C4300 Cost");
//result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_场内期权_short_JD1909C4300");
//Assert.AreEqual(-65, result.Notional, 1e-8, "1_场内期权_short_JD1909C4300 Notional");
//Assert.AreEqual(0.104, result.Vol, 1e-8, "1_场内期权_short_JD1909C4300 Vol");
//Assert.AreEqual(-11808.2616349197, result.Pv, 1e-8, "1_场内期权_short_JD1909C4300 Pv");
//Assert.AreEqual(14993.919567198500, result.DailyPnl, 1e-8, "1_场内期权_short_JD1909C4300 DailyPnl");
//Assert.AreEqual(6541.738365080300, result.TotalPnl, 1e-8, "1_场内期权_short_JD1909C4300 TotalPnl");
//Assert.AreEqual(-18350, result.Cost.Value, 1e-8, "1_场内期权_short_JD1909C4300 Cost");
//result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_场内期权_long_JD1909P4400");
//Assert.AreEqual(30, result.Notional, 1e-8, "1_场内期权_long_JD1909P4400 Notional");
//Assert.AreEqual(0.105, result.Vol, 1e-8, "1_场内期权_long_JD1909P4400 Vol");
//Assert.AreEqual(682.250581766453, result.Pv, 1e-8, "1_场内期权_long_JD1909P4400 Pv");
//Assert.AreEqual(-3346.688309786890, result.DailyPnl, 1e-8, "1_场内期权_long_JD1909P4400 DailyPnl");
//Assert.AreEqual(3482.250581766450, result.TotalPnl, 1e-8, "1_场内期权_long_JD1909P4400 TotalPnl");
//Assert.AreEqual(-2800, result.Cost.Value, 1e-8, "1_场内期权_long_JD1909P4400 Cost");
//result = results.FirstOrDefault(x => x.HedgeUniqueCode == "1_场内期权_short_JD1909P4400");
//Assert.AreEqual(-70, result.Notional, 1e-8, "1_场内期权_short_JD1909P4400 Notional");
//Assert.AreEqual(0.105, result.Vol, 1e-8, "1_场内期权_short_JD1909P4400 Vol");
//Assert.AreEqual(-1591.91802412172, result.Pv, 1e-8, "1_场内期权_short_JD1909P4400 Pv");
//Assert.AreEqual(8208.08197587828, result.DailyPnl, 1e-8, "1_场内期权_short_JD1909P4400 DailyPnl");
//Assert.AreEqual(8208.08197587828, result.TotalPnl, 1e-8, "1_场内期权_short_JD1909P4400 TotalPnl");
//Assert.AreEqual(-9800, result.Cost.Value, 1e-8, "1_场内期权_short_JD1909P4400 Cost");
#endregion
#region AU 香草期权
//此交易有部分平仓的情况
result = results.FirstOrDefault(x => x.TradeId == 2001);
Assert.AreEqual(0.134, result.Vol, 1e-8, "trade 2001 vol");
Assert.AreEqual(-734.79976938977222, result.Pv, 1e-8, "trade 2001 Pv");
Assert.AreEqual(-70.036312279432877, result.Delta, 1e-8, "trade 2001 Delta");
Assert.AreEqual(-21277.03167049171, result.DeltaCash, 1e-8, "trade 2001 DeltaCash");
Assert.AreEqual(-0.070036312279432883, result.DeltaInLots, 1e-8, "trade 2001 DeltaInLots");
Assert.AreEqual(-3.5916961564907979, result.Gamma, 1e-8, "trade 2001 Gamma");
Assert.AreEqual(-3314.9358541347056, result.GammaCash, 1e-8, "trade 2001 GammaCash");
Assert.AreEqual(-0.0035916961564907979, result.GammaInLots, 1e-8, "trade 2001 GammaInLots");
Assert.AreEqual(-35.196287307263674, result.Vega, 1e-8, "trade 2001 Vega");
Assert.AreEqual(12.266805039301175, result.Theta, 1e-8, "trade 2001 Theta");
Assert.AreEqual(0.58219533109308941, result.Rho, 1e-8, "trade 2001 Rho");
Assert.AreEqual(15.200230610227777, result.TotalPnl, 1e-8, "trade 2001 TotalPnl");
Assert.AreEqual(-811.09770746206, result.DailyPnl, 1e-8, "trade 2001 DailyPnl");
#endregion
#region AU 商品期货
#endregion
#region AU 场内期权
#endregion
}
[TestMethod]
public void AtmQuoteTestV2()
{
//等待数据初始化,等法见改进数据加载后可去掉
Thread.Sleep(3000);
#region Normal Vol Mode
PS.ResetConfig("{\"SkewMapVolConstruction\":\"false\"}");
//只计算主力合约
var mainContraceQuoteResults = CalculatorHelper.AtMoneyOptionQuotesV2("2019-07-16", "", onlyMainContract: true);
Assert.AreEqual(3, mainContraceQuoteResults.Count, "mainContraceQuoteResults onlyMainContract count");
Assert.AreEqual("CU1909", mainContraceQuoteResults[0].underlyingCode, "CU1909");
Assert.AreEqual("SHFE", mainContraceQuoteResults[0].marketCode, "CU1909");
Assert.AreEqual(47100, mainContraceQuoteResults[0].spotPrice, "CU1909 spotPrice");
Assert.AreEqual(715.49051521718434, mainContraceQuoteResults[0].sellOptionPrice, 1e-8, "CU1909 sellOptionPrice");
Assert.AreEqual(0.12906666666666669, mainContraceQuoteResults[0].sellOptionVol, 1e-8, "CU1909 sellOptionVol");
Assert.AreEqual(453.5500469250411, mainContraceQuoteResults[0].buyOptionPrice, 1e-8, "CU1909 buyOptionPrice");
Assert.AreEqual(0.08181250000000001, mainContraceQuoteResults[0].buyOptionVol, 1e-8, "CU1909 buyOptionVol");
Assert.AreEqual("RB1910", mainContraceQuoteResults[1].underlyingCode, "RB1910");
Assert.AreEqual("SHFE", mainContraceQuoteResults[1].marketCode, "RB1910");
Assert.AreEqual(3973, mainContraceQuoteResults[1].spotPrice, "RB1910 spotPrice");
Assert.AreEqual(140.24670982614325, mainContraceQuoteResults[1].sellOptionPrice, 1e-8, "RB1910 sellOptionPrice");
Assert.AreEqual(0.3, mainContraceQuoteResults[1].sellOptionVol, 1e-8, "RB1910 sellOptionVol");
Assert.AreEqual(140.24670982614325, mainContraceQuoteResults[1].buyOptionPrice, 1e-8, "RB1910 buyOptionPrice");
Assert.AreEqual(0.3, mainContraceQuoteResults[1].buyOptionVol, 1e-8, "RB1910 buyOptionVol");
Assert.AreEqual("AP911", mainContraceQuoteResults[2].underlyingCode, "AP911");
Assert.AreEqual(8758, mainContraceQuoteResults[2].spotPrice, "AP911 spotPrice");
Assert.AreEqual(310.35618111067134, mainContraceQuoteResults[2].sellOptionPrice, 1e-8, "AP911 sellOptionPrice");
Assert.AreEqual(0.3, mainContraceQuoteResults[2].sellOptionVol, 1e-8, "AP911 sellOptionVol");
Assert.AreEqual(310.35618111067134, mainContraceQuoteResults[2].buyOptionPrice, 1e-8, "AP911 buyOptionPrice");
Assert.AreEqual(0.3, mainContraceQuoteResults[2].buyOptionVol, 1e-8, "AP911 buyOptionVol");
//Assert.AreEqual("JD1909", mainContraceQuoteResults[3].underlyingCode, "JD1909");
//Assert.AreEqual(4477, mainContraceQuoteResults[3].spotPrice, "JD1909 spotPrice");
//Assert.AreEqual(158.65090463946953, mainContraceQuoteResults[3].sellOptionPrice, 1e-8, "JD1909 sellOptionPrice");
//Assert.AreEqual(0.3, mainContraceQuoteResults[3].sellOptionVol, 1e-8, "JD1909 sellOptionVol");
//Assert.AreEqual(158.65090463946953, mainContraceQuoteResults[3].buyOptionPrice, 1e-8, "JD1909 buyOptionPrice");
//Assert.AreEqual(0.3, mainContraceQuoteResults[3].buyOptionVol, 1e-8, "JD1909 buyOptionVol");
//计算所有报价合约
mainContraceQuoteResults = CalculatorHelper.AtMoneyOptionQuotesV2("2019-07-16", "", onlyMainContract: false);
Assert.AreEqual(5, mainContraceQuoteResults.Count, "mainContraceQuoteResults count");
Assert.AreEqual("CU1910", mainContraceQuoteResults[1].underlyingCode, "CU1910");
Assert.AreEqual("SHFE", mainContraceQuoteResults[1].marketCode, "CU1910");
Assert.AreEqual(47120, mainContraceQuoteResults[1].spotPrice, "CU1CU1910909 spotPrice");
Assert.AreEqual(715.79433284572588, mainContraceQuoteResults[1].sellOptionPrice, 1e-8, "CU1910 sellOptionPrice");
Assert.AreEqual(0.12906666666666669, mainContraceQuoteResults[1].sellOptionVol, 1e-8, "CU1910 sellOptionVol");
Assert.AreEqual(453.74263717851096, mainContraceQuoteResults[1].buyOptionPrice, 1e-8, "CU1910 buyOptionPrice");
Assert.AreEqual(0.08181250000000001, mainContraceQuoteResults[1].buyOptionVol, 1e-8, "CU1910 buyOptionVol");
Assert.AreEqual("RB1912", mainContraceQuoteResults[3].underlyingCode, "RB1912");
Assert.AreEqual("SHFE", mainContraceQuoteResults[3].marketCode, "RB1912");
Assert.AreEqual(3766, mainContraceQuoteResults[3].spotPrice, "RB1912 spotPrice");
Assert.AreEqual(132.9396197345217, mainContraceQuoteResults[3].sellOptionPrice, 1e-8, "RB1912 sellOptionPrice");
Assert.AreEqual(0.3, mainContraceQuoteResults[3].sellOptionVol, 1e-8, "RB1912 sellOptionVol");
Assert.AreEqual(132.9396197345217, mainContraceQuoteResults[3].buyOptionPrice, 1e-8, "RB1912 buyOptionPrice");
Assert.AreEqual(0.3, mainContraceQuoteResults[3].buyOptionVol, 1e-8, "RB1912 buyOptionVol");
#endregion
#region SkewMap Vol Mode
PS.ResetConfig("{\"SkewMapVolConstruction\":\"true\"}");
//只计算主力合约
mainContraceQuoteResults = CalculatorHelper.AtMoneyOptionQuotesV2("2019-07-16", "", onlyMainContract: true);
Assert.AreEqual(3, mainContraceQuoteResults.Count, "mainContraceQuoteResults onlyMainContract count");
Assert.AreEqual("CU1909", mainContraceQuoteResults[0].underlyingCode, "CU1909");
Assert.AreEqual("SHFE", mainContraceQuoteResults[0].marketCode, "CU1909");
Assert.AreEqual(47100, mainContraceQuoteResults[0].spotPrice, "CU1909 spotPrice");
Assert.AreEqual(909.05249440526984, mainContraceQuoteResults[0].sellOptionPrice, 1e-8, "CU1909 sellOptionPrice");
Assert.AreEqual(0.16398924510717011, mainContraceQuoteResults[0].sellOptionVol, 1e-8, "CU1909 sellOptionVol");
Assert.AreEqual(609.75971514150763, mainContraceQuoteResults[0].buyOptionPrice, 1e-8, "CU1909 buyOptionPrice");
Assert.AreEqual(0.10999215915889667, mainContraceQuoteResults[0].buyOptionVol, 1e-8, "CU1909 buyOptionVol");
Assert.AreEqual("RB1910", mainContraceQuoteResults[1].underlyingCode, "RB1910");
Assert.AreEqual("SHFE", mainContraceQuoteResults[1].marketCode, "RB1910");
Assert.AreEqual(3973, mainContraceQuoteResults[1].spotPrice, "RB1910 spotPrice");
Assert.AreEqual(76.680797458007078, mainContraceQuoteResults[1].sellOptionPrice, 1e-8, "RB1910 sellOptionPrice");
Assert.AreEqual(0.16398924510717011, mainContraceQuoteResults[1].sellOptionVol, 1e-8, "RB1910 sellOptionVol");
Assert.AreEqual(51.434720769792484, mainContraceQuoteResults[1].buyOptionPrice, 1e-8, "RB1910 buyOptionPrice");
Assert.AreEqual(0.10999215915889667, mainContraceQuoteResults[1].buyOptionVol, 1e-8, "RB1910 buyOptionVol");
Assert.AreEqual("AP911", mainContraceQuoteResults[2].underlyingCode, "AP911");
Assert.AreEqual(8758, mainContraceQuoteResults[2].spotPrice, "AP911 spotPrice");
Assert.AreEqual(169.68955794100592, mainContraceQuoteResults[2].sellOptionPrice, 1e-8, "AP911 sellOptionPrice");
Assert.AreEqual(0.16398924510717011, mainContraceQuoteResults[2].sellOptionVol, 1e-8, "AP911 sellOptionVol");
Assert.AreEqual(113.82169974887145, mainContraceQuoteResults[2].buyOptionPrice, 1e-8, "AP911 buyOptionPrice");
Assert.AreEqual(0.10999215915889667, mainContraceQuoteResults[2].buyOptionVol, 1e-8, "AP911 buyOptionVol");
//计算所有报价合约
mainContraceQuoteResults = CalculatorHelper.AtMoneyOptionQuotesV2("2019-07-16", "", onlyMainContract: false);
Assert.AreEqual(5, mainContraceQuoteResults.Count, "mainContraceQuoteResults count");
Assert.AreEqual("CU1910", mainContraceQuoteResults[1].underlyingCode, "CU1910");
Assert.AreEqual("SHFE", mainContraceQuoteResults[1].marketCode, "CU1910");
Assert.AreEqual(47120, mainContraceQuoteResults[1].spotPrice, "CU1CU1910909 spotPrice");
Assert.AreEqual(909.43850395703168, mainContraceQuoteResults[1].sellOptionPrice, 1e-8, "CU1910 sellOptionPrice");
Assert.AreEqual(0.16398924510717011, mainContraceQuoteResults[1].sellOptionVol, 1e-8, "CU1910 sellOptionVol");
Assert.AreEqual(610.01863646428569, mainContraceQuoteResults[1].buyOptionPrice, 1e-8, "CU1910 buyOptionPrice");
Assert.AreEqual(0.10999215915889667, mainContraceQuoteResults[1].buyOptionVol, 1e-8, "CU1910 buyOptionVol");
Assert.AreEqual("RB1912", mainContraceQuoteResults[3].underlyingCode, "RB1912");
Assert.AreEqual("SHFE", mainContraceQuoteResults[3].marketCode, "RB1912");
Assert.AreEqual(3766, mainContraceQuoteResults[3].spotPrice, "RB1912 spotPrice");
Assert.AreEqual(72.685598597245161, mainContraceQuoteResults[3].sellOptionPrice, 1e-8, "RB1912 sellOptionPrice");
Assert.AreEqual(0.16398924510717011, mainContraceQuoteResults[3].sellOptionVol, 1e-8, "RB1912 sellOptionVol");
Assert.AreEqual(48.754885079042914, mainContraceQuoteResults[3].buyOptionPrice, 1e-8, "RB1912 buyOptionPrice");
Assert.AreEqual(0.10999215915889667, mainContraceQuoteResults[3].buyOptionVol, 1e-8, "RB1912 buyOptionVol");
#endregion
}
/// <summary>
/// T型实时报价测试
/// </summary>
[TestMethod]
public void TQuoteTest()
{
//等待数据初始化,等法见改进数据加载后可去掉
Thread.Sleep(3000);
#region Normal Vol Mode
PS.ResetConfig("{\"SkewMapVolConstruction\":\"false\"}");
#region CU1910 采用系统中设置的200strike间隔
var tQuoteRequest = new TQuoteRequest()
{
underlyingCode = "CU1910",
maturityDate = new DateTime(2019, 7, 16)
};
var result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest);
Assert.AreEqual(47120, result.LatestPrice, 1e-8, "CU1910 latest price");
Assert.AreEqual(11, result.quotaList.Count, "CU1910 quotaList.Count");
Assert.AreEqual(46120, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike");
Assert.AreEqual(1323.8188434410963, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice");
Assert.AreEqual(0.13071013016411998, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke");
Assert.AreEqual(0.028094627407493553, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent");
Assert.AreEqual(1113.8549476759197, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice");
Assert.AreEqual(0.0818819326542162, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol");
Assert.AreEqual(0.023638687344565357, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent");
Assert.AreEqual(326.00224868627646, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice");
Assert.AreEqual(0.13071013016411998, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol");
Assert.AreEqual(0.0069185536648191095, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent");
Assert.AreEqual(116.0383529211035, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice");
Assert.AreEqual(0.0818819326542162, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol");
Assert.AreEqual(0.0024626136018909908, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent");
Assert.AreEqual(46520, result.quotaList[2].Strike, 1e-8, "CU1910 2 Strike");
Assert.AreEqual(1055.4409173448089, result.quotaList[2].CallAskPrice, 1e-8, "CU1910 2 CallAskPrice");
Assert.AreEqual(0.13005274476513867, result.quotaList[2].CallAskVol, 1e-8, "CU1910 2 StriCallAskVolke");
Assert.AreEqual(0.022399000792546878, result.quotaList[2].CallAskPricePercent, 1e-8, "CU1910 2 CallAskPricePercent");
Assert.AreEqual(812.21812605787193, result.quotaList[2].CallBidPrice, 1e-8, "CU1910 2 CallBidPrice");
Assert.AreEqual(0.081854159592529716, result.quotaList[2].CallBidVol, 1e-8, "CU1910 2 CallBidVol");
Assert.AreEqual(0.017237226783910695, result.quotaList[2].CallBidPricePercent, 1e-8, "CU1910 2 CallBidPricePercent");
Assert.AreEqual(456.75096049191916, result.quotaList[2].PutAskPrice, 1e-8, "CU1910 2 PutAskPrice");
Assert.AreEqual(0.13005274476513867, result.quotaList[2].PutAskVol, 1e-8, "CU1910 2 PutAskVol");
Assert.AreEqual(0.0096933565469422573, result.quotaList[2].PutAskPricePercent, 1e-8, "CU1910 2 PutAskPricePercent");
Assert.AreEqual(213.52816920498219, result.quotaList[2].PutBidPrice, 1e-8, "CU1910 2 PutBidPrice");
Assert.AreEqual(0.081854159592529716, result.quotaList[2].PutBidVol, 1e-8, "CU1910 2 PutBidVol");
Assert.AreEqual(0.0045315825383060735, result.quotaList[2].PutBidPricePercent, 1e-8, "CU1910 2 PutBidPricePercent");
Assert.AreEqual(46920, result.quotaList[4].Strike, 1e-8, "CU1910 4 Strike");
Assert.AreEqual(820.295788822324, result.quotaList[4].CallAskPrice, 1e-8, "CU1910 4 CallAskPrice");
Assert.AreEqual(0.12939535936615731, result.quotaList[4].CallAskVol, 1e-8, "CU1910 4 StriCallAskVolke");
Assert.AreEqual(0.01740865426193387, result.quotaList[4].CallAskPricePercent, 1e-8, "CU1910 4 CallAskPricePercent");
Assert.AreEqual(559.61782699983837, result.quotaList[4].CallBidPrice, 1e-8, "CU1910 4 CallBidPrice");
Assert.AreEqual(0.081826386530843245, result.quotaList[4].CallBidVol, 1e-8, "CU1910 4 CallBidVol");
Assert.AreEqual(0.01187643945245837, result.quotaList[4].CallBidPricePercent, 1e-8, "CU1910 4 CallBidPricePercent");
Assert.AreEqual(620.73246987136076, result.quotaList[4].PutAskPrice, 1e-8, "CU1910 4 PutAskPrice");
Assert.AreEqual(0.12939535936615731, result.quotaList[4].PutAskVol, 1e-8, "CU1910 4 PutAskVol");
Assert.AreEqual(0.013173439513398997, result.quotaList[4].PutAskPricePercent, 1e-8, "CU1910 4 PutAskPricePercent");
Assert.AreEqual(360.05450804887511, result.quotaList[4].PutBidPrice, 1e-8, "CU1910 4 PutBidPrice");
Assert.AreEqual(0.081826386530843245, result.quotaList[4].PutBidVol, 1e-8, "CU1910 4 PutBidVol");
Assert.AreEqual(0.0076412247039234953, result.quotaList[4].PutBidPricePercent, 1e-8, "CU1910 4 PutBidPricePercent");
Assert.AreEqual(47320, result.quotaList[6].Strike, 1e-8, "CU1910 6 Strike");
Assert.AreEqual(623.75969955305777, result.quotaList[6].CallAskPrice, 1e-8, "CU1910 6 CallAskPrice");
Assert.AreEqual(0.12939535936615731, result.quotaList[6].CallAskVol, 1e-8, "CU1910 6 StriCallAskVolke");
Assert.AreEqual(0.013237684625489342, result.quotaList[6].CallAskPricePercent, 1e-8, "CU1910 6 CallAskPricePercent");
Assert.AreEqual(361.95132597733681, result.quotaList[6].CallBidPrice, 1e-8, "CU1910 6 CallBidPrice");
Assert.AreEqual(0.081826386530843245, result.quotaList[6].CallBidVol, 1e-8, "CU1910 6 CallBidVol");
Assert.AreEqual(0.0076814797533390662, result.quotaList[6].CallBidPricePercent, 1e-8, "CU1910 6 CallBidPricePercent");
Assert.AreEqual(823.32301850402462, result.quotaList[6].PutAskPrice, 1e-8, "CU1910 6 PutAskPrice");
Assert.AreEqual(0.12939535936615731, result.quotaList[6].PutAskVol, 1e-8, "CU1910 6 PutAskVol");
Assert.AreEqual(0.017472899374024291, result.quotaList[6].PutAskPricePercent, 1e-8, "CU1910 6 PutAskPricePercent");
Assert.AreEqual(561.51464492830371, result.quotaList[6].PutBidPrice, 1e-8, "CU1910 6 PutBidPrice");
Assert.AreEqual(0.081826386530843245, result.quotaList[6].PutBidVol, 1e-8, "CU1910 6 PutBidVol");
Assert.AreEqual(0.011916694501874018, result.quotaList[6].PutBidPricePercent, 1e-8, "CU1910 6 PutBidPricePercent");
Assert.AreEqual(48120, result.quotaList[10].Strike, 1e-8, "CU1910 10 Strike");
Assert.AreEqual(339.23353112420568, result.quotaList[10].CallAskPrice, 1e-8, "CU1910 10 CallAskPrice");
Assert.AreEqual(0.13071013016411998, result.quotaList[10].CallAskVol, 1e-8, "CU1910 10 StriCallAskVolke");
Assert.AreEqual(0.0071993533769992716, result.quotaList[10].CallAskPricePercent, 1e-8, "CU1910 10 CallAskPricePercent");
Assert.AreEqual(122.60154224895, result.quotaList[10].CallBidPrice, 1e-8, "CU1910 10 CallBidPrice");
Assert.AreEqual(0.081881932654216186, result.quotaList[10].CallBidVol, 1e-8, "CU1910 10 CallBidVol");
Assert.AreEqual(0.0026019003023970712, result.quotaList[10].CallBidPricePercent, 1e-8, "CU1910 10 CallBidPricePercent");
Assert.AreEqual(1337.05012587902, result.quotaList[10].PutAskPrice, 1e-8, "CU1910 10 PutAskPrice");
Assert.AreEqual(0.13071013016411998, result.quotaList[10].PutAskVol, 1e-8, "CU1910 10 PutAskVol");
Assert.AreEqual(0.0283754271196736, result.quotaList[10].PutAskPricePercent, 1e-8, "CU1910 10 PutAskPricePercent");
Assert.AreEqual(1120.4181370037679, result.quotaList[10].PutBidPrice, 1e-8, "CU1910 10 PutBidPrice");
Assert.AreEqual(0.081881932654216186, result.quotaList[10].PutBidVol, 1e-8, "CU1910 10 PutBidVol");
Assert.AreEqual(0.023777974045071475, result.quotaList[10].PutBidPricePercent, 1e-8, "CU1910 10 PutBidPricePercent");
#endregion
#region CU1910 采用参数传递的100作为Strike间隔
tQuoteRequest = new TQuoteRequest()
{
underlyingCode = "CU1910",
maturityDate = new DateTime(2019, 7, 16),
strikeInterval = 100,
strikeCount = 3
};
result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest);
Assert.AreEqual(47120, result.LatestPrice, 1e-8, "CU1910 latest price 2");
Assert.AreEqual(3, result.quotaList.Count, "CU1910 quotaList.Count 2");
Assert.AreEqual(47020, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike");
Assert.AreEqual(766.94209355431292, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice 2");
Assert.AreEqual(0.12923101301641202, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke 2");
Assert.AreEqual(0.016276360219743484, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent 2");
Assert.AreEqual(504.93702285546607, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice 2");
Assert.AreEqual(0.081819443265421635, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol 2");
Assert.AreEqual(0.010715980960430095, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent 2");
Assert.AreEqual(667.16043407883126, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice 2");
Assert.AreEqual(0.12923101301641202, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol 2");
Assert.AreEqual(0.014158752845476045, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent 2");
Assert.AreEqual(405.15536337998446, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice 2");
Assert.AreEqual(0.081819443265421635, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol 2");
Assert.AreEqual(0.0085983735861626578, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent 2");
Assert.AreEqual(47120, result.quotaList[1].Strike, "CU1910 1 Strike");
Assert.AreEqual(715.79433284572588, result.quotaList[1].CallAskPrice, 1e-8, "CU1910 1 CallAskPrice");
Assert.AreEqual(0.12906666666666669, result.quotaList[1].CallAskVol, 1e-8, "CU1910 1 StriCallAskVolke");
Assert.AreEqual(0.015190881427116424, result.quotaList[1].CallAskPricePercent, 1e-8, "CU1910 1 CallAskPricePercent");
Assert.AreEqual(453.74263717851096, result.quotaList[1].CallBidPrice, 1e-8, "CU1910 1 CallBidPrice");
Assert.AreEqual(0.08181250000000001, result.quotaList[1].CallBidVol, 1e-8, "CU1910 1 CallBidVol");
Assert.AreEqual(0.00962951267356772, result.quotaList[1].CallBidPricePercent, 1e-8, "CU1910 1 CallBidPricePercent");
Assert.AreEqual(715.79433284572588, result.quotaList[1].PutAskPrice, 1e-8, "CU1910 1 PutAskPrice");
Assert.AreEqual(0.12906666666666669, result.quotaList[1].PutAskVol, 1e-8, "CU1910 1 PutAskVol");
Assert.AreEqual(0.015190881427116424, result.quotaList[1].PutAskPricePercent, 1e-8, "CU1910 1 PutAskPricePercent");
Assert.AreEqual(453.74263717851454, result.quotaList[1].PutBidPrice, 1e-8, "CU1910 1 PutBidPrice");
Assert.AreEqual(0.08181250000000001, result.quotaList[1].PutBidVol, 1e-8, "CU1910 1 PutBidVol");
Assert.AreEqual(0.0096295126735677951, result.quotaList[1].PutBidPricePercent, 1e-8, "CU1910 1 PutBidPricePercent");
#endregion
#region AP911 系统未设置Strike间隔,应使用100
tQuoteRequest = new TQuoteRequest()
{
underlyingCode = "AP911",
maturityDate = new DateTime(2019, 7, 16),
spotPrice = 8600
};
result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest);
Assert.AreEqual(8600, result.LatestPrice, 1e-8, "AP911 latest price");
Assert.AreEqual(11, result.quotaList.Count, "AP911 quotaList.Count");
Assert.AreEqual(8100, result.quotaList[0].Strike, 1e-8, "AP911 0 Strike");
Assert.AreEqual(609.80154469645686, result.quotaList[0].CallAskPrice, 1e-8, "AP911 0 CallAskPrice");
Assert.AreEqual(0.3, result.quotaList[0].CallAskVol, 1e-8, "AP911 0 StriCallAskVolke");
Assert.AreEqual(0.070907156360053014, result.quotaList[0].CallAskPricePercent, 1e-8, "AP911 0 CallAskPricePercent");
Assert.AreEqual(609.801544696456, result.quotaList[0].CallBidPrice, 1e-8, "AP911 0 CallBidPrice");
Assert.AreEqual(0.3, result.quotaList[0].CallBidVol, 1e-8, "AP911 0 CallBidVol");
Assert.AreEqual(0.070907156360053014, result.quotaList[0].CallBidPricePercent, 1e-8, "AP911 0 CallBidPricePercent");
Assert.AreEqual(110.90176685520926, result.quotaList[0].PutAskPrice, 1e-8, "AP911 0 PutAskPrice");
Assert.AreEqual(0.3, result.quotaList[0].PutAskVol, 1e-8, "AP911 0 PutAskVol");
Assert.AreEqual(0.012895554285489448, result.quotaList[0].PutAskPricePercent, 1e-8, "AP911 0 PutAskPricePercent");
Assert.AreEqual(110.90176685520926, result.quotaList[0].PutBidPrice, 1e-8, "AP911 0 PutBidPrice");
Assert.AreEqual(0.3, result.quotaList[0].PutBidVol, 1e-8, "AP911 0 PutBidVol");
Assert.AreEqual(0.012895554285489448, result.quotaList[0].PutBidPricePercent, 1e-8, "AP911 0 PutBidPricePercent");
Assert.AreEqual(8300, result.quotaList[2].Strike, 1e-8, "AP911 2 Strike");
Assert.AreEqual(472.58446045531184, result.quotaList[2].CallAskPrice, 1e-8, "AP911 2 CallAskPrice");
Assert.AreEqual(0.3, result.quotaList[2].CallAskVol, 1e-8, "AP911 2 StriCallAskVolke");
Assert.AreEqual(0.054951681448292072, result.quotaList[2].CallAskPricePercent, 1e-8, "AP911 2 CallAskPricePercent");
Assert.AreEqual(472.58446045531184, result.quotaList[2].CallBidPrice, 1e-8, "AP911 2 CallBidPrice");
Assert.AreEqual(0.3, result.quotaList[2].CallBidVol, 1e-8, "AP911 2 CallBidVol");
Assert.AreEqual(0.054951681448292072, result.quotaList[2].CallBidPricePercent, 1e-8, "AP911 2 CallBidPricePercent");
Assert.AreEqual(173.24459375056367, result.quotaList[2].PutAskPrice, 1e-8, "AP911 2 PutAskPrice");
Assert.AreEqual(0.3, result.quotaList[2].PutAskVol, 1e-8, "AP911 2 PutAskVol");
Assert.AreEqual(0.020144720203553915, result.quotaList[2].PutAskPricePercent, 1e-8, "AP911 2 PutAskPricePercent");
Assert.AreEqual(173.24459375056367, result.quotaList[2].PutBidPrice, 1e-8, "AP911 2 PutBidPrice");
Assert.AreEqual(0.3, result.quotaList[2].PutBidVol, 1e-8, "AP911 2 PutBidVol");
Assert.AreEqual(0.020144720203553915, result.quotaList[2].PutBidPricePercent, 1e-8, "AP911 2 PutBidPricePercent");
#endregion
#endregion
#region SkewMap Vol Mode
PS.ResetConfig("{\"SkewMapVolConstruction\":\"true\"}");
#region CU1910 采用系统中设置的200strike间隔
tQuoteRequest = new TQuoteRequest()
{
underlyingCode = "CU1910",
maturityDate = new DateTime(2019, 7, 16)
};
result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest);
Assert.AreEqual(47120, result.LatestPrice, 1e-8, "CU1910 latest price");
Assert.AreEqual(11, result.quotaList.Count, "CU1910 quotaList.Count");
Assert.AreEqual(46120, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike");
Assert.AreEqual(1502.6575903670266, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice");
Assert.AreEqual(0.1674694930736175, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke");
Assert.AreEqual(0.031890016773493776, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent");
Assert.AreEqual(1210.8776103576965, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice");
Assert.AreEqual(0.10581671458278169, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol");
Assert.AreEqual(0.025697742155299162, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent");
Assert.AreEqual(504.84099561221052, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice");
Assert.AreEqual(0.1674694930736175, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol");
Assert.AreEqual(0.010713943030819408, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent");
Assert.AreEqual(231.33391923267263, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice");
Assert.AreEqual(0.10999215915889668, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol");
Assert.AreEqual(0.0049094634811687743, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent");
Assert.AreEqual(46520, result.quotaList[2].Strike, 1e-8, "CU1910 2 Strike");
Assert.AreEqual(1245.4771707744617, result.quotaList[2].CallAskPrice, 1e-8, "CU1910 2 CallAskPrice");
Assert.AreEqual(0.16607739179657319, result.quotaList[2].CallAskVol, 1e-8, "CU1910 2 StriCallAskVolke");
Assert.AreEqual(0.026432028242242396, result.quotaList[2].CallAskPricePercent, 1e-8, "CU1910 2 CallAskPricePercent");
Assert.AreEqual(942.12908835003475, result.quotaList[2].CallBidPrice, 1e-8, "CU1910 2 CallBidPrice");
Assert.AreEqual(0.10806727953002154, result.quotaList[2].CallBidVol, 1e-8, "CU1910 2 CallBidVol");
Assert.AreEqual(0.019994250601656084, result.quotaList[2].CallBidPricePercent, 1e-8, "CU1910 2 CallBidPricePercent");
Assert.AreEqual(646.78721392157206, result.quotaList[2].PutAskPrice, 1e-8, "CU1910 2 PutAskPrice");
Assert.AreEqual(0.16607739179657319, result.quotaList[2].PutAskVol, 1e-8, "CU1910 2 PutAskVol");
Assert.AreEqual(0.013726383996637778, result.quotaList[2].PutAskPricePercent, 1e-8, "CU1910 2 PutAskPricePercent");
Assert.AreEqual(353.23967712691137, result.quotaList[2].PutBidPrice, 1e-8, "CU1910 2 PutBidPrice");
Assert.AreEqual(0.10999215915889668, result.quotaList[2].PutBidVol, 1e-8, "CU1910 2 PutBidVol");
Assert.AreEqual(0.0074965975621161156, result.quotaList[2].PutBidPricePercent, 1e-8, "CU1910 2 PutBidPricePercent");
Assert.AreEqual(46920, result.quotaList[4].Strike, 1e-8, "CU1910 4 Strike");
Assert.AreEqual(1014.6151321609087, result.quotaList[4].CallAskPrice, 1e-8, "CU1910 4 CallAskPrice");
Assert.AreEqual(0.16468529342053853, result.quotaList[4].CallAskVol, 1e-8, "CU1910 4 StriCallAskVolke");
Assert.AreEqual(0.021532579205452224, result.quotaList[4].CallAskPricePercent, 1e-8, "CU1910 4 CallAskPricePercent");
Assert.AreEqual(710.72991801994544, result.quotaList[4].CallBidPrice, 1e-8, "CU1910 4 CallBidPrice");
Assert.AreEqual(0.10945013204491073, result.quotaList[4].CallBidVol, 1e-8, "CU1910 4 CallBidVol");
Assert.AreEqual(0.015083402334888486, result.quotaList[4].CallBidPricePercent, 1e-8, "CU1910 4 CallBidPricePercent");
Assert.AreEqual(815.05181320994552, result.quotaList[4].PutAskPrice, 1e-8, "CU1910 4 PutAskPrice");
Assert.AreEqual(0.16468529342053853, result.quotaList[4].PutAskVol, 1e-8, "CU1910 4 PutAskVol");
Assert.AreEqual(0.01729736445691735, result.quotaList[4].PutAskPricePercent, 1e-8, "CU1910 4 PutAskPricePercent");
Assert.AreEqual(514.14037483185348, result.quotaList[4].PutBidPrice, 1e-8, "CU1910 4 PutBidPrice");
Assert.AreEqual(0.10999215915889665, result.quotaList[4].PutBidVol, 1e-8, "CU1910 4 PutBidVol");
Assert.AreEqual(0.010911298277416246, result.quotaList[4].PutBidPricePercent, 1e-8, "CU1910 4 PutBidPricePercent");
Assert.AreEqual(47320, result.quotaList[6].Strike, 1e-8, "CU1910 6 Strike");
Assert.AreEqual(818.91359452952906, result.quotaList[6].CallAskPrice, 1e-8, "CU1910 6 CallAskPrice");
Assert.AreEqual(0.16468529342053853, result.quotaList[6].CallAskVol, 1e-8, "CU1910 6 StriCallAskVolke");
Assert.AreEqual(0.017379320766755711, result.quotaList[6].CallAskPricePercent, 1e-8, "CU1910 6 CallAskPricePercent");
Assert.AreEqual(516.70763413647092, result.quotaList[6].CallBidPrice, 1e-8, "CU1910 6 CallBidPrice");
Assert.AreEqual(0.10999215915889665, result.quotaList[6].CallBidVol, 1e-8, "CU1910 6 CallBidVol");
Assert.AreEqual(0.010965781709178075, result.quotaList[6].CallBidPricePercent, 1e-8, "CU1910 6 CallBidPricePercent");
Assert.AreEqual(1018.4769134804924, result.quotaList[6].PutAskPrice, 1e-8, "CU1910 6 PutAskPrice");
Assert.AreEqual(0.16468529342053853, result.quotaList[6].PutAskVol, 1e-8, "CU1910 6 PutAskVol");
Assert.AreEqual(0.021614535515290585, result.quotaList[6].PutAskPricePercent, 1e-8, "CU1910 6 PutAskPricePercent");
Assert.AreEqual(713.28431131438026, result.quotaList[6].PutBidPrice, 1e-8, "CU1910 6 PutBidPrice");
Assert.AreEqual(0.10945013204491073, result.quotaList[6].PutBidVol, 1e-8, "CU1910 6 PutBidVol");
Assert.AreEqual(0.015137612718896016, result.quotaList[6].PutBidPricePercent, 1e-8, "CU1910 6 PutBidPricePercent");
Assert.AreEqual(48120, result.quotaList[10].Strike, 1e-8, "CU1910 10 Strike");
Assert.AreEqual(522.821549821188, result.quotaList[10].CallAskPrice, 1e-8, "CU1910 10 CallAskPrice");
Assert.AreEqual(0.1674694930736175, result.quotaList[10].CallAskVol, 1e-8, "CU1910 10 StriCallAskVolke");
Assert.AreEqual(0.011095533739838456, result.quotaList[10].CallAskPricePercent, 1e-8, "CU1910 10 CallAskPricePercent");
Assert.AreEqual(241.7972661396918, result.quotaList[10].CallBidPrice, 1e-8, "CU1910 10 CallBidPrice");
Assert.AreEqual(0.10999215915889668, result.quotaList[10].CallBidVol, 1e-8, "CU1910 10 CallBidVol");
Assert.AreEqual(0.00513152092826171, result.quotaList[10].CallBidPricePercent, 1e-8, "CU1910 10 CallBidPricePercent");
Assert.AreEqual(1520.6381445760005, result.quotaList[10].PutAskPrice, 1e-8, "CU1910 10 PutAskPrice");
Assert.AreEqual(0.16746949307361747, result.quotaList[10].PutAskVol, 1e-8, "CU1910 10 PutAskVol");
Assert.AreEqual(0.032271607482512746, result.quotaList[10].PutAskPricePercent, 1e-8, "CU1910 10 PutAskPricePercent");
Assert.AreEqual(1220.7727682449518, result.quotaList[10].PutBidPrice, 1e-8, "CU1910 10 PutBidPrice");
Assert.AreEqual(0.10581671458278175, result.quotaList[10].PutBidVol, 1e-8, "CU1910 10 PutBidVol");
Assert.AreEqual(0.025907741261565191, result.quotaList[10].PutBidPricePercent, 1e-8, "CU1910 10 PutBidPricePercent");
#endregion
#region CU1910 采用参数传递的100作为Strike间隔
tQuoteRequest = new TQuoteRequest()
{
underlyingCode = "CU1910",
maturityDate = new DateTime(2019, 7, 16),
strikeInterval = 100,
strikeCount = 3
};
result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest);
Assert.AreEqual(47120, result.LatestPrice, 1e-8, "CU1910 latest price 2");
Assert.AreEqual(3, result.quotaList.Count, "CU1910 quotaList.Count 2");
Assert.AreEqual(47020, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike");
Assert.AreEqual(961.16172642256765, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice 2");
Assert.AreEqual(0.16433726926385428, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke 2");
Assert.AreEqual(0.02039816906669286, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent 2");
Assert.AreEqual(659.063558942026, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice 2");
Assert.AreEqual(0.1097211456019037, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol 2");
Assert.AreEqual(0.013986917634593083, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent 2");
Assert.AreEqual(861.380066947086, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice 2");
Assert.AreEqual(0.16433726926385428, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol 2");
Assert.AreEqual(0.018280561692425423, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent 2");
Assert.AreEqual(560.78001074353426, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice 2");
Assert.AreEqual(0.10999215915889668, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol 2");
Assert.AreEqual(0.011901103793368725, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent 2");
Assert.AreEqual(47120, result.quotaList[1].Strike, "CU1910 1 Strike");
Assert.AreEqual(909.43850395703168, result.quotaList[1].CallAskPrice, 1e-8, "CU1910 1 CallAskPrice");
Assert.AreEqual(0.16398924510717011, result.quotaList[1].CallAskVol, 1e-8, "CU1910 1 StriCallAskVolke");
Assert.AreEqual(0.019300477588222235, result.quotaList[1].CallAskPricePercent, 1e-8, "CU1910 1 CallAskPricePercent");
Assert.AreEqual(610.01863646428569, result.quotaList[1].CallBidPrice, 1e-8, "CU1910 1 CallBidPrice");
Assert.AreEqual(0.10999215915889667, result.quotaList[1].CallBidVol, 1e-8, "CU1910 1 CallBidVol");
Assert.AreEqual(0.01294606613888552, result.quotaList[1].CallBidPricePercent, 1e-8, "CU1910 1 CallBidPricePercent");
Assert.AreEqual(909.43850395703532, result.quotaList[1].PutAskPrice, 1e-8, "CU1910 1 PutAskPrice");
Assert.AreEqual(0.16398924510717011, result.quotaList[1].PutAskVol, 1e-8, "CU1910 1 PutAskVol");
Assert.AreEqual(0.019300477588222311, result.quotaList[1].PutAskPricePercent, 1e-8, "CU1910 1 PutAskPricePercent");
Assert.AreEqual(610.01863646428569, result.quotaList[1].PutBidPrice, 1e-8, "CU1910 1 PutBidPrice");
Assert.AreEqual(0.10999215915889667, result.quotaList[1].PutBidVol, 1e-8, "CU1910 1 PutBidVol");
Assert.AreEqual(0.01294606613888552, result.quotaList[1].PutBidPricePercent, 1e-8, "CU1910 1 PutBidPricePercent");
#endregion
#region AP911 系统未设置Strike间隔,应使用100
tQuoteRequest = new TQuoteRequest()
{
underlyingCode = "AP911",
maturityDate = new DateTime(2019, 7, 16),
spotPrice = 8600
};
result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest);
Assert.AreEqual(8600, result.LatestPrice, 1e-8, "AP911 latest price");
Assert.AreEqual(11, result.quotaList.Count, "AP911 quotaList.Count");
Assert.AreEqual(8100, result.quotaList[0].Strike, 1e-8, "AP911 0 Strike");
Assert.AreEqual(524.85087792247145, result.quotaList[0].CallAskPrice, 1e-8, "AP911 0 CallAskPrice");
Assert.AreEqual(0.17352349778994552, result.quotaList[0].CallAskVol, 1e-8, "AP911 0 StriCallAskVolke");
Assert.AreEqual(0.061029171851450167, result.quotaList[0].CallAskPricePercent, 1e-8, "AP911 0 CallAskPricePercent");
Assert.AreEqual(498.90324898752039, result.quotaList[0].CallBidPrice, 1e-8, "AP911 0 CallBidPrice");
Assert.AreEqual(0.054514165017942422, result.quotaList[0].CallBidVol, 1e-8, "AP911 0 CallBidVol");
Assert.AreEqual(0.0580120056962233, result.quotaList[0].CallBidPricePercent, 1e-8, "AP911 0 CallBidPricePercent");
Assert.AreEqual(25.951100081224173, result.quotaList[0].PutAskPrice, 1e-8, "AP911 0 PutAskPrice");
Assert.AreEqual(0.17352349778994552, result.quotaList[0].PutAskVol, 1e-8, "AP911 0 PutAskVol");
Assert.AreEqual(0.0030175697768865316, result.quotaList[0].PutAskPricePercent, 1e-8, "AP911 0 PutAskPricePercent");
Assert.AreEqual(3.5563656761788791, result.quotaList[0].PutBidPrice, 1e-8, "AP911 0 PutBidPrice");
Assert.AreEqual(0.10999215915889667, result.quotaList[0].PutBidVol, 1e-8, "AP911 0 PutBidVol");
Assert.AreEqual(0.00041353089257893942, result.quotaList[0].PutBidPricePercent, 1e-8, "AP911 0 PutBidPricePercent");
Assert.AreEqual(8300, result.quotaList[2].Strike, 1e-8, "AP911 2 Strike");
Assert.AreEqual(359.51333952624168, result.quotaList[2].CallAskPrice, 1e-8, "AP911 2 CallAskPrice");
Assert.AreEqual(0.16970980053784771, result.quotaList[2].CallAskVol, 1e-8, "AP911 2 StriCallAskVolke");
Assert.AreEqual(0.041803876689097873, result.quotaList[2].CallAskPricePercent, 1e-8, "AP911 2 CallAskPricePercent");
Assert.AreEqual(305.98465068823054, result.quotaList[2].CallBidPrice, 1e-8, "AP911 2 CallBidPrice");
Assert.AreEqual(0.0821231255492105, result.quotaList[2].CallBidVol, 1e-8, "AP911 2 CallBidVol");
Assert.AreEqual(0.035579610545143088, result.quotaList[2].CallBidPricePercent, 1e-8, "AP911 2 CallBidPricePercent");
Assert.AreEqual(60.173472821493313, result.quotaList[2].PutAskPrice, 1e-8, "AP911 2 PutAskPrice");
Assert.AreEqual(0.16970980053784771, result.quotaList[2].PutAskVol, 1e-8, "AP911 2 PutAskVol");
Assert.AreEqual(0.0069969154443596873, result.quotaList[2].PutAskPricePercent, 1e-8, "AP911 2 PutAskPricePercent");
Assert.AreEqual(19.357376942186907, result.quotaList[2].PutBidPrice, 1e-8, "AP911 2 PutBidPrice");
Assert.AreEqual(0.10999215915889667, result.quotaList[2].PutBidVol, 1e-8, "AP911 2 PutBidVol");
Assert.AreEqual(0.0022508577839752218, result.quotaList[2].PutBidPricePercent, 1e-8, "AP911 2 PutBidPricePercent");
#endregion
#endregion
}
[TestMethod]
public void TQuoteV2Test()
{
//等待数据初始化,等法见改进数据加载后可去掉
Thread.Sleep(3000);
#region Normal Vol Mode
PS.ResetConfig("{\"SkewMapVolConstruction\":\"false\"}");
#region CU1910 采用系统中设置的200strike间隔
var tQuoteRequest = new TQuoteRequest()
{
underlyingCode = "CU1910",
maturityDate = new DateTime(2019, 7, 16)
};
var result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest);
Assert.AreEqual(47120, result.LatestPrice, 1e-8, "CU1910 latest price");
Assert.AreEqual(11, result.quotaList.Count, "CU1910 quotaList.Count");
Assert.AreEqual(46120, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike");
Assert.AreEqual(1323.8188434410963, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice");
Assert.AreEqual(0.13071013016411998, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke");
Assert.AreEqual(0.028094627407493553, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent");
Assert.AreEqual(1113.8549476759197, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice");
Assert.AreEqual(0.0818819326542162, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol");
Assert.AreEqual(0.023638687344565357, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent");
Assert.AreEqual(326.00224868627646, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice");
Assert.AreEqual(0.13071013016411998, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol");
Assert.AreEqual(0.0069185536648191095, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent");
Assert.AreEqual(116.0383529211035, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice");
Assert.AreEqual(0.0818819326542162, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol");
Assert.AreEqual(0.0024626136018909908, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent");
Assert.AreEqual(46520, result.quotaList[2].Strike, 1e-8, "CU1910 2 Strike");
Assert.AreEqual(1055.4409173448089, result.quotaList[2].CallAskPrice, 1e-8, "CU1910 2 CallAskPrice");
Assert.AreEqual(0.13005274476513867, result.quotaList[2].CallAskVol, 1e-8, "CU1910 2 StriCallAskVolke");
Assert.AreEqual(0.022399000792546878, result.quotaList[2].CallAskPricePercent, 1e-8, "CU1910 2 CallAskPricePercent");
Assert.AreEqual(812.21812605787193, result.quotaList[2].CallBidPrice, 1e-8, "CU1910 2 CallBidPrice");
Assert.AreEqual(0.081854159592529716, result.quotaList[2].CallBidVol, 1e-8, "CU1910 2 CallBidVol");
Assert.AreEqual(0.017237226783910695, result.quotaList[2].CallBidPricePercent, 1e-8, "CU1910 2 CallBidPricePercent");
Assert.AreEqual(456.75096049191916, result.quotaList[2].PutAskPrice, 1e-8, "CU1910 2 PutAskPrice");
Assert.AreEqual(0.13005274476513867, result.quotaList[2].PutAskVol, 1e-8, "CU1910 2 PutAskVol");
Assert.AreEqual(0.0096933565469422573, result.quotaList[2].PutAskPricePercent, 1e-8, "CU1910 2 PutAskPricePercent");
Assert.AreEqual(213.52816920498219, result.quotaList[2].PutBidPrice, 1e-8, "CU1910 2 PutBidPrice");
Assert.AreEqual(0.081854159592529716, result.quotaList[2].PutBidVol, 1e-8, "CU1910 2 PutBidVol");
Assert.AreEqual(0.0045315825383060735, result.quotaList[2].PutBidPricePercent, 1e-8, "CU1910 2 PutBidPricePercent");
Assert.AreEqual(46920, result.quotaList[4].Strike, 1e-8, "CU1910 4 Strike");
Assert.AreEqual(820.295788822324, result.quotaList[4].CallAskPrice, 1e-8, "CU1910 4 CallAskPrice");
Assert.AreEqual(0.12939535936615731, result.quotaList[4].CallAskVol, 1e-8, "CU1910 4 StriCallAskVolke");
Assert.AreEqual(0.01740865426193387, result.quotaList[4].CallAskPricePercent, 1e-8, "CU1910 4 CallAskPricePercent");
Assert.AreEqual(559.61782699983837, result.quotaList[4].CallBidPrice, 1e-8, "CU1910 4 CallBidPrice");
Assert.AreEqual(0.081826386530843245, result.quotaList[4].CallBidVol, 1e-8, "CU1910 4 CallBidVol");
Assert.AreEqual(0.01187643945245837, result.quotaList[4].CallBidPricePercent, 1e-8, "CU1910 4 CallBidPricePercent");
Assert.AreEqual(620.73246987136076, result.quotaList[4].PutAskPrice, 1e-8, "CU1910 4 PutAskPrice");
Assert.AreEqual(0.12939535936615731, result.quotaList[4].PutAskVol, 1e-8, "CU1910 4 PutAskVol");
Assert.AreEqual(0.013173439513398997, result.quotaList[4].PutAskPricePercent, 1e-8, "CU1910 4 PutAskPricePercent");
Assert.AreEqual(360.05450804887511, result.quotaList[4].PutBidPrice, 1e-8, "CU1910 4 PutBidPrice");
Assert.AreEqual(0.081826386530843245, result.quotaList[4].PutBidVol, 1e-8, "CU1910 4 PutBidVol");
Assert.AreEqual(0.0076412247039234953, result.quotaList[4].PutBidPricePercent, 1e-8, "CU1910 4 PutBidPricePercent");
Assert.AreEqual(47320, result.quotaList[6].Strike, 1e-8, "CU1910 6 Strike");
Assert.AreEqual(623.75969955305777, result.quotaList[6].CallAskPrice, 1e-8, "CU1910 6 CallAskPrice");
Assert.AreEqual(0.12939535936615731, result.quotaList[6].CallAskVol, 1e-8, "CU1910 6 StriCallAskVolke");
Assert.AreEqual(0.013237684625489342, result.quotaList[6].CallAskPricePercent, 1e-8, "CU1910 6 CallAskPricePercent");
Assert.AreEqual(361.95132597733681, result.quotaList[6].CallBidPrice, 1e-8, "CU1910 6 CallBidPrice");
Assert.AreEqual(0.081826386530843245, result.quotaList[6].CallBidVol, 1e-8, "CU1910 6 CallBidVol");
Assert.AreEqual(0.0076814797533390662, result.quotaList[6].CallBidPricePercent, 1e-8, "CU1910 6 CallBidPricePercent");
Assert.AreEqual(823.32301850402462, result.quotaList[6].PutAskPrice, 1e-8, "CU1910 6 PutAskPrice");
Assert.AreEqual(0.12939535936615731, result.quotaList[6].PutAskVol, 1e-8, "CU1910 6 PutAskVol");
Assert.AreEqual(0.017472899374024291, result.quotaList[6].PutAskPricePercent, 1e-8, "CU1910 6 PutAskPricePercent");
Assert.AreEqual(561.51464492830371, result.quotaList[6].PutBidPrice, 1e-8, "CU1910 6 PutBidPrice");
Assert.AreEqual(0.081826386530843245, result.quotaList[6].PutBidVol, 1e-8, "CU1910 6 PutBidVol");
Assert.AreEqual(0.011916694501874018, result.quotaList[6].PutBidPricePercent, 1e-8, "CU1910 6 PutBidPricePercent");
Assert.AreEqual(48120, result.quotaList[10].Strike, 1e-8, "CU1910 10 Strike");
Assert.AreEqual(339.23353112420568, result.quotaList[10].CallAskPrice, 1e-8, "CU1910 10 CallAskPrice");
Assert.AreEqual(0.13071013016411998, result.quotaList[10].CallAskVol, 1e-8, "CU1910 10 StriCallAskVolke");
Assert.AreEqual(0.0071993533769992716, result.quotaList[10].CallAskPricePercent, 1e-8, "CU1910 10 CallAskPricePercent");
Assert.AreEqual(122.60154224895, result.quotaList[10].CallBidPrice, 1e-8, "CU1910 10 CallBidPrice");
Assert.AreEqual(0.081881932654216186, result.quotaList[10].CallBidVol, 1e-8, "CU1910 10 CallBidVol");
Assert.AreEqual(0.0026019003023970712, result.quotaList[10].CallBidPricePercent, 1e-8, "CU1910 10 CallBidPricePercent");
Assert.AreEqual(1337.05012587902, result.quotaList[10].PutAskPrice, 1e-8, "CU1910 10 PutAskPrice");
Assert.AreEqual(0.13071013016411998, result.quotaList[10].PutAskVol, 1e-8, "CU1910 10 PutAskVol");
Assert.AreEqual(0.0283754271196736, result.quotaList[10].PutAskPricePercent, 1e-8, "CU1910 10 PutAskPricePercent");
Assert.AreEqual(1120.4181370037679, result.quotaList[10].PutBidPrice, 1e-8, "CU1910 10 PutBidPrice");
Assert.AreEqual(0.081881932654216186, result.quotaList[10].PutBidVol, 1e-8, "CU1910 10 PutBidVol");
Assert.AreEqual(0.023777974045071475, result.quotaList[10].PutBidPricePercent, 1e-8, "CU1910 10 PutBidPricePercent");
#endregion
#region CU1910 采用参数传递的100作为Strike间隔
tQuoteRequest = new TQuoteRequest()
{
underlyingCode = "CU1910",
maturityDate = new DateTime(2019, 7, 16),
strikeInterval = 100,
strikeCount = 3
};
result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest);
Assert.AreEqual(47120, result.LatestPrice, 1e-8, "CU1910 latest price 2");
Assert.AreEqual(3, result.quotaList.Count, "CU1910 quotaList.Count 2");
Assert.AreEqual(47020, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike");
Assert.AreEqual(766.94209355431292, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice 2");
Assert.AreEqual(0.12923101301641202, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke 2");
Assert.AreEqual(0.016276360219743484, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent 2");
Assert.AreEqual(504.93702285546607, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice 2");
Assert.AreEqual(0.081819443265421635, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol 2");
Assert.AreEqual(0.010715980960430095, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent 2");
Assert.AreEqual(667.16043407883126, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice 2");
Assert.AreEqual(0.12923101301641202, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol 2");
Assert.AreEqual(0.014158752845476045, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent 2");
Assert.AreEqual(405.15536337998446, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice 2");
Assert.AreEqual(0.081819443265421635, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol 2");
Assert.AreEqual(0.0085983735861626578, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent 2");
Assert.AreEqual(47120, result.quotaList[1].Strike, "CU1910 1 Strike");
Assert.AreEqual(715.79433284572588, result.quotaList[1].CallAskPrice, 1e-8, "CU1910 1 CallAskPrice");
Assert.AreEqual(0.12906666666666669, result.quotaList[1].CallAskVol, 1e-8, "CU1910 1 StriCallAskVolke");
Assert.AreEqual(0.015190881427116424, result.quotaList[1].CallAskPricePercent, 1e-8, "CU1910 1 CallAskPricePercent");
Assert.AreEqual(453.74263717851096, result.quotaList[1].CallBidPrice, 1e-8, "CU1910 1 CallBidPrice");
Assert.AreEqual(0.08181250000000001, result.quotaList[1].CallBidVol, 1e-8, "CU1910 1 CallBidVol");
Assert.AreEqual(0.00962951267356772, result.quotaList[1].CallBidPricePercent, 1e-8, "CU1910 1 CallBidPricePercent");
Assert.AreEqual(715.79433284572588, result.quotaList[1].PutAskPrice, 1e-8, "CU1910 1 PutAskPrice");
Assert.AreEqual(0.12906666666666669, result.quotaList[1].PutAskVol, 1e-8, "CU1910 1 PutAskVol");
Assert.AreEqual(0.015190881427116424, result.quotaList[1].PutAskPricePercent, 1e-8, "CU1910 1 PutAskPricePercent");
Assert.AreEqual(453.74263717851454, result.quotaList[1].PutBidPrice, 1e-8, "CU1910 1 PutBidPrice");
Assert.AreEqual(0.08181250000000001, result.quotaList[1].PutBidVol, 1e-8, "CU1910 1 PutBidVol");
Assert.AreEqual(0.0096295126735677951, result.quotaList[1].PutBidPricePercent, 1e-8, "CU1910 1 PutBidPricePercent");
#endregion
#region AP911 系统未设置Strike间隔,应使用100
tQuoteRequest = new TQuoteRequest()
{
underlyingCode = "AP911",
maturityDate = new DateTime(2019, 7, 16),
spotPrice = 8600
};
result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest);
Assert.AreEqual(8600, result.LatestPrice, 1e-8, "AP911 latest price");
Assert.AreEqual(11, result.quotaList.Count, "AP911 quotaList.Count");
Assert.AreEqual(8100, result.quotaList[0].Strike, 1e-8, "AP911 0 Strike");
Assert.AreEqual(609.80154469645686, result.quotaList[0].CallAskPrice, 1e-8, "AP911 0 CallAskPrice");
Assert.AreEqual(0.3, result.quotaList[0].CallAskVol, 1e-8, "AP911 0 StriCallAskVolke");
Assert.AreEqual(0.070907156360053014, result.quotaList[0].CallAskPricePercent, 1e-8, "AP911 0 CallAskPricePercent");
Assert.AreEqual(609.801544696456, result.quotaList[0].CallBidPrice, 1e-8, "AP911 0 CallBidPrice");
Assert.AreEqual(0.3, result.quotaList[0].CallBidVol, 1e-8, "AP911 0 CallBidVol");
Assert.AreEqual(0.070907156360053014, result.quotaList[0].CallBidPricePercent, 1e-8, "AP911 0 CallBidPricePercent");
Assert.AreEqual(110.90176685520926, result.quotaList[0].PutAskPrice, 1e-8, "AP911 0 PutAskPrice");
Assert.AreEqual(0.3, result.quotaList[0].PutAskVol, 1e-8, "AP911 0 PutAskVol");
Assert.AreEqual(0.012895554285489448, result.quotaList[0].PutAskPricePercent, 1e-8, "AP911 0 PutAskPricePercent");
Assert.AreEqual(110.90176685520926, result.quotaList[0].PutBidPrice, 1e-8, "AP911 0 PutBidPrice");
Assert.AreEqual(0.3, result.quotaList[0].PutBidVol, 1e-8, "AP911 0 PutBidVol");
Assert.AreEqual(0.012895554285489448, result.quotaList[0].PutBidPricePercent, 1e-8, "AP911 0 PutBidPricePercent");
Assert.AreEqual(8300, result.quotaList[2].Strike, 1e-8, "AP911 2 Strike");
Assert.AreEqual(472.58446045531184, result.quotaList[2].CallAskPrice, 1e-8, "AP911 2 CallAskPrice");
Assert.AreEqual(0.3, result.quotaList[2].CallAskVol, 1e-8, "AP911 2 StriCallAskVolke");
Assert.AreEqual(0.054951681448292072, result.quotaList[2].CallAskPricePercent, 1e-8, "AP911 2 CallAskPricePercent");
Assert.AreEqual(472.58446045531184, result.quotaList[2].CallBidPrice, 1e-8, "AP911 2 CallBidPrice");
Assert.AreEqual(0.3, result.quotaList[2].CallBidVol, 1e-8, "AP911 2 CallBidVol");
Assert.AreEqual(0.054951681448292072, result.quotaList[2].CallBidPricePercent, 1e-8, "AP911 2 CallBidPricePercent");
Assert.AreEqual(173.24459375056367, result.quotaList[2].PutAskPrice, 1e-8, "AP911 2 PutAskPrice");
Assert.AreEqual(0.3, result.quotaList[2].PutAskVol, 1e-8, "AP911 2 PutAskVol");
Assert.AreEqual(0.020144720203553915, result.quotaList[2].PutAskPricePercent, 1e-8, "AP911 2 PutAskPricePercent");
Assert.AreEqual(173.24459375056367, result.quotaList[2].PutBidPrice, 1e-8, "AP911 2 PutBidPrice");
Assert.AreEqual(0.3, result.quotaList[2].PutBidVol, 1e-8, "AP911 2 PutBidVol");
Assert.AreEqual(0.020144720203553915, result.quotaList[2].PutBidPricePercent, 1e-8, "AP911 2 PutBidPricePercent");
#endregion
#endregion
#region SkewMap Vol Mode
PS.ResetConfig("{\"SkewMapVolConstruction\":\"true\"}");
#region CU1910 采用系统中设置的200strike间隔
tQuoteRequest = new TQuoteRequest()
{
underlyingCode = "CU1910",
maturityDate = new DateTime(2019, 7, 16)
};
result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest);
Assert.AreEqual(47120, result.LatestPrice, 1e-8, "CU1910 latest price");
Assert.AreEqual(11, result.quotaList.Count, "CU1910 quotaList.Count");
Assert.AreEqual(46120, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike");
Assert.AreEqual(1502.6575903670266, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice");
Assert.AreEqual(0.1674694930736175, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke");
Assert.AreEqual(0.031890016773493776, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent");
Assert.AreEqual(1210.8776103576965, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice");
Assert.AreEqual(0.10581671458278169, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol");
Assert.AreEqual(0.025697742155299162, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent");
Assert.AreEqual(504.84099561221052, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice");
Assert.AreEqual(0.1674694930736175, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol");
Assert.AreEqual(0.010713943030819408, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent");
Assert.AreEqual(231.33391923267263, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice");
Assert.AreEqual(0.10999215915889668, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol");
Assert.AreEqual(0.0049094634811687743, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent");
Assert.AreEqual(46520, result.quotaList[2].Strike, 1e-8, "CU1910 2 Strike");
Assert.AreEqual(1245.4771707744617, result.quotaList[2].CallAskPrice, 1e-8, "CU1910 2 CallAskPrice");
Assert.AreEqual(0.16607739179657319, result.quotaList[2].CallAskVol, 1e-8, "CU1910 2 StriCallAskVolke");
Assert.AreEqual(0.026432028242242396, result.quotaList[2].CallAskPricePercent, 1e-8, "CU1910 2 CallAskPricePercent");
Assert.AreEqual(942.12908835003475, result.quotaList[2].CallBidPrice, 1e-8, "CU1910 2 CallBidPrice");
Assert.AreEqual(0.10806727953002154, result.quotaList[2].CallBidVol, 1e-8, "CU1910 2 CallBidVol");
Assert.AreEqual(0.019994250601656084, result.quotaList[2].CallBidPricePercent, 1e-8, "CU1910 2 CallBidPricePercent");
Assert.AreEqual(646.78721392157206, result.quotaList[2].PutAskPrice, 1e-8, "CU1910 2 PutAskPrice");
Assert.AreEqual(0.16607739179657319, result.quotaList[2].PutAskVol, 1e-8, "CU1910 2 PutAskVol");
Assert.AreEqual(0.013726383996637778, result.quotaList[2].PutAskPricePercent, 1e-8, "CU1910 2 PutAskPricePercent");
Assert.AreEqual(353.23967712691137, result.quotaList[2].PutBidPrice, 1e-8, "CU1910 2 PutBidPrice");
Assert.AreEqual(0.10999215915889668, result.quotaList[2].PutBidVol, 1e-8, "CU1910 2 PutBidVol");
Assert.AreEqual(0.0074965975621161156, result.quotaList[2].PutBidPricePercent, 1e-8, "CU1910 2 PutBidPricePercent");
Assert.AreEqual(46920, result.quotaList[4].Strike, 1e-8, "CU1910 4 Strike");
Assert.AreEqual(1014.6151321609087, result.quotaList[4].CallAskPrice, 1e-8, "CU1910 4 CallAskPrice");
Assert.AreEqual(0.16468529342053853, result.quotaList[4].CallAskVol, 1e-8, "CU1910 4 StriCallAskVolke");
Assert.AreEqual(0.021532579205452224, result.quotaList[4].CallAskPricePercent, 1e-8, "CU1910 4 CallAskPricePercent");
Assert.AreEqual(710.72991801994544, result.quotaList[4].CallBidPrice, 1e-8, "CU1910 4 CallBidPrice");
Assert.AreEqual(0.10945013204491073, result.quotaList[4].CallBidVol, 1e-8, "CU1910 4 CallBidVol");
Assert.AreEqual(0.015083402334888486, result.quotaList[4].CallBidPricePercent, 1e-8, "CU1910 4 CallBidPricePercent");
Assert.AreEqual(815.05181320994552, result.quotaList[4].PutAskPrice, 1e-8, "CU1910 4 PutAskPrice");
Assert.AreEqual(0.16468529342053853, result.quotaList[4].PutAskVol, 1e-8, "CU1910 4 PutAskVol");
Assert.AreEqual(0.01729736445691735, result.quotaList[4].PutAskPricePercent, 1e-8, "CU1910 4 PutAskPricePercent");
Assert.AreEqual(514.14037483185348, result.quotaList[4].PutBidPrice, 1e-8, "CU1910 4 PutBidPrice");
Assert.AreEqual(0.10999215915889665, result.quotaList[4].PutBidVol, 1e-8, "CU1910 4 PutBidVol");
Assert.AreEqual(0.010911298277416246, result.quotaList[4].PutBidPricePercent, 1e-8, "CU1910 4 PutBidPricePercent");
Assert.AreEqual(47320, result.quotaList[6].Strike, 1e-8, "CU1910 6 Strike");
Assert.AreEqual(818.91359452952906, result.quotaList[6].CallAskPrice, 1e-8, "CU1910 6 CallAskPrice");
Assert.AreEqual(0.16468529342053853, result.quotaList[6].CallAskVol, 1e-8, "CU1910 6 StriCallAskVolke");
Assert.AreEqual(0.017379320766755711, result.quotaList[6].CallAskPricePercent, 1e-8, "CU1910 6 CallAskPricePercent");
Assert.AreEqual(516.70763413647092, result.quotaList[6].CallBidPrice, 1e-8, "CU1910 6 CallBidPrice");
Assert.AreEqual(0.10999215915889665, result.quotaList[6].CallBidVol, 1e-8, "CU1910 6 CallBidVol");
Assert.AreEqual(0.010965781709178075, result.quotaList[6].CallBidPricePercent, 1e-8, "CU1910 6 CallBidPricePercent");
Assert.AreEqual(1018.4769134804924, result.quotaList[6].PutAskPrice, 1e-8, "CU1910 6 PutAskPrice");
Assert.AreEqual(0.16468529342053853, result.quotaList[6].PutAskVol, 1e-8, "CU1910 6 PutAskVol");
Assert.AreEqual(0.021614535515290585, result.quotaList[6].PutAskPricePercent, 1e-8, "CU1910 6 PutAskPricePercent");
Assert.AreEqual(713.28431131438026, result.quotaList[6].PutBidPrice, 1e-8, "CU1910 6 PutBidPrice");
Assert.AreEqual(0.10945013204491073, result.quotaList[6].PutBidVol, 1e-8, "CU1910 6 PutBidVol");
Assert.AreEqual(0.015137612718896016, result.quotaList[6].PutBidPricePercent, 1e-8, "CU1910 6 PutBidPricePercent");
Assert.AreEqual(48120, result.quotaList[10].Strike, 1e-8, "CU1910 10 Strike");
Assert.AreEqual(522.821549821188, result.quotaList[10].CallAskPrice, 1e-8, "CU1910 10 CallAskPrice");
Assert.AreEqual(0.1674694930736175, result.quotaList[10].CallAskVol, 1e-8, "CU1910 10 StriCallAskVolke");
Assert.AreEqual(0.011095533739838456, result.quotaList[10].CallAskPricePercent, 1e-8, "CU1910 10 CallAskPricePercent");
Assert.AreEqual(241.7972661396918, result.quotaList[10].CallBidPrice, 1e-8, "CU1910 10 CallBidPrice");
Assert.AreEqual(0.10999215915889668, result.quotaList[10].CallBidVol, 1e-8, "CU1910 10 CallBidVol");
Assert.AreEqual(0.00513152092826171, result.quotaList[10].CallBidPricePercent, 1e-8, "CU1910 10 CallBidPricePercent");
Assert.AreEqual(1520.6381445760005, result.quotaList[10].PutAskPrice, 1e-8, "CU1910 10 PutAskPrice");
Assert.AreEqual(0.16746949307361747, result.quotaList[10].PutAskVol, 1e-8, "CU1910 10 PutAskVol");
Assert.AreEqual(0.032271607482512746, result.quotaList[10].PutAskPricePercent, 1e-8, "CU1910 10 PutAskPricePercent");
Assert.AreEqual(1220.7727682449518, result.quotaList[10].PutBidPrice, 1e-8, "CU1910 10 PutBidPrice");
Assert.AreEqual(0.10581671458278175, result.quotaList[10].PutBidVol, 1e-8, "CU1910 10 PutBidVol");
Assert.AreEqual(0.025907741261565191, result.quotaList[10].PutBidPricePercent, 1e-8, "CU1910 10 PutBidPricePercent");
#endregion
#region CU1910 采用参数传递的100作为Strike间隔
tQuoteRequest = new TQuoteRequest()
{
underlyingCode = "CU1910",
maturityDate = new DateTime(2019, 7, 16),
strikeInterval = 100,
strikeCount = 3
};
result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest);
Assert.AreEqual(47120, result.LatestPrice, 1e-8, "CU1910 latest price 2");
Assert.AreEqual(3, result.quotaList.Count, "CU1910 quotaList.Count 2");
Assert.AreEqual(47020, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike");
Assert.AreEqual(961.16172642256765, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice 2");
Assert.AreEqual(0.16433726926385428, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke 2");
Assert.AreEqual(0.02039816906669286, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent 2");
Assert.AreEqual(659.063558942026, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice 2");
Assert.AreEqual(0.1097211456019037, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol 2");
Assert.AreEqual(0.013986917634593083, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent 2");
Assert.AreEqual(861.380066947086, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice 2");
Assert.AreEqual(0.16433726926385428, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol 2");
Assert.AreEqual(0.018280561692425423, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent 2");
Assert.AreEqual(560.78001074353426, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice 2");
Assert.AreEqual(0.10999215915889668, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol 2");
Assert.AreEqual(0.011901103793368725, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent 2");
Assert.AreEqual(47120, result.quotaList[1].Strike, "CU1910 1 Strike");
Assert.AreEqual(909.43850395703168, result.quotaList[1].CallAskPrice, 1e-8, "CU1910 1 CallAskPrice");
Assert.AreEqual(0.16398924510717011, result.quotaList[1].CallAskVol, 1e-8, "CU1910 1 StriCallAskVolke");
Assert.AreEqual(0.019300477588222235, result.quotaList[1].CallAskPricePercent, 1e-8, "CU1910 1 CallAskPricePercent");
Assert.AreEqual(610.01863646428569, result.quotaList[1].CallBidPrice, 1e-8, "CU1910 1 CallBidPrice");
Assert.AreEqual(0.10999215915889667, result.quotaList[1].CallBidVol, 1e-8, "CU1910 1 CallBidVol");
Assert.AreEqual(0.01294606613888552, result.quotaList[1].CallBidPricePercent, 1e-8, "CU1910 1 CallBidPricePercent");
Assert.AreEqual(909.43850395703532, result.quotaList[1].PutAskPrice, 1e-8, "CU1910 1 PutAskPrice");
Assert.AreEqual(0.16398924510717011, result.quotaList[1].PutAskVol, 1e-8, "CU1910 1 PutAskVol");
Assert.AreEqual(0.019300477588222311, result.quotaList[1].PutAskPricePercent, 1e-8, "CU1910 1 PutAskPricePercent");
Assert.AreEqual(610.01863646428569, result.quotaList[1].PutBidPrice, 1e-8, "CU1910 1 PutBidPrice");
Assert.AreEqual(0.10999215915889667, result.quotaList[1].PutBidVol, 1e-8, "CU1910 1 PutBidVol");
Assert.AreEqual(0.01294606613888552, result.quotaList[1].PutBidPricePercent, 1e-8, "CU1910 1 PutBidPricePercent");
#endregion
#region AP911 系统未设置Strike间隔,应使用100
tQuoteRequest = new TQuoteRequest()
{
underlyingCode = "AP911",
maturityDate = new DateTime(2019, 7, 16),
spotPrice = 8600
};
result = new TQuoteService(OptUserInfo.UnitTestUser).Execute(tQuoteRequest);
Assert.AreEqual(8600, result.LatestPrice, 1e-8, "AP911 latest price");
Assert.AreEqual(11, result.quotaList.Count, "AP911 quotaList.Count");
Assert.AreEqual(8100, result.quotaList[0].Strike, 1e-8, "AP911 0 Strike");
Assert.AreEqual(524.85087792247145, result.quotaList[0].CallAskPrice, 1e-8, "AP911 0 CallAskPrice");
Assert.AreEqual(0.17352349778994552, result.quotaList[0].CallAskVol, 1e-8, "AP911 0 StriCallAskVolke");
Assert.AreEqual(0.061029171851450167, result.quotaList[0].CallAskPricePercent, 1e-8, "AP911 0 CallAskPricePercent");
Assert.AreEqual(498.90324898752039, result.quotaList[0].CallBidPrice, 1e-8, "AP911 0 CallBidPrice");
Assert.AreEqual(0.054514165017942422, result.quotaList[0].CallBidVol, 1e-8, "AP911 0 CallBidVol");
Assert.AreEqual(0.0580120056962233, result.quotaList[0].CallBidPricePercent, 1e-8, "AP911 0 CallBidPricePercent");
Assert.AreEqual(25.951100081224173, result.quotaList[0].PutAskPrice, 1e-8, "AP911 0 PutAskPrice");
Assert.AreEqual(0.17352349778994552, result.quotaList[0].PutAskVol, 1e-8, "AP911 0 PutAskVol");
Assert.AreEqual(0.0030175697768865316, result.quotaList[0].PutAskPricePercent, 1e-8, "AP911 0 PutAskPricePercent");
Assert.AreEqual(3.5563656761788791, result.quotaList[0].PutBidPrice, 1e-8, "AP911 0 PutBidPrice");
Assert.AreEqual(0.10999215915889667, result.quotaList[0].PutBidVol, 1e-8, "AP911 0 PutBidVol");
Assert.AreEqual(0.00041353089257893942, result.quotaList[0].PutBidPricePercent, 1e-8, "AP911 0 PutBidPricePercent");
Assert.AreEqual(8300, result.quotaList[2].Strike, 1e-8, "AP911 2 Strike");
Assert.AreEqual(359.51333952624168, result.quotaList[2].CallAskPrice, 1e-8, "AP911 2 CallAskPrice");
Assert.AreEqual(0.16970980053784771, result.quotaList[2].CallAskVol, 1e-8, "AP911 2 StriCallAskVolke");
Assert.AreEqual(0.041803876689097873, result.quotaList[2].CallAskPricePercent, 1e-8, "AP911 2 CallAskPricePercent");
Assert.AreEqual(305.98465068823054, result.quotaList[2].CallBidPrice, 1e-8, "AP911 2 CallBidPrice");
Assert.AreEqual(0.0821231255492105, result.quotaList[2].CallBidVol, 1e-8, "AP911 2 CallBidVol");
Assert.AreEqual(0.035579610545143088, result.quotaList[2].CallBidPricePercent, 1e-8, "AP911 2 CallBidPricePercent");
Assert.AreEqual(60.173472821493313, result.quotaList[2].PutAskPrice, 1e-8, "AP911 2 PutAskPrice");
Assert.AreEqual(0.16970980053784771, result.quotaList[2].PutAskVol, 1e-8, "AP911 2 PutAskVol");
Assert.AreEqual(0.0069969154443596873, result.quotaList[2].PutAskPricePercent, 1e-8, "AP911 2 PutAskPricePercent");
Assert.AreEqual(19.357376942186907, result.quotaList[2].PutBidPrice, 1e-8, "AP911 2 PutBidPrice");
Assert.AreEqual(0.10999215915889667, result.quotaList[2].PutBidVol, 1e-8, "AP911 2 PutBidVol");
Assert.AreEqual(0.0022508577839752218, result.quotaList[2].PutBidPricePercent, 1e-8, "AP911 2 PutBidPricePercent");
#endregion
#endregion
}
/// <summary>
/// 用户自定义波动率的T型报价测试
/// </summary>
[TestMethod]
public void TQuoteWithCustomizedVol()
{
//等待数据初始化,等法见改进数据加载后可去掉
Thread.Sleep(3000);
#region Normal Vol Mode
PS.ResetConfig("{\"SkewMapVolConstruction\":\"false\"}");
var tQuoteRequest = new TQuoteWithCustomizedVolRequest()
{
UnderlyingCode = "CU1910",
MaturityDate = "2019-07-16",
SpotPrice = 47120,
Records = new List<TQuoteRecord>()
{
new TQuoteRecord() {
Strike = 46120,
CallAskVol = 0.13077323776205435,
CallBidVol = 0.081913770241203956,
PutAskVol = 0.13077323776205435,
PutBidVol = 0.081913770241203956
},
new TQuoteRecord() {
Strike = 46520,
CallAskVol = 0.13011253524877023,
CallBidVol = 0.081885976840221253,
PutAskVol = 0.13011253524877023,
PutBidVol = 0.081885976840221253
},
}
};
var result = new TQuoteService(OptUserInfo.UnitTestUser).TQuoteWithCustomizedVol(tQuoteRequest);
Assert.AreEqual(46120, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike");
Assert.AreEqual(1324.1156586629375, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice");
Assert.AreEqual(0.13077323776205435, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke");
Assert.AreEqual(0.028100926542082714, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent");
Assert.AreEqual(1113.9729435134141, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice");
Assert.AreEqual(0.081913770241203956, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol");
Assert.AreEqual(0.023641191500709126, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent");
Assert.AreEqual(326.29906390812664, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice");
Assert.AreEqual(0.13077323776205435, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol");
Assert.AreEqual(0.00692485279940846, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent");
Assert.AreEqual(116.15634875859961, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice");
Assert.AreEqual(0.081913770241203956, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol");
Assert.AreEqual(0.0024651177580347966, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent");
Assert.AreEqual(46520, result.quotaList[1].Strike, 1e-8, "CU1910 2 Strike");
Assert.AreEqual(1055.7525657923322, result.quotaList[1].CallAskPrice, 1e-8, "CU1910 2 CallAskPrice");
Assert.AreEqual(0.13011253524877023, result.quotaList[1].CallAskVol, 1e-8, "CU1910 2 StriCallAskVolke");
Assert.AreEqual(0.022405614723945932, result.quotaList[1].CallAskPricePercent, 1e-8, "CU1910 2 CallAskPricePercent");
Assert.AreEqual(812.3705295309245, result.quotaList[1].CallBidPrice, 1e-8, "CU1910 2 CallBidPrice");
Assert.AreEqual(0.081885976840221253, result.quotaList[1].CallBidVol, 1e-8, "CU1910 2 CallBidVol");
Assert.AreEqual(0.017240461153033203, result.quotaList[1].CallBidPricePercent, 1e-8, "CU1910 2 CallBidPricePercent");
Assert.AreEqual(457.0626089394425, result.quotaList[1].PutAskPrice, 1e-8, "CU1910 2 PutAskPrice");
Assert.AreEqual(0.13011253524877023, result.quotaList[1].PutAskVol, 1e-8, "CU1910 2 PutAskVol");
Assert.AreEqual(0.00969997047834131, result.quotaList[1].PutAskPricePercent, 1e-8, "CU1910 2 PutAskPricePercent");
Assert.AreEqual(213.68057267803292, result.quotaList[1].PutBidPrice, 1e-8, "CU1910 2 PutBidPrice");
Assert.AreEqual(0.081885976840221253, result.quotaList[1].PutBidVol, 1e-8, "CU1910 2 PutBidVol");
Assert.AreEqual(0.0045348169074285426, result.quotaList[1].PutBidPricePercent, 1e-8, "CU1910 2 PutBidPricePercent");
#endregion
}
[TestMethod]
public void TQuoteWithCustomizedVolV2()
{
//等待数据初始化,等法见改进数据加载后可去掉
Thread.Sleep(3000);
PS.ResetConfig("{\"SkewMapVolConstruction\":\"false\"}");
var tQuoteRequest = new TQuoteWithCustomizedVolRequest()
{
UnderlyingCode = "CU1910",
MaturityDate = "2019-07-16",
SpotPrice = 47120,
Records = new List<TQuoteRecord>()
{
new TQuoteRecord() {
Strike = 46120,
CallAskVol = 0.13077323776205435,
CallBidVol = 0.081913770241203956,
PutAskVol = 0.13077323776205435,
PutBidVol = 0.081913770241203956
},
new TQuoteRecord() {
Strike = 46520,
CallAskVol = 0.13011253524877023,
CallBidVol = 0.081885976840221253,
PutAskVol = 0.13011253524877023,
PutBidVol = 0.081885976840221253
},
}
};
var result = new TQuoteService(OptUserInfo.UnitTestUser).TQuoteWithCustomizedVol(tQuoteRequest);
Assert.AreEqual(46120, result.quotaList[0].Strike, 1e-8, "CU1910 0 Strike");
Assert.AreEqual(1324.1156586629375, result.quotaList[0].CallAskPrice, 1e-8, "CU1910 0 CallAskPrice");
Assert.AreEqual(0.13077323776205435, result.quotaList[0].CallAskVol, 1e-8, "CU1910 0 StriCallAskVolke");
Assert.AreEqual(0.028100926542082714, result.quotaList[0].CallAskPricePercent, 1e-8, "CU1910 0 CallAskPricePercent");
Assert.AreEqual(1113.9729435134141, result.quotaList[0].CallBidPrice, 1e-8, "CU1910 0 CallBidPrice");
Assert.AreEqual(0.081913770241203956, result.quotaList[0].CallBidVol, 1e-8, "CU1910 0 CallBidVol");
Assert.AreEqual(0.023641191500709126, result.quotaList[0].CallBidPricePercent, 1e-8, "CU1910 0 CallBidPricePercent");
Assert.AreEqual(326.29906390812664, result.quotaList[0].PutAskPrice, 1e-8, "CU1910 0 PutAskPrice");
Assert.AreEqual(0.13077323776205435, result.quotaList[0].PutAskVol, 1e-8, "CU1910 0 PutAskVol");
Assert.AreEqual(0.00692485279940846, result.quotaList[0].PutAskPricePercent, 1e-8, "CU1910 0 PutAskPricePercent");
Assert.AreEqual(116.15634875859961, result.quotaList[0].PutBidPrice, 1e-8, "CU1910 0 PutBidPrice");
Assert.AreEqual(0.081913770241203956, result.quotaList[0].PutBidVol, 1e-8, "CU1910 0 PutBidVol");
Assert.AreEqual(0.0024651177580347966, result.quotaList[0].PutBidPricePercent, 1e-8, "CU1910 0 PutBidPricePercent");
Assert.AreEqual(46520, result.quotaList[1].Strike, 1e-8, "CU1910 2 Strike");
Assert.AreEqual(1055.7525657923322, result.quotaList[1].CallAskPrice, 1e-8, "CU1910 2 CallAskPrice");
Assert.AreEqual(0.13011253524877023, result.quotaList[1].CallAskVol, 1e-8, "CU1910 2 StriCallAskVolke");
Assert.AreEqual(0.022405614723945932, result.quotaList[1].CallAskPricePercent, 1e-8, "CU1910 2 CallAskPricePercent");
Assert.AreEqual(812.3705295309245, result.quotaList[1].CallBidPrice, 1e-8, "CU1910 2 CallBidPrice");
Assert.AreEqual(0.081885976840221253, result.quotaList[1].CallBidVol, 1e-8, "CU1910 2 CallBidVol");
Assert.AreEqual(0.017240461153033203, result.quotaList[1].CallBidPricePercent, 1e-8, "CU1910 2 CallBidPricePercent");
Assert.AreEqual(457.0626089394425, result.quotaList[1].PutAskPrice, 1e-8, "CU1910 2 PutAskPrice");
Assert.AreEqual(0.13011253524877023, result.quotaList[1].PutAskVol, 1e-8, "CU1910 2 PutAskVol");
Assert.AreEqual(0.00969997047834131, result.quotaList[1].PutAskPricePercent, 1e-8, "CU1910 2 PutAskPricePercent");
Assert.AreEqual(213.68057267803292, result.quotaList[1].PutBidPrice, 1e-8, "CU1910 2 PutBidPrice");
Assert.AreEqual(0.081885976840221253, result.quotaList[1].PutBidVol, 1e-8, "CU1910 2 PutBidVol");
Assert.AreEqual(0.0045348169074285426, result.quotaList[1].PutBidPricePercent, 1e-8, "CU1910 2 PutBidPricePercent");
}
public class ClientOptionQuoteResult
{
public double BuyQuote { get; set; }
public double BuyVol { get; set; }
public double BuyPv { get; set; }
public double BuyPercentageQuote { get; set; }
public double SellQuote { get; set; }
public double SellVol { get; set; }
public double SellPv { get; set; }
public double SellPercentageQuote { get; set; }
public double SellMargin { get; set; }
}
public ClientOptionQuoteResult ValueOptionV2(OptionValueRequest req, string userGroup = null)
{
try
{
var valueDate = req.ValueDate ?? CalculatorHelper.RealtimeQuoteValueDate();
if (req.MaturityDate < valueDate)
{
throw new Exception("到期日小于估值日");
}
var qdpMarketId = Guid.NewGuid().ToString();
var marketProxy = QdpMarketManager.Instance.GetPrebuiltMarketProxy(qdpMarketId);
volatility bidVol = null, askVol = null;
underlying_manager underlying = null;
Variety variety = null;
using (var db = new YLContext())
{
underlying = DataCacheProvider.GetUnderlyingDataSource().GetData(req.UnderlyingCode);
if (underlying != null)
{
underlying.QuotationDate = valueDate;
if (PS.Config.ErpElement.SkewMapVolConstruction)
{
bidVol = askVol = VolatilityHelper.GetVol(valueDate.Date, "交易", underlying.UnderlyingCode, userGroup ?? "");
}
else
{
bidVol = VolatilityHelper.GetVol(valueDate.Date, "报价Bid", underlying.UnderlyingCode, userGroup ?? "");
askVol = VolatilityHelper.GetVol(valueDate.Date, "报价Ask", underlying.UnderlyingCode, userGroup ?? "");
}
variety = db.variety.FirstOrDefault(x => x.VarietyCode != null && x.id == underlying.UnderlyingTypeId);
}
}
if (underlying != null && bidVol != null && askVol != null)
{
//var maturityDate = req.MaturityDate.ToString("yyyy-MM-dd");
//根据用户设置的bid/ask天数调整规则来分别调整到期日
//TODO: bidMaturityShift和askMaturityShift应该从某数据库表读取
var bidMaturityShift = 0;
var askMaturityShift = 0;
var otherInfo = "";
var client_param = ClientPricingParamService.GetPricingParam(valueDate.Date, req.MaturityDate.Date);
if (client_param != null)
{
askMaturityShift = client_param.ask_tuning_day ?? 0;
bidMaturityShift = client_param.bid_tuning_day ?? 0;
otherInfo = client_param.ToJson();//$"ask到期日偏离{askMaturityShift}天,bid到期日偏离{bidMaturityShift}天";
}
var dayCount = CalculatorHelper.GetTradeDayCount();
var bidMaturityDate = QdpCalendarHelper.ShiftDate(req.MaturityDate, dayCount, bidMaturityShift).DateTime;
var askMaturityDate = QdpCalendarHelper.ShiftDate(req.MaturityDate, dayCount, askMaturityShift).DateTime;
//使用全局的DiscountCurve以提高计算效率
var discountCurveName = Guid.NewGuid().ToString();
var discountCurve = CalculatorHelper.CreateConstantRiskFreeCurve(discountCurveName, valuedateBLL.RiskFreeRate / 100.0);
marketProxy.AddYieldCurve(discountCurveName, valueDate.ToString("yyyy-MM-dd"), discountCurve);
var volSurfaceName = underlying.GenerateVolSurfaceName();
var parameter = new VanillaOptionParameter()
{
ValueDate = valueDate,
SpotPrices = new Dictionary<string, double>() { { req.UnderlyingCode, req.SpotPrice } },
DiscountCurveName = discountCurveName,
HasNightMarket = variety.HasNightMarket,
PreciseTimeMode = req.preciseTimeMode
};
var trade = new trade()
{
TradeType = "香草期权",
TradeDate = valueDate,
MaturityDate = bidMaturityDate,
ExerciseDate = bidMaturityDate,
OptionType = req.OptionType,
ExerciseMode = req.Exercise,
BuySell = "Buy",
Strike = req.Strike,
Notional = req.Notional
};
parameter.Volatility = VolatilityHelper.GetInterpolatedVol(
volConstructionType: PS.Config.ErpElement.SkewMapVolConstruction ? VolConstructionType.SkewMap : VolConstructionType.Normal,
volSurface: bidVol,
valueDate: valueDate,
underlyingCode: req.UnderlyingCode,
exerciseDate: bidMaturityDate,
strike: req.Strike,
isBuy: true,
isCall: req.OptionType == "Call",
spotPrice: req.SpotPrice,
isMoneynessOption: false);
var bidResult = ValueCalculator.CalculateTradeValue(qdpMarketId, trade, underlying, parameter);
trade.MaturityDate = askMaturityDate;
trade.ExerciseDate = askMaturityDate;
parameter.Volatility = VolatilityHelper.GetInterpolatedVol(
volConstructionType: PS.Config.ErpElement.SkewMapVolConstruction ? VolConstructionType.SkewMap : VolConstructionType.Normal,
volSurface: askVol,
valueDate: valueDate,
underlyingCode: req.UnderlyingCode,
exerciseDate: askMaturityDate,
strike: req.Strike,
isBuy: false,
isCall: req.OptionType == "Call",
spotPrice: req.SpotPrice,
isMoneynessOption: false);
var askResult = ValueCalculator.CalculateTradeValue(qdpMarketId, trade, underlying, parameter);
var valueResult = new ClientOptionQuoteResult()
{
BuyQuote = Math.Abs(bidResult.Pv) / req.Notional,
BuyVol = bidResult.Vol,
BuyPv = Math.Abs(bidResult.Pv),
BuyPercentageQuote = Math.Abs(bidResult.Pv) / req.Notional / req.SpotPrice,
SellQuote = Math.Abs(askResult.Pv) / req.Notional,
SellVol = askResult.Vol,
SellPv = Math.Abs(askResult.Pv),
SellPercentageQuote = Math.Abs(askResult.Pv) / req.Notional / req.SpotPrice,
SellMargin =
OptionCalculatorV1.CommodityFutureOptionMargin(
Math.Abs(askResult.Pv),
req.Notional,
req.Strike,
req.SpotPrice,
variety.Margin ?? 0.0, //避免品种预付金未设置而导致计算出错
req.OptionType)
};
QdpMarketManager.Instance.RemovePrebuiltMarketProxy(qdpMarketId);
return valueResult;
}
else
{
LogFactory.GetLogger().Error($"ValueOptionV2: 未找到标的{req.UnderlyingCode}或其波动率为空!");
return null;
}
}
catch (Exception ex)
{
LogFactory.GetLogger().Error("ValueOptionV2", ex);
return null;
}
}
public class OptionValueRequest
{
public DateTime? ValueDate { get; set; }
public string UnderlyingCode { get; set; }
public DateTime MaturityDate { get; set; }
public string UnderlyingInstrumentType { get; set; }
public double Strike { get; set; }
public string OptionType { get; set; }
public string Exercise { get; set; }
public double SpotPrice { get; set; }
public double Notional { get; set; }
public double RiskFreeRate { get; set; }
public double Vol { get; set; }
public bool preciseTimeMode { get; set; } = true;
}
[TestMethod]
public void ValueOptionTestV2()
{
//等待数据初始化,等法见改进数据加载后可去掉
Thread.Sleep(3000);
#region Normal Vol Mode
PS.ResetConfig("{\"SkewMapVolConstruction\":\"false\"}");
var valueRequest = new OptionValueRequest()
{
ValueDate = new DateTime(2019, 6, 17),
UnderlyingCode = "CU1910",
MaturityDate = new DateTime(2019, 7, 16),
UnderlyingInstrumentType = "CommodityFutures",
Strike = 46520,
OptionType = "Call",
Exercise = "European",
SpotPrice = 47120,
Notional = 2
};
var result = ValueOptionV2(valueRequest);
Assert.AreEqual(0.081854159592529716, result.BuyVol, 1e-8, "Call BuyVol");
Assert.AreEqual(1624.4362521157439, result.BuyPv, 1e-8, "Call BuyPv");
Assert.AreEqual(812.21812605787193, result.BuyQuote, 1e-8, "Call BuyQuote");
Assert.AreEqual(0.017237226783910695, result.BuyPercentageQuote, 1e-8, "Call BuyQuote");
Assert.AreEqual(0.13005274476513867, result.SellVol, 1e-8, "Call SellVol");
Assert.AreEqual(2110.8818346896178, result.SellPv, 1e-8, "Call SellPv");
Assert.AreEqual(1055.4409173448089, result.SellQuote, 1e-8, "Call SellQuote");
Assert.AreEqual(0.022399000792546878, result.SellPercentageQuote, 1e-8, "Call SellPercentageQuote");
Assert.AreEqual(11534.881834689619, result.SellMargin, 1e-8, "Call SellMargin");
valueRequest = new OptionValueRequest()
{
ValueDate = new DateTime(2019, 6, 17),
UnderlyingCode = "CU1910",
MaturityDate = new DateTime(2019, 7, 16),
UnderlyingInstrumentType = "CommodityFutures",
Strike = 46520,
OptionType = "Put",
Exercise = "European",
SpotPrice = 47120,
Notional = 2
};
result = ValueOptionV2(valueRequest);
Assert.AreEqual(0.081854159592529716, result.BuyVol, 1e-8, "Put BuyVol");
Assert.AreEqual(427.05633840996438, result.BuyPv, 1e-8, "Put BuyPv");
Assert.AreEqual(213.52816920498219, result.BuyQuote, 1e-8, "Put BuyQuote");
Assert.AreEqual(0.0045315825383060735, result.BuyPercentageQuote, 1e-8, "Put BuyQuote");
Assert.AreEqual(0.13005274476513867, result.SellVol, 1e-8, "Put SellVol");
Assert.AreEqual(913.50192098383832, result.SellPv, 1e-8, "Put SellPv");
Assert.AreEqual(456.75096049191916, result.SellQuote, 1e-8, "Put SellQuote");
Assert.AreEqual(0.0096933565469422573, result.SellPercentageQuote, 1e-8, "Put SellPercentageQuote");
Assert.AreEqual(9737.50192098384, result.SellMargin, 1e-8, "Put SellMargin");
#endregion
#region SkewMap Vol Mode
PS.ResetConfig("{\"SkewMapVolConstruction\":\"true\"}");
valueRequest = new OptionValueRequest()
{
ValueDate = new DateTime(2019, 6, 17),
UnderlyingCode = "CU1910",
MaturityDate = new DateTime(2019, 7, 16),
UnderlyingInstrumentType = "CommodityFutures",
Strike = 46520,
OptionType = "Call",
Exercise = "European",
SpotPrice = 47120,
Notional = 2
};
result = ValueOptionV2(valueRequest);
Assert.AreEqual(0.10806727953002154, result.BuyVol, 1e-8, "Call BuyVol");
Assert.AreEqual(1884.2581767000695, result.BuyPv, 1e-8, "Call BuyPv");
Assert.AreEqual(942.12908835003475, result.BuyQuote, 1e-8, "Call BuyQuote");
Assert.AreEqual(0.019994250601656084, result.BuyPercentageQuote, 1e-8, "Call BuyQuote");
Assert.AreEqual(0.16607739179657319, result.SellVol, 1e-8, "Call SellVol");
Assert.AreEqual(2490.9543415489234, result.SellPv, 1e-8, "Call SellPv");
Assert.AreEqual(1245.4771707744617, result.SellQuote, 1e-8, "Call SellQuote");
Assert.AreEqual(0.026432028242242396, result.SellPercentageQuote, 1e-8, "Call SellPercentageQuote");
Assert.AreEqual(11914.954341548924, result.SellMargin, 1e-8, "Call SellMargin");
valueRequest = new OptionValueRequest()
{
ValueDate = new DateTime(2019, 6, 17),
UnderlyingCode = "CU1910",
MaturityDate = new DateTime(2019, 7, 16),
UnderlyingInstrumentType = "CommodityFutures",
Strike = 46520,
OptionType = "Put",
Exercise = "European",
SpotPrice = 47120,
Notional = 2
};
result = ValueOptionV2(valueRequest);
Assert.AreEqual(0.10999215915889668, result.BuyVol, 1e-8, "Put BuyVol");
Assert.AreEqual(706.47935425382275, result.BuyPv, 1e-8, "Put BuyPv");
Assert.AreEqual(353.23967712691137, result.BuyQuote, 1e-8, "Put BuyQuote");
Assert.AreEqual(0.0074965975621161156, result.BuyPercentageQuote, 1e-8, "Put BuyQuote");
Assert.AreEqual(0.16607739179657319, result.SellVol, 1e-8, "Put SellVol");
Assert.AreEqual(1293.5744278431441, result.SellPv, 1e-8, "Put SellPv");
Assert.AreEqual(646.78721392157206, result.SellQuote, 1e-8, "Put SellQuote");
Assert.AreEqual(0.013726383996637778, result.SellPercentageQuote, 1e-8, "Put SellPercentageQuote");
Assert.AreEqual(10117.574427843145, result.SellMargin, 1e-8, "Put SellMargin");
#endregion
}
public class CustomizedQuoteResult
{
public double CallAskPrice { get; set; }
public double CallBidPrice { get; set; }
public double Strike { get; set; }
public double PutAskPrice { get; set; }
public double PutBidPrice { get; set; }
public double BidVol { get; set; }
public double AskVol { get; set; }
public double LatestPrice { get; set; }
public double Change { get; set; }
public double ChangePercent { get; set; }
public double RiskFreeRate { get; set; }
}
public CustomizedQuoteResult CustomizedQuoteV2(CustomizedQuoteRequest request, string userGroup = "")
{
try
{
if (request.MaturityDate < request.ValueDate)
{
throw new Exception("到期日小于估值日");
}
var qdpMarketId = Guid.NewGuid().ToString();
var marketProxy = QdpMarketManager.Instance.GetPrebuiltMarketProxy(qdpMarketId);
var valueDate = request.ValueDate;
var maturityDate = request.MaturityDate;
volatility bidVol = null, askVol = null;
underlying_manager underlying = null;
Variety variety = null;
using (var db = new YLContext())
{
underlying = DataCacheProvider.GetUnderlyingDataSource().GetData(request.UnderlyingCode);
if (underlying != null)
{
variety = db.variety.FirstOrDefault(x => x.VarietyCode != null && x.id == underlying.UnderlyingTypeId);
if (request.BidVol <= 0 && request.AskVol <= 0)
{
underlying.QuotationDate = request.ValueDate;
if (PS.Config.ErpElement.SkewMapVolConstruction)
{
bidVol = askVol = VolatilityHelper.GetVol(DateTime.Today, "交易", underlying.UnderlyingCode, userGroup ?? "");
}
else
{
bidVol = VolatilityHelper.GetVol(DateTime.Today, "报价Bid", underlying.UnderlyingCode, userGroup ?? "");
askVol = VolatilityHelper.GetVol(DateTime.Today, "报价Ask", underlying.UnderlyingCode, userGroup ?? "");
}
}
}
}
//如果用户未指定标的,构造一个虚拟标的
if (string.IsNullOrWhiteSpace(request.UnderlyingCode))
{
underlying = new underlying_manager()
{
UnderlyingCode = "dummy_code",
UnderlyingInstrumentType = "CommodityFutures",
QuotationDate = request.ValueDate,
Price = request.SpotPrice,
PrevClosePrice = request.SpotPrice,
MaturityDate = request.MaturityDate
};
}
//根据用户设置的bid/ask天数调整规则来分别调整到期日
//TODO: bidMaturityShift和askMaturityShift应该从某数据库表读取
var bidMaturityShift = 0;
var askMaturityShift = 0;
var otherInfo = "";
var client_param = ClientPricingParamService.GetPricingParam(request.ValueDate.Date, request.MaturityDate.Date);
if (client_param != null)
{
askMaturityShift = client_param.ask_tuning_day ?? 0;
bidMaturityShift = client_param.bid_tuning_day ?? 0;
otherInfo = client_param.ToJson();//$"ask到期日偏离{askMaturityShift}天,bid到期日偏离{bidMaturityShift}天";
}
var dayCount = CalculatorHelper.GetTradeDayCount();
var bidMaturityDate = QdpCalendarHelper.ShiftDate(maturityDate, dayCount, bidMaturityShift).DateTime;
var askMaturityDate = QdpCalendarHelper.ShiftDate(maturityDate, dayCount, askMaturityShift).DateTime;
if (underlying != null)
{
// 如果未传入最新价格,则使用系统里的最新价格; 如果未传入无风险利率,则使用系统里的无风险利率
var spotPrice = (request.SpotPrice <= 0) ? (underlying.Price ?? 0) : request.SpotPrice;
var riskFreeRate = (request.RiskFreeRate <= 0) ? (valuedateBLL.RiskFreeRate / 100.0) : request.RiskFreeRate;
var strike = (request.Strike <= 0) ? spotPrice : request.Strike;
//使用全局的DiscountCurve以提高计算效率
var discountCurveName = Guid.NewGuid().ToString();
var discountCurve = CalculatorHelper.CreateConstantRiskFreeCurve(discountCurveName, riskFreeRate);
marketProxy.AddYieldCurve(discountCurveName, valueDate, discountCurve);
var trade = new trade()
{
TradeType = "香草期权",
TradeDate = request.ValueDate,
ExerciseMode = request.Exercise,
Strike = strike,
Notional = request.Notional
};
var parameter = new VanillaOptionParameter()
{
ValueDate = request.ValueDate,
DiscountCurveName = discountCurveName,
SpotPrices = new Dictionary<string, double>() { { underlying.UnderlyingCode, spotPrice } },
HasNightMarket = variety.HasNightMarket,
PreciseTimeMode = request.preciseTimeMode
};
trade.OptionType = "看涨";
trade.MaturityDate = bidMaturityDate;
trade.ExerciseDate = bidMaturityDate;
parameter.Volatility =
bidVol == null ?
request.BidVol :
VolatilityHelper.GetInterpolatedVol(
volConstructionType: PS.Config.ErpElement.SkewMapVolConstruction ? VolConstructionType.SkewMap : VolConstructionType.Normal,
volSurface: bidVol,
valueDate: valueDate,
underlyingCode: underlying.UnderlyingCode,
exerciseDate: bidMaturityDate,
strike: strike,
isBuy: true,
isCall: true,
spotPrice: spotPrice,
isMoneynessOption: false);
var callBidResult = ValueCalculator.CalculateTradeValue(qdpMarketId, trade, underlying, parameter);
trade.OptionType = "看跌";
parameter.Volatility =
bidVol == null ?
request.BidVol :
VolatilityHelper.GetInterpolatedVol(
volConstructionType: PS.Config.ErpElement.SkewMapVolConstruction ? VolConstructionType.SkewMap : VolConstructionType.Normal,
volSurface: bidVol,
valueDate: valueDate,
underlyingCode: underlying.UnderlyingCode,
exerciseDate: bidMaturityDate,
strike: strike,
isBuy: true,
isCall: false,
spotPrice: spotPrice,
isMoneynessOption: false);
var putBidResult = ValueCalculator.CalculateTradeValue(qdpMarketId, trade, underlying, parameter);
trade.OptionType = "看涨";
trade.MaturityDate = askMaturityDate;
trade.ExerciseDate = askMaturityDate;
parameter.Volatility =
askVol == null ?
request.AskVol :
VolatilityHelper.GetInterpolatedVol(
volConstructionType: PS.Config.ErpElement.SkewMapVolConstruction ? VolConstructionType.SkewMap : VolConstructionType.Normal,
volSurface: askVol,
valueDate: valueDate,
underlyingCode: underlying.UnderlyingCode,
exerciseDate: askMaturityDate,
strike: strike,
isBuy: false,
isCall: true,
spotPrice: spotPrice,
isMoneynessOption: false);
var callAskResult = ValueCalculator.CalculateTradeValue(qdpMarketId, trade, underlying, parameter);
trade.OptionType = "看跌";
parameter.Volatility =
askVol == null ?
request.AskVol :
VolatilityHelper.GetInterpolatedVol(
volConstructionType: PS.Config.ErpElement.SkewMapVolConstruction ? VolConstructionType.SkewMap : VolConstructionType.Normal,
volSurface: askVol,
valueDate: valueDate,
underlyingCode: underlying.UnderlyingCode,
exerciseDate: askMaturityDate,
strike: strike,
isBuy: false,
isCall: false,
spotPrice: spotPrice,
isMoneynessOption: false);
var putAskResult = ValueCalculator.CalculateTradeValue(qdpMarketId, trade, underlying, parameter);
var valueResult = new CustomizedQuoteResult
{
CallAskPrice = callAskResult.Pv / request.Notional,
CallBidPrice = callBidResult.Pv / request.Notional,
Strike = strike,
PutAskPrice = putAskResult.Pv / request.Notional,
PutBidPrice = putBidResult.Pv / request.Notional,
BidVol = callBidResult.Vol,
AskVol = callAskResult.Vol,
RiskFreeRate = riskFreeRate,
LatestPrice = underlying.Price.Value
};
if (underlying.PrevClosePrice.HasValue && underlying.PrevClosePrice.Value > 0.0)
{
valueResult.Change = underlying.Price.Value - underlying.PrevClosePrice.Value;
valueResult.ChangePercent = valueResult.Change / underlying.PrevClosePrice.Value;
}
else
{
valueResult.Change = 0.0;
valueResult.ChangePercent = 0.0;
}
QdpMarketManager.Instance.RemovePrebuiltMarketProxy(qdpMarketId);
return valueResult;
}
else
{
return null;
}
}
catch (Exception)
{
return null;
}
}
public class CustomizedQuoteRequest
{
public DateTime ValueDate { get; set; }
public string UnderlyingCode { get; set; }
public DateTime MaturityDate { get; set; }
public string UnderlyingInstrumentType { get; set; }
public double Strike { get; set; }
public string Exercise { get; set; }
public double SpotPrice { get; set; }
public double Notional { get; set; }
public double RiskFreeRate { get; set; }
public double BidVol { get; set; }
public double AskVol { get; set; }
public bool preciseTimeMode { get; set; } = true;
}
[TestMethod]
public void CustomizedQuoteTestV2()
{
//等待数据初始化,等法见改进数据加载后可去掉
Thread.Sleep(3000);
#region Normal Vol Mode
PS.ResetConfig("{\"SkewMapVolConstruction\":\"false\"}");
var request = new CustomizedQuoteRequest()
{
ValueDate = new DateTime(2019, 6, 17),
UnderlyingCode = "CU1910",
MaturityDate = new DateTime(2019, 7, 16),
UnderlyingInstrumentType = "CommodityFutures",
Strike = 46520,
Exercise = "European",
SpotPrice = 47120,
Notional = 2
};
var result = CustomizedQuoteV2(request);
Assert.AreEqual(46520, result.Strike, 1e-8, "Call BuyQuote");
Assert.AreEqual(0.081854159592529716, result.BidVol, 1e-8, "Call BuyVol");
Assert.AreEqual(812.21812605787193, result.CallBidPrice, 1e-8, "Call BuyPv");
Assert.AreEqual(1055.4409173448089, result.CallAskPrice, 1e-8, "Call BuyQuote");
Assert.AreEqual(0.13005274476513867, result.AskVol, 1e-8, "Call SellQuote");
Assert.AreEqual(213.52816920498219, result.PutBidPrice, 1e-8, "Call SellVol");
Assert.AreEqual(456.75096049191916, result.PutAskPrice, 1e-8, "Call SellPv");
request = new CustomizedQuoteRequest()
{
ValueDate = new DateTime(2019, 6, 17),
UnderlyingCode = "CU1910",
MaturityDate = new DateTime(2019, 7, 16),
UnderlyingInstrumentType = "CommodityFutures",
Strike = 46520,
Exercise = "European",
SpotPrice = 47120,
Notional = 2,
BidVol = 0.123,
AskVol = 0.246
};
result = CustomizedQuoteV2(request);
Assert.AreEqual(46520, result.Strike, 1e-8, "Call BuyQuote");
Assert.AreEqual(0.123, result.BidVol, 1e-8, "Call BuyVol");
Assert.AreEqual(1018.7969661161158, result.CallBidPrice, 1e-8, "Call BuyPv");
Assert.AreEqual(1675.7118430710132, result.CallAskPrice, 1e-8, "Call BuyQuote");
Assert.AreEqual(0.246, result.AskVol, 1e-8, "Call SellQuote");
Assert.AreEqual(420.107009263226, result.PutBidPrice, 1e-8, "Call SellVol");
Assert.AreEqual(1077.0218862181234, result.PutAskPrice, 1e-8, "Call SellPv");
#endregion
#region SkewMap Vol Mode
PS.ResetConfig("{\"SkewMapVolConstruction\":\"true\"}");
request = new CustomizedQuoteRequest()
{
ValueDate = new DateTime(2019, 6, 17),
UnderlyingCode = "CU1910",
MaturityDate = new DateTime(2019, 7, 16),
UnderlyingInstrumentType = "CommodityFutures",
Strike = 46520,
Exercise = "European",
SpotPrice = 47120,
Notional = 2
};
result = CustomizedQuoteV2(request);
Assert.AreEqual(46520, result.Strike, 1e-8, "Call BuyQuote");
Assert.AreEqual(0.10806727953002154, result.BidVol, 1e-8, "Call BuyVol");
Assert.AreEqual(942.12908835003475, result.CallBidPrice, 1e-8, "Call BuyPv");
Assert.AreEqual(1245.4771707744617, result.CallAskPrice, 1e-8, "Call BuyQuote");
Assert.AreEqual(0.16607739179657319, result.AskVol, 1e-8, "Call SellQuote");
Assert.AreEqual(353.23967712691137, result.PutBidPrice, 1e-8, "Call SellVol");
Assert.AreEqual(646.78721392157206, result.PutAskPrice, 1e-8, "Call SellPv");
request = new CustomizedQuoteRequest()
{
ValueDate = new DateTime(2019, 6, 17),
UnderlyingCode = "CU1910",
MaturityDate = new DateTime(2019, 7, 16),
UnderlyingInstrumentType = "CommodityFutures",
Strike = 46520,
Exercise = "European",
SpotPrice = 47120,
Notional = 2,
BidVol = 0.123,
AskVol = 0.246
};
result = CustomizedQuoteV2(request);
Assert.AreEqual(46520, result.Strike, 1e-8, "Call BuyQuote");
Assert.AreEqual(0.123, result.BidVol, 1e-8, "Call BuyVol");
Assert.AreEqual(1018.7969661161158, result.CallBidPrice, 1e-8, "Call BuyPv");
Assert.AreEqual(1675.7118430710132, result.CallAskPrice, 1e-8, "Call BuyQuote");
Assert.AreEqual(0.246, result.AskVol, 1e-8, "Call SellQuote");
Assert.AreEqual(420.107009263226, result.PutBidPrice, 1e-8, "Call SellVol");
Assert.AreEqual(1077.0218862181234, result.PutAskPrice, 1e-8, "Call SellPv");
#endregion
}
/// <summary>
/// 在期权定价时调整定价日
/// </summary>
private DateTime AdjustQuotationDate(DateTime quotationDate, string tradeType)
{
// 对凤凰雪球不做报价日调整
if (tradeType == "雪球期权" || tradeType == "凤凰期权")
{
return quotationDate;
}
//为了暂时修复一个QDP计算方式与客户需求不匹配的情况
//在非精确模式下,QDP不包括交易日当天的时间价值,但根据报价需求,需要将交易日当天的时间价值计算在内,
//所以要将交易日向前移动一天。未来QDP支持传递TTM来计算时,可以直接在TTM上加1,而不用移动交易日
//注意:当前这个临时修改必须在波动率插值之前调用,这样才能正确设置波动率日期
var calendar = CalendarImpl.Get("chn");
return calendar.PrevBizDay(quotationDate).DateTime;
}
[TestMethod]
public void GetOptionCalculatorTestV2()
{
//等待数据初始化,等法见改进数据加载后可去掉
Thread.Sleep(3000);
var userInfo = OptUserInfo.UnitTestUser;
var calcParam = new OptionCalcParams
{
IsCalcGreeks = true,
EngineName = null,
UserId = "0"
};
var underlying = new underlying_manager()
{
UnderlyingCode = "RB1909",
UnderlyingInstrumentType = "CommodityFutures",
MaturityDate = new DateTime(2019, 7, 16),
QuotationDate = new DateTime(2019, 6, 17),
Price = 2900.0
};
#region Normal Vol Mode
#region 香草期权
PS.ResetConfig("{\"SkewMapVolConstruction\":\"false\"}");
var tradeId = Guid.NewGuid().ToString();
var vtParam = new VanillaOptionTradeParam
{
annualizedFactor = 0,
isAnnualized = false,
buysell = "买入",
preciseTimeMode = false,
dividendRate = 0,
dividends = null,
endDate = new DateTime(2019, 7, 16),
exerciseDate = new DateTime(2019, 7, 16),
exerciseType = "European",
hasNightMarket = false,
initialSpotPrice = 2900.0,
isForwardTrade = false,
isMoneynessOption = false,
notional = 20,
optionType = OptionType.Call,
participationRate = 1,
principalRate = 0,
riskFreeRate = 0.035,
settlementDate = new DateTime(2019, 7, 16),
startDate = new DateTime(2019, 6, 17),
strike = 2950,
timeToMaturityDays = double.NaN,
tradeDate = new DateTime(2019, 6, 17),
tradeId = tradeId,
underlyingInstrumentType = "CommodityFutures",
underlyingTickers = new[] { "RB1909" },
volSurfaceNames = new[] { tradeId }
};
var result = new TradeValueResult[5];
var quotDate = AdjustQuotationDate(vtParam.tradeDate, vtParam.tradeType);
using (var marketProxy = new MarketProxy(quotDate, vtParam.riskFreeRate))
{
var volatility = QdpVolHelper.GetDefaultVolatility(0.3);
marketProxy.SetVolSurface(vtParam.tradeId, volatility);
var vcParam = new OptionCalcParam<VanillaOptionTradeParam>(vtParam)
{
pricingRequest = QdpPricingRequest.BASIC_GREEKS,
spotPrices = new[] { vtParam.initialSpotPrice },
engineName = null
};
result[0] = TradeRiskCalcUtil.GetVanillaOptionValue(marketProxy, vcParam);
vtParam.optionType = OptionType.Put;
result[1] = TradeRiskCalcUtil.GetVanillaOptionValue(marketProxy, vcParam);
}
Assert.IsTrue(result[0] != null && result[1] != null);
Assert.AreEqual(0.3, result[0].Vol, 1e-8, "");
Assert.AreEqual(1634.1684722973448, result[0].Pv, 1e-8, "");
Assert.AreEqual(8.82155311051065, result[0].Delta, 1e-4, "");
Assert.AreEqual(0.030129099286568817, result[0].Gamma, 1e-5, "");
Assert.AreEqual(68.538687287491484, result[0].Vega, 1e-5, "");
Assert.AreEqual(-47.02780051542436, result[0].Theta, 1e-5, "");
Assert.AreEqual(-0.014733641666248331, result[0].Rho, 1e-5, "");
//Assert.AreEqual(0.3, result[1].Vol, 1e-8, "");
Assert.AreEqual(2631.017708698957, result[1].Pv, 1e-8, "");
Assert.AreEqual(-11.1154316174634, result[1].Delta, 1e-4, "");
Assert.AreEqual(0.030129149308777414, result[1].Gamma, 1e-5, "");
Assert.AreEqual(68.538687287718858, result[1].Vega, 1e-5, "");
Assert.AreEqual(-46.884799590299735, result[1].Theta, 1e-5, "");
Assert.AreEqual(-0.023721221400774085, result[1].Rho, 1e-5, "");
#endregion
#region 亚式期权
var trade = new trade()
{
TradeType = "亚式期权",
UnderlyingCode = underlying.UnderlyingCode,
UnderlyingInstrumentType = "CommodityFutures",
TradeDate = new DateTime(2019, 6, 17),
StartDate = new DateTime(2019, 6, 17),
MaturityDate = new DateTime(2019, 7, 16),
ExerciseDate = new DateTime(2019, 7, 16),
OptionType = "看涨",
ExerciseMode = "European",
Strike = 2950.0,
SpotPrice = 2900.0,
Notional = 20,
NoRiskRate = 0.035,
BuySell = "Buy",
TradeOpenVolatility = 0.3,
trade_asian_option = new trade_asian_option()
{
PayoffType = "ArithmeticAverage",
StrikeType = "Fixed",
AveragingPeriodStartDate = new DateTime(2019, 6, 17)
}
};
calcParam.QuotationType = "波动率调整";
calcParam.BidVol = 0.30;
calcParam.AskVol = 0.35;
result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam, CalcScenarioEnum.Pricing).ToArray();
Assert.AreEqual(2, result.Length, "");
Assert.AreEqual(0.3, result[0].Vol, 1e-8, "");
Assert.AreEqual(827.56511017840455, result[0].Pv, 1e-8, "");
Assert.AreEqual(7.7136697062655912, result[0].Delta, 1e-8, "");
Assert.AreEqual(0.048432627863803646, result[0].Gamma, 1e-8, "");
Assert.AreEqual(40.109226554295674, result[0].Vega, 1e-8, "");
Assert.AreEqual(-77.2550826512495, result[0].Theta, 1e-8, "");
Assert.AreEqual(-0.0074613162568880394, result[0].Rho, 1e-8, "");
Assert.AreEqual(827.56511017840455, result[0].TradePriceBid, 1e-8, "");
Assert.AreEqual(827.6, result[0].RoundedTradePriceBid, 1e-8, "");
Assert.AreEqual(1029.5537801997957, result[0].TradePriceAsk, 1e-8, "");
Assert.AreEqual(1029.6, result[0].RoundedTradePriceAsk, 1e-8, "");
Assert.AreEqual(1824.4143465800216, result[1].Pv, 1e-8, "");
Assert.AreEqual(-12.223315023152281, result[1].Delta, 1e-8, "");
Assert.AreEqual(0.048432484618388116, result[1].Gamma, 1e-8, "");
Assert.AreEqual(40.109226554511679, result[1].Vega, 1e-8, "");
Assert.AreEqual(-77.112081726129481, result[1].Theta, 1e-8, "");
Assert.AreEqual(-0.016448895991425162, result[1].Rho, 1e-8, "");
Assert.AreEqual(1824.4143465800216, result[1].TradePriceBid, 1e-8, "");
Assert.AreEqual(1824.4, result[1].RoundedTradePriceBid, 1e-8, "");
Assert.AreEqual(2026.4030166014081, result[1].TradePriceAsk, 1e-8, "");
Assert.AreEqual(2026.4, result[1].RoundedTradePriceAsk, 1e-8, "");
#endregion
#region 障碍期权
trade = new trade()
{
TradeType = "障碍期权",
UnderlyingCode = underlying.UnderlyingCode,
UnderlyingInstrumentType = "CommodityFutures",
TradeDate = new DateTime(2019, 6, 17),
StartDate = new DateTime(2019, 6, 17),
MaturityDate = new DateTime(2019, 7, 16),
ExerciseDate = new DateTime(2019, 7, 16),
OptionType = "看涨",
ExerciseMode = "European",
Strike = 2950.0,
SpotPrice = 2900.0,
Notional = 20,
NoRiskRate = 0.035,
BuySell = "Buy",
TradeOpenVolatility = 0.3,
trade_barrier_option = new trade_barrier_option()
{
BarrierType = "上升敲出",
BarrierPrice = 3000.0,
BarrierShift = 20,
Discrete = "离散",
Rebate = 20.0,
KnockInOutStatus = "Monitoring"
}
};
result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam, CalcScenarioEnum.ScenarioCalc).ToArray();
Assert.AreEqual(2, result.Length, "");
Assert.AreEqual(0.3, result[0].Vol, 1e-8, "");
Assert.AreEqual(239.48055669661045, result[0].Pv, 1e-8, "");
Assert.AreEqual(0.9664803751263662, result[0].Delta, 1e-8, "");
Assert.AreEqual(0.0014877446119498927, result[0].Gamma, 1e-8, "");
Assert.AreEqual(2.9460320661684136, result[0].Vega, 1e-8, "");
Assert.AreEqual(-2.3536033746325984, result[0].Theta, 1e-8, "");
Assert.AreEqual(-0.00016961721587449574, result[0].Rho, 1e-8, "");
Assert.AreEqual(239.48055669661045, result[0].TradePriceBid, 1e-8, "");
Assert.AreEqual(239.4, result[0].RoundedTradePriceBid, 1e-8, "");
Assert.AreEqual(252.59384629234816, result[0].TradePriceAsk, 1e-8, "");
Assert.AreEqual(252.6, result[0].RoundedTradePriceAsk, 1e-8, "");
Assert.AreEqual(2377.5015214798786, result[1].Pv, 1e-8, "");
Assert.AreEqual(-13.55024409649559, result[1].Delta, 1e-8, "");
Assert.AreEqual(0.012942437024321407, result[1].Gamma, 1e-8, "");
Assert.AreEqual(35.624956503443173, result[1].Vega, 1e-8, "");
Assert.AreEqual(-20.374879840752783, result[1].Theta, 1e-8, "");
Assert.AreEqual(-0.019445986393657223, result[1].Rho, 1e-8, "");
Assert.AreEqual(2377.5015214798786, result[1].TradePriceBid, 1e-8, "");
Assert.AreEqual(2377.6, result[1].RoundedTradePriceBid, 1e-8, "");
Assert.AreEqual(2545.7364831269824, result[1].TradePriceAsk, 1e-8, "");
Assert.AreEqual(2545.8, result[1].RoundedTradePriceAsk, 1e-8, "");
#endregion
#region 二元期权
trade = new trade()
{
TradeType = "二元期权",
UnderlyingCode = underlying.UnderlyingCode,
UnderlyingInstrumentType = "CommodityFutures",
TradeDate = new DateTime(2019, 6, 17),
StartDate = new DateTime(2019, 6, 17),
MaturityDate = new DateTime(2019, 7, 16),
ExerciseDate = new DateTime(2019, 7, 16),
OptionType = "看涨",
ExerciseMode = "European",
Strike = 2950.0,
SpotPrice = 2900.0,
Notional = 20,
NoRiskRate = 0.035,
BuySell = "Buy",
TradeOpenVolatility = 0.3,
trade_binary_option = new trade_binary_option()
{
PayoffType = "CashOrNothing",
CashOrNothingAmount = 200,
RebateType = "AtHit"
}
};
result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam, CalcScenarioEnum.ScenarioCalc).ToArray();
Assert.AreEqual(2, result.Length, "");
Assert.AreEqual(0.3, result[0].Vol, 1e-8, "");
Assert.AreEqual(1623.5863508863104, result[0].Pv, 1e-8, "");
Assert.AreEqual(5.9236973067754661, result[0].Delta, 1e-8, "");
Assert.AreEqual(0.0032816706152516417, result[0].Gamma, 1e-8, "");
Assert.AreEqual(7.4653126550401794, result[0].Vega, 1e-8, "");
Assert.AreEqual(-5.0737698819882553, result[0].Theta, 1e-8, "");
Assert.AreEqual(-0.014638233397386102, result[0].Rho, 1e-8, "");
Assert.AreEqual(1623.5863508863104, result[0].TradePriceBid, 1e-8, "");
Assert.AreEqual(1623.6, result[0].RoundedTradePriceBid, 1e-8, "");
Assert.AreEqual(1653.9889811223582, result[0].TradePriceAsk, 1e-8, "");
Assert.AreEqual(1654, result[0].RoundedTradePriceAsk, 1e-8, "");
Assert.AreEqual(2363.8105947201393, result[1].Pv, 1e-8, "");
Assert.AreEqual(-5.9236973067527288, result[1].Delta, 1e-8, "");
Assert.AreEqual(-0.0032816751627251506, result[1].Gamma, 1e-8, "");
Assert.AreEqual(-7.4653126550401794, result[1].Vega, 1e-8, "");
Assert.AreEqual(5.6457735824865267, result[1].Theta, 1e-8, "");
Assert.AreEqual(-0.021312085540694171, result[1].Rho, 1e-8, "");
Assert.AreEqual(2363.8105947201393, result[1].TradePriceBid, 1e-8, "");
Assert.AreEqual(2363.8, result[1].RoundedTradePriceBid, 1e-8, "");
Assert.AreEqual(2333.4079644840913, result[1].TradePriceAsk, 1e-8, "");
Assert.AreEqual(2333.4, result[1].RoundedTradePriceAsk, 1e-8, "");
#endregion
#region 合成价差期权
calcParam.QuotationType = "价格调整";
calcParam.BidVol = null;
calcParam.AskVol = null;
trade = new trade()
{
TradeType = "合成价差期权",
UnderlyingCode = underlying.UnderlyingCode,
UnderlyingInstrumentType = "CommodityFutures",
TradeDate = new DateTime(2019, 6, 17),
StartDate = new DateTime(2019, 6, 17),
MaturityDate = new DateTime(2019, 7, 16),
ExerciseDate = new DateTime(2019, 7, 16),
OptionType = "看涨",
ExerciseMode = "European",
Strike = 18,
SpotPrice = 16,
Notional = 20,
NoRiskRate = 0.035,
BuySell = "Buy",
TradeOpenVolatility = 30
};
underlying.Price = 16;
result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam, CalcScenarioEnum.ScenarioCalc).ToArray();
Assert.AreEqual(2, result.Length, "");
Assert.AreEqual(30, result[0].Vol, 1e-8, "");
Assert.AreEqual(53.470199810079578, result[0].Pv, 1e-8, "");
Assert.AreEqual(8.2213181785292022, result[0].Delta, 1e-8, "");
Assert.AreEqual(0.86144587200465139, result[0].Gamma, 1e-8, "");
Assert.AreEqual(0.0233014070001758, result[0].Vega, 1e-8, "");
Assert.AreEqual(-1.5988365822235835, result[0].Theta, 1e-8, "");
Assert.AreEqual(-0.00048208662520323744, result[0].Rho, 1e-8, "");
Assert.AreEqual(93.344169266144078, result[1].Pv, 1e-8, "");
Assert.AreEqual(-11.715666549507375, result[1].Delta, 1e-8, "");
Assert.AreEqual(0.86144587129410866, result[1].Gamma, 1e-8, "");
Assert.AreEqual(0.023301406999820529, result[1].Vega, 1e-8, "");
Assert.AreEqual(-1.5931165452185923, result[1].Theta, 1e-8, "");
Assert.AreEqual(-0.00084158981458415383, result[1].Rho, 1e-8, "");
#endregion
#region 彩虹期权
//trade = new trade()
//{
// TradeType = "彩虹期权",
// UnderlyingInstrumentType = "CommodityFutures",
// TradeDate = new DateTime(2019, 6, 17),
// StartDate = new DateTime(2019, 6, 17),
// MaturityDate = new DateTime(2019, 7, 16),
// ExerciseDate = new DateTime(2019, 7, 16),
// OptionType = "看涨",
// ExerciseMode = "European",
// Strike = 2950,
// SpotPrice = 2900,
// Notional = 20,
// NoRiskRate = 0.035,
// BuySell = "Buy",
// QuotationType = "波动率调整",
// BidVol = 0.30,
// AskVol = 0.35,
// trade_rainbow_option = new trade_rainbow_option()
// {
// RainbowType = "BestOfAssetsOrCash",
// CashAmount = 150.0,
// UnderlyingAssetCode = "RB1910",
// UnderlyingAssetCode2 = "RB1912",
// Strike2 = 2970.0,
// Vol2 = 0.25,
// SpotPrice1 = 2900,
// SpotPrice2 = 2850,
// CorRelation = 0.85
// }
//};
//underlying.Price = 2900;
//result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam).ToList();
//Assert.AreEqual(2, result.Count, "");
//Assert.AreEqual(3029.6196742715465, result[0].Pv, 1e-8, "");
//Assert.AreEqual(0.37022875631009811, result[0].Delta, 1e-8, "");
//Assert.AreEqual(0.0018189894035458565, result[0].Gamma, 1e-8, "");
//Assert.AreEqual(3.0355839711528461, result[0].Vega, 1e-8, "");
//Assert.AreEqual(0, result[0].Theta, 1e-8, "");
//Assert.AreEqual(-0.027316119817896833, result[0].Rho, 1e-8, "");
//Assert.AreEqual(3029.6196742715465, result[1].Pv, 1e-8, "");
//Assert.AreEqual(0.37022875631009811, result[1].Delta, 1e-8, "");
//Assert.AreEqual(0.0018189894035458565, result[1].Gamma, 1e-8, "");
//Assert.AreEqual(3.0355839711528461, result[1].Vega, 1e-8, "");
//Assert.AreEqual(0, result[1].Theta, 1e-8, "");
//Assert.AreEqual(-0.027316119817896833, result[1].Rho, 1e-8, "");
#endregion
#endregion
#region SkewMap Vol Mode
PS.ResetConfig("{\"SkewMapVolConstruction\":\"true\"}");
underlying.Price = 2900;
calcParam.QuotationType = "波动率调整";
calcParam.BidVol = 0.30;
calcParam.AskVol = 0.35;
trade = new trade()
{
TradeType = "香草期权",
UnderlyingCode = underlying.UnderlyingCode,
UnderlyingInstrumentType = "CommodityFutures",
TradeDate = new DateTime(2019, 6, 17),
StartDate = new DateTime(2019, 6, 17),
MaturityDate = new DateTime(2019, 7, 16),
ExerciseDate = new DateTime(2019, 7, 16),
OptionType = "看涨",
ExerciseMode = "European",
Strike = 2950.0,
SpotPrice = 2900.0,
Notional = 20,
NoRiskRate = 0.035,
BuySell = "Buy",
TradeOpenVolatility = 0.30,
};
result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam, CalcScenarioEnum.ScenarioCalc).ToArray();
Assert.AreEqual(2, result.Length, "");
//Assert.AreEqual(0.3, result[0].Vol, 1e-8, "");
Assert.AreEqual(1634.1684722973448, result[0].Pv, 1e-8, "");
Assert.AreEqual(8.82155311051065, result[0].Delta, 1e-8, "");
Assert.AreEqual(0.030129099286568817, result[0].Gamma, 1e-8, "");
Assert.AreEqual(68.538687287491484, result[0].Vega, 1e-8, "");
Assert.AreEqual(-47.02780051542436, result[0].Theta, 1e-8, "");
Assert.AreEqual(-0.014733641666248331, result[0].Rho, 1e-8, "");
Assert.AreEqual(1634.1684722973448, result[0].TradePriceBid, 1e-8, "");
Assert.AreEqual(1634.2, result[0].RoundedTradePriceBid, 1e-8, "");
Assert.AreEqual(1977.6834940442398, result[0].TradePriceAsk, 1e-8, "");
Assert.AreEqual(1977.6, result[0].RoundedTradePriceAsk, 1e-8, "");
//Assert.AreEqual(0.3, result[1].Vol, 1e-8, "");
Assert.AreEqual(2631.017708698957, result[1].Pv, 1e-8, "");
Assert.AreEqual(-11.1154316174634, result[1].Delta, 1e-8, "");
Assert.AreEqual(0.030129149308777414, result[1].Gamma, 1e-8, "");
Assert.AreEqual(68.538687287718858, result[1].Vega, 1e-8, "");
Assert.AreEqual(-46.884799590299735, result[1].Theta, 1e-8, "");
Assert.AreEqual(-0.023721221400774085, result[1].Rho, 1e-8, "");
Assert.AreEqual(2631.017708698957, result[1].TradePriceBid, 1e-8, "");
Assert.AreEqual(2631, result[1].RoundedTradePriceBid, 1e-8, "");
Assert.AreEqual(2974.5327304458565, result[1].TradePriceAsk, 1e-8, "");
Assert.AreEqual(2974.6, result[1].RoundedTradePriceAsk, 1e-8, "");
trade = new trade()
{
TradeType = "香草期权",
UnderlyingCode = underlying.UnderlyingCode,
UnderlyingInstrumentType = "CommodityFutures",
TradeDate = new DateTime(2019, 6, 17),
StartDate = new DateTime(2019, 6, 17),
MaturityDate = new DateTime(2019, 7, 16),
ExerciseDate = new DateTime(2019, 7, 16),
OptionType = "看涨",
ExerciseMode = "European",
Strike = 2950.0,
SpotPrice = 2900.0,
Notional = 20,
NoRiskRate = 0.035,
BuySell = "Buy",
TradeOpenVolatility = 0.3
};
result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam, CalcScenarioEnum.ScenarioCalc).ToArray();
Assert.AreEqual(2, result.Length, "");
Assert.AreEqual(0.3, result[0].Vol, 1e-8, "");
Assert.AreEqual(1634.1684722973448, result[0].Pv, 1e-8, "");
Assert.AreEqual(8.82155311051065, result[0].Delta, 1e-8, "");
Assert.AreEqual(0.030129099286568817, result[0].Gamma, 1e-8, "");
Assert.AreEqual(68.538687287491484, result[0].Vega, 1e-8, "");
Assert.AreEqual(-47.02780051542436, result[0].Theta, 1e-8, "");
Assert.AreEqual(-0.014733641666248331, result[0].Rho, 1e-8, "");
Assert.AreEqual(1634.1684722973448, result[0].TradePriceBid, 1e-8, "");
Assert.AreEqual(1634.2, result[0].RoundedTradePriceBid, 1e-8, "");
Assert.AreEqual(1634.1684722973448, result[0].TradePriceAsk, 1e-8, "");
Assert.AreEqual(1634.2, result[0].RoundedTradePriceAsk, 1e-8, "");
//Assert.AreEqual(0.3, result[1].Vol, 1e-8, "");
Assert.AreEqual(2631.017708698957, result[1].Pv, 1e-8, "");
Assert.AreEqual(-11.1154316174634, result[1].Delta, 1e-8, "");
Assert.AreEqual(0.030129149308777414, result[1].Gamma, 1e-8, "");
Assert.AreEqual(68.538687287718858, result[1].Vega, 1e-8, "");
Assert.AreEqual(-46.884799590299735, result[1].Theta, 1e-8, "");
Assert.AreEqual(-0.023721221400774085, result[1].Rho, 1e-8, "");
Assert.AreEqual(2631.017708698957, result[1].TradePriceBid, 1e-8, "");
Assert.AreEqual(2631, result[1].RoundedTradePriceBid, 1e-8, "");
Assert.AreEqual(2631.017708698957, result[1].TradePriceAsk, 1e-8, "");
Assert.AreEqual(2631, result[1].RoundedTradePriceAsk, 1e-8, "");
//从波动率曲面读取
trade = new trade()
{
TradeType = "香草期权",
UnderlyingCode = underlying.UnderlyingCode,
UnderlyingInstrumentType = "CommodityFutures",
TradeDate = new DateTime(2019, 6, 17),
StartDate = new DateTime(2019, 6, 17),
MaturityDate = new DateTime(2019, 7, 16),
ExerciseDate = new DateTime(2019, 7, 16),
OptionType = "看涨",
ExerciseMode = "European",
Strike = 2950.0,
SpotPrice = 2900.0,
Notional = 20,
NoRiskRate = 0.035,
BuySell = "Buy",
VolType = "交易"
};
underlying = new underlying_manager()
{
UnderlyingInstrumentType = "CommodityFutures",
UnderlyingCode = "CU1910",
MaturityDate = new DateTime(2019, 7, 16),
QuotationDate = new DateTime(2019, 6, 17),
Price = 2900.0
};
result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam, CalcScenarioEnum.ScenarioCalc).ToArray();
Assert.AreEqual(2, result.Length, "");
Assert.AreEqual(0.10956030060947755, result[0].Vol, 1e-8, "");
Assert.AreEqual(367.94427810143958, result[0].Pv, 1e-8, "");
Assert.AreEqual(6.1294421966010759, result[0].Delta, 1e-8, "");
Assert.AreEqual(0.073455497613394982, result[0].Gamma, 1e-8, "");
Assert.AreEqual(61.0248278879169, result[0].Vega, 1e-8, "");
Assert.AreEqual(-15.272668657703719, result[0].Theta, 1e-8, "");
Assert.AreEqual(-0.0033173808200274379, result[0].Rho, 1e-8, "");
Assert.AreEqual(367.94427810143958, result[0].TradePriceBid, 1e-8, "");
Assert.AreEqual(368, result[0].RoundedTradePriceBid, 1e-8, "");
Assert.AreEqual(729.21420750241577, result[0].TradePriceAsk, 1e-8, "");
Assert.AreEqual(729.2, result[0].RoundedTradePriceAsk, 1e-8, "");
//Assert.AreEqual(0.3, result[1].Vol, 1e-8, "");
Assert.AreEqual(1347.0332956294735, result[1].Pv, 1e-8, "");
Assert.AreEqual(-13.909974736793629, result[1].Delta, 1e-8, "");
Assert.AreEqual(0.074904696703015361, result[1].Gamma, 1e-8, "");
Assert.AreEqual(60.569446355327727, result[1].Vega, 1e-8, "");
Assert.AreEqual(-14.609684783051534, result[1].Theta, 1e-8, "");
Assert.AreEqual(-0.012144834652463032, result[1].Rho, 1e-8, "");
Assert.AreEqual(1347.0332956294735, result[1].TradePriceBid, 1e-8, "");
Assert.AreEqual(1347, result[1].RoundedTradePriceBid, 1e-8, "");
Assert.AreEqual(1726.0634439040327, result[1].TradePriceAsk, 1e-8, "");
Assert.AreEqual(1726, result[1].RoundedTradePriceAsk, 1e-8, "");
//传入BaseVol和BidVar、AskVar
new trade()
{
TradeType = "香草期权",
UnderlyingCode = underlying.UnderlyingCode,
UnderlyingInstrumentType = "CommodityFutures",
TradeDate = new DateTime(2019, 6, 17),
StartDate = new DateTime(2019, 6, 17),
MaturityDate = new DateTime(2019, 7, 16),
ExerciseDate = new DateTime(2019, 7, 16),
OptionType = "看涨",
ExerciseMode = "European",
Strike = 2950.0,
SpotPrice = 2900.0,
Notional = 20,
NoRiskRate = 0.035,
BuySell = "Buy"
};
result = new PriceCalcService(userInfo).GetOptionCalculatorV2(trade, underlying, calcParam, CalcScenarioEnum.ScenarioCalc).ToArray();
Assert.AreEqual(2, result.Length, "");
Assert.AreEqual(0.2471367218114178, result[0].Vol, 1e-8, "");
Assert.AreEqual(1273.1815280634544, result[0].Pv, 1e-8, "");
Assert.AreEqual(8.44111397193501, result[0].Delta, 1e-8, "");
Assert.AreEqual(0.036274864214647096, result[0].Gamma, 1e-8, "");
Assert.AreEqual(67.978921076371535, result[0].Vega, 1e-8, "");
Assert.AreEqual(-38.425449979023824, result[0].Theta, 1e-8, "");
Assert.AreEqual(-0.011478988077760733, result[0].Rho, 1e-8, "");
Assert.AreEqual(1273.1815280634544, result[0].TradePriceBid, 1e-8, "");
Assert.AreEqual(1273.2, result[0].RoundedTradePriceBid, 1e-8, "");
Assert.AreEqual(2299.7798038856977, result[0].TradePriceAsk, 1e-8, "");
Assert.AreEqual(2299.8, result[0].RoundedTradePriceAsk, 1e-8, "");
//Assert.AreEqual(0.3, result[1].Vol, 1e-8, "");
Assert.AreEqual(2263.6749352101019, result[1].Pv, 1e-8, "");
Assert.AreEqual(-11.503795101498326, result[1].Delta, 1e-8, "");
Assert.AreEqual(0.036405872378963977, result[1].Gamma, 1e-8, "");
Assert.AreEqual(67.965549632390321, result[1].Vega, 1e-8, "");
Assert.AreEqual(-38.129531169690836, result[1].Theta, 1e-8, "");
Assert.AreEqual(-0.020409263738520166, result[1].Rho, 1e-8, "");
Assert.AreEqual(2263.6749352101019, result[1].TradePriceBid, 1e-8, "");
Assert.AreEqual(2263.6, result[1].RoundedTradePriceBid, 1e-8, "");
Assert.AreEqual(3296.62904028731, result[1].TradePriceAsk, 1e-8, "");
Assert.AreEqual(3296.6, result[1].RoundedTradePriceAsk, 1e-8, "");
#endregion
}
[TestMethod]
public void RealTimePnlCalcTest()
{
var result = YLErp.BLL.Eod.RealtimePnlCalc.RealtimePosition(OptUserInfo.UnitTestUser);
Assert.AreNotEqual(0, result.Count);
}
[TestMethod]
public void QueryFlowRiskListTest()
{
new FlowRiskService(OptUserInfo.UnitTestUser).QueryFlowRiskList(DateTime.Today, DateTime.Today.AddMonths(1));
}
}
}