本文整理汇总了C#中InitializedList.Add方法的典型用法代码示例。如果您正苦于以下问题:C# InitializedList.Add方法的具体用法?C# InitializedList.Add怎么用?C# InitializedList.Add使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类InitializedList
的用法示例。
在下文中一共展示了InitializedList.Add方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: calculate
public override void calculate()
{
/* this engine cannot really check for the averageType==Geometric
since it can be used as control variate for the Arithmetic version
QL_REQUIRE(arguments_.averageType == Average::Geometric,
"not a geometric average option");
*/
if(!(arguments_.exercise.type() == Exercise.Type.European))
throw new ApplicationException("not an European Option");
double runningLog;
int pastFixings;
if (arguments_.averageType == Average.Type.Geometric) {
if(!(arguments_.runningAccumulator>0.0))
throw new ApplicationException("positive running product required: "
+ arguments_.runningAccumulator + " not allowed");
runningLog =
Math.Log(arguments_.runningAccumulator.GetValueOrDefault());
pastFixings = arguments_.pastFixings.GetValueOrDefault();
} else { // it is being used as control variate
runningLog = 1.0;
pastFixings = 0;
}
PlainVanillaPayoff payoff = (PlainVanillaPayoff)(arguments_.payoff);
if (payoff == null)
throw new ApplicationException("non-plain payoff given");
Date referenceDate = process_.riskFreeRate().link.referenceDate();
DayCounter rfdc = process_.riskFreeRate().link.dayCounter();
DayCounter divdc = process_.dividendYield().link.dayCounter();
DayCounter voldc = process_.blackVolatility().link.dayCounter();
List<double> fixingTimes = new InitializedList<double>(arguments_.fixingDates.Count());
int i;
for (i=0; i<arguments_.fixingDates.Count(); i++) {
if (arguments_.fixingDates[i]>=referenceDate) {
double t = voldc.yearFraction(referenceDate,
arguments_.fixingDates[i]);
fixingTimes.Add(t);
}
}
int remainingFixings = fixingTimes.Count();
int numberOfFixings = pastFixings + remainingFixings;
double N = numberOfFixings;
double pastWeight = pastFixings/N;
double futureWeight = 1.0-pastWeight;
/*double timeSum = std::accumulate(fixingTimes.begin(),
fixingTimes.end(), 0.0);*/
double timeSum = 0;
fixingTimes.ForEach((ii, vv) => timeSum += fixingTimes[ii]);
double vola = process_.blackVolatility().link.blackVol(
arguments_.exercise.lastDate(),
payoff.strike());
double temp = 0.0;
for (i=pastFixings+1; i<numberOfFixings; i++)
temp += fixingTimes[i-pastFixings-1]*(N-i);
double variance = vola*vola /N/N * (timeSum+ 2.0*temp);
double dsigG_dsig = Math.Sqrt((timeSum + 2.0*temp))/N;
double sigG = vola * dsigG_dsig;
double dmuG_dsig = -(vola * timeSum)/N;
Date exDate = arguments_.exercise.lastDate();
double dividendRate = process_.dividendYield().link.
zeroRate(exDate, divdc, Compounding.Continuous, Frequency.NoFrequency).rate();
double riskFreeRate = process_.riskFreeRate().link.
zeroRate(exDate, rfdc, Compounding.Continuous, Frequency.NoFrequency).rate();
double nu = riskFreeRate - dividendRate - 0.5*vola*vola;
double s = process_.stateVariable().link.value();
if(!(s > 0.0))
throw new ApplicationException("positive underlying value required");
int M = (pastFixings == 0 ? 1 : pastFixings);
double muG = pastWeight * runningLog/M +
futureWeight * Math.Log(s) + nu*timeSum/N;
double forwardPrice = Math.Exp(muG + variance / 2.0);
double riskFreeDiscount = process_.riskFreeRate().link.discount(
arguments_.exercise.lastDate());
BlackCalculator black = new BlackCalculator(payoff, forwardPrice, Math.Sqrt(variance),
riskFreeDiscount);
results_.value = black.value();
results_.delta = futureWeight*black.delta(forwardPrice)*forwardPrice/s;
results_.gamma = forwardPrice*futureWeight/(s*s)
*( black.gamma(forwardPrice)*futureWeight*forwardPrice
- pastWeight*black.delta(forwardPrice) );
double Nx_1, nx_1;
CumulativeNormalDistribution CND = new CumulativeNormalDistribution();
NormalDistribution ND = new NormalDistribution();
if (sigG > Const.QL_Epsilon) {
double x_1 = (muG-Math.Log(payoff.strike())+variance)/sigG;
Nx_1 = CND.value(x_1);
//.........这里部分代码省略.........
示例2: testPastFixings
public void testPastFixings()
{
//BOOST_MESSAGE("Testing use of past fixings in Asian options...");
DayCounter dc = new Actual360();
Date today = Date.Today ;
SimpleQuote spot = new SimpleQuote(100.0);
SimpleQuote qRate = new SimpleQuote(0.03);
YieldTermStructure qTS = Utilities.flatRate(today, qRate, dc);
SimpleQuote rRate = new SimpleQuote(0.06);
YieldTermStructure rTS = Utilities.flatRate(today, rRate, dc);
SimpleQuote vol = new SimpleQuote(0.20);
BlackVolTermStructure volTS = Utilities.flatVol(today, vol, dc);
StrikedTypePayoff payoff = new PlainVanillaPayoff(Option.Type.Put, 100.0);
Exercise exercise = new EuropeanExercise(today + new Period(1,TimeUnit.Years));
BlackScholesMertonProcess stochProcess =
new BlackScholesMertonProcess(new Handle<Quote>(spot),
new Handle<YieldTermStructure>(qTS),
new Handle<YieldTermStructure>(rTS),
new Handle<BlackVolTermStructure>(volTS));
// MC arithmetic average-price
double runningSum = 0.0;
int pastFixings = 0;
List<Date> fixingDates1 = new InitializedList<Date>();
for (int i=0; i<=12; ++i)
fixingDates1.Add(today + new Period(i,TimeUnit.Months));
DiscreteAveragingAsianOption option1 =
new DiscreteAveragingAsianOption(Average.Type.Arithmetic, runningSum,
pastFixings, fixingDates1,
payoff, exercise);
pastFixings = 2;
runningSum = pastFixings * spot.value() * 0.8;
List<Date> fixingDates2 = new InitializedList<Date>();
for (int i=-2; i<=12; ++i)
fixingDates2.Add(today + new Period(i,TimeUnit.Months));
DiscreteAveragingAsianOption option2 =
new DiscreteAveragingAsianOption(Average.Type.Arithmetic, runningSum,
pastFixings, fixingDates2,
payoff, exercise);
IPricingEngine engine =
new MakeMCDiscreteArithmeticAPEngine<LowDiscrepancy,Statistics>(stochProcess)
.withStepsPerYear(1)
.withSamples(2047)
.value() ;
option1.setPricingEngine(engine);
option2.setPricingEngine(engine);
double price1 = option1.NPV();
double price2 = option2.NPV();
if (Utils.close(price1, price2)) {
Assert.Fail(
"past fixings had no effect on arithmetic average-price option"
+ "\n without fixings: " + price1
+ "\n with fixings: " + price2);
}
// MC arithmetic average-strike
engine = new MakeMCDiscreteArithmeticASEngine<LowDiscrepancy,Statistics>(stochProcess)
.withSamples(2047)
.value();
option1.setPricingEngine(engine);
option2.setPricingEngine(engine);
price1 = option1.NPV();
price2 = option2.NPV();
if (Utils.close(price1, price2)) {
Assert.Fail(
"past fixings had no effect on arithmetic average-strike option"
+ "\n without fixings: " + price1
+ "\n with fixings: " + price2);
}
// analytic geometric average-price
double runningProduct = 1.0;
pastFixings = 0;
DiscreteAveragingAsianOption option3 =
new DiscreteAveragingAsianOption(Average.Type.Geometric, runningProduct,
pastFixings, fixingDates1,
payoff, exercise);
pastFixings = 2;
runningProduct = spot.value() * spot.value();
DiscreteAveragingAsianOption option4 =
new DiscreteAveragingAsianOption(Average.Type.Geometric, runningProduct,
pastFixings, fixingDates2,
payoff, exercise);
//.........这里部分代码省略.........