java 数据可视化工具包_用java做量化

6c17d539f2cc4429a3a04571ab3a9f0f.png

这篇文章是对目前我自己用java开发量化交易系统的一个总结,后续有新的进展我会陆续更新到这个专栏里。用业余时间搞量化这个副业是想实现自己一直以来的愿望:当一个自由的宽客(其实大部分是因为不满足于死工资)

想做量化已经有4-5年了,记得大学的时候第一次在网上看到宽客这个名词,当时心里很激动。第一,当宽客很自由,而且能发挥个人的聪明才智,大学时在学校里参加过数据建模竞赛,我对能够用模型描述解决现实问题的这种方式感到既激动又开心,对社团里建模大神们尤其崇拜。当然,现在看来,当时的我们都不过是套模型,套公式而已。第二,这种职业不像自主创业那样需要太多应酬(当时的理解)。在学校里我们用的是matlab,后来慢慢又接触了python、R、java这些语言,在数学建模课上,老师讲了各种模型,像线性回归,决策树、SVM、遗传算法、退火算法等等,PPT一闪而过,我对模型却只是一知半解,在比赛的时候也只是找现成的解决方法去套,于是我决定用matlab来实现这些算法,后来接触到python、R后,又用python、R把这些算法实现了一遍。这些都是大学的经历,后来工作了,使用java比较多。这几门语言里,matlab和R在早期的时候使用的比较多,尤其是R的ggplot2绘图包,画出来的图实在是太惊艳了,但是它们有一个很大的局限处,它们的易用性只是体现在特定的领域:数据分析、处理、可视化等等,如果你想要用matlab或者R去写一个爬虫,或者将中间数据存储到数据库里,对它进行增删改查,相信你还是会选择python或者java这种比较全面一点的语言。python我使用得比较多,在整个研究生期间,包括后来实习都是用的python,用python也写了很多小玩具,比如打包依赖用的pymvn, 利用pyqt5写了一个翻译工具,后台调的是百度翻译,还写了一个用来计时的桌面小软件。总的来说python在写代码的时候很舒服,而且有很多库可以实现你想要的功能,缺点也有,就是很多库都是c/c++写的,有的时候出了莫名其妙的bug只能查文档,或者在网上翻解决方案,python很多应该是大部分库的代码都没有使用类型注解,如果不去debug,直接看源码会很懵逼。说实话,由于python很容易上手,导致很多水平很差的人在用python,看到有的同事写python变量用t,tt,ttt,我真的是一肚子火。最后一点当然是运行效率了,很多人说用python写原型,然后用c++或者java再实现一遍,但是当你写的逻辑或者算法特别复杂的时候,这个时候再去换一门语言代价就很大了。网上有不少文章写用numba或者cython给python提速,大多数人都只是罗列下官网的例子,或者随便找一个代数计算的例子。在真正在项目里面,很多都是自己定义的数据结构,numba和cython提升的效果根本就不明显,你需要把耗时的计算代码解耦出来,只使用基本的数据结构或者使用numpy的数组结构去实现计算功能,这样才能有效的提升代码的运行效率,在我看来这有点得不偿失,还不如用传统的方法去优化代码逻辑和数据结构,因为你的代码不可能不迭代,也许下次迭代的时候你解耦出来的高效代码就无用了。之所以使用java来做量化,其实我也纠结了很久,知乎里好多人比较反感java,认为java很啰嗦,很多人推送scala或者kotlin,这两门语言我都尝试过,就我个人而言,我并没有觉得使用了scala或者kotlin后我的代码简洁了很多,我有一个观点:只要工具包足够多,写代码的体验自然就提升了,在开发的过程中,我也写了一个java的工具包:easy-util,这个包包含了字符串格式化,操作数组、流、日期等等,个人体验还不错。好了,这部分到此为止,本来是想总结下自己的量化实践过程的,没想到都在说语言的问题了。

从一个业余的角度来看,个人觉得一个量化系统需要以下这几个模块:

  • 数据来源
  • 方便操作数据集的工具,像python的DataFrame
  • 回测结果可视化
  • 策略参数优化
  • 实盘交易
  1. 数据来源:我在github上找了很多,但是没有找到提供java调用接口的数据源,国内的有tushare、baostock,tushare已经满足我个人的使用需求了,就没有关注其他的。tushare提供了部分http接口获取数据,但是像股票的实时分笔数据还是只能用python去调用,于是我用flask把tushare里获取数据的方法做成了http接口,利用http接口给java提供数据源。
  2. 一个方便操作数据集的工具:这个在python里有pandas,而且很成熟。我刚开始用的是kotlin的krangl库,它里面也提供了DataFrame结构,但还不是很成熟,并不好用。这里强力推荐下java的smile库,它提供了很多基于jvm语言的接口,而且它提供的DataFrame很好用,作者回复issue也很及时
  3. 回测结果可视化:smile库也提供了可视化的模块,但是个人觉得并不是很好用,画图的时候必须基于DataFrame的数据结构,很多时候我们画图的数据长度并不是一致的,有的列只有部分数据,用smile画图必须用DataFrame重新构造数据,我觉得这样做太麻烦了,于是写了一个专门画图的库:better-plot,这个库的思路是模仿pyechart,前端使用echart展示数据,在java端构造出echart的option,下面是画图的例子:
Plot.of()
  .x(tradeDates, RangeUtil.slice(tradeDates, 6, new String[tradeDates.length - 6]),
        tradeDates, RangeUtil.slice(tradeDates, 1, new String[tradeDates.length-1]),tradeDates, tradeDates)
  .y(closePrices, RangeUtil.multiply(macdWeekLine, 8), RangeUtil.multiply(macdLine, 8), forceIndexesNormalized,
                        lowClosePrices, highClosePrices)
  .title("ma")
  .xLabel("trade_date")
  .legend("close", "macd-week", "macd", "force-indexes", "low", "high")
  .lineTypes("line", "line", "line", "line", "line", "line")
  .show();

e0d6ae1fcfd97142465d64a801ab29a0.png

目前这个库还很简陋,只适合普通的折线和散点图,不过用来对回测进行可视化已经足够了,而且也比较方便

4. 策略参数优化:优化参数的算法有很多,像遗传算法,退火算法,粒子群算法等,我写了一个通用的遗传算法框架,将select,mutate,cross等算子中可重用的部分用框架实现,自己只需要实现个体的数据结构,适应度值计算,个体比较等逻辑。

5. 实盘交易:这块应该是量化交易中最重要的部分了,当初在设计的时候是想根据策略来执行自动交易的,但是国内个人要想进行自动交易好像比较困难,具体的我没详细去了解,网上现有一个解决方案:利用自动化测试工具像selenium等,在网页版交易软件上模拟交易操作时的点击事件。这种方案需要网络稳定,并且网页前端代码不变这些条件,最后我还是决定使用发送邮件的形式来通知交易。我开发了一个小网站,通过在网站上对相关股票进行关注,后台对关注的股票,每天下午2:30进行计算,将需要执行的交易发送到邮件里进行通知

4aba5e77dc880bd5f31def2ad2771721.png

811dc697495c876be3b0053fa1d9af87.png

91a9714261e542ec691fe95652b235dd.png

好了,先记录到这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值