primo commit
This commit is contained in:
107
pricer/comparison.py
Normal file
107
pricer/comparison.py
Normal 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,
|
||||
)
|
||||
Reference in New Issue
Block a user