vN51 新葡京官网 内容是什么

新倩女幽魂游戏原声 - 歌单 - 网易云音乐
新倩女幽魂游戏原声
相信很多人是因为微微一笑很倾城这部电视剧开始玩的倩女这部游戏,而我在电视剧之前便在玩这款游戏,很好玩,之前就很喜欢红衣女刀客这个游戏角色,没想到电视剧里的女一号也是这个角色,特别的巧,我玩的...
相信很多人是因为微微一笑很倾城这部电视剧开始玩的倩女这部游戏,而我在电视剧之前便在玩这款游戏,很好玩,之前就很喜欢红衣女刀客这个游戏角色,没想到电视剧里的女一号也是这个角色,特别的巧,我玩的正好就是这个角色,希望我创的这张专辑可以帮到大家,这里面有很多倩女幽魂这部游戏特别好听的歌,希望大家喜欢,谢谢大家
播放:1292次
喜欢这个歌单的人
网易云音乐多端下载
同步歌单,随时畅听320k好音乐
网易公司版权所有(C)杭州乐读科技有限公司运营:美国嘻哈网站XXL推荐的15位韩国Rapper - 歌单 - 网易云音乐
美国嘻哈网站XXL推荐的15位韩国Rapper
1: Noise MoB
2012年出道,成员为Rhyme-A-&Minos
2: GD&T.O.P
韩国团体BigBang成员,2006年出道
3: Huckleberry P
团体Pinodyne的成员,HiLite成员
4: Deepflow
2007年出道,韩国硬核hiphop代表人物
1: Noise MoB
2012年出道,成员为Rhyme-A-&Minos
2: GD&T.O.P
韩国团体BigBang成员,2006年出道
3: Huckleberry P
团体Pinodyne的成员,HiLite成员
4: Deepflow
2007年出道,韩国硬核hiphop代表人物
5: beenzino
1ll成员,K-hiphop的高富帅
2008年出道,原属于Brand New Music,后创建了厂牌Just Music
7: Paloatlo
2004年出道,创建了厂牌HiLite,永远的首长!
8: Supreme Team
成员为Simon D和E-sens,已解散。2004年,Simon D加入了朴宰范建立的厂牌AOMG
9: Verbal Jint
Brand New Music的成员
10: The Quiett&Dok2
厂牌1ll成员,著名的富帅
11: Garion
成员有MC Meta和Naachal
12: Epik High
由两名Rapper和一名唱片骑师组成,YG成员,tablo已创建自己的厂牌
13: Dynamic Duo
2004年出道,成员为Choiza和Gaeko,创建厂牌Amoeba Culture
14: 尹美莱
公认的韩国第一女Rapper
15: Tiger JK
创建了韩国最大的hiphop地下组织Movement,厂牌Jungle Ent.
播放:288次
喜欢这个歌单的人
网易云音乐多端下载
同步歌单,随时畅听320k好音乐
网易公司版权所有(C)杭州乐读科技有限公司运营:『世界抖腿锦标赛』官方指定用曲 - 歌单 - 网易云音乐
『世界抖腿锦标赛』官方指定用曲
云村村民们注意了!!
世锦抖腿赛第S8赛季开始
你们要做的就是达到最强王者段位
上吧!抖腿王们
PS.本歌单以 DubStep & DrumStep 风格电音为主
播放:2949650次
喜欢这个歌单的人
网易云音乐多端下载
同步歌单,随时畅听320k好音乐
网易公司版权所有(C)杭州乐读科技有限公司运营:vn.pyvn.py基于python的开源交易平台开发框架关注专栏更多量化交易{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\u002Fpay.zhihu.com\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&title&:&vn.trader使用教程系列3-策略算法&,&author&:&traderusingpython&,&content&:&\u003Ch2\u003E风控模块\u003C\u002Fh2\u003E\u003Cbr\u003E\u003Cimg data-rawheight=\&315\& data-rawwidth=\&291\& src=\&3edb3d80a3a24059dec96.jpg\&\u003E点击菜单栏的功能-&风险管理后,可以打开如上图所示的界面。风控模块主要提供的是针对高频策略和短周期CTA策略的事前风控功能,防止由于错误的算法逻辑导致类似光大乌龙指的事件(就算亏不了几十亿,一下子把账户亏掉一半也是很痛苦的…)。\u003Cbr\u003E\u003Cb\u003E\u003Cbr\u003E开关 \u003C\u002Fb\u003E\u003Cbr\u003E工作状态按钮用于控制风控模块的运行状态。处于“运行中”状态时,每笔委托在发出前会执行模块中定义好的多个风控条件检查,全部符合条件(参考下文的详细介绍)才能正常通过,只要有一条不符合该委托都会被拒绝,并且会在日志中输出具体的风控信息。处于“未启动”状态时,则会忽略所有的风控检查,允许委托直接发出。\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003E流控 \u003C\u002Fb\u003E\u003Cbr\u003E流控主要控制的是单位时间内允许发出的最大的委托笔数,图中所示的限制是每1秒允许最多发出4笔委托,如果发送第5笔就会被拒绝,从而防止某些成交触发的交易信号由于逻辑错误被重复触发,在1秒内发出几十笔的情况。\u003Cbr\u003E\u003Cbr\u003E清空流控计数按钮可以把当前的流控计数清0。\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003E单笔委托 \u003C\u002Fb\u003E\u003Cbr\u003E单笔委托上限比较容易理解,控制的是每一笔委托允许的最大合约手数,防止由于逻辑或者参数设置错误导致开仓太多合约的风险。\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003E总成交 \u003C\u002Fb\u003E\u003Cbr\u003E总成交上限控制的是每日允许的总成交的合约数量(不是成交笔数),针对的是无人值守的情况下,策略算法出现逻辑错误开始频繁的买卖(比如每秒开多1手,再平多1手,不断重复),导致在手续费和买卖价差上快速亏损的情况。\u003Cbr\u003E\u003Cbr\u003E清空总成交技术按钮可以把当前的总成交技术清0。\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003E活动订单 \u003C\u002Fb\u003E\u003Cbr\u003E活动订单上限限制的是当前系统内所有的未成交和部分成交的委托数量,一些采用挂限价单来开平仓的策略算法,可能由于撤单操作有误,导致之前的委托没有撤销的同时还在不断挂出新的委托单,一旦价格波动就有可能被全部成交,出现巨大的持仓风险。\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003E保存设置 \u003C\u002Fb\u003E\u003Cbr\u003E用户改变以上风控参数的数值后,系统中的数值会立即被改变,但是必须点击“保存设置”按钮后相应的数值才会写入配置文件RM_setting.json中,重启后风控参数会从该文件中再次读取。\u003Cbr\u003E\u003Ch2\u003E行情数据收集\u003C\u002Fh2\u003E\u003Cimg data-rawheight=\&820\& data-rawwidth=\&1439\& src=\&a681ae370e20c655da353c82.jpg\&\u003E行情数据收集模块位于vn.trader\u002FdataRecorder文件夹下,该模块主要用于收集每天的实盘Tick数据,并自动聚合为K线后插入到MongoDB数据库中,模块内置了1分钟K线的聚合算法。点击菜单栏的功能-&行情数据记录后可以打开如上图所示的界面,查看目前正在收集的行情数据内容(不开也没关系,数据收集会自动在后台运行)。\u003Cbr\u003E\u003Cbr\u003E该模块的配置基于DR_setting.json文件,打开后如下:\n\u003Ccode lang=\&json\&\u003E{\n
\&working\&: false,\n\n
\&tick\&:\n
[\&Au(T+D)\&, \&SGIT\&],\n
[\&Ag(T+D)\&, \&SGIT\&]\n
\&bar\&:\n
[\&au1606\&, \&CTP\&],\n
[\&ag1606\&, \&CTP\&]\n
\&active\&:\n
\&IF0000\&: \&IF1605\&,\n
\&IH0000\&: \&IH1605\&,\n
\&IC0000\&: \&IC1605\&\n
}\n}\u003C\u002Fcode\u003E\u003Cbr\u003E各个字段的功能如下:\u003Cbr\u003E\u003Cul\u003E\u003Cli\u003Eworking:用于控制是否启动行情数据的收集,true对应启动,false对应停止\u003C\u002Fli\u003E\u003Cli\u003Etick:需要收集Tick行情数据的合约代码和接口,[“Au(T+D)”, “SGIT”] 代表需要收集来自于飞鼠接口的黄金T+D现货的Tick数据\u003C\u002Fli\u003E\u003Cli\u003Ebar:需要收集1分钟K线行情数据的合约代码和接口,[“au1606”, “CTP”]代表需要收集来自于CTP接口的au1606黄金期货的1分钟K线数据\u003C\u002Fli\u003E\u003Cli\u003Eactive:用于设置具体的期货合约和该期货连续合约的代码映射关系,”IF0000”: “IF1605”代表将IF1605的行情数据(Tick和1分钟K线)插入到IF0000(可以自行改名)的集合中,注意这里每个连续合约代码只能对应一个具体合约的代码\u003C\u002Fli\u003E\u003C\u002Ful\u003E注意事项:\u003Cbr\u003E\u003Cbr\u003E\u003Col\u003E\u003Cli\u003E修改DR_setting.json中的配置后,需要重启vn.trader才会生效。\u003C\u002Fli\u003E\u003Cli\u003E在active字段中定义的连续合约对应的具体合约代码也必须加入到上面的tick或者bar字段中,才会收集相应的tick或者1分钟K线数据。\u003C\u002Fli\u003E\u003Cli\u003E当数据收集组件向MongoDB中插入数据时可能因为某种原因出现阻塞(如硬盘转速较慢等),导致vn.trader的事件驱动引擎无法处理后续的事件,因此实盘中建议开一个独立的vn.trader进程专门用于收集数据。\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Ch2\u003ECTA策略模块\u003C\u002Fh2\u003ECTA策略模块相比较于之前介绍的部分,功能要强大和复杂的多,也需要用户有一定的Python编程基础,具体细节的使用方法未来会在单独的教程中讲解,这里只简要介绍下从开发到实盘交易一个CTA策略的流程:\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003E回测和配置\u003C\u002Fb\u003E\u003Cbr\u003E\u003Col\u003E\u003Cli\u003E在ctaAlgo文件夹下创建一个策略.py文件;\u003C\u002Fli\u003E\u003Cli\u003E继承ctaTemplate.py中的CtaTemplate类实现具体的策略;\u003C\u002Fli\u003E\u003Cli\u003E使用ctaHistoryData.py中的函数从通联数据下载行情数据建立历史行情数据库(需要购买对应的数据授权,修改datayes.json),或者将文件夹下的IF0000_1min.csv中的股指连续合约1分钟数据插入到MongoDB中(仅适用于学习和回测);\u003C\u002Fli\u003E\u003Cli\u003E在交互式开发工具中(如IPython Notebook和Spyder),使用ctaBacktesting.py中提供的回测引擎对开发好的策略使用历史数据进行回测(参考ctaBacktesting.py中的例子);\u003C\u002Fli\u003E\u003Cli\u003E确定策略符合预期可以上线交易后,在ctaSetting.py中导入你的策略类,并添加到STRATEGY_CLASS字典中(这步是为了让CTA策略引擎能找到你的策略类);\u003C\u002Fli\u003E\u003Cli\u003E在CTA_setting.json中加入实盘交易时创建策略实例所需要的参数,如策略实例名称name(不能重复)、策略类名称className(使用上一步中设置的策略类名称)、交易的合约代码vtSymbol等,其他的参数可以选择不传,会自动使用策略类中定义的默认值。\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cb\u003E实盘交易\u003C\u002Fb\u003E\u003Cbr\u003E\u003Col\u003E\u003Cli\u003E\u003Cimg data-rawheight=\&815\& data-rawwidth=\&1440\& src=\&65bd46bdb0bc4c8bfff1be.jpg\&\u003E打开vn.trader,连接好交易接口和数据库后,点击菜单栏的算法-&CTA策略可以打开如上图所示的CTA策略模块的实盘交易管理界面;\u003C\u002Fli\u003E\u003Cli\u003E点击“加载策略”按钮,策略引擎会从CTA_setting.json中读取相关的策略配置信息用于生成具体的策略实例(下面称为“策略”),并显示在管理界面上;\u003C\u002Fli\u003E\u003Cli\u003E点击“初始化”按钮会调用策略的onInit函数,并完成策略开始交易前的初始化操作,此时策略可以计算参数指标等,但是无法发出委托;\u003C\u002Fli\u003E\u003Cli\u003E点击“启动”按钮会调用策略的onStart函数,正式启动策略的交易功能,此时策略基于收到的行情、成交、委托等数据进行相应的逻辑判断,并发出委托;\u003C\u002Fli\u003E\u003Cli\u003E点击“停止”按钮会调用策略的onStop函数,撤销当前策略已发出的所有未成交委托,并停止策略的交易功能,恢复到无法发出委托的状态;\u003C\u002Fli\u003E\u003Cli\u003E如果加载了多个策略,窗口最上方的“全部初始化”、“全部启动”和“全部停止”可以一次性对所有的策略执行相应的操作,省去多次点击。\u003C\u002Fli\u003E\u003C\u002Fol\u003E&,&updated&:new Date(&T06:11:34.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:5,&likeCount&:26,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:true,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T14:11:34+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic3.zhimg.com\u002F65bd46bdb0bc4c8bfff1be_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:5,&likesCount&:26},&&:{&title&:&vn.py框架v1.0发布&,&author&:&traderusingpython&,&content&:&\u003Cp\u003Evn.py框架终于迎来了v1.0的正式发布,离2月份宣布2016年的项目计划已经过去了三个月的时间,比起当时也取得了不少的进展。\u003C\u002Fp\u003E\u003Cp\u003E代码方面:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E增加了vn.xspeed(飞创)、vn.sgit(飞鼠)和vn.oanda(OANDA)接口\u003C\u002Fli\u003E\u003Cli\u003E整理了vn.py项目中包括的所有API的具体信息(版本号、获得渠道、特性等)\u003C\u002Fli\u003E\u003Cli\u003E在Linux上成功编译了vn.ctp和vn.lts接口,并加入了vn.trader中\u003C\u002Fli\u003E\u003Cli\u003Evn.trader中增加了风控模块和行情数据记录模块,以及一系列的bug修复和特性更新\u003C\u002Fli\u003E\u003Cli\u003E使用Ubuntu 16.04 LTS以及一系列最新的软件包建立了开箱即用的VirtualBox镜像\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cp\u003E文章方面:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E关于在vn.trader中使用ta-lib和quantlib的教程\u003C\u002Fli\u003E\u003Cli\u003Evn.trader的使用教程系列\u003C\u002Fli\u003E\u003Cli\u003E国内常见交易接口的介绍\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cp\u003E社区方面:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E使用pelican重新建设的官方网站,比起原来Hexo开发的更加简洁美观\u003C\u002Fli\u003E\u003Cli\u003E上海地区的两次线下活动,主要介绍了vn.trader的相关使用和开发\u003C\u002Fli\u003E\u003Cli\u003E官方交流群的成员活跃度和讨论专业程度不断上升\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Cp\u003E计划中剩下的一些工作也会在今年内逐步完成。\u003C\u002Fp\u003E\u003Cp\u003E尽管2016年到目前的市场形势都不是太好,但是只有在行业低谷期做好准备的人才能抓住未来的行情,所以现在未尝不是一个好好修炼内功的机会。\u003C\u002Fp\u003E\u003Cp\u003E最后,目前vn.py在Github上的仓库已经分出了master和dev两个branch,未来所有的功能更新和pull request请都使用dev,当更新数量达到一定程度后作者会合并到master上并发布一个新的版本升级。\u003C\u002Fp\u003E&,&updated&:new Date(&T15:51:45.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:19,&likeCount&:77,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T23:51:45+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:19,&likesCount&:77},&&:{&title&:&我注册了值乎~&,&author&:&traderusingpython&,&content&:&\u003Cp\u003Ehttps:\u002F\u002Fwww.zhihu.com\u002Fzhi\u002Fpeople\u002F304384 (二维码自动识别)\u003C\u002Fp\u003E\u003Cp\u003E知乎新的产品,之前想捐赠vn.py项目的朋友不妨来试试。\u003C\u002Fp\u003E&,&updated&:new Date(&T02:42:01.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:1,&likeCount&:8,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T10:42:01+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:1,&likesCount&:8},&&:{&title&:&vn.trader的Ubuntu运行环境搭建教程&,&author&:&traderusingpython&,&content&:&最近比较忙没时间写东西,这篇的作者是量衍投资,vn.py项目的一个商业支持公司。文章发布在\u003Ca href=\&www.vnpie.com\& data-editable=\&true\& data-title=\&维恩的派论坛\&\u003E维恩的派论坛\u003C\u002Fa\u003E,主要内容是关于vn.py项目的讨论和一些量化行业相关的招聘信息,有兴趣不妨去看看。\u003Cbr\u003E\u003Ch2\u003E准备Ubuntu\u003C\u002Fh2\u003E\u003Cp\u003E建议使用一个新安装干净的Ubuntu环境(如果你一定要使用老环境也行,万一不幸掉坑后再回到这步就好),我这里使用的环境如下:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E版本:Ubuntu 16.04 LTS\u003C\u002Fli\u003E\u003Cli\u003E语言:简体中文\u003C\u002Fli\u003E\u003Cli\u003E时区:Shanghai\u003C\u002Fli\u003E\u003Cli\u003E硬件:VirtualBox虚拟机(64位,分配4G内存)\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cbr\u003E\u003Ch2\u003E安装Anaconda\u003C\u002Fh2\u003E\u003Cp\u003E在\u003Ca href=\&https:\u002F\u002Fwww.continuum.io\u002Fdownloads\& data-editable=\&true\& data-title=\&Continuum官网\&\u003EContinuum官网\u003C\u002Fa\u003E下载Python 2.7版本Linux 64-Bit的Anaconda,我这里下载完成后的文件名为Anaconda2-4.0.0-Linux-x86_64.sh。\u003C\u002Fp\u003E\u003Cp\u003E打开Terminal(终端),进入文件所在的目录,输入如下命令:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&text\&\u003Ebash Anaconda2-4.0.0-Linux-x86_64.sh\n\u003C\u002Fcode\u003E\u003Cp\u003E设置方面除了最后一个选择可以一路回车,到最后一项设置是否要将Anaconda添加到bash的PATH中时,注意选yes,安装成功后如下图所示:\u003C\u002Fp\u003E\u003Cimg src=\&8ec468bac3edf9cc8c186f8e1bab3bc1.jpg\& data-rawwidth=\&768\& data-rawheight=\&450\&\u003E\u003Cp\u003E下一步重启系统,打开Terminal后运行Python,如下图所示说明安装成功(注意最上方显示中有Anaconda相关信息):\u003C\u002Fp\u003E\u003Cimg src=\&bbbb7cf51ff.jpg\& data-rawwidth=\&736\& data-rawheight=\&439\&\u003E\u003Cbr\u003E\u003Ch2\u003E安装其他依赖\u003C\u002Fh2\u003E\u003Cp\u003E使用pip安装MongoDB驱动和Qt黑色主题,注意不要加sudo:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&text\&\u003Epip install pymongo qdarkstyle\n\u003C\u002Fcode\u003E\u003Cp\u003E使用apt-get安装编译API相关的工具:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&text\&\u003Esudo apt-get install git build-essential libboost-all-dev python-dev cmake\n\u003C\u002Fcode\u003E\u003Cbr\u003E\u003Ch2\u003E运行vn.trader\u003C\u002Fh2\u003E\u003Cp\u003E使用git从Github上下载vn.py框架:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&text\&\u003Egit clone http:\u002F\u002Fgithub.com\u002Fvnpy\u002Fvnpy.git\n\u003C\u002Fcode\u003E\u003Cp\u003E完成后,切换到vn.trader文件夹下(cd vnpy\u002Fvn.trader),输入命令:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&text\&\u003Epython vtMain.py\n\u003C\u002Fcode\u003E\u003Cp\u003E当当~~~~,深沉内敛的黑色主界面出现了:\u003C\u002Fp\u003E\u003Cimg src=\&f6b41ddd7fc43cd4508b.jpg\& data-rawwidth=\&1919\& data-rawheight=\&1077\&\u003E\u003Cp\u003E注意菜单栏系统下的连接选项中只有CTP、LTS和OANDA三个接口,这是因为当前项目里只编译了vn.ctp和vn.lts的Ubuntu版本,而vn.oanda是基于REST API的纯Python接口,可以直接跨平台使用。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ch2\u003E总结\u003C\u002Fh2\u003E\u003Cp\u003E试着使用Ubuntu后,不得不承认确实Linux在编程方面比Windows更加友好,看过vn.py的Windows开发环境搭建教程的用户应该记得其步骤还是相当繁琐的(boost占了相当一部分),而Ubuntu下基本只有三步:安装Anaconda、pip和apt-get,纯命令行操作用着很爽。\u003C\u002Fp\u003E\u003Cp\u003E安装完上面的这套环境后,想要折腾一下自己编译API的用户可以进入vn.ctp文件夹下,输入:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&text\&\u003E.\u002Fbuild.sh\n\u003C\u002Fcode\u003E\u003Cp\u003E然后就编译好了,简直非常之爽(当然写CMakeLists.txt的时候还是挺麻烦),编译好的接口在build\u002Flib文件夹下。\u003C\u002Fp\u003E&,&updated&:new Date(&T15:00:10.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:36,&likeCount&:94,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T23:00:10+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic3.zhimg.com\u002F0aecc16eed7_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:36,&likesCount&:94},&&:{&title&:&针对Quant的Python快速入门指南&,&author&:&traderusingpython&,&content&:&作者:用Python的交易员
(原创文章,转载请注明出处)\u003Cbr\u003E\u003Cbr\u003E最近有越来越多的朋友在知乎或者QQ上问我如何学习入门Python,就目前需求来看,我需要写这么一篇指南。\u003Cbr\u003E\u003Cbr\u003E针对整个vn.py框架的学习,整体上有两条不同的路线:\u003Cbr\u003E\u003Cul\u003E\u003Cli\u003E有经验的Quant学习如何使用Python语言来做策略和交易程序的开发(编程语言是学习重点)\u003C\u002Fli\u003E\u003Cli\u003E有经验的程序员学习如何将自己的编程知识和经验应用在量化研究和策略开发上(金融量化是学习重点)\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cbr\u003E我自己本身是金融工程硕士,毕业后也是从Quant入行,所以这篇指南主要针对的是第一条路线,欢迎社区里从第二条路线入行的朋友写写自己的经历。\u003Cbr\u003E\u003Cbr\u003E以下内容建议按照顺序一步步走,不要跳步、不要偷懒,多敲代码、多做调试,英语不好的就当顺道提高阅读水平吧。\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Ch2\u003E\u003Cb\u003ELearn Python The Hard Way\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cimg src=\&0be5b2a488b832f883c0f.jpg\& data-rawwidth=\&790\& data-rawheight=\&522\&\u003E链接:\u003Ca href=\&http:\u002F\u002Flearnpythonthehardway.org\u002Fbook\u002F\& class=\&\&\u003Ehttp:\u002F\u002Flearnpythonthehardway.org\u002Fbook\u002F\u003C\u002Fa\u003E\u003Cbr\u003E\u003Cbr\u003E这套教程是我进入Python世界大门的敲门砖,一共50个Exercise包含了一个Python新手需要知道的所有基础:\u003Cbr\u003E\u003Cul\u003E\u003Cli\u003E如何搭建Python环境\u003C\u002Fli\u003E\u003Cli\u003E变量、注释、运算符\u003C\u002Fli\u003E\u003Cli\u003E输入、输出\u003C\u002Fli\u003E\u003Cli\u003E函数\u003C\u002Fli\u003E\u003Cli\u003E数据结构:字典、列表、集合\u003C\u002Fli\u003E\u003Cli\u003EOO:类和对象\u003C\u002Fli\u003E\u003Cli\u003E控制语句:条件、循环\u003C\u002Fli\u003E\u003Cli\u003EPython的模块\u003C\u002Fli\u003E\u003Cli\u003E构建一个小型项目\u003C\u002Fli\u003E\u003Cli\u003E等等\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cbr\u003E学习方法很简单:照着Introduction章节中的要求,不用IDE只用编辑器(文中推荐的是Notepad++,个人觉得Sublime Text也不错),一行一行地敲代码,敲完后用最原始的方法来运行,根据Python解释器的异常输出来做调试。\u003Cbr\u003E50个Exercise全部完成后,你基本就掌握Python的运行和调试方法以及基础语法了。\u003Cbr\u003E\u003Cbr\u003E\u003Ch2\u003E\u003Cb\u003E利用Python进行数据分析\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cimg src=\&ddbb1ee4f0905.jpg\& data-rawwidth=\&249\& data-rawheight=\&339\&\u003E链接:\u003Ca href=\&https:\u002F\u002Fwww.amazon.cn\u002F%E5%88%A9%E7%94%A8Python%E8%BF%9B%E8%A1%8C%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90-Wes-McKinney\u002Fdp\u002FB00KD7Q7U2\u002F455-1506?ie=UTF8&;;;;;;;;;;;;%2aVersion%2a=1&%2aentries%2a=0\& class=\&\& data-editable=\&true\& data-title=\&亚马逊购买页面\&\u003E亚马逊购买页面\u003C\u002Fa\u003E\u003Cbr\u003E\u003Cbr\u003E这本书的作者Wes McKinney在美国著名的量化对冲基金AQR工作时开发了Python在数据分析领域的主要工具pandas。这本书最大的特点之一是作者用非常多的案例来介绍numpy、matplotlib、pandas和ipython在实践中的使用方法,读者实际操作过一次后立即就可以把相关的知识应用在自己其他相关的项目上。\u003Cbr\u003E\u003Cbr\u003E网上有不少建议新手直接从某个库的用户手册开始学习,我个人不赞同这种方法。原因是大部分库的用户手册主要是介绍其API的使用方法,内容写得太过抽象,对于本来就没有太多经验的新手而言就跟死记硬背英文单词差不多,看了挺久后往往还不知道如何把代码系统化的整合起来解决自己的问题。\u003Cbr\u003E\u003Cbr\u003E\u003Ch2\u003E\u003Cb\u003EPython Cookbook\u003C\u002Fb\u003E\u003C\u002Fh2\u003E链接:\u003Ca href=\&http:\u002F\u002Fitem.jd.com\u002F.html\& class=\&\& data-editable=\&true\& data-title=\&京东购买页面\&\u003E京东购买页面\u003C\u002Fa\u003E\u003Cbr\u003E\u003Cbr\u003E有了以上两段学习的基础后,可以把Cookbook这本著名的“烹饪秘籍”买了放在书橱里以备不时之需(没完成以上两段买了也是浪费看不懂)。既然叫秘籍,内容难度高是必然的,整本书根据用户要使用Python解决的具体问题来区分章节,请了每个领域中的大牛分享了一些经验和代码。\u003Cbr\u003E\u003Cbr\u003E和前两本不同的是这本书的内容不用全部掌握,可以先大概扫一遍知道每章有什么内容,后面做开发遇到相应问题时再来翻书研究。另外这本书里很多技术属于Python的“奇技淫巧”级别,如果能全部掌握对于编程水平会有非常大的提高。\u003Cbr\u003E\u003Cbr\u003E\u003Ch2\u003E\u003Cb\u003EPyQt4入门(ZetCode)\u003C\u002Fb\u003E\u003C\u002Fh2\u003E链接:\u003Ca href=\&http:\u002F\u002Fzetcode.com\u002Fgui\u002Fpyqt4\u002F\& class=\&\& data-editable=\&true\& data-title=\&ZetCode\&\u003EZetCode\u003C\u002Fa\u003E\u003Cbr\u003E\u003Cbr\u003EPyQt4是目前Python上最为主流的GUI开发库,底层运行的是C++开发的Qt代码,上层使用Python封装的API来实现调用,运行效率足以满足开发量化交易实时监控界面的需求。\u003Cbr\u003E\u003Cbr\u003E对于Python新手而言,学习PyQt4除了开发GUI外,更重要的是吸收PyQt4代码中的面向对象(OO)的设计模式相关的知识。简单的量化策略可以用过程式编程的方法来实现(如轮询价格、突破100买、跌破90卖),但是对于复杂的量化策略(如期权波动率套利、跨多市场套利等)就需要使用OO的设计模式来解耦不同功能的模块(信号生成、委托下单、风险管理),提高整个代码的健壮性和可维护性。PyQt4的OO编程风格非常简洁和清爽,掌握后用在其他的项目开发上可以大幅提高程序的编码质量。\u003Cbr\u003E另外推荐这本书给想要更深入学习PyQt4的朋友:\u003Ca href=\&https:\u002F\u002Fwww.amazon.cn\u002FIntroduction-to-Python-Programming-and-Developing-GUI-Applications-with-PyQT-Harwani-B-M\u002Fdp\u002F\u002Fref=sr_1_2?s=digital-text&ie=UTF8&qid=&sr=8-2&keywords=pyqt\& class=\&\& data-editable=\&true\& data-title=\&Introduction to Python Programming and Developing GUI Applications with PyQT\&\u003EIntroduction to Python Programming and Developing GUI Applications with PyQT\u003C\u002Fa\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Ch2\u003E\u003Cb\u003EQuantStart\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cimg src=\&d3fab51ff38adc2cccf675f4.jpg\& data-rawwidth=\&308\& data-rawheight=\&383\&\u003E链接:\u003Ca href=\&https:\u002F\u002Fwww.quantstart.com\u002F\& class=\&\&\u003Ehttps:\u002F\u002Fwww.quantstart.com\u002F\u003C\u002Fa\u003E\u003Cbr\u003E\u003Cbr\u003E应该是目前全球Python量化交易领域访问量最大和内容最丰富的网站,不加之一是因为据我所知还没有更大的,而且我还喜欢经常在网上找Python量化的资料,应该算得上经验丰富。\u003Cbr\u003EQuantStart上的内容整体难度较高,都是直接使用Python来处理量化交易项目的知识经验和代码实例,没有老老实实学完前几个部分大概率是会看得云里雾里。\u003Cbr\u003E总结下网站文章的大体分类:\u003Cbr\u003E\u003Cul\u003E\u003Cli\u003E买方(P宗):\u003Cbr\u003E\u003Cul\u003E\u003Cli\u003E算法交易\u003C\u002Fli\u003E\u003Cli\u003E统计建模和机器学习\u003C\u002Fli\u003E\u003Cli\u003E量化策略研究\u003C\u002Fli\u003E\u003Cli\u003E时间序列建模\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003C\u002Fli\u003E\u003Cli\u003E卖方(Q宗):\u003Cbr\u003E\u003Cul\u003E\u003Cli\u003E二叉树模型\u003C\u002Fli\u003E\u003Cli\u003E随机积分\u003C\u002Fli\u003E\u003Cli\u003E偏微分方程PDE\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003C\u002Fli\u003E\u003Cli\u003E代码示例:\u003Cbr\u003E\u003Cul\u003E\u003Cli\u003EC++\u003C\u002Fli\u003E\u003Cli\u003EPython\u003C\u002Fli\u003E\u003Cli\u003E外汇交易平台开发\u003C\u002Fli\u003E\u003Cli\u003E统计套利平台开发\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003C\u002Fli\u003E\u003Cli\u003EQuant职业生涯\u003Cbr\u003E\u003Cul\u003E\u003Cli\u003E职业生涯建议\u003C\u002Fli\u003E\u003Cli\u003E读书笔记\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E另外网站的作者也写了两本书Successful Algorithmic Trading和Advanced Algorithmic Trading,比起另外一个著名的量化博客主E.P. Chan写的两本书质量要好非常多,推荐购买。\u003Cbr\u003E\u003Cbr\u003E\u003Ch2\u003E\u003Cb\u003E其他学习内容\u003C\u002Fb\u003E\u003C\u002Fh2\u003E\u003Cb\u003ECodeCombat\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cimg src=\&a2b6ded8e3a50e4724dab1812eaa680c.jpg\& data-rawwidth=\&716\& data-rawheight=\&427\&\u003E链接:\u003Ca href=\&http:\u002F\u002Fcodecombat.com\u002F\& class=\&\&\u003Ehttp:\u002F\u002Fcodecombat.com\u002F\u003C\u002Fa\u003E\u003Cbr\u003E\u003Cbr\u003E写Python代码来玩RPG游戏,游戏设计的非常好,毫无基础的人也能逐步掌握Python编程(本来就是设计给孩子的),同时一些关卡对于程序员的逻辑思维能力有很好的训练。游戏难度随着关卡逐步增强,到后期还是有相当的挑战度,可能导致学习者沉迷其中,入坑前请谨慎三思……\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003EFlask Web开发:基于Python的Web应用开发实战\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cbr\u003E链接:\u003Ca href=\&https:\u002F\u002Fwww.amazon.cn\u002FFlask-Web%E5%BC%80%E5%8F%91-%E5%9F%BA%E4%BA%8EPython%E7%9A%84Web%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98-%E6%A0%BC%E6%9E%97%E5%B8%83%E6%88%88\u002Fdp\u002FB00QT2TQCG\u002Fref=sr_1_1?ie=UTF8&qid=&sr=8-1&keywords=flask\& class=\&\& data-editable=\&true\& data-title=\&亚马逊购买页面\&\u003E亚马逊购买页面\u003C\u002Fa\u003E\u003Cbr\u003E\u003Cbr\u003EFlask是Python目前在Web开发领域人气最高的框架之一(另一个是Django),采用微框架的设计哲学,代码短小精悍,同时还有着非常好的扩展性。整本书的内容就是教会读者如何一步步从0开始搭建一个自己的博客,中间涉及的设计模式、数据库ORM、APP部署等知识在量化领域也都有相应的应用。\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003E廖雪峰的Python教程\u003C\u002Fb\u003E\u003Cp\u003E链接:\u003Ca href=\&http:\u002F\u002Fwww.liaoxuefeng.com\u002F\& class=\&\&\u003Ehttp:\u002F\u002Fwww.liaoxuefeng.com\u002F\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E可以作为LPTHW的中文版替代,涉及的内容相对更加丰富也带有大量的代码实例,不过整个教程中对于Python一些底层特性的讲解较多,更加适合完成了前几个阶段的学习后用来作为二次的知识巩固和提高,初学者建议还是从LPTHW开始入门。\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003E知乎\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cbr\u003E链接:\u003Ca href=\&http:\u002F\u002Fwww.zhihu.com\u002F\& class=\&\& data-title=\&http:\u002F\u002Fwww.zhihu.com\&\u003Ehttp:\u002F\u002Fwww.zhihu.com\u003C\u002Fa\u003E\u003Cbr\u003E\u003Cbr\u003E知乎和豆瓣一样,都是国内使用Python开发的大型项目,其员工对于Python的讨论氛围非常浓厚。同时作为一个以问答为主的社区,知乎上的Python问题下汇聚了很多国内Python业界的大牛级高手的回答和文章,上下班挤地铁、买早饭排队、晚上睡不着的时候随手翻一翻,既解决了无聊又能吸收很多碎片化的知识。\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003Evn.py项目\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cimg src=\&e8506083f.jpg\& data-rawwidth=\&671\& data-rawheight=\&700\&\u003E链接:\u003Ca href=\&http:\u002F\u002Fwww.vnpy.org\u002F\& class=\&\& data-editable=\&true\& data-title=\&项目官网\&\u003E项目官网\u003C\u002Fa\u003E和\u003Ca href=\&http:\u002F\u002Fwww.vnpie.com\u002F\& class=\&\& data-editable=\&true\& data-title=\&维恩的派论坛\&\u003E维恩的派论坛\u003C\u002Fa\u003E\u003Cbr\u003E\u003Cbr\u003E最后,请允许我厚着脸皮推荐一下自己的开源项目…… #^_^#\u003C\u002Fp\u003E&,&updated&:new Date(&T04:14:35.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:71,&likeCount&:2772,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T12:14:35+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic1.zhimg.com\u002F18cb6a05c7ecce667e5f_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:71,&likesCount&:2772},&&:{&title&:&用python的交易员的 Live -- 聊聊 Python 和 Quant&,&author&:&traderusingpython&,&content&:&\u003Cp\u003E我是陈晓优,知乎网名:用 Python 的交易员,现在均直资产担任期权部门主管。 我在业余时间维护了一款针对国内市场的开源量化交易平台开发框架 vn.py,目前是国内用户最多的量化金融开源项目之一。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E本次 Live,我想聊聊 Python 语言对于 Quant 的意义。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E本次 Live 主要包括以下问题:\u003C\u002Fp\u003E\u003Cp\u003E* Quant 在工作中遇到的一些痛点\u003C\u002Fp\u003E\u003Cp\u003E* Python 对于这些痛点的解决方案\u003C\u002Fp\u003E\u003Cp\u003E* Python 的量化投资方面的工具生态链\u003C\u002Fp\u003E\u003Cp\u003E* vn.py 项目在整个生态链中的定位\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E如果你是有着以下需求的 Quant,相信我的 Live 会让你有所收获:\u003C\u002Fp\u003E\u003Cp\u003E* 想走出脚本语言(TB、MC 等)的限制,实现更加复杂的量化策略和交易算法\u003C\u002Fp\u003E\u003Cp\u003E* 擅长 C++、Java 等重型武器,但工作中想要有一把瑞士军刀来解决日常问题(系统运维、业绩分析、数据处理)\u003C\u002Fp\u003E\u003Cp\u003E* 习惯了 Matlab 和 R 在研究工作上的便利性,但是希望能低成本(资金和时间)切入到策略实盘交易的领域\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E如果你不是职业 Quant,但是有着以下的需求,不妨也来了解下 Python 可能为你带来的帮助:\u003C\u002Fp\u003E\u003Cp\u003E* 想要了解 Python 在量化投资领域应用前景的大学毕业生\u003C\u002Fp\u003E\u003Cp\u003E* 程序猿想要转型 Quant,Python 是一个不错的着手点\u003C\u002Fp\u003E\u003Cp\u003E* 传统投资者想要切入量化交易领域,可以从使用 Python 改进现有的投资决策流程和效率开始,一步步引导投资业务的转型\u003C\u002Fp\u003E\u003Cp\u003E【传送门】\u003Ca href=\&https:\u002F\u002Fwww.zhihu.com\u002Flives\u002F968384\& class=\&\&\u003Ehttps:\u002F\u002Fwww.zhihu.com\u002Flives\u002F3C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E版权声明:讲者在本产品上发表的全部原创内容(包括但不限于文字、音频、图片等)著作权均归讲者本人所有。未经讲者授权许可,听众用户不得以任何载体或形式使用讲者的内容。\u003C\u002Fp\u003E&,&updated&:new Date(&T06:51:58.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:18,&likeCount&:256,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T14:51:58+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic1.zhimg.com\u002F48eb977f483a1abb07ed_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:18,&likesCount&:256},&&:{&title&:&量化交易接口大对比&,&author&:&traderusingpython&,&content&:&\u003Cb\u003E作者:用Python的交易员\u003Cbr\u003E原创文章,转载请注明出处\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cbr\u003E本篇比较简单,只有下面一张图,但是精华尽在其中,有问题欢迎留言。\u003Cbr\u003E\u003Cimg src=\&806c93e6d57b.png\& data-rawwidth=\&1234\& data-rawheight=\&599\&\u003E\u003Cp\u003E补充一下,避免误会:针对LTS接口,目前只有存量客户可以用(程序化监管规定出来前的老账户),\u003Cb\u003E\u003Cu\u003E新增帐户是无法使用的\u003C\u002Fu\u003E\u003C\u002Fb\u003E。\u003C\u002Fp\u003E\u003Cp\u003E针对网上流传的一些通达信、恒生网页版的破解接口,我个人观点是小心为上:\u003C\u002Fp\u003E\u003Cp\u003E1. 破解接口肯定是违规的(是否违法不清楚,请专业人士解答)\u003C\u002Fp\u003E\u003Cp\u003E2. 这些主要面向手动交易的接口,在稳定性和速度方面比专业的量化接口相去甚远\u003C\u002Fp\u003E\u003Cp\u003E所以大部分机构都是不会考虑这种接口的,更多适合散户自娱自乐一下。\u003C\u002Fp\u003E&,&updated&:new Date(&T05:15:10.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:44,&likeCount&:219,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T13:15:10+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic2.zhimg.com\u002Fcbebc2c5ae5261d_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:44,&likesCount&:219},&&:{&title&:&CtaAlgo vs PyAlgoTrade&,&author&:&traderusingpython&,&content&:&\u003Cp\u003E\u003Cb\u003E作者:用Python的交易员\u003Cbr\u003E原创文章,转载请注明出处\u003Cbr\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E在Python量化领域,PyAlgoTrade和zipline并列两大策略回测框架的先驱,其中PyAlgoTrade主要针对CTA策略(单一合约交易),而zipline主要针对统计套利策略(投资组合交易)。\u003C\u002Fp\u003E\u003Cp\u003E在知乎和QQ群里也被很多人问了挺多次vn.py和PyAlgoTrade有什么区别,感觉零散的解释效果不咋地,还是决定“一表剩千言”。\u003C\u002Fp\u003E\u003Cp\u003E值得说明的是,vn.py是一个完整的量化交易程序开发框架,包括从交易接口、事件引擎、GUI、算法应用等诸多模块,而PyAlgoTrade主要是一个策略框架(回测、交易),所以直接对比没什么意义,下面这个表里用来和PyAlgoTrade做对比的是vn.trader(交易平台)中的上层应用模块CtaAlgo(CTA策略模块)。\u003C\u002Fp\u003E\u003Cp\u003E在上表前先强调下:本人也是vn.py框架的作者,以下对比内容可能带有严重的主观偏见,所以如果对内容有任何不满的地方欢迎在评论区指出,如果是PyAlgoTrade的作者当然也可以选择破口大骂~:)\u003C\u002Fp\u003E\u003Cimg src=\&efaf3af65db0d070d2df8d8c1d46233e.png\& data-rawwidth=\&826\& data-rawheight=\&684\&\u003E&,&updated&:new Date(&T09:30:15.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:19,&likeCount&:115,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T17:30:15+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic4.zhimg.com\u002F31f6e053cb47d66d61859d_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:19,&likesCount&:115},&&:{&title&:&用python的交易员的 Live --聊聊作为一个金融外行如何入门量化交易&,&author&:&traderusingpython&,&content&:&\u003Cp\u003E我是陈晓优,知乎网名:用 Python 的交易员,现在均直资产担任期权部门主管。 我在业余时间维护了一款针对国内市场的开源量化交易平台开发框架 vn.py,目前是国内用户最多的量化金融开源项目之一。\u003C\u002Fp\u003E\u003Cp\u003E上次的 Live 结束后,很多人给我留言和发私信,咨询作为一个有理科生背景或者工作经验(包括但不限于:数学、统计、计算机、物理等)的金融外行,如何才能比较快的入门量化交易。\u003C\u002Fp\u003E\u003Cp\u003E关于 Quant 如何入门 Python 的话题,我之前在知乎专栏写了一篇文章《针对 Quant 的 Python 快速入门指南》,收获 2K 多赞。但是关于金融外行如何入门量化交易,就不是三言两语能够讲得清的了,相比较于掌握一个工具的使用,学习一门全新的学科领域无疑是一项难度要高得多的挑战(想要「入坑」量化交易的朋友请一定要做好心理准备),所以决定继续以 Live 这个互动性更强的交流形式来和大家聊聊这个话题。\u003C\u002Fp\u003E\u003Cp\u003E在本次的 Live 中,我会和大家分享一些自己在金融行业和量化投资领域的成长经历,主要包括:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E从数量化的角度来认识金融行业的方方面面\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E如何快速积累在投资领域生存和发展所需的各种知识\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E如何把自己原来在理科相关的学习和工作中积累的经验知识应用到量化交易\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E作为一名量化交易员的打怪和升级之路\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E在定位上,本次的 Live 将会是一场主要针对非量化从业人员的快速入门课,如果你有着以下的需求,相信我的 Live 会让你有所收获:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E理科专业的在校大学生,希望毕业后能够进入金融机构从事量化相关工作\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E有着多年 IT 经验的程序猿,想要转行投资领域,做量化开发或者策略研究\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E在理工科相关的工作中积累了丰富的研究经验,希望通过量化的方式来获取较为稳定收益\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E【传送门】\u003Ca href=\&https:\u002F\u002Fwww.zhihu.com\u002Flives\u002F315072\& class=\&\&\u003Ehttps:\u002F\u002Fwww.zhihu.com\u002Flives\u002F3C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003EPS:本篇文章的题图来源于\u003Ca href=\&http:\u002F\u002Fgekkoquant.com\u002F\& data-editable=\&true\& data-title=\&gekkoquant.com\&\u003Egekkoquant.com\u003C\u002Fa\u003E,一个原创干货非常多的量化投资博客,强烈建议关注。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E版权声明:讲者在本产品上发表的全部原创内容(包括但不限于文字、音频、图片等)著作权均归讲者本人所有。未经讲者授权许可,听众用户不得以任何载体或形式使用讲者的内容。\u003C\u002Fp\u003E&,&updated&:new Date(&T07:57:51.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:29,&likeCount&:398,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T15:57:51+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic4.zhimg.com\u002F484ea09b1e365d473c3ee49c_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:29,&likesCount&:398},&&:{&title&:&百倍加速!Python量化策略的算法性能提升指南&,&author&:&traderusingpython&,&content&:&\u003Cp\u003E原创文章,转载请注明出处:用Python的交易员\u003C\u002Fp\u003E\u003Ch3\u003E性能问题\u003C\u002Fh3\u003E\u003Cp\u003EPython在2016年里可以说是风靡国内量化投资圈,目前整个生态链已经初具规模:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E交易:vn.py、easytrader、at_py\u003C\u002Fli\u003E\u003Cli\u003E数据:tushare\u003C\u002Fli\u003E\u003Cli\u003E回测:rqalpha\u003C\u002Fli\u003E\u003Cli\u003E在线平台:UQER、RiceQuant、JoinQuant\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E随着用户越来越多,Python语言的性能问题也就逐渐成为整个社区关注的重点,经常遇到新手问:Python写的量化交易程序是不是很慢啊?\u003C\u002Fp\u003E\u003Cp\u003E在他们心中,Python估计是这个样子:\u003C\u002Fp\u003E\u003Cimg src=\&v2-00a331c4b01853d57fcebe.jpg\& data-rawwidth=\&473\& data-rawheight=\&309\&\u003E\u003Cp\u003E(即使作为破旧自行车,我也深表怀疑这辆能不能骑好吧)\u003C\u002Fp\u003E\u003Cp\u003E网上关于如何提升Python程序性能的文章不少,但大多不成体系只是非常简单的例子,总有点隔靴搔痒的感觉,和现实中应用的距离比较远。\u003C\u002Fp\u003E\u003Cp\u003E作者一看,填补市场空白(装逼)的机会来了!!\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E在这篇文章里,将会通过实际的例子展示如何对一段量化策略常用的代码实现百倍加速。\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cimg src=\&v2-9d5c7ce2be2c342eacfccf785c1dc5af.jpg\& data-rawwidth=\&401\& data-rawheight=\&193\&\u003E\u003Ch3\u003E一段常用的代码\u003C\u002Fh3\u003E\u003Cp\u003E接下来要用的例子相信几乎所有做量化策略的人都写过类似的代码:对时间序列求算术移动平均值。\u003C\u002Fp\u003E\u003Cp\u003E这里我们先初始化即将用到的数据:10万个数据点(随机整数),遍历计算窗口为500的算术移动平均值,每种算法运行10次求平均耗时。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&python\&\u003E# 这个测试目标在于仿造一个类似于实盘中,不断有新的数据推送过来,\n# 然后需要计算移动平均线数值,这么一个比较常见的任务。\n\nfrom __future__ import division\nimport time\nimport random\n\n# 生成测试用的数据\ndata = []\ndata_length = 100000
# 总数据量\nma_length = 500
# 移动均线的窗口\ntest_times = 10
# 测试次数\n\nfor i in range(data_length):\n
data.append(random.randint(1, 100))\n\u003C\u002Fcode\u003E\u003Cp\u003E在每次测试中,我们都通过遍历测试用数据的方式来模拟实盘中策略不断收到新数据推送的情况(同样适用于事件驱动的回测模式),将计算出的移动平均值不断保存到一个列表list中作为最终结果返回。\u003C\u002Fp\u003E\u003Cp\u003E测试用电脑的配置情况:Core i7-G\u002F16G\u002FWindows 7。\u003C\u002Fp\u003E\u003Cp\u003E第一步我们以最简单、最原始的方式来计算移动平均值:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&python\&\u003E# 计算500期的移动均线,并将结果保存到一个列表里返回\ndef ma_basic(data, ma_length):\n\n
# 用于保存均线输出结果的列表\n
ma = []\n\n
# 计算均线用的数据窗口\n
data_window = data[:ma_length]\n\n
# 测试用数据(去除了之前初始化用的部分)\n
test_data = data[ma_length:]\n\n
# 模拟实盘不断收到新数据推送的情景,遍历历史数据计算均线\n
for new_tick in test_data:\n
# 移除最老的数据点并增加最新的数据点\n
data_window.pop(0)\n
data_window.append(new_tick)\n\n
# 遍历求均线\n
sum_tick = 0\n
for tick in data_window:\n
sum_tick += tick\n
ma.append(sum_tick\u002Fma_length)\n\n
# 返回数据\n
return ma\n\n# 运行测试\nstart = time.time()\n\nfor i in range(test_times):\n
result = ma_basic(data, ma_length)\n\ntime_per_test = (time.time()-start)\u002Ftest_times\ntime_per_point = time_per_test\u002F(data_length - ma_length)\n\nprint u'单次耗时:%s秒' %time_per_test\nprint u'单个数据点耗时:%s微秒' %(time_per_point*1000000)\nprint u'最后10个移动平均值:', result[-10:]\n\u003C\u002Fcode\u003E\u003Cp\u003E单次耗时指的是遍历完整个测试数据计算移动平均值所需的时间,单个数据点耗时指的是遍历过程中每个数据点的平均计算耗时,最后10个移动平均值用于和后续的算法进行比对,保证计算结果的正确性。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003Ema_basic测试结果\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E单次耗时:1.秒\u003C\u002Fli\u003E\u003Cli\u003E单个数据点耗时:11.微秒\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E大约10万个数据点(说大约因为有500个用于初始化了),这个测试结果不能说很好但也还过得去。考虑到一个简单的双均线CTA策略(Double SMA Strategy),每个数据点来了后会进行两次均线计算,通常均线窗口不会超过500,且比较两根均线交叉情况的算法开销更低,估计策略单纯在信号计算方面的耗时会在30微秒以内,对于一个通常跑在1分钟线甚至更高时间周期上的策略而言已经是绰绰有余。\u003C\u002Fp\u003E\u003Cp\u003E有了起点,下面来试着一步步提升性能。\u003C\u002Fp\u003E\u003Ch3\u003E试试NumPy?\u003C\u002Fh3\u003E\u003Cp\u003E用Python做数值运算性能不够的时候,很多人的第一反应就是上NumPy:之前的ma_basic里,比较慢的地方应该在每一个新的数据点加入到data_window中后遍历求平均值的代码,那么改用numpy.array数组来求和应该性能就会有所提升了吧?\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&python\&\u003E# 改用numpy(首先是一种常见的错误用法)\nimport numpy as np\n\ndef ma_numpy_wrong(data, ma_length):\n
data_window = data[:ma_length]\n
test_data = data[ma_length:]\n\n
for new_tick in test_data:\n
data_window.pop(0)\n
data_window.append(new_tick)\n\n
# 使用numpy求均线,注意这里本质上每次循环\n
# 都在创建一个新的numpy数组对象,开销很大\n
data_array = np.array(data_window)\n
ma.append(data_array.mean())\n\n
return ma\n\u003C\u002Fcode\u003E\u003Cp\u003E\u003Cstrong\u003Ema_numpy_wrong测试结果\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E单次耗时:2.秒\u003C\u002Fli\u003E\u003Cli\u003E单个数据点耗时:21.微秒\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cimg src=\&v2-d700b681ec063.jpg\& data-rawwidth=\&528\& data-rawheight=\&235\&\u003E\u003Cp\u003EWTF?!用NumPy后居然反而速度降低了一半(耗时增加到了快2倍)!\u003C\u002Fp\u003E\u003Cp\u003E这里的写法是一个非常常见的NumPy错误用法,问题就出在:\u003C\u002Fp\u003E\u003Cblockquote\u003E\u003Cp\u003Edata_array = np.array(data_window)\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Cp\u003E由于NumPy中的对象大多实现得比较复杂(提供了丰富的功能),所以其对象创建和销毁的开销都非常大。上面的这句代码意味着在计算每一个新数据点时,都要创建一个新的array对象,并且仅使用一次后就会销毁,使用array.mean方法求均值带来的性能提升还比不上array对象创建和销毁带来的额外开销。\u003C\u002Fp\u003E\u003Cp\u003E正确的用法是把np.array作为data_window时间序列的容器,每计算一个新的数据点时,使用底层数据偏移来实现数据更新:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&python\&\u003E# numpy的正确用法\ndef ma_numpy_right(data, ma_length):\n
ma = []\n\n
# 用numpy数组来缓存计算窗口内的数据\n
data_window = np.array(data[:ma_length])\n\n
test_data = data[ma_length:]\n\n
for new_tick in test_data:\n
# 使用numpy数组的底层数据偏移来实现数据更新\n
data_window[0:ma_length-1] = data_window[1:ma_length]\n
data_window[-1] = new_tick\n
ma.append(data_window.mean())\n\n
return ma\n\u003C\u002Fcode\u003E\u003Cp\u003E\u003Cstrong\u003Ema_numpy_right测试结果\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E单次耗时:0.秒\u003C\u002Fli\u003E\u003Cli\u003E单个数据点耗时:6.微秒\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E速度比ma_basic提高了大约2倍,看来NumPy也就这么回事了。\u003C\u002Fp\u003E\u003Ch3\u003EJIT神器:Numba\u003C\u002Fh3\u003E\u003Cp\u003E关心过Python性能的朋友应该都听过PyPy的大名,通过重新设计的Python解释器,PyPy内建的JIT技术号称可以将Python程序的速度提高几十倍(相比于CPython),可惜由于兼容性的问题并不适合于量化策略开发这一领域。\u003C\u002Fp\u003E\u003Cp\u003E幸运的是,我们还有Anaconda公司推出的Numba。Numba允许用户使用基于LLVM的JIT技术,对程序内想要提高性能的部分(函数)进行局部优化。同时Numba在设计理念上更加务实:可以直接在CPython中使用,和其他常用的Python模块的兼容性良好,并且最爽的是使用方法傻瓜到了极点:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&python\&\u003E# 使用numba加速,ma_numba函数和ma_basic完全一样\nimport numba\n\n@numba.jit\ndef ma_numba(data, ma_length):\nma = []\ndata_window = data[:ma_length]\ntest_data = data[ma_length:]\n\nfor new_tick in test_data:\n
data_window.pop(0)\n
data_window.append(new_tick)\n
sum_tick = 0\n
for tick in data_window:\n
sum_tick += tick\n
ma.append(sum_tick\u002Fma_length)\n\nreturn ma\n\u003C\u002Fcode\u003E\u003Cp\u003E\u003Cstrong\u003Ema_numba测试结果\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E单次耗时:0.秒\u003C\u002Fli\u003E\u003Cli\u003E单个数据点耗时:0.微秒\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003EOMG!就加了一行@numba.jit,性能竟然提高了26倍!这估计是按照代码修改行数算,性价比最高的优化方案了。\u003C\u002Fp\u003E\u003Ch3\u003E改写算法\u003C\u002Fh3\u003E\u003Cp\u003E从编程哲学的角度来看,想提高计算机程序的速度,一个最基本的原则就是降低算法复杂度。看到这里估计早就有量化老手ma_basic不爽了,弄个复杂度O(N)的算法来算平均值,就不能缓存下求和的结果,把复杂度降低到O(1)么?\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&text\&\u003E# 将均线计算改写为高速算法\ndef ma_online(data, ma_length):\n
data_window = data[:ma_length]\n
test_data = data[ma_length:]\n\n
# 缓存的窗口内数据求和结果\n
sum_buffer = 0\n\n
for new_tick in test_data:\n
old_tick = data_window.pop(0)\n
data_window.append(new_tick)\n\n
# 如果缓存结果为空,则先通过遍历求第一次结果\n
if not sum_buffer:\n
sum_tick = 0\n
for tick in data_window:\n
sum_tick += tick\n
ma.append(sum_tick\u002Fma_length)\n\n
# 将求和结果缓存下来\n
sum_buffer = sum_tick\n
# 这里的算法将计算复杂度从O(n)降低到了O(1)\n
sum_buffer = sum_buffer - old_tick + new_tick\n
ma.append(sum_buffer\u002Fma_length)\n\n
return ma\n\u003C\u002Fcode\u003E\u003Cp\u003E\u003Cstrong\u003Ema_online测试结果\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E单次耗时:0.1秒\u003C\u002Fli\u003E\u003Cli\u003E单个数据点耗时:0.微秒\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E哲学果然才是最强大的力量!!!\u003C\u002Fp\u003E\u003Cimg src=\&v2-c20a996c1ceecded7d15a148.jpg\& data-rawwidth=\&492\& data-rawheight=\&300\&\u003E\u003Cp\u003E(索罗斯:其实我是个哲学家。)\u003C\u002Fp\u003E\u003Cp\u003E改写算法后的ma_online无需JIT就超越了ma_numba,将性能提高到了33倍(对比ma_basic),如果再把numba加上会如何?\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&python\&\u003E# 高速算法和numba结合,ma_online_numba函数和ma_online完全一样\n@numba.jit\ndef ma_online_numba(data, ma_length):\n
data_window = data[:ma_length]\n
test_data = data[ma_length:]\n\n
sum_buffer = 0\n\n
for new_tick in test_data:\n
old_tick = data_window.pop(0)\n
data_window.append(new_tick)\n\n
if not sum_buffer:\n
sum_tick = 0\n
for tick in data_window:\n
sum_tick += tick\n
ma.append(sum_tick\u002Fma_length)\n
sum_buffer = sum_tick\n
sum_buffer = sum_buffer - old_tick + new_tick\n
ma.append(sum_buffer\u002Fma_length)\n\n
return ma\n\u003C\u002Fcode\u003E\u003Cp\u003E\u003Cstrong\u003Ema_online_numba测试结果\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E单次耗时:0.2秒\u003C\u002Fli\u003E\u003Cli\u003E单个数据点耗时:0.微秒\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E尽管性能进一步提升了到了40倍,不过相比较于ma_numba对比ma_basic的提升没有那么明显,果然哲学的力量还是太强大了。\u003C\u002Fp\u003E\u003Ch3\u003E终极武器:Cython\u003C\u002Fh3\u003E\u003Cp\u003E到目前为止使用纯Python环境下的优化方法我们已经接近了极限,想要再进一步就得发挥Python胶水语言的特性了:使用其他扩展语言。由于CPython虚拟机的开发语言是C,因此在性能提升方面的扩展语言主要选择就是C\u002FC++,相关的工具包括ctypes、cffi、Swig、Boost.Python等,尽管功能十分强大,不过以上工具都无一例外的需要用户拥有C\u002FC++语言相关的编程能力,对于很多Python用户而言是个比较麻烦的事。\u003C\u002Fp\u003E\u003Cp\u003E好在Python社区对于偷懒的追求是永无止境的,Cython这一终极武器应运而生。关于Cython的详细介绍可以去\u003Ca href=\&http:\u002F\u002Fwww.cython.org\u002F\& data-editable=\&true\& data-title=\&官网\&\u003E官网\u003C\u002Fa\u003E看,简单来它的主要作用就是允许用户以非常接近Python的语法来实现非常接近C的性能。\u003C\u002Fp\u003E\u003Cp\u003E先来试试最简单的方法:完全不修改任何代码,只是把函数放到.pyx文件里,调用Cython编译成.pyd扩展模块。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&python\&\u003E# 基础的cython加速\ndef ma_cython(data, ma_length):\n
data_window = data[:ma_length]\n
test_data = data[ma_length:]\n\n
for new_tick in test_data:\n
data_window.pop(0)\n
data_window.append(new_tick)\n\n
sum_tick = 0\n
for tick in data_window:\n
sum_tick += tick\n
ma.append(sum_tick\u002Fma_length)\n\n
return ma\n\u003C\u002Fcode\u003E\u003Cp\u003E\u003Cstrong\u003Ema_cython测试结果\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E单次耗时:0.秒\u003C\u002Fli\u003E\u003Cli\u003E单个数据点耗时:6.微秒\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003Ema_cython和ma_basic的代码完全相同,简单使用Cython编译后性能提高了大约1倍,不过这和之前我们已经达成的优化效果比可以说是毫无吸引力。\u003C\u002Fp\u003E\u003Cp\u003ECython官方的Quick Start里,第一步是教会用户如何去编译程序,第二步就是如何使用静态声明来大幅提高性能,所以我们的下一步就是:静态声明+高速算法。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&python\&\u003E# cython和高速算法\ndef ma_cython_online(data, ma_length):\n
# 静态声明变量\n
cdef int sum_buffer, sum_tick, old_tick, new_tick\n\n
data_window = data[:ma_length]\n
test_data = data[ma_length:]\n
sum_buffer = 0\n\n
for new_tick in test_data:\n
old_tick = data_window.pop(0)\n
data_window.append(new_tick)\n\n
if not sum_buffer:\n
sum_tick = 0\n
for tick in data_window:\n
sum_tick += tick\n
ma.append(sum_tick\u002Fma_length)\n\n
sum_buffer = sum_tick\n
sum_buffer = sum_buffer - old_tick + new_tick\n
ma.append(sum_buffer\u002Fma_length)\n\n
return ma\n\u003C\u002Fcode\u003E\u003Cp\u003E\u003Cstrong\u003Ema_cython_online测试结果\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E单次耗时:0.11秒\u003C\u002Fli\u003E\u003Cli\u003E单个数据点耗时:0.8微秒\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cimg src=\&v2-52ea5a40a60e4dda914bb.jpg\& data-rawwidth=\&600\& data-rawheight=\&400\&\u003E\u003Cp\u003E117倍!!!比ma_online_numba的速度还提高了接近3倍,98纳秒的计算速度已经足以满足大部分毫秒级别高频策略的延时需求。\u003C\u002Fp\u003E\u003Cp\u003E主要的功臣是这行:\u003C\u002Fp\u003E\u003Cblockquote\u003E\u003Cp\u003Ecdef int sum_buffer, sum_tick, old_tick, new_tick\u003C\u002Fp\u003E\u003C\u002Fblockquote\u003E\u003Cp\u003E把函数中用到的变量静态声明成int类型后,Cython在编译时无需再考虑Python对象的动态性特点,可以把整个函数高度优化成类似静态语言的实现,从而达到了接近C语言的运行性能,再加上复杂度O(1)的高速算法,有这个级别的性能提升也就不足为奇了。\u003C\u002Fp\u003E\u003Cp\u003E附上简单的Cython使用指南:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E把要使用Cython编译的函数放到.pyx文件中,比如test.pyx\u003C\u002Fli\u003E\u003Cli\u003E创建setup.py用于设置相关编译选项\u003C\u002Fli\u003E\u003Cli\u003E打开cmd或者terminal进入到test.pyx和setup.py所在的文件夹\u003C\u002Fli\u003E\u003Cli\u003E运行\u003Cstrong\u003Epython setup.py build_ext --inplace\u003C\u002Fstrong\u003E,执行编译\u003C\u002Fli\u003E\u003Cli\u003E若编译成功则在当前文件夹下会出现test.pyd\u003C\u002Fli\u003E\u003Cli\u003E打开python像使用其他模块一样载入(import)test.pyd使用\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Ch3\u003E写在最后\u003C\u002Fh3\u003E\u003Cp\u003E感谢Numba、Cython和哲学的强大力量,作者最终装逼成功,从自己挖的“百倍加速”这个坑里爬了出来,不用当标题党了。\u003C\u002Fp\u003E\u003Cp\u003E最终的算法性能对比图:\u003C\u002Fp\u003E\u003Cimg src=\&v2-cf.png\& data-rawwidth=\&696\& data-rawheight=\&456\&\u003E\u003Cp\u003E最后做一些总结吧:\u003C\u002Fp\u003E\u003Col\u003E\u003Cli\u003E现实工作中遇到需要优化Python程序性能时,首先要做的就是去寻找程序里延时较大的热点代码,找到了问题所在,解决方案才有意义;\u003C\u002Fli\u003E\u003Cli\u003E所有的优化工作都应该基于测试来一步步推进,同样的优化方法对于不同类型的代码效果可能是截然相反的,同时错误的优化方法还不如不要优化(比如ma_numpy_wrong);\u003C\u002Fli\u003E\u003Cli\u003E只需增加一句代码(@numba.jit)就能实现加速的Numba无疑是性价比最高的优化方案,值得优先尝试,不过需要注意numba的JIT技术局限性比较大(主要针对数值计算相关的逻辑);\u003C\u002Fli\u003E\u003Cli\u003E学习如何降低算法复杂度和编写更高效的算法,可以在潜移默化中提高自己的编程水平,在长期而言是对Quant或者程序员最有价值的优化方法;\u003C\u002Fli\u003E\u003Cli\u003E如果其他优化方法都无法达到令你满意的性能水平,试试Cython(记得一定要加静态声明);\u003C\u002Fli\u003E\u003Cli\u003E一个好的程序架构设计非常重要,把功能不同的计算逻辑分解到不同的函数里,适当降低每个函数的代码行数,会有助于后期的性能优化工作。\u003C\u002Fli\u003E\u003C\u002Fol\u003E\u003Ch2\u003E文章中的所有代码以及测试用的Jupyter Notebook都可以在\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Fvnpy\u002Fvnpy\u002Ftree\u002Fdev\u002Fvn.how\& data-editable=\&true\& data-title=\&vn.py项目的Github仓库\&\u003Evn.py项目的Github仓库\u003C\u002Fa\u003E下载,记得点Star!\u003C\u002Fh2\u003E&,&updated&:new Date(&T15:17:51.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:56,&likeCount&:925,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T23:17:51+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic4.zhimg.com\u002Fv2-cf_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:56,&likesCount&:925},&&:{&title&:&vn.trader的tick-to-trade延时测试&,&author&:&traderusingpython&,&content&:&\u003Cp\u003E原创文章,转载请注明出处:用Python的交易员\u003C\u002Fp\u003E\u003Ch3\u003Etick-to-trade延时\u003C\u002Fh3\u003E\u003Cp\u003E对于量化交易平台而言,最重要的技术指标之一就是所谓的tick-to-trade延时,即从底层API收到一个tick行情推送的tick_time,到平台内部处理完毕再调用底层API发出委托的trade_time,中间所耗费的时间。\u003C\u002Fp\u003E\u003Cp\u003E通常出于纯粹测试平台性能的目的,会采用收到行情后不进行任何策略逻辑计算,立即发出委托的方式来实现。考虑目前vn.trader的用户群中最常见的情景,本文中使用Windows系统和CTP接口来进行测试。\u003C\u002Fp\u003E\u003Cp\u003E为了实现这种精度比较高的延时测试,需要在底层的C++ API相关的封装中加入计时相关的代码,这里选择用Windows系统提供的QueryPerformanceCounter和QueryPerformanceFrequency函数,具体可以参考\u003Ca href=\&http:\u002F\u002Fblog.csdn.net\u002Fnancy_m\u002Farticle\u002Fdetails\u002F9621221\& data-editable=\&true\& data-title=\&这篇文章\&\u003E这篇文章\u003C\u002Fa\u003E。\u003C\u002Fp\u003E\u003Ch3\u003E在MdApi中测量tick_time\u003C\u002Fh3\u003E\u003Cp\u003E当行情接口MdApi的行情推送回调函数被触发时,需要立即记录下当前的时间戳。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&cpp\&\u003Evoid MdApi::OnRtnDepthMarketData(CThostFtdcDepthMarketDataField *pDepthMarketData)\n{\n
Task task = Task();\n\n
LARGE_INTEGER\n
QueryPerformanceCounter(&t);\n
task.task_time = t.QuadP\n
\u002F\u002Ftask.task_time = std::clock();\n\n
task.task_name = ONRTNDEPTHMARKETDATA;\n\n
if (pDepthMarketData)\n
task.task_data = *pDepthMarketD\n
CThostFtdcDepthMarketDataField empty_data = CThostFtdcDepthMarketDataField();\n
memset(&empty_data, 0, sizeof(empty_data));\n
task.task_data = empty_\n
this-&task_queue.push(task);\n};\n\u003C\u002Fcode\u003E\u003Cp\u003E然后在处理C++行情结构体并生成Python字典时,把时间戳和计时频率作为额外的数据放入字典中。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&cpp\&\u003Evoid MdApi::processRtnDepthMarketData(Task task)\n{\n
CThostFtdcDepthMarketDataField task_data = any_cast&CThostFtdcDepthMarketDataField&(task.task_data);\\n
data[\&HighestPrice\&] = task_data.HighestP\n
data[\&BidPrice5\&] = task_data.BidPrice5;\n
data[\&BidPrice4\&] = task_data.BidPrice4;\n
data[\&BidPrice1\&] = task_data.BidPrice1;\n
data[\&BidPrice3\&] = task_data.BidPrice3;\n
data[\&BidPrice2\&] = task_data.BidPrice2;\n
data[\&LowerLimitPrice\&] = task_data.LowerLimitP\n
data[\&OpenPrice\&] = task_data.OpenP\n
data[\&AskPrice5\&] = task_data.AskPrice5;\n
data[\&AskPrice4\&] = task_data.AskPrice4;\n
data[\&AskPrice3\&] = task_data.AskPrice3;\n
data[\&PreClosePrice\&] = task_data.PreCloseP\n
data[\&AskPrice1\&] = task_data.AskPrice1;\n
data[\&PreSettlementPrice\&] = task_data.PreSettlementP\n
data[\&AskVolume1\&] = task_data.AskVolume1;\n
data[\&UpdateTime\&] = task_data.UpdateT\n
data[\&UpdateMillisec\&] = task_data.UpdateM\n
data[\&AveragePrice\&] = task_data.AverageP\n
data[\&BidVolume5\&] = task_data.BidVolume5;\n
data[\&BidVolume4\&] = task_data.BidVolume4;\n
data[\&BidVolume3\&] = task_data.BidVolume3;\n
data[\&BidVolume2\&] = task_data.BidVolume2;\n
data[\&PreOpenInterest\&] = task_data.PreOpenI\n
data[\&AskPrice2\&] = task_data.AskPrice2;\n
data[\&Volume\&] = task_data.V\n
data[\&AskVolume3\&] = task_data.AskVolume3;\n
data[\&AskVolume2\&] = task_data.AskVolume2;\n
data[\&AskVolume5\&] = task_data.AskVolume5;\n
data[\&AskVolume4\&] = task_data.AskVolume4;\n
data[\&UpperLimitPrice\&] = task_data.UpperLimitP\n
data[\&BidVolume1\&] = task_data.BidVolume1;\n
data[\&InstrumentID\&] = task_data.InstrumentID;\n
data[\&ClosePrice\&] = task_data.CloseP\n
data[\&ExchangeID\&] = task_data.ExchangeID;\n
data[\&TradingDay\&] = task_data.TradingD\n
data[\&PreDelta\&] = task_data.PreD\n
data[\&OpenInterest\&] = task_data.OpenI\n
data[\&CurrDelta\&] = task_data.CurrD\n
data[\&Turnover\&] = task_data.T\n
data[\&LastPrice\&] = task_data.LastP\n
data[\&SettlementPrice\&] = task_data.SettlementP\n
data[\&ExchangeInstID\&] = task_data.ExchangeInstID;\n
data[\&LowestPrice\&] = task_data.LowestP\n
data[\&ActionDay\&] = task_data.ActionD\n\n
\u002F\u002F保存测试时间\n
data[\&tick_time\&] = task.task_\n
data[\&frequency_time\&] = this-&t.QuadP\n
this-&onRtnDepthMarketData(data);\n};\n\u003C\u002Fcode\u003E\u003Ch3\u003E在TdApi中测量trade_time\u003C\u002Fh3\u003E\u003Cp\u003E行情进入Python环境中处理完毕,会调用底层API发送委托,委托发送成功后需要立即记录当时的时间戳trade_time,并返回到Python环境中从而实现测量tick_time和trade_time之间的延时。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&cpp\&\u003ELONGLONG TdApi::reqOrderInsert(dict req, int nRequestID)\n{\n
CThostFtdcInputOrderField myreq = CThostFtdcInputOrderField();\n
memset(&myreq, 0, sizeof(myreq));\n
getChar(req, \&ContingentCondition\&, &myreq.ContingentCondition);\n
getStr(req, \&CombOffsetFlag\&, myreq.CombOffsetFlag);\n
getStr(req, \&UserID\&, myreq.UserID);\n
getDouble(req, \&LimitPrice\&, &myreq.LimitPrice);\n
getInt(req, \&UserForceClose\&, &myreq.UserForceClose);\n
getChar(req, \&Direction\&, &myreq.Direction);\n
getInt(req, \&IsSwapOrder\&, &myreq.IsSwapOrder);\n
getInt(req, \&VolumeTotalOriginal\&, &myreq.VolumeTotalOriginal);\n
getChar(req, \&OrderPriceType\&, &myreq.OrderPriceType);\n
getChar(req, \&TimeCondition\&, &myreq.TimeCondition);\n
getInt(req, \&IsAutoSuspend\&, &myreq.IsAutoSuspend);\n
getDouble(req, \&StopPrice\&, &myreq.StopPrice);\n
getStr(req, \&InstrumentID\&, myreq.InstrumentID);\n
getStr(req, \&ExchangeID\&, myreq.ExchangeID);\n
getInt(req, \&MinVolume\&, &myreq.MinVolume);\n
getChar(req, \&ForceCloseReason\&, &myreq.ForceCloseReason);\n
getStr(req, \&BrokerID\&, myreq.BrokerID);\n
getStr(req, \&CombHedgeFlag\&, myreq.CombHedgeFlag);\n
getStr(req, \&GTDDate\&, myreq.GTDDate);\n
getStr(req, \&BusinessUnit\&, myreq.BusinessUnit);\n
getStr(req, \&OrderRef\&, myreq.OrderRef);\n
getStr(req, \&InvestorID\&, myreq.InvestorID);\n
getChar(req, \&VolumeCondition\&, &myreq.VolumeCondition);\n
getInt(req, \&RequestID\&, &myreq.RequestID);\n\n
int i = this-&api-&ReqOrderInsert(&myreq, nRequestID);\n\n
\u002F\u002F延时测试相关\n
LARGE_INTEGER order_\n
QueryPerformanceCounter(&order_time);\n
return order_time.QuadP\n};\n\u003C\u002Fcode\u003E\u003Cp\u003E感谢Boost.Python的强大封装功能,可以自动实现long long(LONGLONG)类型到Python整数类型的转换,用户无需另外处理。\u003C\u002Fp\u003E\u003Ch3\u003E在Python环境中计算tick-to-trade延时\u003C\u002Fh3\u003E\u003Cp\u003E在Python环境中,我们已经通过行情推送的tick字典获取了tick_time,又通过调用发送委托请求后的返回数值获取了trade_time,此时在Python环境中计算两者之间的差值即我们需要的tick_to_trade延时。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&python\&\u003E#----------------------------------------------------------------------\ndef orderTest(self, event):\n
\&\&\&\&\&\&\n
tick = event.dict_['data']\n\n
req = VtOrderReq()\n
req.symbol = tick.symbol\n
req.price = tick.lastPrice\n
req.direction = DIRECTION_LONG\n
req.offset = OFFSET_OPEN\n
req.priceType = PRICETYPE_LIMITPRICE\n
req.volume = 1\n\n
order_time = self.sendOrder(req, tick.gatewayName)\n\n
print u'耗时:', (order_time - tick.tick_time)*Ftick.frequency_time, u'毫秒'\n\u003C\u002Fcode\u003E\u003Cp\u003E在主引擎MainEngine中添加该事件处理函数,监听所有的EVENT_TICK类型的事件,收到事件推送后立即发送一个开多1手的限价委托。需要注意的是通过QueryPerformanceCounter获取的tick_time和trade_time是系统时间的计数,需要除以计时频率才能转换成具体的时间(秒),乘以1000后转化为毫秒时间。\u003C\u002Fp\u003E\u003Cp\u003E以上函数在主引擎初始化时注册到了事件引擎中。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Ccode lang=\&python\&\u003E########################################################################\nclass MainEngine(object):\n
\&\&\&主引擎\&\&\&\n\n
#----------------------------------------------------------------------\n
def __init__(self):\n
\&\&\&Constructor\&\&\&\n
# 创建事件引擎\n
self.eventEngine = EventEngine2()\n
self.eventEngine.start()\n\n
# 创建数据引擎\n
self.dataEngine = DataEngine(self.eventEngine)\n\n
# MongoDB数据库相关\n
self.dbClient = None
# MongoDB客户端对象\n\n
# 调用一个个初始化函数\n
self.initGateway()\n\n
# 扩展模块\n
self.ctaEngine = CtaEngine(self, self.eventEngine)\n
self.drEngine = DrEngine(self, self.eventEngine)\n
self.rmEngine = RmEngine(self, self.eventEngine)\n\n
self.eventEngine.register(EVENT_TICK, self.orderTest)\n\u003C\u002Fcode\u003E\u003Cp\u003E注意需要手动在TradingWidget中订阅一些合约来收到tick推送。\u003C\u002Fp\u003E\u003Ch3\u003E测试结果\u003C\u002Fh3\u003E\u003Cp\u003E作者测试机器配置:Core i7-G\u002F16G\u002FWindows 7\u003C\u002Fp\u003E\u003Cp\u003E测试结果:228个数据点,平均tick_to_trade延时22.6毫秒\u003C\u002Fp\u003E\u003Cp\u003E当vn.trader底层的行情接口收到一个新的行情数据推送后,最快差不多只需要百分之二秒的时间就可以完成事件引擎处理,并调用交易接口发出委托。这个速度对于追求微秒级交易延时的超高频策略而言可能无法满足,但对于大部分目标延时在毫秒级以上的常规高频策略应该说是基本没有问题。\u003C\u002Fp\u003E\u003Cp\u003E同时考虑到测试时使用的是Windows系统,且带GUI图形界面的形式,其实还存在着相当大的提升空间,有兴趣的朋友不妨自己试试看,欢迎把测试结果分享给我。\u003C\u002Fp\u003E\u003Ch3\u003E文章中的所有测试代码可以在\u003Ca href=\&https:\u002F\u002Fgithub.com\u002Fvnpy\u002Fvnpy\u002Ftree\u002Fdev\u002Fvn.how\u002Ftick2trade\& data-editable=\&true\& data-title=\&vn.py项目的Github仓库\&\u003Evn.py项目的Github仓库\u003C\u002Fa\u003E下载。\u003C\u002Fh3\u003E&,&updated&:new Date(&T14:45:09.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:29,&likeCount&:53,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&sourceUrl&:&&,&publishedTime&:&T22:45:09+08:00&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&url&:&\u002Fp\u002F&,&titleImage&:&https:\u002F\u002Fpic7.zhimg.com\u002Fv2-84ac033596bcd5522b14facd127c19a9_r.jpg&,&summary&:&&,&href&:&\u002Fapi\u002Fposts\u002F&,&meta&:{&previous&:null,&next&:null},&snapshotUrl&:&&,&commentsCount&:29,&likesCount&:53},&&:{&title&:&vnpy接收行情数据性能测试与改进优化&,&author&:&jerry-he-20&,&content&:&近来,量化交易平台vnpy因其开源、功能强大、开发容易、可定制性强的特点,目前已经被广泛应用在量化交易中。 行情数据落地是量化交易平台必须解决的一个基础问题,它有两个方面的作用:一}

我要回帖

更多关于 xmq6127agchevn51 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信