from typing import List from .utils import round_to_multiple def generate_report( isin: str, category: str, fair_value: float, fair_values: List[int], ask: float, bid: float, num_sims: int, last_date_price, ) -> None: rif_prezzo = ask riferimento = "Ask" print() if ask == 0 and bid > 0: rif_prezzo = bid riferimento = "Bid" print(f"Ask = 0, preso come valore di riferimento il Bid: {bid:.2f}") casi_over_barriera = [] casi_under_barriera = [] casi_over_ask = [] casi_under_ask = [] for value in fair_values: if value < 100: casi_under_barriera.append(value) else: casi_over_barriera.append(value) if value >= rif_prezzo: casi_over_ask.append(value) else: casi_under_ask.append(value) perc_over_barriera = round_to_multiple(100 * len(casi_over_barriera) / len(fair_values), 0.01) perc_over_ask = round_to_multiple(100 * len(casi_over_ask) / len(fair_values), 0.01) perc_under_ask = 100 - perc_over_ask print(f"Caso calcolo Fair value {isin} = {category}") print( f"Fair value {isin} ({num_sims} iter.) = {fair_value:.2f} (Bid = {bid}, Ask = {ask}, Last updated on {last_date_price})" ) print( f"Sopra {riferimento} nel {perc_over_ask:.2f}% dei casi, sotto {riferimento} nel {perc_under_ask:.2f}% dei casi" ) media_over_ask = round_to_multiple(sum(casi_over_ask) / len(casi_over_ask) if casi_over_ask else 0.0, 0.01) media_under_ask = round_to_multiple(sum(casi_under_ask) / len(casi_under_ask) if casi_under_ask else 0.0, 0.01) print(f"Valore medio casi sopra {riferimento}: {media_over_ask:.2f}") print(f"Valore medio casi sotto {riferimento}: {media_under_ask:.2f}") gain_medio = round_to_multiple(media_over_ask - rif_prezzo, 0.01) loss_medio = round_to_multiple(rif_prezzo - media_under_ask, 0.01) print(f"Gain medio: {media_over_ask:.2f} - {rif_prezzo:.2f} = {gain_medio:.2f}") print(f"Loss medio: {rif_prezzo:.2f} - {media_under_ask:.2f} = {loss_medio:.2f}") perc_media_gain = round_to_multiple(100 * gain_medio / rif_prezzo, 0.01) perc_media_loss = round_to_multiple(100 * loss_medio / rif_prezzo, 0.01) print(f"Perc media Gain: {gain_medio:.2f} / {rif_prezzo:.2f} = {perc_media_gain:.2f}%") print(f"Perc media Loss: {loss_medio:.2f} / {rif_prezzo:.2f} = {perc_media_loss:.2f}%") valore_atteso = round_to_multiple((perc_over_ask / 100) * gain_medio - (perc_under_ask / 100) * loss_medio, 0.01) perc_valore_atteso = round_to_multiple(100 * valore_atteso / rif_prezzo, 0.01) print(f"Valore atteso: {valore_atteso:.2f} ({perc_valore_atteso:.2f}% su {riferimento})")