using Qdp.Foundation.Implementations; using YLErp.Modules.CalculationModule; using YLErp.Modules.TradeModule; using YLErp.QdpModule; namespace YLErp.Modules.CalcModules { /// /// 区间累计期权计算测试 /// [TestClass] public class RangeAccOptionCalcTest : UnitTestBase { [TestMethod("区间累计,行权错误")] public void BarrierOptionCalcTest1() { var data = DeserializeFormData("TradeJson\\RangeAccTrade1.txt"); Assert.IsTrue(data.trades != null && data.trades.Any()); var tdfull = data.trades.First(); var tdconv = TradeConverter.ConvertOptionTrade(tdfull); //var tdCash = new TradeCashService(CurUser).ExecutionTradeCash(td,388.44); //Assert.IsNotNull(tdCash); //SettlementCalcCommons.SetPossibleExec(r, td, r.FinalPrice ?? 0, true); new TradeRangeAccrualService(GetOptUser()).CheckRangeAccrualBonus(tdconv, tdconv.trade_rangeaccrual, new DateTime(2021, 5, 28), 388.44); Console.WriteLine("haole"); } [TestMethod("区间累计,计算测试")] public void BarrierOptionCalcTest2() { var startDate = new DateTime(2022, 7, 1); var endDate = new DateTime(2022, 9, 1); var tradeId = Guid.NewGuid().ToString("N"); var dayCount = QdpCalendarHelper.GetWorkDayCount(startDate, endDate) + 1; var tradeParam = new RangeAccrualTradeParam { annualizedFactor = 1, bonusRate = 0.1, buysell = "买入", callput = Qdp.Pricing.Base.Enums.OptionType.Call, dividendRate = 0, dividends = null, endDate = endDate, exerciseDate = endDate, exerciseType = ConsGlobal.ExerciseMode.European, hasNightMarket = false, initialSpotPrice = 100, isAnnualized = false, isForwardTrade = false, isMoneynessOption = false, lowerRange = 80, notional = 1, observationDateStr = null, originalExerciseDate = endDate, participationRate = 1, preciseTimeMode = true, principalRate = 0, riskFreeRate = 0, settlementDate = endDate, startDate = startDate, strike = 100, timeToMaturityDays = double.NaN, tradeDate = startDate, tradeId = tradeId, tradeNumber = tradeId, underlyingInstrumentType = ConsGlobal.InstrumentType.CommodityFutures, underlyingTickers = new[] { "A00" }, upperRange = 100, volSurfaceNames = new string[] { tradeId }, fixings = "2022-07-01,90;2022-07-04,90;2022-07-05,90;2022-07-06,90;2022-07-07,90", happenedObservations = new List() }; DateTime dt; var paymentAmount = 100 * 0.1 / dayCount; for (dt = new DateTime(2022, 7, 1); dt.Day < 8; dt = dt.AddDays(1)) { tradeParam.happenedObservations.Add(new autocall_observation { StartDate = dt, EndDate = dt, CouponRate = 0.1, StockEqvNotional = 100, PaymentAmount = paymentAmount, PaymentDate = dt }); } var calcParam = new OptionCalcParam(tradeParam) { CalcDeltaT1 = false, calcScenario = Enums.CalcScenarioEnum.RealtimeRisk, engineName = null, pricingRequest = Qdp.Pricing.Base.Implementations.PricingRequest.Pv, quadratureFastMode = false, spotPrices = new double[] { 90 } }; using var marketProxy = new MarketProxy(new DateTime(2022, 7, 8), 0); marketProxy.SetStockPrice("A00", 90); marketProxy.SetVolSurface(tradeId, 0.3); var result1 = TradeRiskCalcUtil.GetRangeAccrualValue(marketProxy, calcParam); tradeParam.fixings += ";2022-07-08,90"; dt = new DateTime(2022, 7, 8); tradeParam.happenedObservations.Add(new autocall_observation { StartDate = dt, EndDate = dt, CouponRate = 0.1, StockEqvNotional = 100, PaymentAmount = paymentAmount, PaymentDate = dt }); var result2 = TradeRiskCalcUtil.GetRangeAccrualValue(marketProxy, calcParam); Assert.AreEqual(result1.Pv, result2.Pv, 1e-4); } } }