72 lines
2.7 KiB
Python
72 lines
2.7 KiB
Python
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})")
|