Reutilización de estrategias y backtests
Las celdas de investigación siguen conteniendo código Rust convencional que puedes editar. Estas funciones auxiliares facilitan la reutilización del código de estrategia existente y de los resultados registrados; no sustituyen el análisis personalizado ni introducen un motor de trading independiente.
Empezar desde el panel de sesión
Sección titulada «Empezar desde el panel de sesión»En Strategy code & backtests:
- Load research tools carga conjuntamente la biblioteca y los componentes públicos de tu estrategia como
project::, sus dependencias normales y las funciones auxiliares de backtesting e investigación. No conecta una fuente de datos ni ejecuta una estrategia. - Add discovery cell enumera los backtests completados del proyecto y los IDs de parámetros del grafo.
- Elige una referencia y un candidato y después Add comparison cell.
- Refresh saved runs actualiza los selectores después de un experimento sin restablecer las variables.
- Add signal chart & heatmap crea un ejemplo editable para la ejecución seleccionada.
- Add isolated backtest cell usa las instantáneas históricas ya cargadas en el cuaderno.
Los botones Add… cell insertan código sin ejecutarlo. Load research tools compila e inicializa el entorno de ejecución, pero nunca ejecuta las celdas guardadas del cuaderno. Si la misma revisión del proyecto ya está importada en una sesión en ejecución, reutiliza esa sesión sin recompilar, restablecer variables ni marcar las salidas como desactualizadas. Las importaciones nuevas o modificadas restablecen las variables de sesión y marcan las salidas anteriores como desactualizadas.
Las velas ya cargadas y su configuración original de fecha y hora se restauran al cargar las herramientas. Editar las fechas de entrada de la sesión no cambia las etiquetas de una instantánea existente; vuelve a cargar los datos para usar una ventana diferente.
Compilación y caché
Sección titulada «Compilación y caché»La primera importación resuelve las dependencias del proyecto, compila AQE, Polars y los módulos exportados del proyecto, enlaza las funciones auxiliares del cuaderno y restaura las instantáneas cargadas. El panel de sesión muestra la etapa de preparación o compilación y el tiempo transcurrido; Stop/reset cancela la operación. Las dependencias compiladas se almacenan en caché por cuaderno y se conservan tras restablecimientos y reinicios de la aplicación. Una compilación en frío del cuaderno es independiente de la compilación de la aplicación de escritorio o del ejecutable de estrategia y también puede tardar varios minutos.
Las celdas del cuaderno y las dependencias importadas usan un perfil de desarrollo de compilación rápida: nivel de optimización 0, 256 unidades de generación de código, compilación incremental, sin símbolos de depuración y sin optimización en tiempo de enlace. Las aserciones de depuración, las comprobaciones de desbordamiento y el desenrollado de pila ante errores panic siguen activados. Esto prioriza reducir el tiempo de compilación frente a aumentar la velocidad de ejecución; los tiempos de los cuadernos no son pruebas de rendimiento de estrategias en modo release. Estos ajustes específicos solo se aplican a la compilación del cuaderno, no a las compilaciones de estrategias en vivo, a los backtests normales ni a los subprocesos de experimentos aislados.
Después de actualizar AQS, reinicia la sesión del cuaderno para incorporar los cambios de ajustes del compilador. Cargo puede recompilar las dependencias una vez al cambiar el perfil y reutilizar después esa caché en cargas posteriores. No es necesario borrar la caché de compilación.
Mantén el mismo cuaderno y su caché de compilación para trabajos repetidos. Usa Refresh saved runs para actualizar los selectores de backtests sin compilar. Después de editar el código fuente o el manifiesto de este proyecto, vuelve a hacer clic en Load research tools. Después de editar AQE u otra dependencia externa de ruta, usa Stop/reset seguido de Load research tools para forzar una nueva comprobación de importaciones. El restablecimiento borra las variables, no la caché de dependencias; vuelve a ejecutar después las celdas de configuración personalizadas.
Reutilizar un modelo alfa, indicador o pipe
Sección titulada «Reutilizar un modelo alfa, indicador o pipe»Por ejemplo, un proyecto Three Amigo que exporte un módulo openingrange puede usar su implementación real del modelo alfa:
use project::openingrange::Openingrange;
let alpha: Openingrange = Openingrange::new( 45, "07:00".to_string(), 14, 2.0, 1.5, false,);let study: AqsBacktest = aqs_run_alpha(alpha, &research_snapshot).await?;let btc = study.bars("BTCUSD", "5m")?;let signals = study.signals("BTCUSD")?;aqs_chart(&btc).candles().signals(&signals)?.show()?;Usa el nombre real del módulo y el constructor de tu componente. aqs_run_alpha realiza una reproducción histórica de AQE con el ciclo de vida del modelo alfa y un historial filtrado por tiempo. Es un estudio solo de señales, sin un pipe de envío de entradas; no es un backtest de rentabilidad de estrategia. Los modelos alfa que requieran configuración personalizada del ciclo de vida, marcos temporales adicionales, variables compartidas o estado de ejecución deben probarse en una estrategia completa.
Usa tipos de variables explícitos en los límites con código importado, como en el ejemplo anterior. El análisis incremental de tipos del cuaderno de Rust puede necesitar una anotación incluso cuando una compilación normal de Cargo inferiría el tipo. Si una celda informa de que no puede determinarse el tipo de una variable, anótalo (por ejemplo, let btc: DataFrame = ...;) y después vuelve a cargar la sesión o la configuración si el diagnóstico solicita un restablecimiento.
Un indicador importado puede operar directamente sobre data.bars(symbol)?. Los pipes de insights importados requieren un contexto de estrategia y los estados de insight adecuados. Regístralos en tu Strategy personalizada de AQE y después ejecuta esa estrategia:
// my_strategy implements AQE's existing Strategy interface.let run = aqs_run_strategy( my_strategy, &research_snapshot, 100_000.0, 10,).await?;aqs_table(&run.trades()?, 20)?;Esta reproducción personalizada usa los valores predeterminados de costes de PaperBroker y los argumentos explícitos de efectivo y apalancamiento. No hereda los componentes registrados del ciclo de vida ni los ajustes de costes del grafo. Usa un experimento con grafo guardado, descrito más abajo, cuando deban conservarse. También puedes definir funciones, indicadores, modelos y estrategias directamente en las celdas de Rust.
Leer backtests existentes
Sección titulada «Leer backtests existentes»aqs_table(&backtests.list()?, 100)?;let run = backtests.load("backtests/your-run-id")?;run.metrics()La lista incluye ejecuciones completadas del directorio backtests/ del proyecto vinculado y ejecuciones completadas de research/experiments/. Usa el ID devuelto; se rechazan las rutas absolutas directas y los recorridos al directorio superior. Deben existir tanto las métricas como backtest.db.
let equity = run.equity()?;let trades = run.trades()?; // Closed round tripslet insights = run.insights()?; // Full saved insight recordslet btc = run.bars("BTCUSD", "5m")?;let fills = run.table("trade_log")?;let monthly = run.table("monthly_returns")?;
aqs_table(&insights, 20)?;aqs_plot(&equity, "equity")?;bars selecciona el símbolo y el marco temporal exactos guardados del flujo principal, no de los flujos adicionales de contexto. Añade una columna timestamp de tipo Int64 con milisegundos UTC. equity añade esa marca de tiempo, además de return_pct (variación del patrimonio desde su primer valor observado) y drawdown_pct (respecto al máximo observado hasta ese momento). Estas rentabilidades no están ajustadas por flujos de efectivo.
table(name) conserva los nombres de columnas y los datos almacenados. Las tablas disponibles incluyen velas, historial de cuenta, insights, registro de operaciones, operaciones completas de apertura y cierre, rentabilidades mensuales, rendimiento temporal, series de drawdown, rendimiento por estrategia o régimen, exposición a factores, correlaciones, concentración de posiciones, deslizamiento, MAE de operaciones, rendimiento por configuración, Sharpe móvil, barridos de parámetros y resultados walk-forward. Las ejecuciones antiguas pueden carecer de algunas tablas y comunicar un error en lugar de inventar datos.
Las lecturas completas están limitadas a 250 000 filas y 64 MiB por solicitud. Superar el límite produce un error, no un resultado truncado silenciosamente. Pagina explícitamente para ejecuciones más grandes:
let (page, has_more) = run.table_page("insights", 10_000, 0)?;// Next page: run.table_page("insights", 10_000, 10_000)?Comparar estrategias y señales
Sección titulada «Comparar estrategias y señales»let baseline = backtests.load("backtests/baseline-id")?;let candidate = backtests.load("backtests/candidate-id")?;
aqs_compare_backtests(&[&baseline, &candidate])?;aqs_returns_heatmap(&[&baseline, &candidate])?;let differences = aqs_compare_insights(&baseline, &candidate)?;aqs_table(&differences, 30)?;

Compara ejecuciones guardadas con un resumen de la cuenta y curvas de variación del patrimonio y drawdown. Ver la captura de comparación a tamaño completoVer la captura de comparación a tamaño completo.
aqs_compare_backtests acepta 2–6 ejecuciones y emite un resumen y superposiciones de variación del patrimonio y drawdown. Las estadísticas usan todas las observaciones de cuenta cargadas; las curvas se muestrean para su visualización. Cada ejecución conserva sus horas UTC observadas. No se rellena con el último valor ni se cambia la base a una observación común inventada.
Comprueba que coincidan los periodos de prueba, el capital inicial, los flujos de efectivo, la revisión del código fuente, el conjunto de datos, el calentamiento, las especificaciones de activos y los costes antes de atribuir las diferencias a un cambio del modelo. La función auxiliar muestra periodos diferentes, pero no afirma que sean experimentos controlados. Las métricas registradas siguen disponibles mediante metrics().
aqs_compare_insights empareja las señales generadas por símbolo, hora exacta de creación, modelo alfa, dirección de la operación, marco temporal y condición de principal o secundario, no por UUID aleatorios de insights. Se cuentan las señales duplicadas. Devuelve los recuentos de la ejecución de referencia y de la candidata, el número de coincidencias y las señales exclusivas de cada ejecución. No afirma que las ejecuciones de órdenes o el PnL sean idénticos; inspecciona las tablas completas de insights y operaciones para comprobarlo.
El antiguo aqs_compare(&data, symbols, "close") compara precios de mercado, no rendimiento de backtests.
Marcar señales generadas o entradas ejecutadas
Sección titulada «Marcar señales generadas o entradas ejecutadas»let candles = baseline.bars("BTCUSD", "5m")?;let generated = baseline.signals("BTCUSD")?;aqs_chart(&candles).candles().signals(&generated)?.show()?;
let executed = baseline.fills("BTCUSD")?;aqs_chart(&candles).candles().signals(&executed)?.show()?;Los marcadores de señales generadas usan created_at; los marcadores de entradas ejecutadas usan filled_at. Una señal generada no demuestra que una orden se haya ejecutado. Las tablas de marcadores personalizados necesitan timestamp (milisegundos UTC), side (Buy/Sell, sin distinguir mayúsculas de minúsculas) y, opcionalmente, label. Filtra los datos para incluir un solo símbolo del gráfico y un máximo de 500 marcadores.
El gráfico interactivo sitúa un marcador en la vela mostrada anterior y conserva la hora exacta del evento en su texto. Los marcadores fuera de rango no se muestran. La reducción de muestras puede cambiar la posición visual; nunca cambia la marca de tiempo almacenada. Las instantáneas de artículos de AQI usan el mismo renderizador interactivo para los gráficos temporales guardados y conservan una alternativa SVG estática con pies que indican la hora del evento.
Ejecutar un experimento aislado con un grafo guardado
Sección titulada «Ejecutar un experimento aislado con un grafo guardado»Guarda el grafo y carga los datos históricos; después, inspecciona los IDs reales de los nodos y los nombres de las entradas:
project_parameterslet baseline = aqs_backtest() .name("Baseline") .snapshot(&research_snapshot) .run()?;
let candidate = aqs_backtest() .name("Candidate") .snapshot(&research_snapshot) .parameter("actual-node-id", "actual-input-name", 45) .run()?;
aqs_compare_backtests(&[&baseline, &candidate])?;El ejecutor toma instantáneas del código fuente del proyecto y del grafo guardado, verifica las huellas de los archivos históricos Parquet, crea datos de entrada CSV y usa la generación normal de código de AQE con PaperBroker. Conserva la configuración de dimensionamiento, riesgo, orden de pipes, ciclo de vida y costes del grafo. Los valores modificados solo se aplican a este experimento; no se reescriben el .aqmeta, el código fuente ni el manifiesto originales. Los cambios del grafo sin guardar en el editor no se incluyen. Resuelve primero los valores predeterminados de hiperparámetros; no se inician barridos combinatorios implícitos.
Cada experimento se guarda en research/experiments/<id>/, con su instantánea de código fuente y configuración, provenance.json, execution.log y los artefactos habituales de backtesting de AQE. Las compilaciones reutilizan research/experiment-target/. Stop/reset termina el árbol de procesos del cuaderno, incluido un experimento activo. Las ejecuciones fallidas conservan los diagnósticos y no aparecen como completadas.
Las dependencias externas de ruta siguen haciendo referencia a sus directorios de código fuente existentes; no se copian al experimento. Mantén estables esas dependencias al comparar ejecuciones. El archivo de bloqueo del proyecto se usa como punto de partida, pero Cargo puede resolver cambios requeridos por la compilación de investigación; inspecciona el Cargo.lock final del experimento al reproducir resultados.
Límites del modelo de datos: la reproducción CSV usa activos sintéticos, no especificaciones de contratos de MT5. El marco temporal cargado debe coincidir exactamente con el marco temporal de ejecución del grafo; no se sustituye ningún flujo ausente ni se rellena con el último valor. Un único marco temporal cargado no proporciona marcos temporales adicionales de contexto ni historial de calentamiento anterior a la ventana. Inspecciona la cobertura y los registros de los modelos que necesiten esos flujos. Estos resultados no son automáticamente equivalentes a los backtests con fuentes de datos del bróker ni a la ejecución en vivo. El ejecutor de grafos aislados todavía no admite proyectos con scripts de compilación personalizados.
Compartir un resultado
Sección titulada «Compartir un resultado»El código seleccionado, los gráficos comparativos, los gráficos con marcadores, los mapas de calor y las vistas previas de tablas pueden incluirse en un bloque de cuaderno de AQI. Los lectores no ejecutan nada. Compartir no sube automáticamente árboles de código fuente del proyecto, bases de datos sin procesar, conjuntos de datos ni credenciales. Revisa cualquier código, ruta impresa y vista previa de datos antes de guardar o publicar un artículo.
Usamos cookies y almacenamiento esenciales para el inicio de sesión, la seguridad de la cuenta, las preferencias de tema de color, este aviso y las métricas internas necesarias de PostHog sobre uso, calidad de las sesiones y fiabilidad. No usamos cookies publicitarias.
