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...
In [1]:
from mastr.idn.sandbox import Sandbox
sandbox = Sandbox()
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.
In [2]:
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
Lo mejor es que ahora lo podemos probar, hacer test unitarios... De mastr importaremos el objeto que cuenta fracciones de año.
In [3]:
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)
Pero mastr está diseñado para ejecutar IDN, los scripts de descripción de carteras y de escenarios.
In [4]:
sandbox.add_pricer(newbond)
sandbox.add_object(DayCounter)
In [5]:
%cat data/script.json
In [6]:
with open('data/script.json') as f:
results = sandbox.eval(f.read())
print(results)
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.
In [7]:
%cat data/scriptdata.json
In [8]:
%cat data/data.json
Este nuevo fichero JSON, que contiene los datos de distintos escenarios, no es más que un nuevo argumento para el sandbox.
In [9]:
with open('data/scriptdata.json') as f:
with open('data/data.json') as g:
results = sandbox.eval(f.read(), g.read())
In [10]:
print(results)
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.
In [11]:
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)
Out[11]: