在量化时, CTP是期货交易量化的开发平台, 但其提供的行情时tick级别的, 常需要进行转换.
而通过Julia实现时, 会很方便将tick序列转为任意周期(包括分钟,小时等)的Bar序列.
本方法的特点:
- 目标序列周期任意
- 源序列周期可任意, 但理应比目标周期小
- 不需进行大量的临时序列和内存拷贝
本方法使用到一个Package: TimeFrames.
源数据序列应该是Array{T,1}
类型, 其中的T
可以是Float64
,Int
或其他数值类型. 假设源数据为如下的四项基本的浮点序列:
src_length = 100
# TODO: 该处为预先准备的src_length长度时间序列, 这里不提供有效数据
src_time = Array{DateTime,1}()
src_open = rand(src_length)
src_high = rand(src_length)
src_low = rand(src_length)
src_close = rand(src_length)
事实上, 这些可以是 DataFrames
结构或者是TimeSeries
结构的某列.
转换前, 先声明一个想转成的时间周期:
using TimeFrames
to_tf = Minute(5) # 要源序列转成5分钟级别的
# 或
# to_tf = TimeFrame("5T")
再定义一个临时变量, 跟踪源数据窗口:
cursor = [1 1]
好了, 可以开始转换了.
这里提供 批量 方式, 如果实时增量转换, 需稍微改动一下.
# 从头遍历源序列
for i = 1:src_length
# 折算当前时间所属的目标周期的时间点
dtf = apply(to_tf, src_time[i])
cursor[2] = i
if dtf == src_time[i] # 正好处于新周期的时间点
bartime = Base.last(view(src_time, cursor[1]: cursor[2]))
# 或
# bartime = src_time[i]
baropen = first(view(src_open, cursor[1]: cursor[2]))
# 或
# baropen = src_open[cursor[1]]
barhigh = reduce(max, view(src_high, cursor[1]: cursor[2]) )
barlow = reduce(min, view(src_low, cursor[1]: cursor[2]) )
barclose = Base.last(view(src_close cursor[1]: cursor[2]))
# 或
# barclose = src_open[cursor[2]]
@show (bartime, baropen, barhigh, barlow, barclose)
cursor[1] = cursor[2]+1
end
end
- 说明
- 采用内嵌的
view
方法, 是建立了在源序列数据上的索引引用, 不用拷贝成临时数据再进行max
,min
等操作. - 有些细节, 比如恰好的时间点属于前一个bar的结束, 还是新bar的开始, 需要自行确定
- 在行情刚刚开始时, 通常是整点, 会满足上述的新周期时间点的判定, 需要自行处理.
- 采用内嵌的