9. Saltar a contenido

9. Matrices de riesgo cliente

La matriz de riesgo cliente segmenta a los legajos de acuerdo a su nivel de riesgo de Lavado de Dinero y Financiamiento del Terrorismo, en cumplimiento de las recomendaciones del GAFI y de normativas locales.

Una matriz de riesgo bien definida facilita el control de los legajos mas riesgosos sin el costo operativo que supone aplicar procesos de monitoreo intensificados a toda la base de legajos.

Trak.e permite la gestión de la matriz de riesgo cliente dentro de la aplicación. La matriz de riesgo cliente se implementa mediante una regla configurable por cliente.

Se permite agregar cualquier cantidad de reglas de matriz de riesgo, pero a lo sumo una puede estar activa.

9.1 Implementación

La regla se implementa utilizando el lenguaje de programación Python. A nivel general, la regla toma como parámetro un legajo y decide su nivel de riesgo: low (bajo), medium (medio), ó high (alto).

9.1.1 Parámetros

Las variables disponibles son:

  • profile: Al evaluar la regla se pone en el contexto de ejecución la variable profile que contiene el legajo que se esta procesando actualmente. Todos los atributos detallados en la sección Legajos se encuentra disponible en este objeto.

  • alerts: Al evaluar la regla se pone en el contexto de ejecución la variable alerts que contiene el historial de alertas abiertas y cerradas del legajo que se esta procesando actualmente. La variable es una lista donde cada objeto representa una alerta. Todos los atributos detallados en la sección Alertas se encuentra disponible en este objeto.

  • documents: Al evaluar la regla se pone en el contexto de ejecución la variable documents que contiene los documentos asociados al legajo que se esta procesando actualmente. La variable es una lista donde cada objeto representa un documento. Todos los atributos detallados en la sección Documentación se encuentra disponible en este objeto.

  • hist_trxs: Si la regla incluye información sobre la transaccionalidad del legajo, se puede acceder al histórico de la transaccionalidad del legajo con este nombre. La variable es puesta en contexto de ejecución en formato de pandas.DataFrame, donde cada fila del DataFrame representa una transacción y las columnas del DataFrame son los atributos de las transacciones (utilizando guion bajo como separador en caso de ser atributos anidados). Es posible que el historial este vacío (sin filas ni columnas) si el cliente no registra transacciones.

9.1.2 Resultado de la regla

La regla debe definir una variable de nombre RISK_LEVEL cuyos posibles valores son 'high', 'medium' o 'low' representando el valor de riesgo evaluado para el legajo.

Nota

Contexto: Además de los valores 'high', 'medium' o 'low' utilizados para interpretar la evaluación de la regla, se devuelve el contexto de la evaluación, particularmente aquellas variables públicas definidas. Esto permite guardar valores calculados durante la ejecución de la regla y que los mismos estén disponibles al momento de ver los resultados.

9.2 Ejemplo simple de matriz de riesgo cliente

A continuación, se define la implementación de una regla simple para el cálculo del riesgo de un perfil.

if "pep" in profile.declaration and profile.declaration.pep:
    RISK_LEVEL = "high"
else:
    RISK_LEVEL = "low"

La anterior regla, sencillamente, decide el nivel de riesgo de un perfil en base a su declaración de Persona Expuesta Políticamente (PEP). Es decir, la regla decidirá que el perfil es de riesgo alto en caso de que la persona se haya declarado como PEP, o de riesgo bajo en caso contrario.

9.3 Creando reglas mas complicadas

La regla de ejemplo anterior utilizaba un solo factor para determinar el riesgo de un legajo. Una opción mas realista es utilizar varios factores para evaluar el riesgo de un legajo, generando una ponderación o scoring que a su vez se discretiza en un nivel de riesgo. Puede ser conveniente, modularizar cada factor de riesgo como una función de Python, por ejemplo, si uno de los factores de riesgo de nuestra matriz es el tipo de persona física/jurídica podemos escribir:

def _tipo_de_persona(p):
    if p.person_type == "natural_person":
        return 50
    if p.person_type == "legal_person":
        return 100
    # Assume worst case in case of missing or corrupted data
    return 100

Luego, podemos llamar a esta función como lo hacemos de la forma estándar en python:

score_tipo_de_persona = _tipo_de_persona(profile)

Asi, podemos definir los distintos factores de riesgo como funciones separadas y luego calcular un promedio ponderado:

score_total = (
    score_tipo_de_persona * 0.1
    + score_actividad * 0.2
    + score_antiguedad * 0.2
    + score_canal * 0.1
    + score_nacionalidad * 0.1
    + score_pep * 0.1
    + score_producto * 0.1
    + score_provincia * 0.1
)

Finalmente, en base al score y a unos umbrales previamente definidos, asignamos un valor de riesgo

if riesgo <= 30:
    RISK_LEVEL = "low"
elif riesgo <= 60:
    RISK_LEVEL = "medium"
else:
    RISK_LEVEL = "high"

9.4 Usando Tablas de búsqueda

Supongamos que para asignar la ponderación del factor de riesgo según la actividad económica definimos un mapeo entre las actividades económicas de AFIP con un score de riesgo asociado. Si bien esto se puede realizar simplemente en Python, puede ser comodo para ello utilizar una tabla de búsqueda. Una tabla de búsqueda es un archivo CSV separado por coma, con encoding utf-8, representando un diccionario clave valor. Por ejemplo, un CSV válido con algunas actividades económicas de ejemplo sería

actividad,puntaje
7,0
12,5
13,10

El nombre del archivo CSV (sin extensión) se utilizará como el nombre de la tabla de búsqueda. Si ya existe una tabla de búsqueda con el mismo nombre se reemplazara la tabla anterior. Una vez que la tabla de búsqueda está cargada se puede acceder en cualquier regla como un diccionario. Por ejemplo, si subimos el CSV de ejemplo con el nombre "actividad" como una tabla de búsqueda, luego podemos implementar el factor de riesgo 'actividad' como:

def _actividad(p):
    # get first activity for the profile
    code = p.activities[0].code
    return actividad.get(code, 100) # return 100 if activity not found

9.5 Testing de la regla de riesgo

Trak.e permite testear la regla de riesgo antes de guardarla con cualquier legajo de la base o con un legajo armado a necesidad para testear casos bordes y asegurarse de que la regla es correcta tanto sintáctica como semanticamente.

9.6 Nombre y descripción de la matriz de riesgo

La matriz de riesgo se guarda con un nombre, el cual debe ser único dentro de todas las variantes de matriz de riesgo que tenga cargada la entidad.

La matriz de riesgo permite adjuntar ademas una descripción en formato de texto enriquecido, con lo cual se puede guardar la documentación del comportamiento de la matriz de riesgo junto al código que la implementa.

Recurso
risk_evaluation
risk_lookup_table
risk_rule

9.7 API

Para más información técnica sobre cómo crear, buscar y modificar matrices de riesgo, se encuentra disponible la documentación de la API.