#!/usr/bin/env python3
"""
Esempio d'uso di gex.py: la catena illustrativa della monografia.

    python3 esempio.py

Riproduce i valori del volume, e serve come punto di partenza per sostituire
la catena con la propria.
"""
from gex import Catena, Linea, beta, moltiplicatore, movimento_pareggio

# (strike, open interest call, open interest put) — catena aggregata su
# circa tre giorni di borsa, spot 6.508
CATENA = [(6400, 2000, 12000), (6425, 2500, 9000), (6450, 4000, 13000),
          (6475, 5000, 58000), (6500, 16000, 15000), (6525, 22000, 6000),
          (6550, 40000, 3000), (6575, 15000, 1800), (6600, 26000, 1400),
          (6625, 9000, 700), (6650, 14000, 500)]

ORE, IV, SPOT = 19.5, 0.12, 6508.0

catena = Catena([Linea(K, tipo, ORE, IV, oi)
                 for K, c, p in CATENA
                 for tipo, oi in (("call", c), ("put", p))])

mld = lambda x: x / 1e9

print(f"spot {SPOT:,.0f}   {ORE} ore residue   iv {IV:.0%}\n")
print(f"  GEX                    {mld(catena.gex(SPOT)):+8.2f} mld $ per 1%")
print(f"  DEX                    {mld(catena.dex(SPOT)):+8.2f} mld $")
print(f"  CEX (un'ora)           {mld(catena.cex(SPOT)):+8.2f} mld $   (negativo = acquisti)")
print(f"  VEX                    {mld(catena.vex(SPOT)):+8.2f} mld $ per punto di vol")
print(f"  gamma efficace         {mld(catena.gamma_efficace(SPOT)):+8.2f} mld $")
print(f"  concentrazione         {catena.concentrazione(SPOT):8.3f}")

giu, su = catena.sopra_sotto(SPOT)
print(f"  sotto il prezzo        {mld(giu):+8.2f} mld $")
print(f"  sopra il prezzo        {mld(su):+8.2f} mld $")

print("\n  zero gamma (cambi di segno rilevati):")
for r in catena.zero_gamma(6380, 6670):
    print(f"    {r:,.1f}   ({r - SPOT:+.0f} punti dallo spot)")

print("\n  strike con massimo |GEX netto|:")
per = catena.per_strike(SPOT)
for K, v in sorted(per.items(), key=lambda kv: -abs(kv[1]))[:3]:
    print(f"    {K:,}  {mld(v):+7.2f} mld")

b = beta(catena.gex(SPOT), 300e9, 0.0075, orizzonte_min=5.0)
print(f"\n  retroazione a 5 minuti  beta = {b:+.4f}"
      f"   moltiplicatore = {moltiplicatore(b):.3f}")

em = movimento_pareggio(SPOT, IV, ORE / (252 * 6.5))
print(f"  pareggio gamma-theta    +/- {em:,.0f} punti")
