Ir al contenido

PaperBroker y ejecución simulada

PaperBroker es el simulador de ejecución de AQE para:

  • backtesting
  • trading simulado
  • validación del comportamiento del ciclo de vida de los insights

Se encarga de:

  • envío de órdenes
  • ejecuciones de órdenes
  • cancelaciones
  • solicitudes de cierre
  • órdenes vinculadas de tipo bracket
  • ejecución de stops dinámicos
  • emisión de eventos de operaciones
  • estado de la cuenta y del patrimonio

También se encarga de evitar estados no válidos en la cuenta simulada, como órdenes que superarían el poder de compra disponible.

YahooFinanceDataFeed proporciona:

  • metadatos de símbolos
  • velas históricas
  • últimas cotizaciones
  • últimas velas
  • suscripción a flujos de velas en vivo

Esta es la ruta de datos de mercado predeterminada para la investigación histórica y los flujos de ejecución orientados a la simulación.

AQE modela los costes de los activos por separado del PnL bruto de las operaciones. Asset.fees contiene:

  • commission.entry.long y commission.entry.short para abrir posiciones largas y cortas
  • commission.exit.long y commission.exit.short para cerrar posiciones largas y cortas
  • swap.long y swap.short para la financiación o el abono nocturno de posiciones largas y cortas

Largo y corto se refieren a la dirección de la posición, no solo a la acción inmediata de la orden. Una orden de compra que abre exposición usa la comisión de entrada de una posición larga. Una orden de venta que abre exposición usa la comisión de entrada de una posición corta. Cuando se cierra una posición, AQE aplica la comisión de salida y el swap correspondientes a la dirección original de la posición, por lo que commission.exit.short es la comisión de cierre de una posición corta aunque la acción de cierre sea una compra.

La comisión y el swap usan la misma enumeración pública de tipos de coste, AssetFee. Los tipos de coste disponibles son:

  • AssetFee::None
  • AssetFee::Points(points), usado para el cálculo de swap basado en puntos
  • AssetFee::PercentageFee(rate), donde 0.001 significa el 0,1 % del valor nocional negociado
  • AssetFee::FixedFee(amount), un importe fijo por ejecución
  • AssetFee::PerContractFee(amount), multiplicado por la cantidad negociada
  • AssetFee::PercentagePerContractFee(rate), aplicado como price * contract_size * quantity * rate

Los cálculos de comisión aceptan valores positivos de PercentageFee, FixedFee, PerContractFee y PercentagePerContractFee. Points está presente en la enumeración compartida porque el swap lo necesita; si se usa en un campo de comisión, AQE lo trata como cero.

Los valores de swap pueden ser positivos o negativos. Un swap positivo aumenta el PnL y uno negativo lo reduce. En la ejecución simulada, AQE calcula el PnL neto de cierre así:

gross PnL + swap - entry commission - exit commission

Usa with_asset_fees(...) al crear el bróker de ejecución simulada. Los backtests generados por AQS usan la misma ruta.

use aq_engine::core::broker::paper_broker::PaperBroker;
use aq_engine::core::broker::types::{
AccountType, AssetCommissionFees, AssetFee, AssetFees, AssetSideFees, AssetSwapFees,
};
let fees = AssetFees {
commission: AssetCommissionFees {
entry: AssetSideFees {
long: AssetFee::PercentageFee(0.0005),
short: AssetFee::PercentageFee(0.0007),
},
exit: AssetSideFees {
long: AssetFee::FixedFee(1.0),
short: AssetFee::FixedFee(1.0),
},
},
swap: AssetSwapFees {
long: AssetFee::PerContractFee(-3.25),
short: AssetFee::PercentagePerContractFee(0.000041),
},
..AssetFees::default()
};
let execution = PaperBroker::new(AccountType::Paper, 100_000.0, 1).with_asset_fees(fees);

Los campos heredados entry y exit de AssetFees se siguen aceptando como alternativa de compatibilidad cuando el objeto de comisiones por lado está vacío. Las configuraciones nuevas deben usar los objetos commission y swap.

  • aq-engine/src/core/broker/paper_broker.rs
  • aq-engine/src/core/broker/types/mod.rs
  • aq-engine/src/core/broker/data_feeds/yahoo.rs