公开代码,我的量化程序的开发历程!

2023-10-17 14:25:41 浏览数 (1)

大家好,我是对白。

今天给大家分享一位好朋友的六年量化程序开发历程,最后他的策略实现了很高的收益,身边有很多朋友也都是主业码农,副业量化,这种搭配是现在非常流行的,量化代码给大家放在了文章末尾,看完后希望对你有所启发与帮助~

一、起始

2018年大概11月份的时候,忽然想到一个点子,就是用LSTM模型根据前几天的股票价格来预测后一天的股票价格。那个时候由于工作需要,接触了一些关于AI开发的东西,所以写一些简单的AI训练的模型还是很快的。说干就干,从网上搜索了一下如何获取股票数据,然后就定位使用tushare。先是用tushare简单写了一个下载股票数据的程序,把A股日线数据都下载了下来保存在本地,然后用LSTM模型用前15天的数据预测后一天的数据,由于数据量不大,程序跑得也很快,我记得执行结果的预测准确率大概是54%左右。我很兴奋的把这个结果告诉我一个朋友,结果他说,这个从逻辑上好像不太可能。我冷静下来,仔细地想了一下,好像确实是从逻辑上不太可能,因为很多时候第二天的涨跌更多的依赖当天发生的各种事件,而非前几天股票的走势。想清楚这一点,我很快就把预测这个事情放一边了。

但是我很快就想到另外一个思路。我曾经设计过不少版本的交易系统,我何不用这个程序来验证一下那些交易系统到底靠谱不靠谱,原来设计交易系统的时候只是随便找自选股中的一些股票,看着图形就算了,这些交易系统我自己也不知道究竟是否靠谱。于是我很快花了一两天时间写了一个简单的回测程序(看了一下,这个程序还在我的硬盘里,1000行左右的代码,逻辑比较完整,不但可以回测,还可以暴力搜索参数,也是开始回测我设计的那些交易系统。

接下来,我开始对这个程序比较感兴趣,而python明显不是我喜欢的语言,于是很快用nim语言将程序重新实现了一遍,开始了我自己的量化程序的开发过程。

总结:回顾第一阶段的过程,我觉得最大的价值就是让我从头开始去写整个回测的程序,而不是用各种开源的框架或者网上的线上回测,这使得我后面可以亲历每一个策略实现的细节,对我理解整个交易系统的执行过程以及各种细节的关键性非常重要,从而为我建立对自己交易系统的信心打下坚实的基础。

二、初始策略

一直到2020年下半年的时候,虽然程序已经改了很多版,功能也开始有很大的增强,但是策略却没有很大的突破。那个时候主要的买入卖出策略考虑以下几个因子:

  • 均线方向,均线方向是向上还是向下的
  • 均线交叉,金叉还是死叉
  • MACD,0轴上,dif和dea的关系等
  • 股价突破,股价突破n日高点或者低点
  • 股价和均线的关系,在均线上还是均线下
  • 时间周期,当前处于哪个时间周期

最后回测下来,买入的条件就是简单的股价突破,卖出的条件是均线向下,并且股价跌破某个均线,那是用的是30分钟周期的数据回测的,从2018年到2020年下半年,我记得大概A股所有股票的平均收益是110%,还有那时候的回测结果的图保存着:

策略主要的执行方式是手工,股票池是手工选的,每个周期结束的时候实时获取股票数据,计算是否有买点,如果有买点就通过邮件发送出去,我可以在手机上收到邮件,根据邮件中的股票和买卖价格手动进行下单。不过这个阶段并没有很好的去执行这个策略,因为虽然看上去回测收益还不错,但是我对它还是没有任何信心。

总结:回顾这个过程,最大的价值是我从一开始就坚持A股所有股票一起回测,而不是针对某一些股票去单独回测,我的目标是随机选股,建立一个适用于所有股票的交易策略,而不是依赖于选股的策略。当然这个过程中也暴露出很严重的问题,就是没有按照最终希望的交易过程去建立回测过程(回测和实盘不一致,回测策略终究不靠谱),这使得接下来的一个阶段一直停滞不前。

三、策略停滞阶段

这个阶段大概是从2020年10月份开始一直到2021年底,觉得程序写差不多了,然后策略也没有明显可优化的地方了,实盘也一般般,有时照着执行,有时凭感觉。接下来一段时间主要是以优化代码为主,各种代码的重构,外围功能的增加和完善,比如和同花顺的交互,交易信号告警的优化等。策略的变化主要通过变换周期来调整,从30分钟周期调整到5分钟周期最后到15分钟周期,但是因子还是原来的一些,又增加一些新的突破类型。

总结:这个过程其实蛮无聊的,整个量化策略没有任何实质性的进展,个人对此也没有任何信心,也没想过这个东西最后真能帮我赚钱,只是凭借着对写程序的兴趣,无聊时用于打发时间而已。我觉得另一个原因是缺乏志同道合的人进行交流,很多想法是需要通过相互碰撞出来的,一个人想很快就会到达黔驴技穷的阶段。

四、策略突破

时间到了2022年春节,上海出现了疫情,只能在家里上班,每天通过远程会议工作。这段时间,我开始重视轮动策略的开发,因为这个才是和实盘一致的交易模式。于是我推翻了原来的实现方式,重新按照实际的交易模式设计了轮动回测过程,在这个过程中意识到了非常重要的一点:在全A平均模式下,我追求的最大收益和在轮动模式下追求的最大收益是不一样的,在轮动模式下,只有单笔交易收益率高,轮动策略的收益才可能高。于是我开始调整交易策略,把参数优化的方向往单笔收益率高的方向靠拢。很快,交易策略在轮动模式下回测结果已经能够达到我的期望了,随机选取A股的100只股票作为轮动股票池,2018-2022四年的年化收益可以达到31%。然后随后几天我再接再厉,策略中增加大盘指数的判断,年化收益上升到48%,用2010-2018年的数据回测,年化收益也有38%。于是我知道我的策略终于突破了,正如我在其它回答里说的那样,在那一刻,我改掉了我的一切关于交易的坏毛病,从此以后我的交易里只有策略,没有我,策略说买,我必须买,策略说不买,我绝不买。

总结:策略的突破其实很快,其中没花几天时间。当然从我的角度来说,最核心的其实是我的程序的性能优化工作。在很早以前,我已经写了轮动策略的回测程序,但是那时候程序执行的太慢,每一次执行大概要花十五,十六秒左右,我懒得等,所以也不想花太多的时间在这个上面。后来,从重新设计了轮动回测程序,并且进行了深度代码优化,使得单次执行的时间缩短到非常小,最后又经过缓存的优化,轮动执行100次,只需要不到10秒的时间,这才使得我可以把回测的重点从全A平均回测转到随机选股轮动回测。工具上的突破形成了策略上突破的契机。当基本策略稳定后,想要逐步优化,最终拼的就是速度,你能用多少时间验证你的想法决定了你后面能走多远。这也从另外一个角度证明我最初决定自己从头写量化程序是一个相当正确的选择,不然现在市场上的那些回测框架的那种性能,根本就没法用,但是到那个时候可能我已经没有勇气从头来过了。

五、策略起飞

接下来大概从2022年5月份开始,我又进行了一系列的策略优化,其中非常关键的就是对出现信号的股票进行排序,能够把潜在收益高的股票排到前面,这个非常重要。当然这个过程也不简单,主要还是在各种因子的尝试上,我设计了10个左右的排序因子,然后通过调整权重不断地尝试,最后选定了几个因子和相应的权重。排序的加入使得策略的理论收益进一步提高,该收益已经远远超过我的预期。在这个过程中,量化程序的其它方面也都有了很大的提高,周边的各种功能都被我加入到了程序中,我个人比较喜欢一个小程序搞定一切的方式。由于感觉一切都差不多了,我后面就把自动化交易这部分给加上了,从此以后,所有的买卖都是程序自动化完成,我在手机上只是偶尔看看程序发过来的买卖信号而已

总结:自动化交易是一个非常关键的步骤,在没用自动化交易前,需要手工下单,这个过程又麻烦,效率又低,而且潜在诱惑破坏规则的可能(我破坏过一次,没有卖出信号,我卖出了,结果第二天大涨),自从自动化交易完成之后,觉得整个人特别轻松,看行情我就是一个旁观者的心态,无论涨跌都和我无关,反正自动化程序会帮我搞定一切。另外自动化交易要求自己的自己的策略非常有信心,而且要求自己对自动化程序很有信心,中间不会出任何纰漏。

六、持续改进

从2023年开始,我觉得自己的量化程序应该都做的差不多了,接下来可能没有太多的开发和策略调整的事情了。不过检查了一下我的gitlog,2023年我的程序还是提交了700多次,虽然大的调整很少,但还是有各种零零星星地改进和调整。现在策略已经基本上到达很难改进的程度了,而且理论收益也已经到了我无法更加满意的程度,至于说后面还能有什么改进,我想看机缘吧。

对了,最后说一下程序的规模。程序主体大概4w行,其它辅助代码1w行。代码比较简洁,换成其它语言,代码规模应该会增加,换成C ,代码规模应该2倍或者3倍左右。另外命令行参数大概700个,主配置文件150行,策略配置文件1000行。

补充信息

1. Python代码

前面说的python版的初始代码我已上传github,地址是:

GitHub - slangmgh/stocktest,请需要的同学自行下载。

2. 回测性能数据

补充一下有关性能的数据。

首先回测全A平均收益和轮动是不一样的。所谓全A平均收益回测,是指用交易策略对每一个股票单独进行回测,每个股票是独立的,所以可以利用CPU多核并行能力。而轮动策略(我的轮动和网上的那些轮动可能不是同一个概念)是指在固定股票池,固定买卖资金份数的情况下,根据规则产生的买卖点进行买卖的过程,所以股票池里面的股票无法单独独立进行回测(因为有资金份数的限制在那里),因此只能单线程按照时间一步一步推进进行回测。

这个是全A平均收益的回测速度,1.5秒5900万条K线:

这个是进行轮动回测的速度,2.6亿条K线,大概8秒左右完成:

目前使用的机器是一台笔记本,thinkpad p15,cpu是 i7-11850H。

3. 关于实盘和回测

关于实盘和回测的关系,其实以前专门写过一篇: 小马哥:说说回测和实盘,这里再总结几个观点:

1. 实盘的结果必须和回测的结果基本一致,所谓基本一致就是99%是没有差别的。实盘和回测结果不一致的策略其实是没法用的,你永远不知道哪个细节在实盘中会把你的收益全吃掉。

2. 你对策略的信心必须建立在回测结果之上。回测必须建立在长时间的大数据之上,这样逻辑经过充分验证,策略才是可信的。至于实盘,策略实盘运行的那点时间,靠这个来建立信心,验证策略的可行性,那是本末倒置。实盘就是用来赚钱的。

4. 关于策略执行的心态问题

其实没有啥心态问题,在任何时候,你永远都是“知行合一”的,你所谓无法执行的问题本质上就是你认知没有到位的外在表现。具体到交易执行过程中,你无法严格执行你的策略原因只有一点,你对你的策略无法100%的信任,所以又回到上面的那个问题了,你如何建立对自身策略的信心,在我看来短时间的实盘(3年或者更长时间以内)无法让你建立充分的信心,只有策略的底层逻辑和基于长时间大数据的回测才能。

0 人点赞