from typing import List from . import calc from .payoffs import PayoffContext from .report import generate_report def clone_context(original: PayoffContext) -> PayoffContext: return PayoffContext( days_to_maturity=original.days_to_maturity, r=original.r, capital_value=original.capital_value, prot_min_val=original.prot_min_val, pdi_barrier=original.pdi_barrier, pdi_style=original.pdi_style, coupon_in_memory=original.coupon_in_memory, days_to_obs_y_fract=list(original.days_to_obs_y_fract), coupon_triggers=list(original.coupon_triggers), coupon_values=list(original.coupon_values), autocall_triggers=list(original.autocall_triggers), autocall_values=list(original.autocall_values), memory_flags=list(original.memory_flags), caso=original.caso, pdi_strike=original.pdi_strike, fattore_airbag=original.fattore_airbag, trigger_one_star=original.trigger_one_star, cap=original.cap, days_to_obs=list(original.days_to_obs), airbag=original.airbag, sigma=original.sigma, relief=original.relief, twin_win=original.twin_win, one_star=original.one_star, leva=original.leva, volatility=list(original.volatility), prices_ul=list(original.prices_ul), nominal_amount=original.nominal_amount, ) def compare_fair_values( num_simulations: int, prices_ul: List[float], corr_matrix: List[List[float]], num_assets: int, days_to_maturity: int, rate: float, dividends: List[float], context: PayoffContext, nominal_amount: float, isin: str, ask: float, bid: float, last_date, category: str, ) -> None: print(f"Motore GBM con payoff engine '{context.caso}'") results = calc.simulate_payoffs( num_simulations, prices_ul, corr_matrix, days_to_maturity, rate, dividends, context.volatility, context.days_to_obs, context.days_to_obs_y_fract, context.coupon_values, context.coupon_triggers, context.autocall_values, context.autocall_triggers, context.memory_flags, context.coupon_in_memory, context.pdi_style, context.pdi_strike, context.pdi_barrier, context.capital_value, context.prot_min_val, context.airbag, context.sigma, context.twin_win, context.relief, context.fattore_airbag, context.one_star, context.trigger_one_star, context.cap, ) results = [float(val) * 100.0 for val in results] mean = sum(results) / num_simulations variance = sum((val - mean) ** 2 for val in results) / num_simulations stddev = variance ** 0.5 fair_value_scaled = mean * nominal_amount / 100.0 fair_values = [int(val * nominal_amount / 100) for val in results] generate_report( isin=isin, category=category, fair_value=fair_value_scaled, fair_values=fair_values, ask=ask, bid=bid, num_sims=num_simulations, last_date_price=last_date, )