Iscriviti ora
ProBacktest/probacktest · proorder

ROUNDEDUP

ROUNDEDUP in ProBacktest e ProOrder arrotonda un valore per eccesso al numero intero successivo, usato quando le quantità degli ordini devono essere arrotondate verso l'alto. Sintassi, esempi e insidie.

Sintassi

probuilder
ROUNDEDUP(value)

Parametri

NomeTipoPredefinitoDescrizione
valuenumeronessunoValore da arrotondare. Qualsiasi letterale, variabile o espressione aritmetica che restituisce un numero.

Come funziona

ROUNDEDUP prende un valore numerico e restituisce il numero intero superiore successivo ogni volta che il valore ha una parte frazionaria. Un valore che è già intero viene restituito invariato. Poiché le istruzioni di ordine in ProBacktest e ProOrder lavorano con quantità intere di azioni, contratti o lotti, qualsiasi formula di dimensionamento che comporti una divisione richiede un passaggio di arrotondamento prima che il suo risultato possa essere immesso come ordine.

Arrotondare per eccesso è la direzione giusta quando il valore calcolato rappresenta un minimo che deve essere raggiunto, per esempio il numero di azioni necessarie perché una posizione raggiunga un'esposizione obiettivo, o la quantità richiesta per coprire completamente un'altra posizione. In quei casi arrotondare per difetto lascerebbe la posizione sottodimensionata.

Il compromesso è il costo: arrotondare per eccesso significa che l'ordine può richiedere poco più liquidità di quanto suggerisse il calcolo grezzo. Quando il calcolo rappresenta un budget che non deve essere superato, ROUNDEDDOWN è la controparte corretta.

Esempi

Esempio 1, Azioni intere da un importo di liquidità (ProBacktest)

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

La divisione dà circa 8.1 e ROUNDEDUP la porta a 9. Nota che acquistare 9 azioni costa poco più dei 1000 di liquidità; vedi le insidie qui sotto. Questo è l'esempio tratto dal riferimento ufficiale.

Esempio 2, Raggiungere un'esposizione minima (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

Poiché la quantità è arrotondata per eccesso, il valore nominale della posizione raggiunge sempre l'obiettivo di 10000 anziché fermarsi appena sotto.

Esempio 3, Adeguare una copertura short a una posizione 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 rapporto di copertura frazionario viene arrotondato per eccesso alla quantità intera successiva, così la gamba short copre interamente l'esposizione prevista.

Errori e insidie comuni

  • Arrotondare per eccesso può superare il budget. Applicato a una divisione liquidità per prezzo, ROUNDEDUP produce una quantità che costa più della liquidità disponibile, 9 azioni a 123.45 fanno 1111.05 contro un budget di 1000. Per un dimensionamento limitato dal budget usa invece ROUNDEDDOWN.
  • Non disponibile negli indicatori. ROUNDEDUP appartiene ai linguaggi delle strategie. Nel codice di indicatori o screener l'equivalente è CEIL; usare ROUNDEDUP in quel contesto non compila.
  • I valori interi restano invariati. ROUNDEDUP(8) è 8, non 9. Una logica che si aspetta che la funzione aggiunga sempre uno si comporta in modo errato sui numeri interi esatti.
  • Arrotonda una sola volta, alla fine. Arrotondare i valori intermedi, come il prezzo o il rapporto, prima della divisione finale aggrava l'errore di arrotondamento. Applica ROUNDEDUP solo alla quantità finale.
  • ROUNDEDDOWN, arrotonda un valore per difetto al numero intero più vicino.
  • ROUND, arrotonda al numero intero più vicino.
  • CEIL, arrotonda per eccesso, disponibile in tutti i sottolinguaggi.
  • FLOOR, arrotonda per difetto, disponibile in tutti i sottolinguaggi.
  • SHARES, parola chiave dell'unità di quantità per gli ordini su azioni.
  • CASH, parola chiave per il dimensionamento della posizione basato sul contante.
  • BUY, apre una posizione long con la quantità calcolata.
  • SELLSHORT, apre una posizione short con la quantità calcolata.