Example #1
0
def run_one_valuation_intrinsic(Te, fwd_array, cons):
    """
    Calculate intrinsic storage with simple constraints

    Parameters
    ----------
    Te  :       maturities

    fwd_array:

    cons :  Constraints
        (max_inv, min_inv, start_inv, end_inv, inj_cost, rel_cost, rmin, rmax)

    Returns
    -------

    """

    max_inv = cons.max_inv
    min_inv = cons.min_inv
    start_inv = cons.start_inv
    end_inv = cons.end_inv
    inj_cost = cons.inj_cost
    rel_cost = cons.rel_cost
    rmin = cons.rmin
    rmax = cons.rmax

    fc = FlowConstraint(rmin, rmax)
    flow_constraints = FlowConstraints(Te[0], fc)

    inv_constraints = InventoryConstraints(Te, start_inv, end_inv, max_inv,
                                           min_inv, [flow_constraints])
    state_object = StateObject(inv_constraints)

    product = LeastSquaresMonteCarloEngine(
        state_object,
        StorageCashflows(Te, injection_cost=inj_cost,
                         withdrawal_cost=rel_cost))

    res = product.calc_intrinsic(fwd_array)
    TP = product.calc_trigger_price(res)
    return res, TP
def run_one_valuation_intrinsic(Te, fwd_array, cons):
    """
    Calculate intrinsic storage with simple constraints

    Parameters
    ----------
    Te  :       maturities

    fwd_array:

    cons :  Constraints
        (max_inv, min_inv, start_inv, end_inv, inj_cost, rel_cost, rmin, rmax)

    Returns
    -------

    """

    max_inv = cons.max_inv
    min_inv = cons.min_inv
    start_inv = cons.start_inv
    end_inv = cons.end_inv
    inj_cost = cons.inj_cost
    rel_cost = cons.rel_cost
    rmin = cons.rmin
    rmax = cons.rmax

    fc = FlowConstraint(rmin, rmax)
    flow_constraints = FlowConstraints(Te[0], fc)

    inv_constraints = InventoryConstraints(Te, start_inv, end_inv, max_inv, min_inv, [flow_constraints])
    state_object = StateObject(inv_constraints)

    product = LeastSquaresMonteCarloEngine(
        state_object, StorageCashflows(Te, injection_cost=inj_cost, withdrawal_cost=rel_cost)
    )

    res = product.calc_intrinsic(fwd_array)
    TP = product.calc_trigger_price(res)
    return res, TP
def run_valuation_stochastic(val_date, dates, fwd_curve, cons, model_params, nsims=5000):
    """
    Calculate stochastic storage with simple constraints

    Parameters
    ----------
    Te  :       maturities

    fwd_array:

    cons :  tuple
        (max_inv, min_inv, start_inv, end_inv, inj_cost, rel_cost, rmin, rmax)

    Returns
    -------

    """

    max_inv = cons.max_inv
    min_inv = cons.min_inv
    start_inv = cons.start_inv
    end_inv = cons.end_inv
    inj_cost = cons.inj_cost
    rel_cost = cons.rel_cost
    rmin = cons.rmin
    rmax = cons.rmax

    sigma_1 = model_params.sigma_1
    sigma_2 = model_params.sigma_2
    alpha_1 = model_params.alpha_1
    alpha_2 = model_params.alpha_2
    rho = model_params.rho

    alphas = [alpha_1, alpha_2]
    sigmas = [sigma_1, sigma_2]

    Te = calcTe(val_date, dates)

    fc = FlowConstraint(rmin, rmax)
    flow_constraints = FlowConstraints(Te[0], fc)

    inv_constraints = InventoryConstraints(Te, start_inv, end_inv, max_inv, min_inv, [flow_constraints])
    state_object = StateObject(inv_constraints, num_levels=None)
    ls_solver_params = AttrDict(max_basis_order=4, solver="RegularisedLeastSquaresSolver")
    product = LeastSquaresMonteCarloEngine(
        state_object, StorageCashflows(Te, injection_cost=inj_cost, withdrawal_cost=rel_cost), ls_solver_params
    )

    seed = 123
    simulator = MultiFactorSimulator(alphas, sigmas, fwd_curve, rho, val_date, seed=seed)
    sims_bwd = simulator.simulate_spot(dates, nsims).values
    factors_bwd = simulator.stoch_factors
    sims_fwd = simulator.simulate_spot(dates, nsims).values
    factors_fwd = simulator.stoch_factors

    results = product.calc_extrinsic(sims_bwd, sims_fwd, factors_bwd, factors_fwd)
    cashflows = (results["cashflows"].spot + results["cashflows"].opex).sum(axis=0)
    value = cashflows.mean()
    value_std = cashflows.std()
    value_error = value_std / np.sqrt(nsims)

    return value, value_error
Example #4
0
def run_valuation_stochastic(val_date,
                             dates,
                             fwd_curve,
                             cons,
                             model_params,
                             nsims=5000):
    """
    Calculate stochastic storage with simple constraints

    Parameters
    ----------
    Te  :       maturities

    fwd_array:

    cons :  tuple
        (max_inv, min_inv, start_inv, end_inv, inj_cost, rel_cost, rmin, rmax)

    Returns
    -------

    """

    max_inv = cons.max_inv
    min_inv = cons.min_inv
    start_inv = cons.start_inv
    end_inv = cons.end_inv
    inj_cost = cons.inj_cost
    rel_cost = cons.rel_cost
    rmin = cons.rmin
    rmax = cons.rmax

    sigma_1 = model_params.sigma_1
    sigma_2 = model_params.sigma_2
    alpha_1 = model_params.alpha_1
    alpha_2 = model_params.alpha_2
    rho = model_params.rho

    alphas = [alpha_1, alpha_2]
    sigmas = [sigma_1, sigma_2]

    Te = calcTe(val_date, dates)

    fc = FlowConstraint(rmin, rmax)
    flow_constraints = FlowConstraints(Te[0], fc)

    inv_constraints = InventoryConstraints(Te, start_inv, end_inv, max_inv,
                                           min_inv, [flow_constraints])
    state_object = StateObject(inv_constraints, num_levels=None)
    ls_solver_params = AttrDict(max_basis_order=4,
                                solver='RegularisedLeastSquaresSolver')
    product = LeastSquaresMonteCarloEngine(
        state_object,
        StorageCashflows(Te, injection_cost=inj_cost,
                         withdrawal_cost=rel_cost), ls_solver_params)

    seed = 123
    simulator = MultiFactorSimulator(alphas,
                                     sigmas,
                                     fwd_curve,
                                     rho,
                                     val_date,
                                     seed=seed)
    sims_bwd = simulator.simulate_spot(dates, nsims).values
    factors_bwd = simulator.stoch_factors
    sims_fwd = simulator.simulate_spot(dates, nsims).values
    factors_fwd = simulator.stoch_factors

    results = product.calc_extrinsic(sims_bwd, sims_fwd, factors_bwd,
                                     factors_fwd)
    cashflows = (results['cashflows'].spot +
                 results['cashflows'].opex).sum(axis=0)
    value = cashflows.mean()
    value_std = cashflows.std()
    value_error = value_std / np.sqrt(nsims)

    return value, value_error