from mastr.idn.sandbox import Sandbox
sandbox = Sandbox()

"""
Explanation: Mastr
Mastr es la nueva herramienta de valoración y agregación diseñada encima de PALM, que permite describir carteras y escenarios de riesgo de manera separada a la implementación de los pricers y los objetos. PALM se utiliza para poder distribuir la carga tanto en valoración como agregación, eliminando cuellos de botella y permitiendo la ejecución escalable en paralelo de todo el flujo de trabajo.
Uno de los problemas a resolver de las herramientas actuales es que el desarrollo de pricers y objetos está muy relacionado con la propia infraestructura. El objeto curva incluye la mayoría de la lógica para pasar de datos de mercado a lógica de evaluación.
Mastr incluye un sandbox diseñado para poder implementar pricers y objetos de manera sencilla y ensayar la ejecución de scripts IDN, un formato de descripción de carteras y escenarios de valoración.
Además, Mastr incluye una librería en Python que cubre algunas tareas comunes en la implementación de pricers y objetos, como calendarios, bootstrap, interpolaciones...
Desarrollo de pricers
Un pricer en Mastr no es más que una función. Pero antes hay que cargar el sandbox
End of explanation
"""


from datetime import date

def newbond(strike, signed, time, daycount):
    signed = date(*map(int, signed.split('-')))
    time = date(*map(int, time.split('-')))
    
    yearfrac = daycount(signed, time)
    
    if yearfrac > 1.5:
        return (1 + 0.05) * strike
    else:
        return 0.0

"""
Explanation: Vamos a construir un pricer para un bono que nos vamos a inventar. Es un bono que vale 0 mientras no haya pasado 1.5 fracciones de año desde la fecha de firma. En cuanto se supere ese tiempo, el bono vale un 5% más que el strike price.
End of explanation
"""


from mastr.bootstrapping.daycount import DayCounter

value = newbond(100, '2016-9-7', '2017-9-10', DayCounter('actual/360'))
print('2017-9-10', value)

value = newbond(100, '2016-9-7', '2018-9-10', DayCounter('actual/360'))
print('2018-9-10', value)

"""
Explanation: Lo mejor es que ahora lo podemos probar, hacer test unitarios... De mastr importaremos el objeto que cuenta fracciones de año.
End of explanation
"""


sandbox.add_pricer(newbond)
sandbox.add_object(DayCounter)

%cat data/script.json

with open('data/script.json') as f:
    results = sandbox.eval(f.read())
    
print(results)

"""
Explanation: Pero mastr está diseñado para ejecutar IDN, los scripts de descripción de carteras y de escenarios.
End of explanation
"""


%cat data/scriptdata.json

%cat data/data.json

"""
Explanation: El intérprete de IDN está preparado para poder evaluar la cartera con múltiples escenarios. En este caso, vamos a evaluar distintos escenarios temporales.
End of explanation
"""


with open('data/scriptdata.json') as f:
    with open('data/data.json') as g:
        results = sandbox.eval(f.read(), g.read())
        

print(results)

"""
Explanation: Este nuevo fichero JSON, que contiene los datos de distintos escenarios, no es más que un nuevo argumento para el sandbox.
End of explanation
"""


import matplotlib.pyplot as plt
import json
%matplotlib notebook

dates = [
    date(2016,9,10),
    date(2016,12,10),
    date(2017,9,10),
    date(2018,9,10),
    date(2019,9,10)
        ]

fig1 = plt.figure(1)
ax = fig1.add_subplot(1,1,1)
ax.plot(dates, [r['eval1'] for r in results])
plt.setp(ax.get_xticklabels(), rotation=30)

"""
Explanation: Finalmente, podemos utilizar las capacidades de representación gráfica para analizar los resultados y la evolucion en los tiempos dados del valor de este bono.
End of explanation
"""


