Files
zszq-trs/UnitTestProject/BasicTests/QdpExtensionTest.cs
T
2024-05-09 14:06:26 +08:00

168 lines
11 KiB
C#

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);
}
}
}