pivot

语法

pivot(func, funcArgs, rowAlignCol, colAlignCol)

参数

  • func 函数。

  • funcArgs func 的参数。如果 func 有多个参数,那么它是一个元组。

  • rowAlignCol 行的分组变量。

  • colAlignCol 列的分组变量。

rowAlignCol, colAlignColfuncArgs 中的每个参数都是相同长度的向量。

详情

在指定的二维维度上重组数据,结果为一个矩阵。

假设 rowAlignCol 有 n 个不同元素,colAlignCol 有 m 个不同元素。该高阶函数将会返回 n 行 m 列的矩阵,colAlignCol 的唯一值作为行标签,rowAlignCol 的唯一值作为列标签。对于矩阵的每一个元素,将指定函数应用到 rowAlignColcolAlignCol 所指定的矩阵单元格的元素上。

例子

本例计算多只股票收益率的两两相关性。

原始数据表有 4 列:sym, price, volume 和 time。

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

将数据依据 time 和 sym 维度对齐,并且计算每分钟内股价以交易量为权重的加权平均值。结果为一个矩阵。

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

计算每分钟的股票收益率:

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

计算股票收益率的两两相关性:

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

统计每个股票每分钟内的记录数量:

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

每个股票每分钟里的最后一条记录:

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