Computing positions

The default method of function position computes a position (i.e. the resulting balance) of a number of transactions.

library("PMwR")
amount <- c(1, 1, 1)
position(amount)
3

Positive amounts increase the balance, and negative amounts decrease it. (Think of buying and selling a commodity.) You can also add the instrument to which a particular amount belongs.

instrument <- c("A", "A", "B")
position(amount = amount, instrument = instrument)
A 2
B 1

Another way to get instrument information into the position is to specify names for amount.

amount <- c(A = 1, B = 1, C = 1)
position(amount)
A 1
B 1
C 1

This is most useful if you want to 'declare' a position (i.e. not really compute it from transactions). This behaviour is controlled by the argument use.names. Its default (NULL) works as follows: if amount is named and no separate argument instrument is specified, the names are interpreted as instruments. If use.names is FALSE, names of amount are ignored. (Ignoring names was the default behaviour prior to PMwR version 0.11.)

amount <- c(A = 1, B = 1, C = 1)
position(amount, use.names = FALSE)
3

The behaviour when use.names is TRUE is currently experimental: the names are used even if instrument is specified.

amount <- c(A = 1, B = 1, C = 1)
position(amount, instrument = c("A", "A", "A"), 
         use.names = TRUE)
A 1
B 1
C 1

Why is it experimental? The reason for adding use.names was to allow fast and convenient construction of single-period positions, such as the example from above.

position(c(A = 1, B = 1, C = 1))

However, using names(amount) should remain a shortcut, with the safe option being to specify instrument explicitly. So a reasonable reasoning would have been that whenever instrument is specified, it is used. Thus, the TRUE may be removed again.

amount may also be a matrix. The use case is a matrix in which each column belongs to one instrument. But to interpret a matrix in this way, information about the instrument must be provided. When there is no such information, position treats the matrix as a list of transactions in a single instrument, but only as long as it has only a single row or only a single column.

amount <- array(1:3, dim = c(1, 3))
position(amount)  
position(t(amount))
6
6
position(amount, instrument = letters[1:3])  
a 1
b 2
c 3
colnames(amount) <- letters[1:3]
amount
     a b c
[1,] 1 2 3
position(amount)
a 1
b 2
c 3

If you instruct position to ignore the column names, it treats the matrix as a list of transactions in a single instrument, as expected.

position(amount, use.names = FALSE)
6

Providing as input a matrix of more than one row and more than one column, but no instrument information at all, raises an error.

amount <- array(1:6, dim = c(2, 3))
position(amount)
Error in position.default(amount) : 
  amount is a matrix but instrument is missing
amount <- array(1:6, dim = c(2, 3))
colnames(amount) <- letters[1:3]
amount
     a b c
[1,] 1 3 5
[2,] 2 4 6
position(amount)
a 3
b 7
c 11