5. Operator y Grupo: quién corre cuando
5.1. 1. 运行层在整体中的位置
La capa de tiempo de ejecución es responsable de la ejecución de la estrategia basada en el tiempo, agregando señales de cada estrategia y pasando los resultados a pruebas retrospectivas/operaciones en vivo/optimización. El núcleo es Operator: es a la vez un contenedor de estrategias y un punto de entrada unificado para la ejecución (op.run(config, datasource, logger)). A través de Group y group_timing_table, Operator determina «qué estrategias se ejecutan en cada paso de tiempo y cómo se combinan las señales», lo que permite una ejecución reproducible consistente con el período de backtest y la frecuencia de ejecución.
5.2. 2. Operator 的角色
Contenedor de estrategias: contiene varios Grupos. Cada Grupo contiene varias estrategias (Estrategia). Cuando los usuarios agregan estrategias a través de
add_strategy/Operator([...]), las estrategias se asignan a un grupo existente o se crea un nuevo grupo basado en run_freq y run_timing.Punto de entrada de ejecución: Expone run(config, datasource, logger) externamente. La configuración incluye el universo de activos, el período de prueba retrospectiva, los costos, el plan de capital, etc.; la fuente de datos proporciona datos históricos o en tiempo real. La lógica de ejecución ejecuta cada grupo paso a paso de acuerdo con group_timing_table y agrega las señales.
Mantener group_timing_table: antes de ejecutar, esta tabla se genera en función del período de prueba retrospectiva (o programación en vivo) y run_freq y run_timing de cada grupo. Cada fila corresponde a un paso de tiempo, cada columna corresponde a un Grupo; un valor de 1 significa que el grupo se ejecuta en ese paso, 0 significa que no se ejecuta.
5.3. 3. Group 的概念
Definición: Un grupo es una colección de estrategias que comparten la misma run_freq y run_timing, y tiene un signal_type unificado (PT/PS/VS) y un blender (reglas de combinación).
Por qué agrupar por “tiempo de ejecución”: las estrategias que se ejecutan en el mismo momento comparten el mismo conjunto de datos y programación del “paso de tiempo actual”; cuando se mezclan, las señales se combinan primero con un mezclador como “señales del mismo grupo”, luego se usa group_merge_type para manejar el caso en el que coexisten varios grupos, lo que facilita su comprensión y configuración.
5.4. 4. Operator 与 Group 的关系
Un Operator contiene varios grupos y cada grupo contiene varias estrategias.
Al agregar una estrategia, si ya existe un grupo con la misma run_freq y run_timing, la estrategia se agrega a ese grupo; de lo contrario, se crea un nuevo grupo. Por lo tanto, la partición del grupo está completamente determinada por el «tiempo de ejecución». La clase de estrategia en sí no almacena run_freq/run_timing; son gestionados por su Grupo.
5.5. 5. group_timing_table
Significado: Una tabla 2D: filas = pasos de tiempo (alineados con el período de prueba retrospectiva o el cronograma en vivo), columnas = Grupos; un valor de celda de 1 significa que el grupo se ejecuta en ese paso, 0 significa que no se ejecuta.
Relación con el período de backtest y run_freq: en el backtesting, se genera una línea de tiempo a partir de invest_start, invest_end y el calendario comercial, y luego run_freq y run_timing de cada grupo se utilizan para marcar «qué pasos ejecutan qué grupos» en esa línea de tiempo, produciendo group_timing_table. El comercio en vivo es similar: los grupos que se activan están determinados por las fechas de ejecución reales y run_freq/run_timing.
5.6. 6. blender
Propósito: Puede haber múltiples estrategias dentro de un mismo Grupo. En cada paso, cada estrategia genera una señal (un escalar o una matriz). El licuadora mezcla estas señales en una señal fusionada para el grupo de acuerdo con ciertas reglas (por ejemplo, promedio ponderado, suma, etc.).
Configuración: Puede ser una expresión (por ejemplo,
0.5*s0+0.5*s1) o usar las reglas predeterminadas: en PT comúnmente usa el promedio de la posición objetivo de cada estrategia; en PS/VS comúnmente usa suma, etc. Para obtener más detalles, consulte la documentación y la API.Resultado: la señal combinada se utiliza como salida de este paso y de este grupo, y luego se combina con las salidas de otros grupos según group_merge_type (si se ejecutan varios grupos al mismo tiempo).
5.7. 7. group_merge_type
Cuando se ejecutan varios grupos al mismo tiempo, group_merge_type determina cómo se combinan las señales de los grupos:
Ninguno: cada grupo genera resultados de forma independiente, sin fusionarse (cuando hay varios grupos, esto puede producir múltiples rutas de ejecución, dependiendo de cómo las use la capa superior).
Y: fusión lógica de estilo AND, como multiplicar señales entre grupos.
O: fusión lógica de estilo OR, como agregar señales entre grupos.
La semántica exacta está sujeta a la documentación de la versión actual; Por lo general, no es necesario que le importe cuando utiliza un solo grupo.
5.8. 8. 小结
A través de Group y group_timing_table, el Operator implementa una programación unificada “por paso de tiempo, por grupo”: en cada paso, solo ejecuta los Grupos marcados como 1 para ese paso; Las estrategias dentro de un grupo comparten la inyección de datos y el mezclador, y generan una señal combinada para realizar pruebas retrospectivas, operaciones en vivo y optimización. Para obtener más información sobre su uso, consulte la Guía del usuario y la documentación de la API.