168 lines
11 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|