2019-01-18 12:36:44

新的硬件?

居然这么久没更新了。从上次因为感受到了cuda的威力,想等新硬件而暂停开发以来,过了2年了。

一开始因为既然已经几个月没更新了,就不更了吧。结果最后拖了2年。

最近半年终于陆陆续续配好了机器,过几周有空更新篇配机记录。

除此之外这段时间也有在各到各处学习各种东西,丰富了domain knowledge,也跟随了下最近的新技术,还顺便把日语N1等级考了下(玩玩。

既然配好了机器,下面开发再开。


量化投资, 程序开发, 日常
2017-01-08 03:33:45

自己写的遗传算法完成,效率不错,界面也做掉了

先把自己平台下的遗传算法和界面完成了。由于之前优化的不错,运行速度足够我执行机器学习了,遗传算法写起来又较简单,所以弄掉了。

遗传算法就是让计算机模拟生物,自动进化出符合你期望的交易策略,会自动生成一段代码,比如if CrossOver(MA(C,5), MA(C, 20)) then buy() end这种,代码可直接拿到我的系统去交易。

[附图]

阅读更多...
量化投资
2016-12-21 09:25:40

后来使用协程优化了下cuda的回测,让cuda和cpu并行,但提升不明显,果然只用单核的话cpu还是瓶颈,只能想办法利用多核了。

由于我比较讨厌线程锁之类的东西,所以一直以来结构是多进程的。但cuda用多进程运行太麻烦,要linux下开MPS服务,不得已开始着手修改成多线程方式。

之后c++11下面多线程开发意外的顺手,没几步就搞定了,还只用了3个锁,主要得益于thread_local说明符和barrier机制,完成后测试下来虽然一年的回测时间快了1倍到了0.025秒,可以25秒测1000次,但gpu利用率还是没用满。

这之后应该还能优化,可惜windows下工具不全,测不出哪里的问题,我不打算继续弄了,等买gtx1080后再说吧。


程序开发, 量化投资
2016-12-16 00:09:16

优化了我好几天,现在1年回测速度从0.4秒提高到了0.04秒,这才像样,但gpu占用率还是有空一半,应该还有些优化余地。

之前主要0.3秒的消耗都在cpu对结果排序上面,现在把排序也移到了cuda中进行。 本来觉得少量的排序移到cuda中也不会有什么改进,但实际效果还是超出预期了。

最后结果看下来cuda的计算中,反而排序占计算量第一了,其次是显存内存间copy的消耗,最后才是信号的计算消耗。不过即便如此还是比cpu快了30倍。而且越复杂的信号,提升的倍数越多。

Lua和c结合做这些真的是非常流畅,接下去尝试用Lua的协程和cuda的异步结合,让gpu计算时cpu也同时做工作。

然而cuda这么给力,导致我以前写的东西可能需要进行重构,我打算借这个机会,休息一段时间,学习学习新东西,再继续开动,正好用来等新设备更新。


程序开发, 量化投资
2016-12-08 07:29:25

使用cuda计算的回测系统已写完,比想象中的工作量要少,得益于原来结构灵活。

目前还没优化,执行沪深所有1年的回测0.4秒,原本是单核1.2秒,已经提升了3倍。但我的24核服务器跑是0.2秒,和多核还是没法比。

性能方面还有问题,现在如果同时执行多个回测时,gpu经常要等cpu完成工作,导致gpu占用率10%不到。这方面得想办法, 先让cpu的工作尽可能提升效率,减少gpu的调用间隔;如果还不行要开多进程来进行cpu的工作,这是代码量最多的。

老实说有点麻烦的是,因为装gpu的电脑为了玩游戏是windows的,不高兴再去装Linux双系统切换,我也没gpu直通的虚拟机,这代码只能windows中运行了,很多Linux的调试工具将无法使用。

只有攒一台专门的gpu服务器了,但是现在攒还不划算,cpu还是老样子没什么进步,得等AMD的zen出来,Intel才会挤牙膏挤出新的cpu,等吧。


程序开发, 量化投资
2016-06-09 09:59:51

之前为玩游戏配的GTX970显卡,虽然玩游戏是用上了,但平日gpu一直闲着,这么大的计算力一直闲着,岂不是很浪费,想要利用上。

最近1080显卡问世,跑分比970要高1倍,打算入手,由此不得不先着手解决这更大的计算力利用不上的问题,不然买来只玩游戏浪费啊(更需要借口告诉我没乱花钱)。

一直在考虑如何把核心的公式系统移植到cuda进行并行计算,虽然现在已经能利用多核cpu并行的跑,但cpu的特点是延迟低而不是计算力,大概比较的话,gpu的计算能力要高40-100倍。不然怎么每秒渲染60帧图像呢。 但我这里移植并行计算会牵涉到最大的问题:

数据源不能直接使用,因为金融产品的数据有复权问题,而且需要用定点复权功能来避免前视偏差,不然你会很惨, 所以每算一列数据(时间)之前的数据都会变化。

这等于本来可以按行和列直接进行并行计算,但现在只能按行进行,列则一个个计算,预计性能会下降不少。 还有些空间换时间的方法,不知道显存是否够用,还要实际写时计算下。

另外正好cuda 8.0 rc刚刚推出了,说支持vs2015了,果断下了装上。一编译,坑爹啊!vs2015 update2 不支持!


程序开发, 量化投资
2015-10-04 12:44:38

最近在给系统增加前复权的功能,而且不能是简单的复权,得能模拟测试用的定点前复权。

比如你测试2014-01-01日的交易,那你不能以今天2015-10-01的点往前复权,这会导致和当时的实际情况不一样。 我希望能尽量再现当时情况进行测试交易,虽然这点差距不大吧(实际测试下来确实几乎没影响),但我依然做掉了。

定点前复权无法cache,因为每次换交易日,复权数据就变了,每次取一个tick时都要实时计算,做好后速度慢了1.5倍。

这也太慢了吧,不过可以优化了!

我个人最喜欢做的就是优化,毕竟优化很有挑战性,且事务单一,容易集中精神。

今天跑了下主要慢在复权公式上(20%),其次是慢在搜索复权点上(15%),打算对这2个分别优化下,预估分别能优化到10%和3%。

计算没有太大优化余地,你公式基本简化不了,我打算储存一部分的计算结果来加速这10%。 搜索也比较困难,二分法对这类每个商品只有10来行的数据来说已经最快了,我还加了cache。所以只能通过改变方式来做了,打算不搜索复权点了,想办法直接取到。

明天开干。


量化投资
2015-09-07 11:23:28

花了2天,把重构的C代码结合到回测系统上了,试了下效率,这次不用cache达到了之前用cache才能达到的速度。

因为不再依赖缓存,数据计算更灵活了,可以下一步了,所以顺手把回测系统的公式格式改的类似矩阵计算那种:

return MA(C, 50) / History(MA(C, 10), 5)

至于为啥要这样,是因为这种矩阵的数据输入方式确实能缩短公式长度,也符合常见方式。

但我为了性能,实现的有点绕。

比如公式,求过去5行C数据项的平均值可以用:AVG(data.C, 5),这里的C表示数据项的列。然后AVG会对每行C数据(也就是data.C),与前5行,平均一下。

但你要做 AVG(data.C - 10, 5) 的话要怎么实现?按照函数调用的一般逻辑,data.C - 10会先计算出来并传入AVG函数,C作为一列数组,每行都先-10,现在python他们都是这么做的。

但这个问题是,浪费计算量啊!并不是所有行你都要求平均值,也许你需要跳着求。

那么就需要延后计算,惰性求值。闭包可以做到,所以这部分我用Lua闭包饶了一下才做了实现。


量化投资
2015-08-09 08:34:07

img 24核满速跑机器学习,风扇声像引擎声一样...有点爽

测量了下24核一起运算的性能,平均1年的交易回测只用0.2秒,还可以优化个1倍大概?打算近期动手。


量化投资
2015-05-15 07:21:23

精确A股退市列表

下面是由我从数据库整理导出的,A股精确的退市列表,按最后交易日期排序,需要的人你懂的。

因为主要用于量化,所以时间使用的是最后一次交易的日期(也就是因为退市导致的停牌前一天),而不是公告退市的日期。

最后更新:2015年 9月8日,在未来的退市常态化环境下,本页面会尽量保持更新。

阅读更多...
量化投资
2015-05-12 10:42:53

重写的回测做完了,这次整理清晰了一点。虽然还是有些不满意。

排除任务管理和事件系统,回测本体代码总共130行实现,因此清晰了很多。

回测支持很多现实情况的模拟,做到了和实盘一致。 其实实盘运行就是使用回测的代码来运行的,只是从模拟切换到了生产,所以能保持一致。 这样做的另一个副作用也非常美妙:从根源上断绝了先见乖离(国内叫偷价、未来数据,前视偏差,都没我中二)

回测目前的执行速度非常不错,2000个品种MA100和MA20双均线策略,400个tick的买卖回测0.3秒完成。

root@ubuntu:~# ./luajitrun.sh lua/trade_perform.lua
0.235988        sec
0.232527        sec
0.246502        sec

速度那么快是因为回测中用到了cache,但如果测试2w个tick的话,会慢到需要2-4分钟,因为数据量太大cache无法全面覆盖。


量化投资
2015-04-30 07:25:45

这几天在写backtest回测系统,要求处理比较复杂的交易策略。

考虑到有不少状态的变化,一开始选用了有限状态机FSM来做。 虽然早就认识到FSM就是渣,但觉得回测应该不复杂,就用了,然后就悲剧了。写出的代码完全不符合简单的原则。 少既是多,简单的代码才会让我有信心。花了2周写的回测系统等于现在要全部重写。

回测系统我的目标是要能适应全球的市场,比如T+1和T+0都能完美应对,要能模拟遇到涨停板时买不到,要有移动止损等等, 等于是一个拥有完整功能的交易系统,所以我打算不再写一个回测系统,而是直接写交易系统。

然后为回测模拟写一个专门的虚拟的“市场”,把这个市场带入交易系统运行即可。


量化投资, 自动交易
2015-04-10 05:14:06

今天终于完成了数据库部分,这个数据库是完全自己设计的,纯Lua实现。

不通过网络而是直接文件读取,当文件有修改时也能直接立即的更新。

整个数据库打开后占用内存10M,2000个商品10年1分钟级的价格数据106G磁盘空间(随机填充的)。 所有商品算一遍任一个时间点的MA100,也就是以时间为索引,纯磁盘获取2300*100条数据,单核耗时0.6秒,完全超乎要求了。

目前返回结构化数据用了10%时间,磁盘读取用了23%时间,磁盘数据解析10%,内存申请15%,其他GC相关用了30%左右时间。 另外第一版代码耗时是1.8-2.5秒,原因是因为内建的LRU,本来想LRU来提高速度,结果发现对于这种大量的小数据来说,LRU去掉更快。

做到这个速度意味着我可以无视内存了。

root@ubuntu:~# ./luajitrun.sh testma100.lua
0.55863 sec
0.5293  sec
0.634713        sec

这个数据库做的最累的就是索引,和索引的实时更新了。整个索引不用全部读入内存,直接动态的红黑树只读需要的单项。

占用内存做的那么小还是考虑到灵活性,因为现在各家云便宜的cpu不少,但内存则相对较贵。 少量的内存意味着我可以在需要时开一堆低配的服务器进行计算,价格也能达到最低。

下面开始做数据统计测试的界面了。


程序开发, 量化投资
2015-03-25 13:37:23

金融业别人的代码要么没有,要么大都不符合我的需求。好在我习惯写代码从底层开始做,一点点积累了。 今天终于把时间序列的代码完成了。

因为金融数据都是以时间为基准的数据,所以我就做了个时间序列的类先。 之后可以把数据读入到这个类里进行操作。 主要就是一个矩阵,有简单的时间范围选择查询,以及输入公式。 目前还没有优化性能,等实际跑了后一下子优化。

下一步做数据的导入和读取,每种格式一个导入类,方便以后扩展实时的数据读取。


量化投资
2015-03-12 00:55:03

Openresty介绍和架设记录

Openresty是一个http服务器端包和环境,可以用lua写基于http的程序。 我们的手游服务器就是完全基于Openresty的, 用下来1核1G的服务器至少支撑2000人在线。

金融行业内部的系统并不需要写成http应用,理论上直接用Luajit就行了,但我为了更方便的和各种网络结合, 比如抓取网页数据和消息、直观的显示统计后的分析图表、通过网页方便我在任何地方操作,等等。因此决定一开始就基于http写了。

Openresty是我在游戏开发过程中已经非常熟悉的东西了,速度快,http相关的功能也很到位。

Ubuntu架设记录,安装openresty:

阅读更多...
程序开发, 量化投资, 自动交易
2015-03-11 13:08:53

Lua 开发环境对比

研究了下Lua的开发工具,之前一直使用的是文本编辑器+高亮,或idea加lua插件。

后来得知了eclipse官方开发了一个lua IDE叫LDT,看上去这个官方的非常顺手:

阅读更多...
程序开发, 量化投资
2015-03-11 12:49:27

今天找了台服务器建立一个代码Git版本库,用于存放自己的所有工作文件,作为开发前的首要准备工作。

你肯定不希望你的代码没有备份丢失,版本库可以帮你; 你会喜欢上能清楚地看到每次改了些什么,随时回退; 最后你的代码可以自动部署,写完了你的自动交易系统就用新版本工作了,多美好!

最后别忘记给服务器磁盘加密,你不会希望机房人员能查看到你工作成果的。

架设Git服务器端的命令:

#!/bin/bash
#添加git用户
sudo adduser git
ssh-copy-id user@host
#加密磁盘,执行后会问你要密码,先输入git用户的账号密码,再输入加密密码,之后只要
#每次重启后登陆下git用户就自动加载加密磁盘了
ecryptfs-setup-private -u git --noautoumount
sudo chown -R git:git /home/git/Private
sudo chown -R git:git /home/git/.Private
sudo chown -R git:git /home/git/.ecryptfs

#开设git库
cd /home/git/Private
sudo git init --bare code.git
sudo chown -R git:git code.git

然后就好了,可以用了,地址是:git@host:/home/git/Private/code.git


程序开发, 量化投资
2015-03-11 08:37:37

近期思考了下怎么开发量化投资系统,打算先开发出有效的统计系统,然后再研究程序自动交易, 因为自动交易肯定是难度最低的,而找出有效的交易模式是最不确定的。不过自动交易开发最有成就感,时刻勾引着我去开发。

第一个问题,选择什么语言开发?

由于我之前做网络游戏的全栈开发,接触过的也许和金融相关的知识:大规模高并发的处理、数据库开发、NPC行为树、决策机制、tcp/网络、概率,统计,线代。

不知道金融行业普遍的技术水品怎么样,不过一直作为IT业内技术领先的游戏行业,在技术开发上优于金融业还是有信心的。

客户端网络游戏大都使用C、C++作为主要开发语言,用Lua作为配置语言,或黏合C代码。但我打算完全使用LuaJit。

Lua是一种脚本语言,但是非常轻量,因此执行也非常快。Lua本身编译后只有20K,只有lua.exe和lua.dll两个文件。 和Lua相比所有其他语言都显得很笨重(特别是某些J开头的语言)。简单还带来很多好处,像学习成本低(我们都是让游戏策划写Lua的,可想而知)。

但如果因此你把Lua当作玩具就错了,Lua的语法很优雅,有Lisp的感觉,所以Torch才会那么的简洁; 更重要的是有LuaJIT这个实现,本身就很快了,有了它,使Lua变成了最快的脚本语言,没有之一,因为基本上是C级别的效率了。

Lua真的有公司作为核心使用么?国外早就开始使用Lua作为整个服务器端的主要语言,而不再是粘合或配置使用,其中我估计暴雪Wow就是。 我们自己从2009年开始就使用Lua作为服务器端的主要语言(超过95%),之后几年连客户端Lua代码也超过80%了。 我确定11年游戏业都还没这么超前, 因为那年和盛大合作时,问过他们都表示没不敢用动态语言写游戏服务器。大概14年后,很多公司开始转为用动态语言写游戏服务器了, 而且追求性能的游戏人们,首选果然就是Lua了。

总结下,为什么选择LuaJit? 因为:

  • 代码执行速度快,C级别,Lua的诞生有一部分就是故意针对Python的低效
  • 通过工具可以很简单的发现代码效率问题点,优化非常有效,速度更快
  • 可直接用ffi几乎无损性能的黏合C库,不用做额外工作
  • 代码优雅,调试方便,时间节约

基本上所有原因都是效率,有人说没必要那么讲究效率,那只是你没尝过效率的好处。 如果你有足够的计算力,可以直接无脑用大量计算碾压其他的那些量化系统,所以计算力就是一切! 再加上可以自己写cuda库,我目标是自己写的能达到业内最高的速度。

至少金融行业会越来越需要效率,而低效率闻名的Python只是在拖后腿而已。 举个例子,经常拿来比较的2500万次3*log(x) + cos(x) ^ 2计算,我电脑上python是15秒,纯Lua是6秒,而LuaJIT是0.76秒。从python里调用c库执行都要1.7秒。 虽说需要性能的地方你可以用c库来解决,但你冷不丁一个小地方就要用C库的感觉是什么?用了C库结果速度还没LuaJIT快的感觉是什么?不是吃屎是什么?用LuaJIT你可以真正只关心核心功能的效率。 20-30倍啊,科学栈多又怎么样?和这些相比,自己一个个重写根本不是事,反正用到的也就几个,只写自己需要的就行了。

你看到的这个博客就是Lua开发的。

然后是第二个问题,数据怎么处理?是否要用数据库?

考虑到分析是最重要的,对于分析系统我打算完全自己开发一套定制的数据库,以不用全部读到内存,并最大化速度为目标。 虽然以天为单位,这个可以简单的全部读到内存,然后处理。但我打算要能够处理以分钟为单位的数据。 记得哪个大牛说过最好的数据库就是定制的数据库。

数据源方面,国内我是用券商的FTP数据源;国外则是券商提供了获取的API。

分析系统以外的部分使用Redis,绝不使用糟糕的sql。这也是游戏行业的习惯。

Redis本身就是内存数据库,但相比直接内存读取,读取数据库还是要经过网络传输,慢几千倍(参考 每个程序员都应该知道的延迟数)。 所以数据库更多的作用是持久化,等到自动交易系统开发时,自动交易系统自己的数据用Redis来储存。

这么看来网络游戏行业还真是领先其他行业至少10年啊,在nosql概念还没出来前,网络游戏就讨厌sql尽量不用。在大家还 在用早期apache那种1连接1线程模式时,网络游戏就已遇到大量用户导致的c10k问题,普及epoll或iocp了。 最近lua又普及到人工智能行业了,不知道游戏行业最先喜爱的Lua是否能在将来带到所有其他行业去。


程序开发, 量化投资