用.net6重构我的量化交易系统

2023年4月15日 373点热度 2人点赞 0条评论

因为工作关系,最近这段时间又拾起了.net和java,业余时间我在考虑对之前Python写的系统用.net6进行重构,并且已经开始付诸行动。

产生这个想法的原因我自己也说不清楚,可能就是基于一种单纯的技术实现,但是抛开这一层,用.net6重构确实有诸多好处:

1、执行效率。如果不对原来的Python代码进行架构式的调整,很难在执行效率上再上一个台阶。在之前的系统实现中,各个策略相关的配置及数据存储采用的是ini和csv文件形式,这样可以确保系统每天自动发送的备份邮件中的附件我可以用手机上的WPS Office直接打开查看。因为系统实现了对持仓标的做周期评价,对评价周期内不符合预期的标的做自动敲出,并自动进行筛选补位,出于这个原因,系统在整个策略实例轮询的阶段,对每个策略实例均做循环中的实例化,以确保配置的重新读取及避免程序异常的发生,也正是因为这个原因,尽管Python作为脚本语言在执行效率上存在天生不足,但整个软件的执行瓶颈却出在文件的读写上。虽然从性能上足够使用需求(每个实时报价周期约5秒,足够),但显然从软件本身的设计上,还不够快。基于.net6重构,首先编译型语言的性能就高于解释型语言,其次在数据的存取读写上将基于数据库(目前考虑使用SQLite,没必要上MySQL),这都是对性能的巨大提升。

2、更好的界面表达。Python写后端绝对是开发效率最高的,但是对于UI的设计与实现上,可以说是痛苦的。用QT,无疑太重,用Tinker这类Python原生库,又有很多界面元素没法简单实现。目前基于Python的量化软件实现使用的是Thinker,一共三个窗体(一个主窗体,两个配置接口的窗体),部分外围工具用了QT,现在回过头来看看,只能说用Python写Form程序确实是个让人头大的事情。而用.net6就不同了,更好的界面表达,更高的界面开发效率,更快的执行速度,更小的exe。

尽管Python提供了面向对象特性,但在代码上并不强制应用,这一点和C#不同,C#中的类无处不在,所以其开发思路与Python截然不同,与其说是重构,不如说是重写,虽然从大的系统结构上思想是一致的,但从具体实现上已经是天壤之别。

用.net6重构过程中,一个很明显的体会就是.net在金融生态上确实赶不上Python,很多模块在Python中简单import一个轮子进来就可以了,在.net的nuget中却找不到同样的替代品,很可能需要自己造。

目前.net版本的开发已经开始,完成了各种工具类,配置层,数据层的基本实现,正在做标的类和策略类的设计和实现。整体开发进度,考虑目前的精力有限,可能要2,3个月左右,作为一种业余消遣也挺好,代码可以慢慢写,但是结构一定要合理,代码质量我自己的要求还是挺高的,急不得。

Python版本上周又做了一次小更新,完善了一处可改可不改的细节。目前来到了2.5.4,这很可能是Python版本的最后一次更新。后续的精力会都放在.net版本的开发上。

最后聊聊投资的收益情况,截至上周末,年化收益为12.9%,年化波动率5.86%,夏普比率为1.62,样本周期计128个交易日,目前的累积收益率是6.36% 。对目前这个投资成绩我还是满意的,但还不够好,最大的遗憾是没有持有传媒和游戏的ETF,游戏ETF在游戏版号下发重启时就有考虑,后口罩时代考虑消费复苏,传媒可能是业绩先锋,传媒ETF也曾重点考虑过,可是最终都没有开仓,生生错过了上半年ChatGPT带来的最大红利,还真是可惜。目前看好低位的医药板块,下周有开仓创新药ETF的考虑。

QThinker

前地产从业者,假装是个程序员,热爱编程与交易 自研QThinker量化交易框架

文章评论