4. La lista antes de poner dinero real
Nivel 12: Probar, desplegar y dar el paso
Este es el último módulo del curso y el último de la academia. Primero, convertir seis niveles en una lista concreta que puedas mirar el día que vayas a poner dinero de verdad. Después, mirar hacia atrás y ver el mapa entero.
La lista, punto por punto
1. El motor de señales que opera es el mismo módulo que probaste, sin lógica duplicada en dos sitios. (Nivel 7)
2. La decisión es determinista: misma entrada, misma salida, sin reloj ni azar sin semilla por dentro. (Nivel 7)
3. Cada orden lleva un identificador de intención estable y reenviarla no crea una segunda. (Nivel 8)
4. El estado sobrevive a un reinicio y su versión de esquema se comprueba al arrancar. (Nivel 8)
5. El calendario está en datos, no en condicionales: festivos, medias sesiones, cambios de hora, vencimientos. (Nivel 9)
6. Un ciclo perdido tiene una política escrita: qué se hace con la señal atrasada y qué se descarta. (Nivel 9)
7. Registro estructurado de la decisión y de sus entradas, no solo del resultado. (Nivel 10)
8. Reconciliación automática contra el bróker al arrancar, al cerrar y de forma periódica. (Nivel 10)
9. Alertas que separan lo grave de lo raro y que llegan a alguien capaz de actuar. (Nivel 10)
10. Interruptor manual accesible en menos de un minuto, probado este mes. (Nivel 11)
11. Cortes automáticos por pérdida diaria, por número de órdenes y por descuadre, con umbrales escritos antes de operar. (Nivel 11)
12. Un procedimiento para el peor día que pueda ejecutar alguien que no seas tú. (Nivel 11)
13. Pruebas con bróker simulado que cubran ejecución parcial, rechazo, hueco de datos y tiempo agotado. (Nivel 12)
14. Prueba de comparación entre versiones sobre un tramo de datos fijo. (Nivel 12)
15. Vuelta atrás ensayada, con la versión anterior instalada y el estado leído en los dos sentidos. (Nivel 12)
16. Escalones recorridos y medidos: coste real con capital pequeño, comparado con el supuesto del backtest. (Nivel 12)
La lista se ejecuta, no se lee
Buena parte de esos puntos se comprueban solos, y lo que se comprueba solo no se olvida un lunes con prisa.
def prevuelo(sistema, broker, config):
fallos = []
if sistema.hash_git != config.hash_git_aprobado:
fallos.append("la version en ejecucion no es la aprobada")
if not sistema.estado_cuadra_con(broker):
fallos.append("estado y broker no cuadran")
if config.perdida_diaria_maxima is None:
fallos.append("sin corte por perdida diaria")
if sistema.dias_desde_prueba_del_interruptor() > 30:
fallos.append("el interruptor no se prueba desde hace demasiado")
if not sistema.canal_de_alertas_responde():
fallos.append("las alertas no llegan a ninguna parte")
return fallos
pendientes = prevuelo(sistema, broker, config)
if pendientes:
raise SystemExit("no se habilita el envio de ordenes: " + "; ".join(pendientes))Y el día que se pasa a dinero real se deja un acta, porque dentro de seis meses nadie recordará con qué versión ni con qué límites se arrancó.
import json, hashlib, datetime
def acta_de_arranque(ruta_config, hash_git, capital, limites):
with open(ruta_config, "rb") as f:
hash_config = hashlib.sha256(f.read()).hexdigest()[:12]
return json.dumps({
"momento": datetime.datetime.now(datetime.timezone.utc).isoformat(),
"version_codigo": hash_git,
"hash_config": hash_config,
"capital_asignado": capital,
"perdida_diaria_maxima": limites["perdida_diaria"],
"quien_puede_parar": limites["responsable"],
}, ensure_ascii=False)Escenario trabajado, con cifras inventadas para el ejemplo: un sistema que envía unas 200 órdenes al día arranca con un error de signo en el cierre de posición y compra en cada ciclo. Con el punto 11 en su sitio, el corte por número de órdenes lo detiene alrededor de la cuadragésima; sin él, sigue hasta el cierre. Misma equivocación, coste cinco veces mayor. La lista no evita el error: acota lo que cuesta.
El mapa de la academia
- Pista sin código. Teoría de mercados, Macro y Costes. Qué es un mercado y quién está al otro lado, cómo el precio del dinero y los bancos centrales condicionan todo lo demás, y por qué las comisiones, la horquilla y los impuestos deciden más resultados que la mayoría de las ideas brillantes.
- Pista intermedia. Matemáticas y estadística, Derivados, y Riesgo y gestión de cartera. Cómo se distingue una diferencia real de una casual, qué son de verdad los futuros y las opciones y qué riesgos traen, y cómo se dimensiona una posición para seguir vivo después de una mala racha.
- Pista difícil. Técnica, de Python desde cero hasta operar en un bróker; Datos y producción, este mismo curso, que consigue información en la que se pueda confiar y luego hace que todo lo anterior aguante funcionando solo; y Expectativas y ventaja, que pregunta qué precio ya está descontado y dónde puede existir una ventaja.
Hacia dónde seguir
Lo que falta ahora no es más material, es medida. Vuelve a Matemáticas y estadística cuando tengas resultados propios que juzgar, porque la pregunta "¿esto es una ventaja o es suerte?" solo tiene respuesta allí. Vuelve a Costes cuando midas tu deslizamiento real, y a Riesgo cuando toque decidir el tamaño. Y recuerda lo que este curso no te ha dado en ningún momento: una estrategia. Un sistema impecable que ejecuta una idea sin ventaja pierde dinero con una puntualidad admirable.
La advertencia, sin adornos
Todo esto es formación, no asesoramiento financiero. Nada de lo que has leído es una recomendación de comprar o vender ningún activo, ni está adaptado a tu situación, tus objetivos ni tu tolerancia al riesgo. Operar conlleva riesgo de pérdida, incluida la pérdida total del capital. Y un sistema automático amplifica tanto los aciertos como los errores: el mismo mecanismo que repite una decisión buena sin cansarse repite la mala a la misma velocidad, sin dudar y sin avisar. Por eso la lista de este módulo no es burocracia. Es lo único que separa un fallo de un desastre.