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

132 lines
4.9 KiB
C#

using Qdp.Foundation.Implementations;
using YLErp.Modules.CalculationModule;
using YLErp.Modules.TradeModule;
using YLErp.QdpModule;
namespace YLErp.Modules.CalcModules
{
/// <summary>
/// 区间累计期权计算测试
/// </summary>
[TestClass]
public class RangeAccOptionCalcTest : UnitTestBase
{
[TestMethod("区间累计,行权错误")]
public void BarrierOptionCalcTest1()
{
var data = DeserializeFormData<OtcOptionTradeFullFormData>("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<autocall_observation>()
};
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<RangeAccrualTradeParam>(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);
}
}
}