108 lines
3.1 KiB
Python
108 lines
3.1 KiB
Python
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,
|
|
)
|