6. Cómo se ejecuta la estrategia: tiempos, datos y parámetros

6.1. 1. 策略运行时机

El tiempo de ejecución de la estrategia (cuándo y con qué frecuencia se ejecuta) no se almacena dentro de la clase de estrategia, sino que está determinado por el Grupo al que pertenece. run_freq y run_timing del grupo se especifican al agregar la estrategia a un Operator (por ejemplo, add_strategy(stg, run_freq='d', run_timing='close')). Por lo tanto, colocar la misma instancia de estrategia en grupos con diferentes run_freq/run_timing hará que se invoque en diferentes momentos.

6.2. 2. 单步运行流程(细化)

Para el paso de tiempo actual (step_index):

  1. Verifique group_timing_table: tome la fila correspondiente a este paso para obtener la lista de Grupos que se ejecutarán en este paso (columnas con valor 1).

  2. Para cada grupo en ejecución:

    • Para cada estrategia dentro de este grupo: según sus tipos de datos, longitud de ventana y el paso actual, corte la ventana de datos de este paso de los datos preparados y llame a update_running_data_window para inyectarla en esa instancia de estrategia (escrita por dtype_id).

    • Llame a generate() para cada estrategia de este grupo en orden (llamará internamente al no-arg realize()), recopile las señales devueltas por cada estrategia y forme una lista.

    • Utilice el licuadora de este grupo para combinar las señales de la lista en una señal combinada para el grupo.

  3. Si se ejecutan varios grupos en este paso: luego combine las señales de cada grupo en una de acuerdo con group_merge_type (o envíelas por separado, según la implementación).

  4. Entregue la señal final del paso a la capa superior: en el backtesting, pásela al Backtester para analizar compras/ventas y actualizar posiciones; en el comercio real, páselo al Trader/Broker para generar órdenes.

6.3. 3. Strategy 内部:realize() 与 get_pars / get_data

  • realize(): No acepta argumentos. La lógica estratégica se implementa sólo dentro de este método; no recibe datos ni tiempo a través de parámetros. En su lugar, utilice get_pars(name, …) para recuperar parámetros ajustables y get_data(dtype_id) para recuperar la ventana de datos inyectada para el paso actual.

  • Valor de retorno: un escalar o una matriz 1D, según la clase base de la estrategia (RuleIterator suele ser un escalar, FactorSorter devuelve una matriz de factores y GeneralStg devuelve una señal por activo). El mismo código darse cuenta() se reutiliza tanto en las pruebas retrospectivas como en las operaciones reales para garantizar un comportamiento coherente.

6.4. 4. 可调参数(Parameter)

  • Definición: en init de la clase de estrategia, use pars (una lista de parámetros o dict) para definir los nombres, tipos, rangos de valores, etc. de los parámetros ajustables.

  • Configuración previa a la ejecución: utilice set_parameter (por ejemplo, op.set_parameter(stg_id, pars=(...))) para escribir los valores de los parámetros que se utilizarán antes de la ejecución.

  • Optimización: El Optimizador toma muestras o busca en el espacio de parámetros (determinado por la configuración de parámetros como par_range). Para cada conjunto de parámetros, establece los parámetros en Operator y ejecuta una prueba retrospectiva, agrega los resultados de acuerdo con la función objetivo (por ejemplo, la relación de Sharpe) y, por lo tanto, encuentra una mejor combinación de parámetros.

6.5. 5. 三种策略基类的输入/输出差异

clase base

Entradas (get_data, etc.)

Salidas (valor de retorno de la realización)

Casos de uso típicos

RuleIterator

Ventana de datos de un solo activo o de múltiples activos, recuperada por dtype_id

Escalar (por ejemplo, 1/-1/0); la misma iteración de regla se aplica a todos los activos

Timing, regla única con múltiples instrumentos

FactorSorter

Sección transversal de múltiples activos (por ejemplo, valores de factores para cada acción)

Una matriz de factores 1D; el motor selecciona acciones de acuerdo con reglas de clasificación y filtrado

Selección de acciones basada en factores

GeneralStg

Ventanas de múltiples activos y múltiples tipos

Una matriz de señales 1D (una posición objetivo o peso por activo)

Señales multiactivos de uso general

6.6. 6. 小结

El mismo flujo de trabajo “paso → preparar datos → inyectar → realizar() → mezclar” sirve tanto para el backtesting como para el trading en vivo: a la estrategia no le importa si actualmente se está realizando un backtesting o en vivo; solo depende de get_pars/get_data y el momento de su grupo. La capa de tiempo de ejecución es responsable de proporcionar los datos correspondientes en diferentes modos y manejar las señales de salida. Para obtener más detalles de implementación, consulte la “Guía del usuario” y la referencia de API.