今天介绍一个比较有意思的java库叫ta4j

最近一段时间接触了一些跟程序化交易、自动交易有关的业务,每天跟k线、指标打交道,

无意中在github上发现了一个叫ta4j的java库,虽然不是很成熟,但还是很有借鉴意义的。

从综合成本上来说,不建议用java来搞程序化交易,python和nodejs更为合适一些,

公共库更为成熟,而且更利于支持可视化的需求。

ta4j主要提供了如下功能:

  1. k线
  2. 指标
  3. 判断规则、规则的逻辑运算
  4. 策略
  5. 回测、报告

关于指标

k线的技术指标主要是基于k线值的算术运算得来的,比如均值、加权均值、差值、方差等。

指标会随着k线的实时变化而变化,其表现形式跟K线是一样的,存储在一个时间序列数组里。

ta4j在保存时间序列数据时采用的ArrayList,这个地方不是很好。当超过一定数量时,

就需要淘汰最老的数据,会不断触发ArrayList的arraycopy,感觉换成ringbuffer更合理。

关于规则、策略

基于K线和指标线的逻辑判断就是规则,比如在股票里我们常听说的多头排列。

这种图形上的形态,需要转化为代码,成为一个识别规则(match)。ta4j里提供了一些常见的规则,

比如交叉、向上突破、向下突破、阈值等等。

因为在K线的使用和识别中,会应用到很多个规则的组合,所以规则需要支持逻辑运算(and/or/xor)。

针对买入和卖出的一系列规则的集合,我们可以称之为策略,这个是整个程序交易的核心。

关于回测

程序化交易里面回测是非常重要的一个环节,回测越接近真实,你的策略盈利的可能性就越大。

最理想的回测就是将实时数据录制下来,这是最准的了。但是如此明细的数据是很难拿到的,

大多数是用1min的k线替代明细数据。其实这样的数据是严重失真的,1min里的变化压缩为一个点。

我一般的做法是将1min的k线点拆分为4个点,分别是开、高、低、收,依次写入数据集合进行测试。

这样能尽量还原一个k线点的轨迹,比如一个K线点是上涨的,那就是开、低、高、收,依次变化。

另外还要特别注意,在回测的时候用到的数据会不会是“未来的数据”,可能会让程序未卜先知。

比如短线指标基于15min,中线是1hour的指标,在判断15min的指标规则时,1hour指标就是“未来”。

我一般在回测的时候,其他粒度的k线会用1min的聚合而来,保持与1minK线的同步关系。

watchdog-hubble

ta4j虽然给了我很多启发,但是问题还是非常多的。所以我自己造了一个轮子,放在watchdog下。

结合上个月介绍的websocket和bark,我自己用起来还是非常顺手的。