ta4j
今天介绍一个比较有意思的java库叫ta4j。
最近一段时间接触了一些跟程序化交易、自动交易有关的业务,每天跟k线、指标打交道,
无意中在github上发现了一个叫ta4j的java库,虽然不是很成熟,但还是很有借鉴意义的。
从综合成本上来说,不建议用java来搞程序化交易,python和nodejs更为合适一些,
公共库更为成熟,而且更利于支持可视化的需求。
ta4j主要提供了如下功能:
- k线
- 指标
- 判断规则、规则的逻辑运算
- 策略
- 回测、报告
关于指标
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,我自己用起来还是非常顺手的。