final SimpleQuote riskFreeRateQuote = new SimpleQuote(0.3);
final RelinkableHandle<Quote> handleToRiskFreeRateQuote = new RelinkableHandle<Quote>(riskFreeRateQuote);
final YieldTermStructure riskFreeTermStructure = new FlatForward(2,new UnitedStates(Market.NYSE),handleToRiskFreeRateQuote, new Actual365Fixed(), Compounding.Continuous,Frequency.Daily);
//Creating the process
final StochasticProcess1D process = new GeneralizedBlackScholesProcess(handleToStockQuote,new RelinkableHandle<YieldTermStructure>(dividendTermStructure),new RelinkableHandle<YieldTermStructure>(riskFreeTermStructure),new RelinkableHandle<BlackVolTermStructure>(varianceCurve),new EulerDiscretization());
//Calculating the drift of the stochastic process after time = 18th day from today with value of the stock as specified from the quote
//The drift = (riskFreeForwardRate - dividendForwardRate) - (Variance/2)
System.out.println("The drift of the process after time = 18th day from today with value of the stock as specified from the quote = "+process.drift(process.time(date18.clone()), handleToStockQuote.currentLink().value()));
//Calculating the diffusion of the process after time = 18th day from today with value of the stock as specified from the quote
//The diffusion = volatiltiy of the stochastic process
System.out.println("The diffusion of the process after time = 18th day from today with value of the stock as specified from the quote = "+process.diffusion(process.time(date18.clone()), handleToStockQuote.currentLink().value()));
//Calulating the standard deviation of the process after time = 18th day from today with value of the stock as specified from the quote
//The standard deviation = volatility*sqrt(dt)
System.out.println("The stdDeviation of the process after time = 18th day from today with value of the stock as specified from the quote = "+process.stdDeviation(process.time(date18.clone()), handleToStockQuote.currentLink().value(), 0.01));
//Calulating the variance of the process after time = 18th day from today with value of the stock as specified from the quote
//The variance = volatility*volatility*dt
System.out.println("The variance of the process after time = 18th day from today with value of the stock as specified from the quote = "+process.variance(process.time(date18.clone()), handleToStockQuote.currentLink().value(), 0.01));
//Calulating the expected value of the stock quote after time = 18th day from today with the current value of the stock as specified from the quote
//The expectedValue = intialValue*exp(drift*dt)-----can be obtained by integrating----->dx/x= drift*dt
System.out.println("Expected value = "+process.expectation(process.time(date18.clone()), handleToStockQuote.currentLink().value(), 0.01));
//Calulating the exact value of the stock quote after time = 18th day from today with the current value of the stock as specified from the quote
//The exact value = intialValue*exp(drift*dt)*exp(volatility*sqrt(dt))-----can be obtained by integrating----->dx/x= drift*dt+volatility*sqrt(dt)
System.out.println("Exact value = "+process.evolve(process.time(date18.clone()), 6.7, .001, new NormalDistribution().op(Math.random())));
//Calculating the drift of the stochastic process after time = 18th day from today with value of the stock as specified from the quote
//The drift = (riskFreeForwardRate - dividendForwardRate) - (Variance/2)
final Array drift = process.drift(process.time(date18.clone()), new Array(1).fill(5.6));
System.out.println("The drift of the process after time = 18th day from today with value of the stock as specified from the quote");
//Calculating the diffusion of the process after time = 18th day from today with value of the stock as specified from the quote
//The diffusion = volatiltiy of the stochastic process
final Matrix diffusion = process.diffusion(process.time(date18.clone()), new Array(1).fill(5.6));
System.out.println("The diffusion of the process after time = 18th day from today with value of the stock as specified from the quote");
//Calulating the standard deviation of the process after time = 18th day from today with value of the stock as specified from the quote
//The standard deviation = volatility*sqrt(dt)
final Matrix stdDeviation = process.stdDeviation(process.time(date18.clone()), new Array(1).fill(5.6), 0.01);
System.out.println("The stdDeviation of the process after time = 18th day from today with value of the stock as specified from the quote");
//Calulating the expected value of the stock quote after time = 18th day from today with the current value of the stock as specified from the quote
//The expectedValue = intialValue*exp(drift*dt)-----can be obtained by integrating----->dx/x= drift*dt
final Array expectation = process.expectation(process.time(date18.clone()), new Array(1).fill(5.6), 0.01);
System.out.println("Expected value = "+expectation.first());
//Calulating the exact value of the stock quote after time = 18th day from today with the current value of the stock as specified from the quote
//The exact value = intialValue*exp(drift*dt)*exp(volatility*sqrt(dt))-----can be obtained by integrating----->dx/x= drift*dt+volatility*sqrt(dt)
final Array evolve = process.evolve(process.time(date18.clone()), new Array(1).fill(6.7), .001, new Array(1).fill(new NormalDistribution().op(Math.random()) ));
System.out.println("Exact value = "+evolve.first());
//Calculating covariance of the process
final Matrix covariance = process.covariance(process.time(date18.clone()), new Array(1).fill(5.6), 0.01);
System.out.println("Covariance = "+covariance.get(0, 0));
clock.stopClock();
clock.log();
}