El día que desactivé mi propio interruptor de seguridad

En algún lugar del historial de mi primer bot de trading en vivo hay un commit del que no me siento orgulloso. Tiene dos palabras. En medio del sistema en funcionamiento, para hacer desaparecer un problema, metí la mano en el mecanismo de seguridad que se suponía debía proteger la cuenta y escribí: if False.

Funcionó, en el mismo sentido en que apagar una alarma de humo “funciona”. La alarma se detuvo. Aquello que la alarma vigilaba, no.

El guardián que no dejaba de saltar

Al principio hice una cosa bien: le di al bot en vivo un límite de pérdida diario. Si la cuenta caía demasiado en un solo día, el sistema se suponía que debía dejar de operar y esperarme. Es el tipo más básico de cortacircuitos, y sobre el papel era exactamente la clase de disciplina que a un principiante le dicen que construya.

El problema era que seguía saltando cuando en realidad no pasaba nada malo. Cada vez que el bot desplegaba efectivo en una posición, el guardián veía caer el saldo en efectivo y lo interpretaba como una pérdida. Así que hacía su trabajo, ruidosa y constantemente, deteniendo un sistema que no estaba experimentando la condición de pérdida que el guardián afirmaba. Una alarma que se dispara cada pocos minutos sin razón no es una característica de seguridad; es ruido. Y el ruido, al final, acaba siendo silenciado.

El parche en caliente de dos palabras

Así que lo silencié. A mitad de sesión, con el bot en marcha, desactivé la comprobación de pérdida diaria —if False— y lo desplegué. Las detenciones cesaron. El bot volvió a operar con libertad. Durante unos minutos pareció un arreglo.

No era un arreglo. Fue una de las decisiones más peligrosas que tomé en todo aquel proyecto, y vale la pena ser preciso sobre por qué.

Lo que realmente hice

El guardián saltaba porque se le estaba alimentando con información errónea: confundía gastar efectivo en una posición con perder dinero. Eso era un bug real, y tenía un arreglo real: enseñarle al guardián la diferencia entre comprar y perder.

No hice eso. Apagué el guardián. Traté un problema de medición como si fuera un problema de guardián, y lo resolví quitando el guardián. Eso es el equivalente en ingeniería a sacarle la pila a un detector de humo porque no deja de pitar. El pitido se detiene. La protección también.

Un guardián desactivado es una deuda que se acumula

Aquí está la parte que debería haberme asustado más de lo que lo hizo en aquel momento. Antes del parche en caliente, mi problema era simplemente molesto: un guardián que me detenía con demasiada frecuencia. Después del parche, mi problema era invisible e ilimitado: un bot en vivo, operando con dinero real, sin ningún límite de pérdida que funcionara.

Las falsas alarmas tenían un coste que yo podía ver: trading interrumpido. El guardián desactivado tenía un coste que yo no podía ver, hasta el día en que una pérdida genuina pudiera llegar y descubrir que no había nada interponiéndose en su camino. Había cambiado una irritación visible y superable por un riesgo invisible y sin límites, y lo había hecho para que una luz roja se pusiera verde más rápido.

Esa es la seducción de desactivar una salvaguarda: el coste se aplaza. No pasa nada malo de inmediato. La factura, si llega, llega más tarde y toda de golpe, en el peor momento posible, que es exactamente el momento para el que el guardián existía.

La jugada correcta: reparar el guardián, no silenciarlo

La respuesta correcta era la aburrida. La salvaguarda prevista era válida, pero sus entradas de medición y contabilidad estaban rotas. Así que arreglas la entrada: separas las señales que la alimentan para que reaccione a pérdidas reales, no al movimiento ordinario de efectivo hacia las posiciones. Una vez que el guardián pudo distinguir una pérdida real de una compra normal, dejó de gritar que venía el lobo, y estuvo ahí, intacto, para las pérdidas que sí importarían.

La regla que saqué de esto es casi vergonzosamente simple, y ahora la trato como algo casi absoluto: no sigues operando con un mecanismo de seguridad apagado. Si un guardián se dispara erróneamente, diagnostica sus entradas y su propia lógica antes de cambiarlo o desactivarlo, y arréglalo o reemplázalo antes de reanudar, en lugar de operar sin protección.

El sentido entero de un guardián es el momento en que no estás

Hay una razón por la que esto importa más para un sistema automatizado que para casi cualquier cosa que operes a mano. Un bot en vivo corre mientras duermes, mientras estás en el trabajo, mientras casi has olvidado que existe. Sus mecanismos de seguridad no son realmente para los momentos en que estás mirando: apenas los necesitas entonces. Son para los momentos en que no estás: el movimiento brusco a las 4 de la madrugada, el bug que solo se activa en un día festivo, la cascada que se despliega en los noventa segundos en que te apartaste del escritorio.

Cuando desactivas un guardián para superar una molestia hoy, estás pidiendo prestado precisamente contra esos momentos. Estás apostando a que la hora sin vigilancia será tranquila. El mercado no ofrece esa apuesta en términos justos.

Mantengo ese commit de dos palabras en mente como una especie de etiqueta de advertencia. if False es el arreglo más fácil del mundo, y a menudo no es ningún arreglo: es una forma de convertir un problema que puedes ver en un desastre que no puedes.

— Sin señales, sin retornos, esto no es asesoramiento de inversión.