pivot

Syntax

pivot(func, funcArgs, rowAlignCol, colAlignCol)

Arguments

func is an aggregate function.

funcArgs are the parameters of func. It is a tuple if there are more than 1 parameter of func.

rowAlignCol is the grouping variable for the rows of the result.

colAlignCol is the grouping variable for the columns of the result.

rowAlignCol, colAlignCol, and each of the function argument in funcArgs are vectors of the same size.

Details

Rearrange the results of an aggregate function as a matrix.

Assume rowAlignCol has n unique elements and colAlignCol has m unique elements. The template will return an n (row) by m (column) matrix, with unique values of rowAlignCol as row labels and unique values of colAlignCol as column labels. For each element of the matrix, the given function is applied conditional on rowAlignCol and colAlignCol equal to corresponding values indicated by the cell's row and column labels.

Examples

A trader needs to calculate the volume-weighted average prices (vwap) for each stock in every minute, and the pair-wise correlations of stock returns based on the vwap price series. The data are in a table with 4 columns: sym, price, qty, and trade_time.

We first use the pivot template to pivot the data to a vwap price matrix with the time as row label and the stock symbol as column label. Then we use the cross template to calculate the pairwise correlation.

syms=`600300`600400`600500$SYMBOL
sym=syms[0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2]
time=09:40:00+1 30 65 90 130 185 195 10 40 90 140 160 190 200 5 45 80 140 170 190 210
price=172.12 170.32 172.25 172.55 175.1 174.85 174.5 36.45 36.15 36.3 35.9 36.5 37.15 36.9 40.1 40.2 40.25 40.15 40.1 40.05 39.95
volume=100 * 10 3 7 8 25 6 10 4 5 1 2 8 6 10 2 2 5 5 4 4 3
t1=table(sym, time, price, volume);
t1;
sym time price volume
600300 09:40:01 172.12 1000
600300 09:40:30 170.32 300
600300 09:41:05 172.25 700
600300 09:41:30 172.55 800
600300 09:42:10 175.1 2500
600300 09:43:05 174.85 600
600300 09:43:15 174.5 1000
600400 09:40:10 36.45 400
600400 09:40:40 36.15 500
600400 09:41:30 36.3 100
600400 09:42:20 35.9 200
600400 09:42:40 36.5 800
600400 09:43:10 37.15 600
600400 09:43:20 36.9 1000
600500 09:40:05 40.1 200
600500 09:40:45 40.2 200
600500 09:41:20 40.25 500
600500 09:42:20 40.15 500
600500 09:42:50 40.1 400
600500 09:43:10 40.05 400
600500 09:43:30 39.95 300

Align the data on the dimensions of time and sym, and calculate the vwap price for every minute in each minute:

stockprice=pivot(wavg, [t1.price, t1.volume], minute(t1.time), t1.sym)
stockprice.round(2);
label 600300 600400 600500
09:40m 171.7 36.28 40.15
09:41m 172.41 36.3 40.25
09:42m 175.1 36.38 40.13
09:43m 174.63 36.99 40.01

The step above can also use the following SQL statement to get the same result:

stockreturn = each(ratios, stockprice)-1
stockreturn;
label 600300 600400 600500
09:40m
09:41m 0.004108 0.000459 0.002491
09:42m 0.015602 0.002204 -0.003037
09:43m -0.002677 0.016871 -0.003006

Calculate stock returns in each minute:

cross(corr, stockreturn, stockreturn);
label 600300 600400 600500
600300 1 -0.719182 -0.151824
600400 -0.719182 1 -0.577578
600500 -0.151824 -0.577578 1

Calculate pair-wise correlation:

pivot(count, price, minute(time), sym);
label 600300 600400 600500
09:40m 2 2 2
09:41m 2 1 1
09:42m 1 2 2
09:43m 2 2 2

Count the number of observations within each minute for each stock:

pivot(last, price, minute(time), sym);
label 600300 600400 600500
09:40m 170.32 36.15 40.2
09:41m 172.55 36.3 40.25
09:42m 175.1 36.5 40.1
09:43m 174.5 36.9 39.95