primo commit

This commit is contained in:
fredmaloggia
2026-01-05 19:15:03 +01:00
commit f707b9c95b
61 changed files with 2928 additions and 0 deletions

107
pricer/comparison.py Normal file
View File

@@ -0,0 +1,107 @@
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,
)