本文主要记录我构建量化回测系统的学习历程。

被遗弃的项目: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在上面又找到了好多教学视频。主要是:

特别是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 , 缓慢更新,也不知道什么时候能写好。开源是因为想让更多人看到,如果其中有什么不足,思路有什么欠缺,有人能提出来,就非常感激不尽了。

当然也希望这段经历在硕士毕业后在找工作方面能有所帮助。

OnePy--构建属于自己的量化回测框架的更多相关文章

  1. 手把手教你用Python搭建自己的量化回测框架【均值回归策略】

    手把手教你用Python搭建自己的量化回测框架[均值回归策略] 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的, ...

  2. 量化投资策略:常见的几种Python回测框架(库)

    量化投资策略:常见的几种Python回测框架(库) 原文地址:http://blog.csdn.net/lawme/article/details/51454237 本文章为转载文章.这段时间在研究量 ...

  3. 量化投资学习笔记01——初识Pyalgotrade量化交易回测框架

    年初学习量化投资,一开始想自己从头写,还是受了C/C++的影响.结果困在了计算回测数据那里,结果老也不对,就暂时放下了.最近试了一下python的各个量化投资框架,发现一个能用的——pyalgotra ...

  4. 回测框架pybacktest简介(一)

    pybacktest 教程 本教程让你快速了解 pybacktest's 的功能.为此,我们回测精典交易策略移动平均线MA交叉. MA快线上穿慢线时,买进做多 MA快线下穿慢线时,卖出做空 进场规则, ...

  5. 回测框架pybacktest简介(二)

    pybacktest 的疑点 第(一)节“教程”原文,是用 ipython notebook 写成,程序代码是一些片段组成. 为了阅读方便,合并在一起. 本文转载于:http://blog.csdn. ...

  6. 量化投资:第8节 A股市场的回测

    作者: 阿布 阿布量化版权所有 未经允许 禁止转载 abu量化系统github地址(欢迎+star) 本节ipython notebook 之前的小节回测示例都是使用美股,本节示例A股市场的回测. 买 ...

  7. FMZ发明者量化平台回测机制说明

    原文连接:https://www.fmz.com/digest-topic/4009 大部分策略在实盘之前都需要回测进行验证,FMZ支持部分品种数字货币现货.期货和永续合约,以及商品期货所有品种.但发 ...

  8. 量化框架zipline--分钟回测改写

    转自:http://www.cnblogs.com/dxf813/p/7845398.html 基于zipline的分钟回测改写,其中数据源为自定义,使用bcolz的ctable,该数据格式与pand ...

  9. 量化交易回测系统---RQalpha、qstrade学习笔记

    一.RQalpha github 地址  https://github.com/ricequant/rqalpha 1.运行test.py文件,显示 No module named 'logbook. ...

随机推荐

  1. 使用JSON Web Tokens和Spring实现微服务

    http://www.jdon.com/dl/best/json-web-tokens-spring-cloud-microservices.html

  2. echarts 百度图表

    手册说明 http://echarts.baidu.com/option.html 3.0版本加了很多新属性可以看以上链接  此文用的3.x版本 第一步 引入 <script src=" ...

  3. cocos2dx迷你地图

    用CCRenderTexture就可以了,不知是否有更好的方法. if (!miniMap) { miniMap=CCSprite::create(); miniMap->setZOrder() ...

  4. 已知问题汇总 (2013-11-30) - QQ空间, EXTJS

    目前发现两个已知问题暂时无法得到解决: 1. QQ空间问题. 打开页面 http://user.qzone.qq.com/822994792/311, 点击 "xxx人赞" 这个链 ...

  5. 关于HTTP的长连接和短连接

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议. IP协议主要解决网络路由和寻址 ...

  6. Farey Sequence(欧拉函数)

    题意:给出式子F F中分子分母互质,且分子小于分母 例: F2 = {1/2} F3 = {1/3, 1/2, 2/3} F4 = {1/4, 1/3, 1/2, 2/3, 3/4} F5 = {1/ ...

  7. 02 观察 mysql 周期性变化

    ()首先写一个shell 脚本 vim mysql_status.sh 脚本如下: #!bin/bash while true do mysqladmin -urooy ext|awk '/Queri ...

  8. Hadoop源码分析之客户端向HDFS写数据

    转自:http://www.tuicool.com/articles/neUrmu 在上一篇博文中分析了客户端从HDFS读取数据的过程,下面来看看客户端是怎么样向HDFS写数据的,下面的代码将本地文件 ...

  9. MyBatis常用对象SqlSessionFactory和SqlSession介绍和运用

    学习框架一个比较好的路径阅读源码.本文介绍的SqlSessionFactory和SqlSession.可以通过了解SqlSessionFactory接口和SqlSession接口以及两个的实现类入手, ...

  10. (转)FS_S5PC100平台上Linux Camera驱动开发详解(二)

    4-3 摄像头的初始化流程及v4l2子设备驱动 这个问题弄清楚了以后下面就来看获得Camera信息以后如何做后续的处理: 在fimc_init_global调用结束之后我们获得了OV9650的信息,之 ...