Rejoignez-nous
ProBacktest/probacktest · proorder

ROUNDEDUP

ROUNDEDUP dans ProBacktest et ProOrder arrondit une valeur au nombre entier supérieur, utilisé lorsque les quantités d'ordre doivent être arrondies vers le haut. Syntaxe, exemples et pièges.

Syntaxe

probuilder
ROUNDEDUP(value)

Paramètres

NomTypePar défautDescription
valuenombreaucunValeur à arrondir. Tout littéral, variable ou expression arithmétique qui s'évalue en un nombre.

Comment ça marche

ROUNDEDUP prend une valeur numérique et renvoie le nombre entier supérieur dès que la valeur a une partie fractionnaire. Une valeur déjà entière est renvoyée inchangée. Comme les instructions d'ordre dans ProBacktest et ProOrder fonctionnent avec des quantités entières d'actions, de contrats ou de lots, toute formule de dimensionnement impliquant une division nécessite une étape d'arrondi avant que son résultat puisse être placé comme ordre.

Arrondir au supérieur est le bon sens lorsque la valeur calculée représente un minimum à atteindre, par exemple le nombre d'actions nécessaires pour qu'une position atteigne une exposition cible, ou la quantité requise pour couvrir entièrement une autre position. Dans ces cas, arrondir à l'inférieur laisserait la position sous-dimensionnée.

Le compromis est le coût : arrondir au supérieur signifie que l'ordre peut nécessiter légèrement plus de liquidités que ne le suggérait le calcul brut. Lorsque le calcul représente un budget à ne pas dépasser, ROUNDEDDOWN est l'équivalent correct.

Exemples

Exemple 1, Actions entières à partir d'un montant en liquidités (ProBacktest)

probuilder
// Convert a cash amount into a whole number of shares
myCash = 1000
stockPrice = 123.45
maxShares = ROUNDEDUP(myCash / stockPrice)

La division donne environ 8.1 et ROUNDEDUP la porte à 9. Notez qu'acheter 9 actions coûte légèrement plus que les 1000 en liquidités ; voir les pièges ci-dessous. C'est l'exemple tiré de la référence officielle.

Exemple 2, Atteindre une exposition minimale (ProOrder)

probuilder
DEFPARAM CumulateOrders = false

// Size the position so exposure is at least 10000 in notional value
targetExposure = 10000
qty = ROUNDEDUP(targetExposure / close)

IF NOT onmarket AND close CROSSES OVER Average[100](close) THEN
  BUY qty SHARES AT MARKET
ENDIF

Comme la quantité est arrondie au supérieur, la valeur notionnelle de la position atteint toujours l'objectif de 10000 plutôt que de s'arrêter juste en dessous.

Exemple 3, Ajuster une couverture short à une position long (ProOrder)

probuilder
DEFPARAM CumulateOrders = false

// Hedge ratio derived from relative volatility
hedgeRatio = 1.6
IF NOT onmarket AND close CROSSES UNDER Average[50](close) THEN
  // Round up so the hedge is never undersized
  SELLSHORT ROUNDEDUP(hedgeRatio * 2) SHARES AT MARKET
ENDIF

Un ratio de couverture fractionnaire est arrondi à la quantité entière supérieure, de sorte que la jambe short couvre entièrement l'exposition visée.

Erreurs et pièges courants

  • Arrondir au supérieur peut dépasser le budget. Appliqué à une division liquidités par prix, ROUNDEDUP produit une quantité qui coûte plus que les liquidités disponibles, 9 actions à 123.45 font 1111.05 contre un budget de 1000. Pour un dimensionnement plafonné par le budget, utilisez plutôt ROUNDEDDOWN.
  • Non disponible dans les indicateurs. ROUNDEDUP appartient aux langages de stratégie. Dans le code d'indicateur ou de screener, l'équivalent est CEIL ; ROUNDEDUP n'y compile pas.
  • Les valeurs entières restent inchangées. ROUNDEDUP(8) vaut 8, pas 9. Une logique qui attend de la fonction qu'elle ajoute toujours un se comporte mal sur des nombres entiers exacts.
  • Arrondissez une seule fois, à la fin. Arrondir des valeurs intermédiaires, comme le prix ou le ratio, avant la division finale aggrave l'erreur d'arrondi. N'appliquez ROUNDEDUP qu'à la quantité finale.
  • ROUNDEDDOWN, arrondit une valeur au nombre entier inférieur.
  • ROUND, arrondit au nombre entier le plus proche.
  • CEIL, arrondit vers le haut, disponible dans tous les sous-langages.
  • FLOOR, arrondit vers le bas, disponible dans tous les sous-langages.
  • SHARES, mot-clé d'unité de quantité pour les ordres sur actions.
  • CASH, mot-clé de dimensionnement de position basé sur les espèces.
  • BUY, ouvre une position long avec la quantité calculée.
  • SELLSHORT, ouvre une position short avec la quantité calculée.