using Qdp.Pricing.Base.Implementations; using YLErp.Modules.VolatilityModule; using YLErp.QdpModule; namespace YLErp.BasicTests { [TestClass] public class QdpExtensionTest : UnitTestBase { [TestMethod] public void TTMTest() { var maturityDate = new DateTime(2019, 7, 16); var dateT = new DateTime(2019, 7, 12); var dateTPlus = new DateTime(2019, 7, 15); var dateTMinus = new DateTime(2019, 7, 11); var dayCount = new Bus244(); //1. 报价日期不等于系统日期,所有精确时间模式都无效 var ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateTMinus, dateT, dayCount, true, false); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateTMinus, dateT, dayCount, false, false); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateTMinus, dateT, dayCount, true, true); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateTMinus, dateT, dayCount, false, true); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateTPlus, dateT, dayCount, true, false); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateTPlus, dateT, dayCount, false, false); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateTPlus, dateT, dayCount, true, true); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateTPlus, dateT, dayCount, false, true); Assert.AreEqual(3, ttm, 1e-10); //2. 报价期日等于系统日期 //2.1 系统日期等于服务器日期,交易日的日盘 //2.1.1 精确到半天 //2.1.1.1 有夜盘 ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 00, 01, 0), dayCount, true, false); Assert.AreEqual(2.66, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 9, 31, 0), dayCount, true, false); Assert.AreEqual(2.66, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 11, 31, 0), dayCount, true, false); Assert.AreEqual(2.66, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 13, 01, 0), dayCount, true, false); Assert.AreEqual(2.33, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 13, 31, 0), dayCount, true, false); Assert.AreEqual(2.33, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 15, 01, 0), dayCount, true, false); Assert.AreEqual(2, ttm, 1e-10); //2.1.1.2 无夜盘 ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 00, 01, 0), dayCount, false, false); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 9, 31, 0), dayCount, false, false); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 11, 31, 0), dayCount, false, false); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 13, 01, 0), dayCount, false, false); Assert.AreEqual(2.5, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 13, 31, 0), dayCount, false, false); Assert.AreEqual(2.5, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 15, 01, 0), dayCount, false, false); Assert.AreEqual(2, ttm, 1e-10); //2.1.2 精确到分钟 //2.1.2.1 有夜盘 ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 00, 15, 0), dayCount, true, true); Assert.AreEqual(2.6666666666666665, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 9, 55, 0), dayCount, true, true); Assert.AreEqual(2.5138888888888888, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 11, 27, 0), dayCount, true, true); Assert.AreEqual(2.2583333333333333, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 13, 08, 0), dayCount, true, true); Assert.AreEqual(2.25, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 13, 36, 0), dayCount, true, true); Assert.AreEqual(2.2333333333333334, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 15, 01, 0), dayCount, true, true); Assert.AreEqual(2, ttm, 1e-10); //2.1.2.2 无夜盘 ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 00, 15, 0), dayCount, false, true); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 9, 55, 0), dayCount, false, true); Assert.AreEqual(2.7708333333333335, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 11, 27, 0), dayCount, false, true); Assert.AreEqual(2.3875, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 13, 08, 0), dayCount, false, true); Assert.AreEqual(2.375, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 13, 36, 0), dayCount, false, true); Assert.AreEqual(2.35, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 12, 15, 01, 0), dayCount, false, true); Assert.AreEqual(2, ttm, 1e-10); //2.2 系统日期大于服务器日期,交易日的夜盘 //2.2.1 精确到半天 //2.2.1.1 有夜盘 ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 11, 15, 01, 0), dayCount, true, false); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 11, 20, 31, 0), dayCount, true, false); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 11, 21, 01, 0), dayCount, true, false); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 11, 23, 59, 0), dayCount, true, false); Assert.AreEqual(3, ttm, 1e-10); //2.2.1.2 无夜盘 ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 11, 15, 01, 0), dayCount, false, false); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 11, 20, 31, 0), dayCount, false, false); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 11, 21, 01, 0), dayCount, false, false); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 11, 23, 59, 0), dayCount, false, false); Assert.AreEqual(3, ttm, 1e-10); //2.2.2 精确到分钟 //2.2.2.1 有夜盘 ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 11, 15, 01, 0), dayCount, true, true); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 11, 20, 31, 0), dayCount, true, true); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 11, 21, 13, 0), dayCount, true, true); Assert.AreEqual(2.963888888888889, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 11, 23, 59, 0), dayCount, true, true); Assert.AreEqual(2.6666666666666665, ttm, 1e-10); //2.2.2.2 无夜盘 ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 11, 15, 01, 0), dayCount, false, true); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 11, 20, 31, 0), dayCount, false, true); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 11, 21, 13, 0), dayCount, false, true); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, new DateTime(2019, 7, 11, 23, 59, 0), dayCount, false, true); Assert.AreEqual(3, ttm, 1e-10); //2.3 系统日期小于服务器日期,所有精确时间模式都无效 ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, dateTPlus, dayCount, true, false); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, dateTPlus, dayCount, false, false); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, dateTPlus, dayCount, true, true); Assert.AreEqual(3, ttm, 1e-10); ttm = QdpHelper.CalculateTTMDays(dateT, maturityDate, dateT, dateTPlus, dayCount, false, true); Assert.AreEqual(3, ttm, 1e-10); } [TestMethod] public void TestGetTradeVol() { var vol1 = VolatilityHelper.GetTradeVol(valueDate: new DateTime(2022, 3, 10) , valueStartDate: new DateTime(2022, 3, 10) , exerciseDate: new DateTime(2022, 3, 20) , openVol: 0.3 , closeVol: 0.1 , mumOfSmoothingDays: 3, includeStartDate: true); var vol2 = VolatilityHelper.GetTradeVol(valueDate: new DateTime(2022, 3, 10) , valueStartDate: new DateTime(2022, 3, 10) , exerciseDate: new DateTime(2022, 3, 17) , openVol: 0.7 , closeVol: 0.1 , mumOfSmoothingDays: 7, includeStartDate: true); Assert.AreEqual(vol2, 0.3, 0.001); } } }