Aller au contenu

PaperBroker et exécution paper

PaperBroker est le simulateur d’exécution d’AQE pour :

  • le backtesting
  • le paper trading
  • la validation du comportement du cycle de vie des insights

Il gère :

  • la soumission d’ordres
  • les fills
  • les annulations
  • les demandes de clôture
  • les jambes bracket
  • l’exécution du trailing stop
  • l’émission d’événements de trade
  • l’état du compte et de l’equity

Il empêche aussi les états de compte paper invalides, comme des ordres qui dépasseraient le buying power disponible.

YahooFinanceDataFeed fournit :

  • les métadonnées ticker
  • les barres historiques
  • les dernières cotations
  • les dernières barres
  • l’abonnement au flux de barres live

C’est le chemin de données de marché par défaut pour la recherche historique et les workflows runtime orientés paper.

AQE modélise les frais d’actif séparément du PnL brut du trade. Asset.fees contient :

  • commission.entry.long et commission.entry.short pour ouvrir des positions longues et courtes
  • commission.exit.long et commission.exit.short pour clôturer des positions longues et courtes
  • swap.long et swap.short pour le financement overnight ou le crédit sur les positions longues et courtes

Long et short désignent le côté de la position, pas seulement l’action immédiate de l’ordre. Un ordre d’achat qui ouvre une exposition utilise le frais d’entrée long. Un ordre de vente qui ouvre une exposition utilise le frais d’entrée short. Lorsqu’une position est clôturée, AQE applique le frais de sortie et le swap du côté de position d’origine, donc commission.exit.short est le frais de clôture d’une position short même si l’action de clôture est un achat.

La commission et le swap utilisent le même enum public de type de frais, AssetFee. Les types de frais disponibles sont :

  • AssetFee::None
  • AssetFee::Points(points), utilisé pour le calcul de swap en points
  • AssetFee::PercentageFee(rate), où 0.001 signifie 0,1 % du notionnel traité
  • AssetFee::FixedFee(amount), un montant fixe par fill
  • AssetFee::PerContractFee(amount), multiplié par la quantité traitée
  • AssetFee::PercentagePerContractFee(rate), appliqué comme price * contract_size * quantity * rate

Les calculs de commission acceptent des valeurs positives PercentageFee, FixedFee, PerContractFee et PercentagePerContractFee. Points existe sur l’enum partagé parce que le swap en a besoin ; s’il est utilisé dans un champ de commission, AQE le traite comme zéro.

Les valeurs de swap peuvent être positives ou négatives. Un swap positif augmente le PnL et un swap négatif le réduit. En exécution paper, AQE calcule le PnL net de clôture ainsi :

PnL brut + swap - commission d’entrée - commission de sortie

Utilisez with_asset_fees(...) lors de la création du broker d’exécution paper. Les backtests générés par AQS utilisent le même chemin.

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);

Les anciens champs entry et exit sur AssetFees restent acceptés comme fallback de compatibilité lorsque l’objet de commission par côté est vide. Les nouvelles configurations doivent utiliser les objets commission et 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