Por biblioteca de precios globales me refiero a una biblioteca
- gestión de los recursos propios, de los tipos, etc., de los productos híbridos
- con varios modelos (BS, LV, SV, LSV)
- disponer de varios métodos numéricos (fórmula analítica, MC, PDE FD/FE)
Nunca he tenido que diseñar una biblioteca de precios global, sólo he tenido que escribir bibliotecas de precios aisladas de MC o PDE FD, con BS, LV y SV principalmente, en un entorno puramente de front office, por lo que tenía bastante libertad para el modelado y el diseño. En estos casos siempre utilicé la siguiente arquitectura (en el caso de un MC de juguete) :
- a
Product
tiene una (referencia a)PayOff
- a
PayOff
tiene unModel
y unComputePayOff
método que calcula la retribución en un camino generado por el modelo - a
Model
tiene unRandomNumberGenerator
y unGenerateMCPath
que genera una ruta MC con fechas dadas con el generador aleatorio dado
PayOff
es abstracto, así como Model
y RandomNumberGenerator
Aunque siempre he tenido problemas para evitar el aumento exponencial de subclases debido a la funcionalidad transversal, ya que no soy un experto en patrones de diseño (¿puente?).
De modo que PayOff
tiene mucha información "no inmutable". Por ejemplo, si mi RandomNumberGenerator
es un Sobol, puede tener un miembro que cambia después de generar el número aleatorio, de modo que después de un precio, PayOff tiene una información que ha cambiado. Nunca me preocupé por eso.
Ahora, tengo la tarea de diseñar un poc para una biblioteca de precios global, con la restricción de que Product
y PayOff
no deben cambiar (van a ser (des)serializados). Podría, por supuesto, con un montón de contorsiones, seguir haciendo como en el juguete-ejemplo anterior, pero estaría mal.
Sin embargo, después de pensar, algunas cosas no cambian: efectivamente quiero tener tres categorías de "objetos" :
- productos (o pagos para simplificar)
- modelos
- métodos numéricos
y estas categorías pueden cruzarse, por ejemplo:
- la intersección de los pagos europeos, el modelo BS y las fórmulas cerradas (un tipo especial de método numérico) da como resultado la fórmula BS
- la intersección de los pagos europeos y el modelo de Heston produce como métodos numéricos fórmulas cerradas, PDE FD2D o MC
etc. De hecho, la biblioteca necesita procesar un pago dado bajo un modelo dado, utilizando un método numérico dado, teniendo en cuenta que no puede ponerle precio a todo en cualquier modelo y con cualquier método numérico...
¿Existe una forma clásica de diseñar esto? Como no tengo la intención de reinventar la rueda necesariamente, miré QuantLib y Strata hasta ahora, pero ambos tienen "pagos" no inmutables.
0 votos
Yo diría que se trata de un problema que requiere mucha experiencia para hacerlo bien desde el principio. La realidad es que, al principio, tomarás decisiones de diseño que parecen buenas ideas pero que, más tarde, acaban por obstaculizarte. Se trata de un problema que te encontrarás al construir cualquier sistema grande, no es un problema fácil. Luego habrá que pensar en calcular las griegas de todos los productos, calcular la pnl y atribuirla a determinadas griegas, ¿hasta dónde quieres llegar? ¿Piensas hacer un sistema completo de gestión de riesgos?
0 votos
El final del camino es, en efecto, un sistema completo de gestión de riesgos. Pero, para empezar, puede ser sólo un MC genérico. Aún así, supongo que hay malos hábitos que evitar desde el principio, y estoy intentando evitarlos. Como ya he dicho, no estoy realmente satisfecho con QL ni con Strata.
0 votos
Entonces, creé un mc pricer genérico que tenía mutlple modelos, prngs, modelos de correlación, etc, todo como usted mencionó anteriormente. Después me trasladé a un IB y vi cómo funcionaba el sistema de rm también. Si usted tiene el sistema de fijación de precios, a continuación, envolver rm y pnl festoneado a su alrededor no es demasiado difícil, ya que todo va a ser sólo la aplicación de una serie de golpes a los datos del mercado. Los principales consejos que yo daría son los siguientes Haz que todo sea genérico. 2. 2. Sea muy estricto acerca de cómo permitir que sus objetos interactúen, si se les permite meterse con el interior de unos a otros rápidamente se hace muy difícil cambiar el código.
0 votos
Por qué todo ¿Genérico?
0 votos
Genérico es potencialmente la palabra equivocada, abstracto es mejor. No todo va a tener que ser, pero me pareció más fácil esbozar todo en clases abstractas y luego tener métodos de fábrica que instancian las partes móviles específicas basadas en una carga de variables de configuración. Había una función que se sentó fuera de todo el asunto y controla el flujo de información, pero como lados de thst era todo abstractm