Exemple #1
0
def random_empty_book(maturity, dimension, rate, drift, volatility, seed=None):
    tf.random.set_seed(seed)
    rate = float(rate)
    drift = _fit_to_dimension(dimension, drift)
    volatility = _fit_to_dimension(dimension, volatility)

    # scale diffusion to have row norms equal to volatility
    diffusion = tf.random.uniform((dimension, dimension), minval=-1, maxval=1)
    norm = tf.linalg.norm(diffusion, axis=1)
    diffusion *= (volatility / norm)[:, tf.newaxis]

    init_instruments = _fit_to_dimension(dimension, 100.0)
    init_numeraire = tf.constant([1.0], FLOAT_DTYPE)

    instrument_simulator = simulators.GBM(rate, drift, diffusion)
    numeraire_simulator = simulators.ConstantBankAccount(rate)
    book = books.DerivativeBook(
        maturity, instrument_simulator, numeraire_simulator)

    return init_instruments, init_numeraire, book
Exemple #2
0
def random_basket_book(maturity, dimension, volatility, seed=None):
    tf.random.set_seed(seed)
    volatility = _fit_to_dimension(dimension, volatility)
    spot = strike = 1.0

    # scale diffusion to have row norms equal to volatility
    diffusion = tf.random.uniform((dimension, dimension), minval=-1, maxval=1)
    norm = tf.linalg.norm(diffusion, axis=1)
    diffusion *= (volatility / norm)[:, tf.newaxis]

    init_instruments = _fit_to_dimension(dimension, spot)
    init_numeraire = tf.constant([1.0], FLOAT_DTYPE)

    instrument_simulator = simulators.BrownianMotion(diffusion)
    numeraire_simulator = simulators.ConstantBankAccount(0.0)
    book = books.BasketBook(
        maturity, instrument_simulator, numeraire_simulator)

    weights = tf.random.uniform((dimension, ))
    derivative = derivatives.BachelierBasketCall(
        maturity, strike, diffusion, weights)
    book.add_derivative(derivative, 0, 1.0)

    return init_instruments, init_numeraire, book
cost = False

spot = 1
strike = 1
timesteps = 14
sigma = 0.2
maturity = timesteps / 250

if cost:
    instrument_simulator = simulators.GBM(0.0, 0.0, [[sigma]])
    derivative = derivatives.PutCall(maturity, strike, 0.0, sigma, 1)
else:
    instrument_simulator = BrownianMotion(sigma)
    derivative = BachelierBinary(maturity, strike, sigma)
numeraire_simulator = simulators.ConstantBankAccount(0.0)

book = books.DerivativeBook(maturity, instrument_simulator,
                            numeraire_simulator)

book.add_derivative(derivative, 0, 1.0)

init_instruments = tf.constant([spot], FLOAT_DTYPE)
init_numeraire = tf.constant([1.0], FLOAT_DTYPE)

driver = utils.HedgeDriver(
    timesteps=timesteps,
    frequency=0,  # no need for frequency for non-path dependent derivatives.
    init_instruments=init_instruments,
    init_numeraire=init_numeraire,
    book=book,