本文主要记录我构建量化回测系统的学习历程。
被遗弃的项目:Chandlercjy/OnePy_Old
新更新中的项目:Chandlercjy/OnePy
目录
1. 那究竟应该学习哪种编程语言比较好呢?
2. 是否也有些python在线教学视频可以加速学习?
3. 那有没有什么现成的回测系统可以直接拿来用,避免重复造轮子?
4. 既然学习别人的框架那么困难,不如自己写一个框架出来?
5. 写出这个回测框架之后,我开始思考,如何接入实盘交易?
6. 再写一个完善的 OnePy 回测框架。
正文:
我以前一开始是做外汇主观交易,主要依靠看新闻和经济数据在大方向上做趋势判断,然后运用技术面寻找最佳入场点。后来为了便于自己分析,我在Federal Reserve Economic Data上下载经济数据,用Excel进行分析。
因为每天都有新的经济数据发布,所以我需要每天不断地更新新的数据。分析了一段时间后,我发现我大部分时间都花在了复制粘贴这种无意义的重复性劳动上,所以我就想到了是不是有种方法可以将这一切都自动化,使我每天只需要按一个按键,一切数据就自动更新完毕,并导出交易报告。于是我想到了编程。
1. 那究竟应该学习哪种编程语言比较好呢?
由于我一开始还局限于使用Excel进行数据分析,所以第一个想到的是学习VBA。于是二话不说就在网上找了些VBA的帖子开始看,可能是自己功夫不到家,感觉还是无法达到理想的效果。然后我就在知乎上搜索 “学习哪种编程语言”,结论是各种编程语言,各有各的优点,不能一概而论。不过很多人都在推崇学习python,因为python对新手非常友好,不容易懵逼。
在考虑哪种编程语言比较好的同时,我突然又想到是不是能够将一切的一切都自动化,甚至包括交易本身。惊奇的我发现了原来还有量化交易这种东西,这东西太令人着迷了。
于是我开始学习用python进行数据分析。根据Python书籍推荐 - 知乎专栏的推荐,又因为自己很喜欢编程,我花了一周迅速刷了六百多页《Python学习手册》,学会了一些最基本的python知识,什么是列表、元祖、字典等,对于一些比较复杂的概念比如面向对象编程什么的仍是似懂非懂。然而我发现这一周后,我还是不懂怎么用python进行数据分析。这时候我发现了知乎大V @用python的交易员 发的一篇文章针对Quant的Python快速入门指南 - 知乎专栏 ,犹如久旱逢甘霖,心中狂喜。
由于刷了一周的书,属于光说不练,我规规矩矩地按照@用python的交易员的文章,又花了一周将《Learn Python The Hard Way》学了一遍,然后才开始看激动人心的《利用Python进行数据分析》,但还是总感觉有些地方晦涩难懂,而且目光来来回回于书本与电脑之间,感觉效率并不是很高。突然想起以前在网易公开课上学金融市场微积分线代概率论,我把视频都下载到了本地倍速播放,效率奇高,受益匪浅。
2. 是否也有些python在线教学视频可以加速学习?
幸运的我在b站上搜到了【全30集】使用 pandas 进行数据分析:Data analysis in Python with pandas , 每集才10分钟不到,简单明了,还能练英语听力。我用的是Chrome浏览器,再借助神奇的HTML5 Video Speed Control —— 一个倍速播放HTML5视频的插件,不到两天我就把这30集视频都看完了,还简单做了笔记放在 Chandlercjy/My-Notes 。
看着视频,第一次用到pandas,三两句就将图画出来,突然感觉自己无所不能,因为以往用Excel想画个图看一下都太繁琐了。看完这30集之后,我意犹未尽,于是上网,跑到他的youtube在上面又找到了好多教学视频。主要是:
- DataSchool: https://www.youtube.com/user/dataschool
- sentdex: https://www.youtube.com/user/sentdex
特别是sentdex的教学视频,我发现他python数据分析都是关于金融的,特别适合我。于是我花了大概两三周的时间,把他大部分视频都看了,随意做了些笔记也放在了Chandlercjy/My-Notes 上。然后我又回去重新看了《Python学习手册》,温故而知新,突然觉得很多句子都变得很有道理,之前都是扫过去没什么感觉,这次再读一遍觉得每个知识点都非常make sense。
当然在这过程中我还迷失了一周多的时间在开发环境配置上,一开始是用VIM,研究了各种插件,学了Linux命令行的一些系统指令,安装了ubuntu虚拟机,配置更好看的jupyter notebook主题等等,最终还是回归大自然,使用atom作为主要开发环境,具体配置下一篇文章再说。
这一波又一波的视频看下来后,当初想实现的用python进行经济数据自动更新的愿望已经可以完美实现了,无非就是运用Quandl的python API,将数据爬下来后用pandas实现画图。我慢慢做了这个功能,也当是把自己看视频所学的东西学以致用。在这过程中不懂就google搜,到pandas的documents看说明,慢慢的python也越来越熟练了,虽然层次还是非常浅的。做完后,我开始考虑,是不是可以做一个回测系统出来。
3. 那有没有什么现成的回测系统可以直接拿来用,避免重复造轮子?
这时候我又搜到了 有哪些程序化交易方面的 GitHub 作者值得关注? 。于是我在Github上逛了一圈又一圈,发现一个开发特别活跃的回测系统:mementum/backtrader 。而且很贴心地贴出了Github上很多量化回测框架,不过没列出国内很出名的 vnpy/vnpy 。
- PyAlgoTrade
- Zipline
- Ultra-Finance
- ProfitPy
- pybacktest
- prophet
- quant
- AlephNull
- Trading with Python
- visualize-wealth
- tia: Toolkit for integration and analysis
- QuantSoftware Toolkit
- Pinkfish
- bt
- PyThalesians
- QSTrader
- QSForex
- pysystemtrade
- QTPyLib
- RQalpha
由于这时候python水平还仅局限于会写函数而已,类都不会写,大部分框架源代码看了还是一脸懵逼。只是大概知道分两种,一种是事件驱动框架,一种是"for-loop" 框架。而如果后期要将回测框架接入实盘交易,最好是使用事件驱动框架。
我决定从有名的 PyAlgoTrade 入手,埋头开始看源代码,记得一开始就被@abstractmethod这个装饰器卡了三天,因为身边没认识什么做量化的朋友,也没什么人可以请教,一切只能自学。靠google和Stack Overflow 强行理解看了一周,然后还是基本都看不懂~ 狠下心来打了两天王者荣耀。。。实在不甘心, 问了一些计算机专业的同学才知道,编程不仅要懂语法,更要懂编程思想,还要学一些算法与数据结构。突然感觉自己马上就要变身计算机专业学生了。
就在这万分火急之际,我又想起之前就一直在看的QuantStart这个网站 Algorithmic Trading, Quantitative Trading, Trading Strategies, Backtesting and Implementation ,上面有很多很多文章,包括教如何写回测系统的,非常值得阅读。
4. 既然学习别人的框架那么困难,不如自己写一个框架出来?
借助QuantStart上面的一系列文章:
Quantitative Finance Articles, Python Finance Articles, C++ Finance Articles
Backtesting
- Successful Backtesting of Algorithmic Trading Strategies - Part I
- Successful Backtesting of Algorithmic Trading Strategies - Part II
- Best Programming Language for Algorithmic Trading Systems?
- Event-Driven Backtesting with Python - Part I
- Event-Driven Backtesting with Python - Part II
- Event-Driven Backtesting with Python - Part III
- Event-Driven Backtesting with Python - Part IV
- Event-Driven Backtesting with Python - Part V
- Event-Driven Backtesting with Python - Part VI
- Event-Driven Backtesting with Python - Part VII
- Event-Driven Backtesting with Python - Part VIII
- Should You Build Your Own Backtester?
更是受到最后一篇文章Should You Build Your Own Backtester? 的蛊惑,我开始开发自己的量化回测系统,取名为OnePy。但作为小白,光靠这一系列文章还是不够的,因为上面这一系列文章只是介绍了事件驱动回测框架的各个部分,却没有写出将各个部分如何整合在一起,形成一个完整的框架。我在网上借助这篇文章: 事件驱动的简明讲解 强行理解了何谓事件驱动,再借鉴Quantstart上这系列文章:
Forex Trading Diary
- Forex Trading Diary #1 - Automated Forex Trading with the OANDA API
- Forex Trading Diary #2 - Adding a Portfolio to the OANDA Automated Trading System
- Forex Trading Diary #3 - Open Sourcing the Forex Trading System
- Forex Trading Diary #4 - Adding a Backtesting Capability
- Forex Trading Diary #5 - Trading Multiple Currency Pairs
- Forex Trading Diary #6 - Multi-Day Trading and Plotting Results
- Forex Trading Diary #7 - New Backtest Interface
然后就充分发挥想象,想象回测框架中各个事件是如何互动的,最终终于让我大致弄明白了,其实交易过程中的各个环节,就像是一个一个事件,称为Events,简单来说的话可以分为四个环节(灰色竖线),四种事件(点)。
Feed:负责数据读取,产生Market Event。
- Market Event:将数据传递给Strategy模块。
Strategy:数据经过交易策略思路,产生交易信号Signal Event。
- Signal Event:将信号信息,如做多做空,手数,执行价格等传递给Portfolio。
Portfollio:将信号进行处理,经过风控过滤,产生Order Event。
- Order Event:将交易信息传递给Execution执行。
Execution:根据不同broker的手续费多少等,最后完成交易,形成Fill Event。
- Fill Event:完成交易后将信息集合形成交易记录。
借助python的Queue模块,将这一切整合起来。
while event_queue_isnt_empty():
event = get_latest_event_from_queue();
if event.type == "tick":
strategy.calculate_trading_signals(event);
else if event.type == "signal":
portfolio.handle_signal(event);
else if event.type == "order":
portfolio.handle_order(event);
else if event.type == "fill":
portfolio.handle_fill(event)
sleep(600); # Sleep for, say, 10 mins
大致思路是这样,具体其中还有诸多细节在此就不赘述了。了解了这些思路后,很快花了两周时间就写出了OnePy,托管在 Chandlercjy/OnePy_Old 。 初步实现了以下功能:
- 事件驱动回测设计
- 仓位百分比风险控制
- 支持多头,空头,一键平仓
- 嵌入talib技术指标
- 打印交易日志
- 输出交易记录
- 多进程Optimize最优参数
- 交易结果分析
- 用plotly进行画图分析
写的过程中确实学到很多东西,因为学习最好的方式就是直接去用,也学会了面向对象编程等,开始能看懂yidao620c/python3-cookbook, 知道怎样的代码叫做Pythonic,学习之路,道阻且长。
5. 写出这个回测框架之后,我开始思考,如何接入实盘交易?
想到要实现这个功能,我头都大了。除去如何自己封装API不说,因为之前写的时候没有经验,都是学到哪就写到哪。在写的过程中如果出现了Bugs,比如如果同时出现一键平仓和只平仓全部多头头寸,就会出现混乱,等于计算两次,双倍仓位损失,又比如没有考虑到滑点(虽然回测中很难模拟出真实情况),也没有考虑如果订单成交失败怎么办,这点需要给每笔交易一个特定的识别ID,等等非常多问题。对于这些问题,我都是出现就改,改得非常随心所欲,导致架构延展性非常低。所以这个框架也就不能用了。
不过多亏了自己写这个回测框架,才迫使自己考虑到很多交易过程中会发生的问题,我相信这些问题在日后思考交易策略时也会有很大帮助。
就像QuantStart中的文章说的:
Should You Write Your Own (Event-Driven) Backtester?
Answer: Yes! It is a great learning experience to write your own Event-Driven backtesting system. Firstly, it forces you to consider all aspects of your trading infrastructure, not just spend hours tinkering on a particular strategy. Even if you don't end up using the system for live trading, it will provide you with a huge number of questions that you should be asking of your commercial or FOSS backtesting vendors. For example: How does your current live system differ from your backtest simulation in terms of:
- Algorithmic execution and order routing?
- Spread, fees, slippage and market impact?
- Risk management and position sizing?
While Event-Driven systems are not quick or easy to write, the experience will pay huge educational dividends later on in your quant trading career.
6. 再写一个完善的 OnePy 回测框架。
写出这个框架后,比较其他大神的回测框架,我觉得非常惭愧,因为确实没有考虑到很多方面的问题。而股票和期货又是两码事,利润计算方法完全不一样;如果还要加上等挂单,移动止损等功能的话,之前很多循环会出现矛盾,导致只能推翻重写。而且小白前期代码风格也非常丑陋,一点都不Pythonic,不忍直视。
所以我决定,主要参考backtrader - Backtesting / Trading ,再重新写一个量化回测框架。因为比起阅读源代码摸清思路,也许临摹仿照,自己动手做一个可能是更有效的学习方式。新项目我托管在 Chandlercjy/OnePy , 缓慢更新,也不知道什么时候能写好。开源是因为想让更多人看到,如果其中有什么不足,思路有什么欠缺,有人能提出来,就非常感激不尽了。
当然也希望这段经历在硕士毕业后在找工作方面能有所帮助。