Source code for quant_analytics_flow.calculators.multivariatebrownianbridge
import tensorflow as tf
from quant_analytics_flow.analytics.norminv import norminv
from quant_analytics_flow.analytics.matrixanalytics import square_root_symmetric_matrix
from quant_analytics_flow.calculators.univariatebrownianbridge import UnivariateBrownianBridge
[docs]class MultivariateBrownianBridge():
[docs] def __init__(self, forwardCovarianceMatrices):
self.forwardCovarianceMatrices = forwardCovarianceMatrices
self.numberTimeSteps = len(forwardCovarianceMatrices)
self.numberStates = len(forwardCovarianceMatrices[0])
self.brownian = UnivariateBrownianBridge(self.numberTimeSteps)
self.sqrtForwardCovarianceMatrices = tf.TensorArray(dtype=tf.float64, size=self.numberTimeSteps, clear_after_read=False)
for i in range(self.numberTimeSteps):
self.sqrtForwardCovarianceMatrices = self.sqrtForwardCovarianceMatrices.write(i, square_root_symmetric_matrix(self.forwardCovarianceMatrices[i]))
[docs] def path(self, number):
x = tf.math.sobol_sample(self.numberTimeSteps*self.numberStates,number,dtype=tf.dtypes.float64)
x = tf.transpose(x)
y = tf.reshape(x, shape=(self.numberTimeSteps,self.numberStates,number))
z = norminv(y)
w = self.brownian.path(z, True)
path = tf.TensorArray(dtype=tf.float64,size=self.numberTimeSteps,clear_after_read=False)
for i in range(len(z)):
path = path.write(i,tf.matmul(self.sqrtForwardCovarianceMatrices.read(i), w[i]))
return path.stack()