Esta es una entrevista con Anton Batiaev del Centro de Tecnología de Deutsche Bank. Hablaremos sobre lo que hacen los matemáticos financieros, de dónde provienen los datos de los bancos, cómo se procesan y optimizan. Sobre la complejidad de ingresar al sector financiero, el comercio en bolsa y la necesidad general de los bancos.

¿Qué y cómo cuentan en el banco?
- Preséntate, por favor: dime quién eres, qué haces.
Me mudé al Deutsche Bank TechCenter a principios de enero de este año y ahora estoy desarrollando el lado del servidor en un proyecto que considera varios tipos de riesgos de instrumentos financieros para muchos operadores diferentes en todo el mundo y otros equipos que necesitan estos datos.
El proyecto ha construido una infraestructura bastante extensa que utiliza muchos marcos estándar populares, bases de datos no relacionales, que funciona con grandes datos en Kafka. También trabajamos con una grilla para decenas de miles de CPU, utilizamos varios proyectos personalizados, optimizamos el trabajo con protobuf, implementamos cálculos en matemática financiera,
Como parte de la infraestructura, hay varias optimizaciones y chips adicionales. Quizás esto sea obvio, pero es extremadamente difícil decir de manera consistente y lógica lo que está sucediendo en el banco. Un par de por ciento lo arrojó y obtuvo recursos financieros: esto es matemática compleja, algoritmos y grandes tareas de infraestructura, técnicas y de optimización.
- Vamos en orden. Usted dijo que en TechCenter está haciendo cálculos para la plataforma bancaria global. ¿Y qué se puede considerar en el banco?
Según mi experiencia, en el marco de las actividades de inversión, se consideran tanto los precios como una serie de otros indicadores de varios instrumentos. Si hablamos de acciones, entonces todo está claro: una cotización es su precio. Para los bonos, esto será un porcentaje del valor nominal.
Si hablamos de derivados (instrumentos financieros derivados), el precio es el tamaño de la prima que debe pagarse por este instrumento. Se calcula por muchas fórmulas diferentes. Existe una fórmula de Black-Scholes que estima el valor de las opciones; esta es una función que depende de la función de la cotización actual, el activo subyacente, la volatilidad, el tiempo de vencimiento y muchos otros factores.
Existen modelos que le permiten calcular el valor de la cartera del comerciante. Un departamento o empresa tiene un conjunto de transacciones, instrumentos financieros derivados en una cartera, y usted necesita calcular cuánto cuestan actualmente. Por separado, puede haber un precio, pero en conjunto: de alguna manera pueden correlacionarse, dar descuentos, etc. Por ejemplo, posiciones sintéticas: cómo construir una opción equivalente a futuros a partir de opciones. Esto es adecuado, por ejemplo, para activos no lineales como las opciones, pero no necesariamente es cierto para todos los tipos de derivados. La valoración se basa en la cotización del activo subyacente sobre el cual se construye el derivado. Por ejemplo, la cotización de uno o más pares de divisas. Los derivados se pueden construir sobre diferentes activos subyacentes: para la moneda, los activos subyacentes serán el euro, el dólar, etc. para derivados de productos básicos: petróleo, oro, trigo; para spot: varias acciones y bonos.
Además de evaluar los derivados, también se consideran los riesgos: ¿qué sucederá si los precios en el mercado asaltan con mayor fuerza (cambios de volatilidad)? O qué sucederá si el dólar no vale 60, sino 100 rublos en relación con una o todas las demás monedas. Lo que sucederá con un instrumento específico, cartera.
Debe calcular esto en tiempo real, y también aproximar el estado actual de la cartera a varios resultados adversos de los movimientos de precios para cada una de las monedas, los cambios en la volatilidad del mercado. Para hacer esto, estamos construyendo una matriz de todos los cambios posibles, que muestra lo que es ahora, lo que sucederá mañana y lo que sucederá si ocurre una crisis de mercado.
Esto es necesario para evaluar qué comprar y vender en el momento actual y cuáles son los riesgos. Y, incluido, evaluar lo que sucederá en el futuro, evaluar las estrategias comerciales y responder con mayor precisión a los cambios del mercado. Por ejemplo, a uno de los cuantos se le ocurrió un nuevo algoritmo para calcular riesgos: debe verificar los datos históricos, conducir, por ejemplo, toda la información de intercambio durante décadas y ver qué sucede.
Para estas necesidades, existe una infraestructura conectada a varias plataformas de intercambio que nos transmiten datos del mercado. Dado que nuestra compañía tiene muchos datos en todo el mundo, necesitamos almacenar y construir preagregados de alguna manera para procesarlos rápidamente.
- Antes de pasar a la parte de infraestructura, me gustaría preguntar sobre lo que ya ha dicho. Usted habló sobre un montón de todo tipo de algoritmos de análisis, ¿de dónde provienen estos algoritmos? ¿Es este algún tipo de conocimiento del libro o sus mejores prácticas?
Hay algunos puntos. En primer lugar, se toman fórmulas bien conocidas, algoritmos inventados por matemáticos. Por ejemplo, el modelo de precios de opción generalmente aceptado es la fórmula Black-Scholes. Pero, además de esto, hay mejoras internas: en particular, usamos otras leyes de distribución de precios, cambiamos los coeficientes en estas fórmulas. La fórmula para la curva de distribución de precios, ofertas y otros indicadores puede ser muy diferente.
Si hablamos de optimización, estas ya son mejoras internas. Por ejemplo, los desarrolladores pueden, en lugar de calcular indicadores en cada punto, calcular valores clave y hacer aproximaciones, lo que costará 20 veces menos tiempo de computadora, pero al mismo tiempo ofrecerá una precisión aceptable y suficiente.
Todos los datos cambian constantemente, y esto es importante para nosotros no solo para informar, sino también para brindarles a los comerciantes una imagen actualizada del estado del mercado.
- Esta es información bastante complicada, y probablemente sea bastante difícil de transferir de persona a persona. ¿Cuál es el tamaño de su equipo y cómo transfiere el conocimiento entre ustedes?
Nuestro proyecto en Moscú emplea a 35 personas. Estos son varios equipos que se ocupan de ciertas funciones: interfaz de usuario, backend, infraestructura, matemática financiera. Cada equipo tiene una profunda experiencia en la funcionalidad de un módulo en particular. Pero además de estas personas, hay tantas personas involucradas en sistemas relacionados con nuestro proyecto.
Los analistas de Confluence describen toda la información sobre nuestro proyecto y también está contenida en las descripciones de las tareas en JIRA, donde hay enlaces a mecanismos estándar y fórmulas públicas. Se pueden encontrar ejemplos de uso de la funcionalidad en las pruebas. Bueno, la comunicación humana no ha sido cancelada.
- Matemáticos financieros: ¿cuántos hay y quiénes son? ¿Algún científico importante?
Sí, son principalmente especialistas (quanta) que se sientan en Londres y crean modelos financieros de cómo funciona el mercado. La mayoría de las veces tienen un doctorado en finanzas o matemáticas. Saben cómo funciona el mercado, qué necesitan los comerciantes y pueden proponer algún tipo de modelo matemático que describa el estado del mercado, los algoritmos de cálculo de riesgos y la evaluación correcta de los derivados.
Por ejemplo, mi colega Alexander escribió un artículo sobre Habré , donde ya mencionó la experiencia con Quantum.
- ¿Pueden los desarrolladores comunes comunicarse con ellos? ¿Cómo va esta comunicación? De hecho, las matemáticas y el desarrollo convencional tienen mundos completamente diferentes.
Pueden comunicarse y comunicarse: está claro que algunas tareas y conceptos de negocios de alto nivel se discuten con los líderes, pero en el marco de cálculos de riesgo específicos u otros indicadores, el desarrollador se comunica directamente con el comerciante o cuántico que construyó este modelo.
Pero en realidad, este es un proceso mutuo de interacción, ya que el algoritmo teórico no siempre se implementa en la práctica. Por lo tanto, los desarrolladores pueden proponer cambios en el modelo para que descanse en la arquitectura de la aplicación actual.
Hay muchas formas de interactuar: el mismo Skype, teléfono, todas las herramientas de comunicación estándar.
- ¿El software que sale como resultado es automático? ¿Son estos robots o hay algo para los comerciantes que se dedican al análisis técnico: gráficos u otra cosa?
Hay varias opciones para usar el software: la primera es automática, es decir robots de comercio, el segundo es un asistente para el comerciante, que muestra el estado actual de la cartera, detallando los riesgos en varios indicadores, las opciones de negociación que ahora puede hacer, así como el estado futuro de la cartera y los riesgos basados en los resultados de estas operaciones. También hay indicadores para los comerciantes, cálculo de riesgos y datos sobre el estado de las carteras.
- Otra medida es la frecuencia del análisis de datos, ¿con qué frecuencia lo haces? Por un lado del espectro, según tengo entendido, algunos microsegundos, y por otro, el análisis de big data que puede llevar semanas.
Dependiendo de la complejidad e importancia de los indicadores, estos pueden ser indicadores en vivo, que se vuelven a calcular para cada marca, y luego el cálculo se realiza en milisegundos. Y si calculamos el costo de las carteras, las actualizaciones se producen una vez por segundo, de modo que el ojo humano tenga tiempo de percibirlo.
Si describe cálculos largos (por ejemplo, algunos riesgos complejos), los datos que se necesitan durante el día, luego las tareas se envían a la cuadrícula, se considera el escenario de cambio de cotizaciones de divisas. El mecanismo general es el siguiente: considera todas las transacciones nuevas dentro de un determinado ciclo, luego realiza una tarea difícil en la cuadrícula para volver a calcular los indicadores para todo el conjunto de transacciones en el estado actual del mercado.
Dichas tareas se pueden actualizar una vez por hora. Si necesita eliminar las estrategias comerciales, esta es una tarea larga, se lanzan y se considera durante varias horas, dependiendo de la complejidad y la cantidad de datos. Las tareas en la cuadrícula pueden ser muy pequeñas, por ejemplo, calcular una fórmula y dar un resultado, o grandes, por ejemplo, para tablas donde necesita calcular las correlaciones de todos los posibles escenarios de riesgo y dar el resultado combinado.
Aquí aparece la tarea de optimizar la carga de la cuadrícula y predecir el tiempo de cálculo de la tarea según el tipo de herramienta, la cantidad de datos y otros indicadores para cargarla al máximo. Porque, si lanza una gran tarea, todos los demás esperarán en la fila, aunque durante este tiempo podría contar algo más.
En general, la tarea de una mochila y otras optimizaciones. Cuando el ping a la cuadrícula sea más largo que el tiempo de cálculo en sí, lo haremos en el backend, donde ya se ha implementado un mini-cluster para tareas tan pequeñas.
- ¿Puedo de alguna manera ponerlo en algún tipo de estructura? Según tengo entendido, se aplican diferentes métodos de optimización según el volumen de tareas. En tareas pequeñas, tiene sentido optimizar el compilador JIT, y en tareas grandes, algo más. Dime cuáles son las áreas del problema y qué métodos se utilizan allí para acelerar y optimizar.
Un ejemplo de una gran tarea es calcular todos los instrumentos financieros y los riesgos al cambiar las cotizaciones de cada moneda en un 1-2-3-10%. En este caso, la optimización consistirá en agrupar ofertas en paquetes para que dentro de un paquete haya ofertas para un tipo de cartera o una moneda.
Para que no haya muchos cálculos de riesgo para cada transacción, los presentamos como una transacción para un gran volumen y luego dividimos proporcionalmente los resultados. Por lo tanto, reducimos el número de cálculos necesarios.
Otro ejemplo de optimización es esta vez con pares de divisas. Digamos que hay dos pares de "rublo-dólar" y "rublo-euro". En el primer par, puedes imaginar que el rublo está cayendo, pero es posible que el dólar esté creciendo. De hecho, este es uno y el mismo. Lo mismo ocurre con el par rublo-euro. En consecuencia, podemos considerar pares que son diferentes a primera vista en un paquete, sobre la base de que el rublo cambia en ambos casos.
El número de cálculos se reduce y el resultado se acelera. Parece haber cambiado una moneda (en nuestro ejemplo, el rublo), pero de hecho, calculamos los riesgos de los activos heterogéneos.
- ¿Y puedes resolver el problema de frente y convertirlo en un gran grupo enorme?
Existe un clúster de este tipo, pero ya está cargado con muchos cálculos. El clúster no es de goma, a pesar de las decenas de miles de CPU que existen actualmente.
- ¿Y desde el punto de vista del software, In-Memory DataGrid o Hadoop?
Sí, hay Hadoop y Kafka para procesar todo esto, y la base de datos ClickHouse para optimizar el trabajo con big data. En términos de apilamiento de datos, está claro que conducir JSON es, por decirlo suavemente, ineficiente. En este sentido, hay momentos de optimización con Protobuf. Es importante para nosotros no solo poner datos binarios, sino al mismo tiempo hacerlo lo más estrictamente posible, utilizando diccionarios.
En ellos almacenaremos, por ejemplo, especificaciones de contrato del mismo tipo para todas las transacciones. Debido a esta optimización con diccionarios, un colega ahorró el 30% de la memoria ocupada.
- ¿Están estos diccionarios en nodos específicos y duplicados o ubicados en una base central?
De diferentes maneras. Principalmente en una base central. Y hay diccionarios que transfiere a la cuadrícula con un montón de cálculos. Quiere ser lo más compacta posible para no arrastrar muchos datos, ya que los canales de Internet no son de goma.
Como funciona Envía la tarea de cálculo a la cuadrícula con toda la información necesaria para ello, que empaca en diccionarios para evitar duplicados. En el interior, ya habrá todo el contenido, y no necesita ir a repositorios adicionales. Esto ahorra tráfico de red y reduce la latencia en los cálculos.
- Hasta donde yo sé, los bancos tienen un análisis de datos históricos, que es un gran paquete de datos por gigabyte-terabytes. ¿Y el enfoque con una sola base de datos no funciona? Puede poner 2 TB en la tecla, pero no es bueno.
Sí, esos momentos se deciden por porciones. Tendrá cachés locales por país, distribuidos por información de intercambio, porque el envío de información sobre todas las transacciones desde Nueva York a Singapur requiere muchos recursos. Está claro que aquí la división por país es lógica: por ejemplo, las transacciones en los Estados Unidos se colocarán en centros de datos estadounidenses. Una situación similar con comillas: debe crear una ruta y determinar qué tipo de acuerdo es, a qué región pertenece, para comprender dónde están los cachés, enviarlos a los almacenes y bases de datos necesarios y no perseguir los datos nuevamente.
- ¿Y sucede que necesitas unir datos de diferentes regiones?
Sí, lo hace, y es una tarea difícil. Está claro que no bombearemos terabytes de datos de todas las regiones para obtener resultados agregados. Lo más probable es que en cada región calcule el agregado local de esta región y luego recopile todos estos resultados para obtener datos resumidos.
- Lo más probable es que haya datos externos, por ejemplo, historial de intercambio. ¿Y cómo manejarlos? ¿Se refleja dentro o hay formas de procesarlos?
Existen protocolos y conexiones con proveedores de datos estándar: Reuters, Bloomberg, que proporcionan información de intercambio. Almacenamos los datos que se necesitan en almacenamientos internos, pero algunas de las cosas se pueden volver a solicitar al proveedor de datos. Nuevamente, por región, para no generar tráfico.
Está claro que también han implementado servidores en todo el mundo para garantizar la velocidad y el rendimiento.
- ¿Y los datos para leer o leer / escribir? Si el registro no da miedo rodar tales volúmenes?
Básicamente, para leer, la escritura se realiza al registrar información sobre transacciones y otra información requerida por los reguladores. Básicamente, los cálculos para las necesidades domésticas: riesgos, el valor de las carteras, etc. Esta es una cocina interna, usted entrega los datos de alguna región o centro de datos, sin enviarlos al exterior.
- Si una pieza se desprende de la luna y vuela a un centro de datos, ¿qué sucederá? ¿Se acabó todo?
Los datos en los centros de datos se reflejan. Está claro que dentro de la región, los datos no se encuentran en un disco duro en un centro de datos. De lo contrario, como en esa bicicleta, cualquier mujer de limpieza podría cortar accidentalmente el servidor. Todo se copia en línea: hay una secuencia de datos en ambas direcciones, se lee desde el espejo más cercano y se sincroniza con la grabación para garantizar la coherencia.
Pero, como regla, hay mucha menos información disponible para la grabación, ya que debe mostrarse al usuario. Si no ve el recuento ahora, pero 2 segundos después de otra fuente, es triste, pero puedes vivir. Está claro que los datos que se necesitan para los reguladores, comercializadores externos y participantes del mercado se duplican y sincronizan en varias fuentes para no perder nada.
Cómo el Tech Center Deutsche Bank prepara datos y recolecta basura

- Pregunta sobre la preparación de datos. Según tengo entendido, cada fuente tiene su propio formato, y convertirlos instantáneamente no es una buena idea. ¿Los preparas de alguna manera para los cálculos?
Hay un formato único interno. Está claro que es más conveniente trabajar con los mismos datos, pero esto se traduce en la necesidad de convertirlos. Hay flujos de datos y equipos que se encargan de intercambiar información y conectarse con los proveedores. Forman y enriquecen datos en nuestro formato único. Para resolver problemas de rendimiento habrá dos flujos de datos, uno de ellos es un ciclo rápido que proporcionará información proveniente del flujo de datos de intercambio. Debido a esto, es menos necesario ir a varios almacenes y formar una estructura estándar. En él puede calcular los indicadores necesarios en tiempo real.
, , , . , , .
— ? , «» ?
- , 100%, . , , . , , . , .
— ? HDD, SSD, RAM, RAM?
. , Java, - In-Memory Data Grid — , . , SSD . , , , .
— - , , ?
Si , - 0 100%, . , . . , 100%, , .
, , , , . , , . .
— Java ?
.
— ?
, - huge pages, . , Shenandoah. full GC .
: flame graph, , , , .
— , flame graph?
, - Java-, , . ELK-, GC- , , . 150 — , . , 150 . , .
— Java GC ?
Java 8, 11- . . , , G1.
— ?
, . JVM.
— , , . - , ?
, . , . . ( UAT — user acceptance testing ) — , . , , . 2 , — 3 , , .
. , , , . , .
— , - , , ? ?
. : , GC, live set . - . — . , . , .
-, - . , . , JSON diff. JSON .
, . , , . .
— , , ?
, , . 100 «», . , . .
master, , , . , , , , . .
, , , , . , , . CI, .
— ?
. — , , . , , , , . - , .
— , .
— , , . , , , , - .
, - , — - , UI, . , , , , UI.
— ? «» Spring?
Spring, Java, MongoDB Protobuf, dependency injection. UI React, gRPC , .
— Mongo, Oracle. - ?
, , . . - , JDBC . - SpringData , JDBC. , , , .
— - CQRS?
, , .
— ? , …
.
— ? , .
, . , , ++ . GNU/Linux, Java. -, . , . , , , . .
, .
— ?
, «» . , , - , - . , , - «» . , , , , , .
— ?
-, , .
: , , . . , , , . , .
, 150 , . - . , .
, , , . , , , — . , , .
-

— - , , , ?
, — . , - , - . , . , 4, .
, - . — . , .
, , . , .
— - - , ?
« ». — , — , .
- - , , - . , , .
, . , , . — . - , . , -.
, , . , , - ( -, - ).
— ?
. , . , , .
— , , , - . , — , .
. , : , - , .
, , - , , . , , , , — . , , , .
( , )
— , ? ?
, , Java. dependency injection, , , — , . , . . : , - .
Es muy importante ocuparse de los subprocesos múltiples, ya que se encontrará con problemas de rendimiento. Si comienza a realizar cálculos paralelos, es importante comprender qué causará la instalación de barreras, cómo realizar la sincronización correctamente, dónde sucederá antes. Es necesario decidir en qué orden se iniciarán los cálculos, cómo usar cosas no estándar para un estilo más grande y más denso.
Como sabe, cosas como IntStream#distinct
implican primitivas de IntStream#distinct
en tipos Java y, posteriormente, la operación inversa. No parece muy aterrador, pero en grandes cantidades de datos, el boxeo masivo y el anboxing serán notables, la memoria se usará en vano. Debe comprender las entrañas de Java en sí mismo, porque en cosas insignificantes como el boxeo, puede generar un montón de asignaciones adicionales que no necesita. Y para notar esto a tiempo, debe poder utilizar herramientas para evaluar el rendimiento, recopilar métricas y comprender otras cosas estándar.
- ¿Necesitas saber los detalles del banco?
No, básicamente Todos entendemos que aquellas personas que conocen los detalles del banco ya están trabajando en los bancos. Cuando vienes de otra esfera, lo más probable es que no la conozcas. Al principio, puede estudiar los documentos sobre puntos generales: qué son los futuros, qué es una opción, cómo difieren, cuáles son los riesgos. Y simplemente te sumerges y comienzas a entender los detalles del negocio.
Pero no obstante, es importante. Al principio, simplemente puede implementar una funcionalidad que no esté vinculada a una especificidad comercial específica, sino que gradualmente aprenda cosas más complejas y específicas del tema. Lo que está aquí, lo que estaba en el último lugar de trabajo (cuando yo, como jefe del departamento, contraté empleados), se da cuenta de que si de cada diez personas al menos uno entiende qué son los futuros, esto ya es bueno.
Si tiene conocimiento de algoritmos, subprocesos múltiples y Java en general, entonces no será difícil estudiar los detalles del negocio. Resulta en sí mismo cuando te sumerges en este entorno, lees documentos y entiendes.
- ¿Cómo vas a probar un conocimiento tan profundo de Java en la entrevista? ¿Es esto real?
Está claro que lo más probable es que no los verifique. Pero hay tareas estándar en lógica, algoritmos, comprensión de estructuras internas. Esta es una tarea de prueba y codificación de pizarra. Por ejemplo, una tarea para implementar una memoria caché en una cola que le permitirá comprender si un candidato comprende el subprocesamiento múltiple: razas, puntos muertos y todo lo demás. En el camino, puede hacer preguntas sobre la cantidad de memoria que consume, por qué TreeMap, no HashMap. Por lo tanto, al resolver un problema general, puede repasar los momentos desde diferentes detalles. Aquí, más bien, la práctica por la cual se calculan ciertos matices.
- ¿Qué crees que hay que hacer para mejorar como programador?
Evolucionar! Codificar y observar qué tecnologías y algoritmos son, qué nuevos lenguajes, resolver problemas algorítmicos. De hecho, mucho depende de la experiencia. Si ha resuelto muchos problemas en algoritmos, puede encontrar algo similar de tareas pasadas en una nueva desconocida. Es necesario desarrollar el pensamiento, la capacidad de encontrar respuestas rápidamente. La capacidad de buscar en Google y encontrar soluciones en StackOverflow es muy útil. Si no sabe algo, pero sabe dónde encontrarlo, este es el camino hacia el éxito.
Los idiomas están cambiando, las tecnologías y los marcos se están transformando. Llegan nuevos patrones, pero quedan algunos patrones que todos usan. Las conferencias de Java sin informes sobre las secuencias reactivas y hablar sobre Kotlin ya no pasan. Sentarse en un capullo y no entender que ahora el abastecimiento de eventos, en cierto sentido, se está apoderando gradualmente del mundo es extraño.
Es necesario desarrollar un fondo. Por ejemplo, los libros de Knut siguen siendo relevantes. Base más nuevas tecnologías. Y necesitas saber dónde y qué buscar en google.
- ¿Qué fue lo último que entendió?
En Kotlin Coroutines. Genial, me gusta. Tanto en sintaxis como en lógica. Miro cómo trabajar en él con subprocesos múltiples y asincronía. Anteriormente, tenía que usar Kotlin muy poco. Ahora lo estoy estudiando activamente, algunos proyectos ya lo están explotando. Incluso existe en algunos módulos pequeños en el producto.
