量化java_⽤java做量化
这篇⽂章是对⽬前我⾃⼰⽤java开发量化交易系统的⼀个总结,后续有新的进展我会陆续更新到这个专栏⾥。⽤业余时间搞量化这个副业是想实现⾃⼰⼀直以来的愿望:当⼀个⾃由的宽客(其实⼤部分是因为不满⾜于死⼯资)
java调用python模型想做量化已经有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
回测结果可视化
策略参数优化
实盘交易数据来源:我在github上了很多,但是没有到提供java调⽤接⼝的数据源,国内的有tushare、baostock,tushare已经满⾜我个⼈的使⽤需求了,就没有关注其他的。tushare提供了部分http接⼝获取数据,但是像股票的实时分笔数据还是只能⽤python去调⽤,于是我⽤flask把tushare⾥获取数据的⽅法做成了http接⼝,利⽤http接⼝给java提供数据源。
⼀个⽅便操作数据集的⼯具:这个在python⾥有pandas,⽽且很成熟。我刚开始⽤的是kotlin的krangl库,它⾥⾯也提供了DataFrame结构,但还不是很成熟,并不好⽤。这⾥强⼒推荐下java的smile库,它提供了很多基于jvm语⾔的接⼝,⽽且它提供的DataFrame很好⽤,作者回复issue也很及时
回测结果可视化: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();
⽬前这个库还很简陋,只适合普通的折线和散点图,不过⽤来对回测进⾏可视化已经⾜够了,⽽且也⽐较⽅便
4. 策略参数优化:优化参数的算法有很多,像遗传算法,退⽕算法,粒⼦算法等,我写了⼀个通⽤的遗传算法框架,将
select,mutate,cross等算⼦中可重⽤的部分⽤框架实现,⾃⼰只需要实现个体的数据结构,适应度值计算,个体⽐较等逻辑。
5. 实盘交易:这块应该是量化交易中最重要的部分了,当初在设计的时候是想根据策略来执⾏⾃动交易的,但是国内个⼈要想进⾏⾃动交易好像⽐较困难,具体的我没详细去了解,⽹上现有⼀个解决⽅案:利⽤⾃动化测试⼯具像selenium等,在⽹页版交易软件上模拟交易操作时的点击事件。这种⽅案需要⽹络稳定,并且⽹页前端代码不变这些条件,最后我还是决定使⽤发送邮件的形式来通知交易。我开发了⼀个⼩⽹站,通过在⽹站上对相关股票进⾏关注,后台对关注的股票,每天下午2:30进⾏计
算,将需要执⾏的交易发送到邮件⾥进⾏通知
好了,先记录到这⾥
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论