dailyAlignedBar

语法

dailyAlignedBar(X, timeOffset, n, [timeEnd], [mergeSessionEnd=false])

相关函数:bar

参数

New in version 2.00.5: 参数 X 新增支持 SECOND,TIME,NANOTIME 类型

X 时间类型向量,支持以下的类型:SECOND, TIME, NANOTIME, DATETIME, TIMESTAMP 或 NANOTIMESTAMP。

timeOffset 标量或向量,表示每个时段的起始时刻。与 X 精度一致,可以是SECOND、TIME 或 NANOTIME 类型的标量或向量。如果 timeOffset 是一个向量,它必须是递增的。

n 是一个正整数或 DURATION 类型数据,表示时间区间长度。 n 取正整数时,其单位为 timeOffset 的最小精度。 n 取 DURATION 类型数据时,其单位不能是 y, M, w, d, B。

timeEnd 可选参数,表示每个时段的结束时刻。和 timeOffset 的类型和长度必须一致。

mergeSessionEnd 为可选参数,是一个布尔值,表示若某个时段的最后时刻为某个区间的起始时刻,是否将其并入之前的区间。默认值为 false。

详情

按照给定的起始时刻 timeOffset (与结束时刻 timeEnd )以及时间区间长度(由 n 指定),划分时间区间,返回 X 中每个元素所属的时间区间起始时刻,结果为与 X 长度相同的向量。具体而言,对于 X 中的每个元素,计算 X-((X-timeOffset)%n)。

时间区间一般包括左边界,不包括右边界。但若指定 mergeSessionEnd = true,且某个时段的最后时刻为某个区间的起始时刻,则将其并入之前的区间。

该函数支持隔夜时段。

例子

以下例子中均使用了随机模拟数据。结果中的 price 列之值每次执行均会有所不同。

例1. 中国股票市场每天有两个交易时段:上午9:30-11:30和下午1:00-3:00。计算每个交易时段中的60分钟均价。

$ sessionsBegin = 09:30:00 13:00:00
$ ts = 2019.11.01T09:30:00..2019.11.01T11:30:00 join 2019.11.01T13:00:00..2019.11.01T15:00:00
$ t = table(ts, rand(10.0, size(ts)) as price);

$ select avg(price) as price, count(*) as count from t group by dailyAlignedBar(ts, sessionsBegin, 60*60) as k60;

k60

price

count

2019.11.01T09:30:00

5.031685383252463

3600

2019.11.01T10:30:00

5.022667285786399

3600

2019.11.01T11:30:00

4.930270051117987

1

2019.11.01T13:00:00

4.931854071494632

3600

2019.11.01T14:00:00

4.979529541734115

3600

2019.11.01T15:00:00

0.961996954865754

1

由于每个区间包括左边界,不包括右边界,若每个交易时段的结束时刻(上午11:30与下午3:00)恰好是区间边界,若不指定timeEnd与mergeSessionEnd,则时段的结束时刻会单独作为一区间,如上例所示。多数情况下,会希望此类结束时刻归入前一区间。可参照以下脚本。

$ sessionsEnd = 11:30:00 15:00:00;
$ select avg(price) as price, count(*) as count from t group by dailyAlignedBar(ts, sessionsBegin, 60*60, sessionsEnd, true) as k60;

k60

price

count

2019.11.01T09:30:00

5.031685383252463

3600

2019.11.01T10:30:00

5.022641627015316

3601

2019.11.01T13:00:00

4.931854071494632

3600

2019.11.01T14:00:00

4.978413870368697

3601

例2. 隔夜时段。期货市场每天有两个交易时段:下午1:30-4:30和晚上10:30-凌晨2:30。使用dailyAlignedBar函数计算每个交易时段中的7分钟均价。

$ sessions = 13:30:00 22:30:00
$ ts = 2019.11.01T13:30:00..2019.11.01T16:30:00 join 2019.11.01T22:30:00..2019.11.02T02:30:00
$ ts = ts join (ts+60*60*24)
$ t = table(ts, rand(10.0, size(ts)) as price)
$ select avg(price) as price, count(*) as count from t group by dailyAlignedBar(ts, sessions, 7m) as k7;

例3. 计算分钟 k 线时,n 需要转换为 NANOTIMESTAMP,此时若使用整型计算可能造成类型溢出,需要将数据类型转换成 LONG。

 1$ n = 1000000
 2$ nano=(09:30:00.000000000 + rand(long(6.5*60*60*1000000000), n)).sort!()
 3$ sessionStartNano=09:30:00.000000000
 4$ price = 100+cumsum(rand(0.02, n)-0.01)
 5$ volume = rand(1000, n)
 6$ symbol = rand(`600519`000001`600000`601766, n)
 7$ tradeNano=table(symbol, nano, price, volume).sortBy!(`symbol`nano)
 8$ undef(`nano`price`volume`symbol)
 9$ barMinutes=7
10$ itv = barMinutes*60*long(1000000000)
11
12$ OHLC_nano=select first(price) as open, max(price) as high, min(price) as low, last(price) as close, sum(volume) as volume from tradeNano group by symbol, dailyAlignedBar(nano, sessionStartNano, itv) as barStart