132 lines
4.9 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|