Mi novia es contadora. Los contadores entienden reglas de negocio como nadie, y sin embargo, algunas son bastante rebuscadas.
Mi novia tiene un cliente que quería sacar las ganancias obtenidas por la participación en un fideicomiso, a través del criterio “Primero Entrado – Primero Salido” (FiFo, por sus siglas en inglés). Esto es, cuando se venden participaciones, que la ganancia se calcule en base a lo que valían las participaciones más antiguas restantes.
Es más fácil pensarlo en un supermercado: si uno tiene un stock de cajas de leche, se pondrán en venta las primeras en ser compradas, porque tienen vencimiento. Acá si bien no existen vencimientos, existen distintos valores en las participaciones. Además, pueden venderse participaciones en cantidades distintas a las que fueron adquiridas en cada oportunidad. Es decir, si compré 50 un día y 50 otro, al siguiente puedo vender 80, por lo que el cálculo de ganancias es a través de la diferencia con las primeras 50 mas las otras 30.
Si, una locura.
Y para las locuras es que existe Python. En este repo dejé la solución que armé para este problema.
El snippet está pensado para que se pueda ordenar por día, aunque al dataset le vendría muy bien un fecha/hora. Sumado a esto, si bien dejé de prueba el número de operación, la secuencia es distinta para suscripciones y rescates, es decir que es totalmente inútil excepto que haya más de estas operaciones en un sólo día.
Lo que hace es ir línea a línea de un archivo Excel, e identifica si una celda es una suscripción o un rescate. Si es lo primero, ese valor se copia a la columna “cuotapartes restantes”, para extraerlas de allí.
Si es un rescate, primero se arma un dataframe filtrando sólo por aquellas suscripciones que tengan cuotapartes restantes: de nada me sirven aquellas del futuro o que ya están liquidadas.
Después, calculo en ganancia el valor de cada cuotaparte por la cantidad vendida. En ganancia voy a ir restando el valor a la suscripción.
En base a eso, compruebo si la cantidad de cuotapartes restantes de una subscripción son mayores, iguales, o menores que la cantidad vendida en el rescate.
Si se dan los primeros dos casos, se calcula el valor a restar de ganancia, se iguala a cero la cantidad de cuotapartes vendidas, y se restan de cuotapartes restantes la cantidad de cuotapartes vendidas, para dar por cerrado el cálculo.
Si la cantidad de cuotapartes restantes es menor a las vendidas, cierro el lote de suscripción igualando a 0 la cantidad restante, y resto de ganancia el remanente de tal suscripción. A cuotapartes vendidas se le restan las restantes, para continuar el bucle.
Una vez hecho todo esto, si la operación fue un rescate, la columna ganancia tomará el valor de tal cálculo.
Finalmente en la ejecución, podría quedar un número en “Cuotapartes restantes”, que es el total de cuotapartes que queda en el fondo sin rescatar. Una vez hecho todo esto, el resultado se guarda en un archivo Excel separado.
Si, es un chino. Pero funciona y fue entretenido de hacer, ideal para un final de sistemas.