Thanks for reading my blog.
-Mike
%config IPCompleter.greedy = True from QuantLib import * import numpy as Numpy import matplotlib.pyplot as Matplotlib # processArray = StochasticProcessArray (Array of correlated 1-D stochastic processes) # timeGrid = TimeGrid object def GenerateCorrelatedPaths(processArray, timeGrid, nPaths): times = []; [times.append(timeGrid[t]) for t in range(len(timeGrid))] generator = UniformRandomGenerator() nProcesses = processArray.size() nGridSteps = len(times) - 1 # deduct initial time (0.0) nSteps = nGridSteps * nProcesses sequenceGenerator = UniformRandomSequenceGenerator(nSteps, generator) gaussianSequenceGenerator = GaussianRandomSequenceGenerator(sequenceGenerator) multiPathGenerator = GaussianMultiPathGenerator(processArray, times, gaussianSequenceGenerator) paths = Numpy.zeros(shape = (nPaths, nProcesses, len(timeGrid))) # loop through number of paths for i in range(nPaths): # request multiPath, which contains the list of paths for each process multiPath = multiPathGenerator.next().value() # loop through number of processes for j in range(multiPath.assetNumber()): # request path, which contains the list of simulated prices for a process path = multiPath[j] # push prices to array paths[i, j, :] = Numpy.array([path[k] for k in range(len(path))]) return paths # create two 1-D stochastic processes process = [] nProcesses = 2 correlation = -1.0 names = ['equity_1', 'equity_2'] spot = [100.0, 100.0] mue = [0.01, 0.01] sigma = [0.10, 0.10] [process.append(GeometricBrownianMotionProcess(spot[i], mue[i], sigma[i])) for i in range(nProcesses)] matrix = [[1.0, correlation], [correlation, 1.0]] # create timegrid object and define number of paths maturity = 1.0 nSteps = 90 timeGrid = TimeGrid(maturity, nSteps) nPaths = 20 # create StochasticProcessArray object # (array of correlated 1-D stochastic processes) processArray = StochasticProcessArray(process, matrix) # request simulated correlated paths for all processes # result array dimensions: nPaths, nProcesses, len(timeGrid) paths = GenerateCorrelatedPaths(processArray, timeGrid, nPaths) # plot paths f, subPlots = Matplotlib.subplots(nProcesses, sharex = True) f.suptitle('Path simulations rho=' + str(correlation) + ', n=' + str(nPaths)) for i in range(nPaths): for j in range(nProcesses): subPlots[j].set_title(names[j]) path = paths[i, j, :] subPlots[j].plot(timeGrid, path)
Thank you for sharing this work. We are just getting started with QuantLib, and need to model a worst-of rainbow option (embedded in a structured note). I will try to create paths for the underlying instrument (equity) prices, then derive contingent cashflows based on those paths. Do you know of any work in QuantLib that is similar, modeling either worst-of rainbow options or structured notes?
ReplyDelete