• Posts tagged "策略"

Blog Archives

回测好,为什么实盘不靠谱?

用IT技术玩金融系列文章,将介绍如何使用IT技术,处理金融大数据。在互联网混迹多年,已经熟练掌握一些IT技术。单纯地在互联网做开发,总觉得使劲的方式不对。要想靠技术养活自己,就要把技术变现。通过“跨界”可以寻找新的机会,创造技术的壁垒。

金融是离钱最近的市场,也是变现的好渠道!今天就开始踏上“用IT技术玩金融”之旅!

关于作者:

  • 张丹(Conan), 程序员R,Nodejs,Java
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/finance-backtest

前言

经常看到做量化的朋友,晒出各种漂亮的回测曲线,准备一夜发家,但开始真金白银地去交易时,就会亏得一塌糊涂。

回测好,为什么实盘不靠谱?这里其实有很多的坑,不用钱买点教训,你是不会明白的。有经验的量化交易员,都是用钱磨炼出来。把你的回测慢慢贴近实盘,让回测结果越来越可靠。

本文为量子金服约稿文章。

目录

  1. 实例复盘
  2. 问题在哪?
  3. 量化理论和模型

1. 实例复盘

回测好,真的是因为策略好吗?

我们举个例子,你可能用到某个回测工具或平台,顺手复制了一个demo的代码,一点运行,就能跑出10%的收益率。接下来,你花了一个晚上彻夜研究,把参数用机器学习的方法来优化,黎明时,终于把收益率提高到了40%。虽然一夜没睡,但心里却是无限地兴奋,觉得多年所学的IT技术终于可以实现赚钱的理想了,金融市场不过如此。明天就先把1个月工资赚出来,下个月就辞职,再也不用看S*领导的脸色,真是浪费生命了。

有过上面经历的同学,我想不在少数吧。第二天,就把打工2年多辛辛苦苦攒到的10万块投到了股市中。谁想股市风云变幻,不仅市场不仅没按照模型的方向走,而且又赶上严监管、去杠杆、大股东减持等等一系列的样本外事件发生,2个月后不仅没有赚到当初设想的钱,甚至亏损到了20%,感情上已经受不了,拒绝了之前定下的止损的规则,又经历了几周的连续下跌,最后亏损到达50%。

每天心都在滴血,连续3个月都是吃不好、睡不好,最后一咬牙全部割肉了。开始全盘怀疑自己,自信心被打击到了负值,封账号,再也不碰股市了。

2. 问题在哪?

那么,为什么回测好的策略实盘就不这么不靠谱呢?可能有以下几点原因。

2.1 算错了

当你的回测出现有显著的盈利时,最大的可能是你算错了。比如,在计算时写错了正负号、不应该用年化的时候用了年化的值,没有严格区别复权数据与非复权数据的区别、交易的周期没对齐、无风险收益率取值过小、四舍五入时保留位数过少、使用向理计算时出现的问题、NA值没有处理、使用了来自互联网的未经验证的数据等等。

总之各种的细节,都会让你的回测出错,而且如果你不理解每个指标的金融含义,你甚至都不知道自己错了。

2.2 未来函数

如果每个计算细节你都了解了,回测结果依然非常好,还是先别激动,检查一下是不是用到未来的函数。
使用到未来函数也是很常见的一个问题,而且通常都是不知不觉的。比如,我们会经常听到股评分析师说:“在牛市开始时建仓买入,在到达最高点时卖出”,这其实就是用到了未来函数。在实际的交易过程中,我怎么会知道,什么时候是牛市的开始,又怎么会知道最高点是3600点还是5700点?如果我真的知道了,我还做什么量化交易,早就环游世界去了。

我们很多时候会都用已经知道的市场信息做回测,但实际交易时,你并不知道市场是什么样子的,会向什么方向变。比如,我们现在来看2017年上半年招商银行涨的很好,那么我就针对银行股开始做回测,而且给招商银行加大权重。在一切数据都算对的情况下,回测的资金曲线相当的漂亮,半年获得了30%以上的收益率,而且最大回撤控制在3%以内,夏普、詹森Alpha也都很不错,这些指标都表示了我的主动管理能力很强,我是个牛逼的基金经理。

真的是这样吗?你在不经意用到了未来函数,才使得你发现了招商银行,然后再对银行股做了回测,获得了较好的资金曲线。所以,这不是能力,也不是运气,是犯规了。

2.3 过拟合

从IT程序员转到金融的量化分析师们,在很多情况下都会用纯IT的方法,来解决金融建模的问题。比如,做了5年推荐系统的推荐算法专家,非常擅长用机器学习的方法,来找到数据之间的关系。于是就以纯数据的方式来切入,脱离金融的投资学理论,导致了数据的过度使用。通过历史数据试图预测未来,而且找到一条完美的投资曲线,穿过所有的样本点,最后将导致过拟合。

从IT转行到金融的朋友,通常有个特点,就是动手能力强,数据来就先丢到模型里,才不管到结果底能不能解释,反正我的回测曲线很漂亮。特别是深度学习,增强学习等方法的崛起,让程序员群体一下子高大上起来,通过一种算法,升维升维再升维,就能通吃所有的单一分类算法模型。这样的结果就是过拟合。回测曲线必然是非常漂亮的,但到实际环境一运行,就只能用惨不忍睹来形容了。

2.4 策略周期

从投资的角度,每种策略都有自己适应的场景。在合适的场景下,选到了适合的资产,那么你的策略会表现的非常棒。但是实际的金融市场是轮动的,资产配置随大的金融周期轮动,股票市场随着行业板块轮动。有可能你在回测的时候选对了风口,赶上了趋势,而实盘时候错过风口或者选错了金融资产,那么就会事与愿违了。

比如,你的策略就是研究债券的,从2016上半年到2017年上半年,选出了鹏华全球高收益债(000290)这支QDII基金,比国内的大部分债基表现都抢眼,走势非常稳定,持续上升,你坚定的买进加仓。但是不凑巧的是,你刚买入完,人民币就进入到了升值的区间,虽然债券本身是很稳定的,但人民币持续走强,由于汇率的影响让这支债基天天亏钱。如果你又懂债券又懂外汇,这个点没想到是能力问题。如果你完全不懂外汇,单从债券的角度考虑,那么就不是能力问题,也不是模型不行,而是运气太差,没把握到轮动的周期。

2.5 真实交易环境

真实的交易,是会被各种情况所影响的。当你的交易量过大时,你会影响市场,这时你的交易就会发生偏离,实际市场交易的冲击成本会比你回测时看到的成交量大得多,而且冲击成本又是很难被模拟和计算的。

当你购买流动性不好的金融产品时,模型的信号出来了,但是实际你却买不到,或者卖不出去,当你被迫用对手价来成交时,就会有比较大的滑点。滑点对于高频交易来说是致命的,对于长周期的趋势交易策略,倒是影响不大。

手续费也是一个不容小觑的因素,2017年7月开始黑色系商品期货被猛炒,焦炭、焦煤的平今手续费上调至3倍,铁矿石平今手续费上调到2倍。这种政策性的调整,在研发模型时是不可预知的,平今手续费的上调,直接就拍死了日内模型。2015年调整的股指期货的40倍手续费,几乎把所有的投机的模型都干掉了。

股票市场也很多真实交易环境的特殊性,比如2016年初开始试行的熔断机制,一共4天,发生了多次恐慌性的挤兑,上证指数下跌488.87点,相比4天前收盘点位下跌了13.8%,A股蒸发市值逾6万亿。

当然,也有一些真实交易环境中的乌龙指,有时会我们带来一些额外的惊喜。

真实交易环境是复杂的,也是很难在回测环境中模拟的,所以要深刻了解金融市场、了解市场运作的原理,你才能规避真实交易环境与回测环境中的差异点。

2.6 人工干预

还有一种情况,就是人工干预。当你建好一个模型,应用到实盘的时候,你要充分地相信你的模型,并且严格的执行。每当遇到回撤的时候,你依然要相信你的模型,坚持模型的策略。

如果你心理抗不住,开始干预时,也会造成回测与实盘的偏差。这个时候,就很难判断是模型不靠谱,还是人不靠谱了。每当我在干预实盘模型的时候,调来调去,觉得及时止盈止损了,实际上是在破坏自己的规则,更加影响了策略的稳定性。

当然,可能还有更多的原因,让回测到实盘有很大的差距。我们需要认真地思考,把每个细节都去实践,慢慢地才能让你的回测越来越接近实盘的效果。

3. 量化理论和模型

从专业角度来讲,投资就是要找到市场的规律,而规律的本质是符合金融市场的简单逻辑。赚钱的模型,通常都是很巧妙的把规律进行量化。

任何模型或者理论,第一步都是提出假设,定义应用场景,解决什么问题。

如果我们能够做出正确的假设,当然是可以赚到钱的,能够赚大钱还是赚小钱,就是运气了。

《海龟交易法》流行了很多年,至今仍然被广大的交易员所使用,书中所讲述是就是金融市场的规律。假设条件越简单,回测可能越靠谱,会越贴近实盘。

转载请注明出处:
http://blog.fens.me/finance-backtest

打赏作者

2017猎奇金融大数据:用R语言开始量化投资

跨界知识聚会系列文章,“知识是用来分享和传承的”,各种会议、论坛、沙龙都是分享知识的绝佳场所。我也有幸作为演讲嘉宾参加了一些国内的大型会议,向大家展示我所做的一些成果。从听众到演讲感觉是不一样的,把知识分享出来,你才能收获更多。

关于作者

  • 张丹, 程序员R,Nodejs,Java
  • weibo:@Conan_Z
  • blog:http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/meeting-cda-20170521

前言

很高兴能够参加由CDA主办的数据分析师线下沙龙的活动,虽然活动规模不大,但是场子很棒,氛围很好。刚好这次沙龙是金融大数据的主题,也是为了给我的新书《R的极客理想-量化投资篇》预热,给大家分享一下R语言在量化投资领域的应用。

本次所分享的内容为我的新书开篇内容,干货多多,错过沙龙的同学,可以在CDA的网站上找到分享的内容。

目录

  1. 我的演讲主题:用R语言开始量化投资
  2. 会议体验和照片分享

1. 我的演讲主题:用R语言开始量化投资

用R语言开始量化投资,PPT下载,主要内容来自我的一篇博文:用R语言开始量化投资

分享主题的目录大纲如下:

  1. 为什么用R语言?
  2. 跨界结合的思维模式
  3. R语言量化工具包
  4. 量化策略实战应用
  5. 有理想的极客

分享结束后,和几个现场的朋友,在聊R语言的大方向,大家都觉得R语言有很大的机会,只是R语言应该如何落地呢?我觉得有很多的点和方向可以做。比如:培训教育,用R来替换SAS,R的企业服务,R的SAAS的个人服务等。

我就在致力于推动R语言在中国金融领域的发展,让R可以给更多的用户使用,培养出更多的数据分析师。也希望让我们中国人的技术能够走出去到世界的舞台。希望多能认识志同道合的朋友,一起做一些事情。

2. 会议体验和照片分享

本次由4个主题组成,主要介绍了金融大数据在国内的应用情况。本次的场地是由科技寺提供的,忍不住还要再说一够场面很棒,如果再能配上咖啡就更好了。

本次猎奇金融大数据专场4位嘉宾:

鲁四海,主题:大数据风控。
中国新一代IT产业推进联盟技术分委会秘书长、首席数据官联盟发起人。主要研究方向为大数据,参与编写了《影响中国大数据产业进程100人》,在中国新IT联盟、北达软讲授大数据技术应用课程。

张丹,主题:如何用R语言开始量化投资。
《R的极客理想》系列图书作者,前况客创始人兼CTO。10年IT编程背景,精通R ,Java, Nodejs 编程,获得10项SUN及IBM技术认证。

于洋,主题:金融大数据运营增长创新案例。
TalkingData增长部门总监,曾加入金山从事游戏数据分析及运营,2012年加入TalkingData,历任游戏业务咨询总监,金融业务咨询总监,现从事在零售,金融,航旅等方向的数据营销,运营及增长创新业务。

李金霞,主题:实战案例:数据驱动下的互联网营销。
神策数据数据分析师,曾就职于民生银行、百度人才、飞信,负责数据处理相关工作。2016年加入神策数据,主导客户包括纷享销客、网易七鱼、ofo、拉钩云人事、多盟等。

嘉宾在分享的照片。

曹鑫,主持人。

张丹,《R的极客理想》系列图书作者

鲁四海,

于洋,

李金霞,美女分析师

2.2 会议相关照片

本次分享的场地,很有特色,宽敞、明亮、很有创意、很舒服,像是咖啡厅,开放式的办公环境,很棒!

很意外地获得了一个CDA给的奖杯,收藏一下。

沙龙很成功,感谢工作人员的辛苦劳动组织。在北京以数据为主题的沙龙,并不是太多,祝CDA的活动能一直坚持品质,越办越好!

转载请注明出处:
http://blog.fens.me/meeting-cda-20170521

打赏作者

用R语言开始量化投资

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/r-quant-start/

前言

做数据分析的朋友,一定知道R语言。R语言是一门统计语言,在数据分析领域优势是非常明显的。金融本身是玩数据行业,R的最大的优势就是数据分析,所以把R语言与金融结合,用R来做量化投资的策略,真的很配,不仅顺手而且方便,用了你就会知道。

本文以“用R语言开始量化投资”做为新书《R的极客理想-量化投资篇》的开篇,主要强调了R语言在量化投资领域有着广阔的应用场景,而且是重要的量化投资工具。

公开课:Hellobi Live | 5月23日如何用R语言开始量化投资

目录

  1. 为什么用R语言?
  2. 跨界结合的思维模式
  3. R语言量化工具包
  4. 量化策略实战应用
  5. 有理想的极客

1. 为什么用R语言?

R语言是一门面向数据的编程语言,早期只是在统计领域,被统计学家所使用。

近年来随着大数据技术的发展,以及R语言自身生态的快速壮大,R语言已经不仅在统计领域,在各大行业领域中都能看到R语言的身影,包括了互联网,数据科学,人工智能,机器学习,生物医疗,游戏,电子商务,全球地理科学,数据可视化等等。

下图是R语言的任务列表,这些任务都是面向具体业务的。截图不全,请大家去R官方网站,查看完整的任务列表。

从R语言的任务列表,我们就能明显看出,R语言和其他编程语言的区别。R语言第三方包所提供的支持,都是对于各种行业的数据操作和算法的支持,而不仅仅纯IT系统开发功能的支持。

R语言不仅能把数据分析做好,而且能够让我们能够有更多地思考,通过数据连接到我们每个人的日常生活。比如,我们去超市购物,你购买的东西会记录在你的购物小票中,如果把这些购物小票都收集起来,通过Apriori关联规则的频繁项集算法,就可以分析出自己的购物习惯。

我们每天都会收到各种推销的骚扰电话,有时候是卖房的,有时候是银行贷款,有时候是股票推荐,有时候是代开发票,有的是猜猜我是谁,处处都体现了中国的国情。那么我们可以收集自己通话记录,通过电话号码、号码注册位置、通话时长来分析一下,哪些是有用通话,哪些是浪费时间的通话,从而计算出我们每一天会浪费多少时间,通过Bayes算法来把有效通话和无效通话进行二元分类,从而阻止骚扰电话的入侵。

如果我们不仅能够收集自己的通话记录,把亲戚朋友的或更多人的通话记录都收集起来,组建一个数据库。再把统计出来的骚扰电话统一标记,做成黑名单,然后把黑名单公开出来,就可以让更多的人面受骚扰电话的影响。

人们的衣食住行都会产生数据,产生数据的地方,就需要做数据分析。通过数据分析,提高生活的效率,为我们节约宝贵的个人时间。

在人类社会中,除了衣食住行的基本需求外,更多的是对钱的需求。我们每天都会跟钱打交道,会有消费的需求,月底会有工资收入,当收入大于消费,资金积累到一定阶段的时候,我们就会有投资的需求。中国人的投资一般就几种,买房,买黄金,买股票,买保险,买理财。投资时,大部分人是不理性的,心血来潮就买了,也不仔细观察行情,买完就被套住,像 “中国大妈抢购黄金”,“中国大妈是救市的主力军” 都一度被新闻媒体热炒。

在金融市场中最不缺的就是机会,不管投资什么,如果能在交易的时候能多思考一下,说不定结果就会不样。运用我们数据分析的知识,和对于金融市场规则的理解,通过R语言进行数据分析,抓住机会,让我们把辛辛苦苦赚到的钱保值和增值。

2. 跨界结合的思维模式

R语言与其他编程语言最大不同在于,R语言是面向数据的,这一点很重要,甚至影响了思维模式。

我写了10多年的JAVA程序,程序员思路在我的脑子里根深地固。我习惯用于面向对象思想来建模,把世界中的物体、行为、连接都用面向对象的方法来表达。我也习惯了IT项目,从架构设计到开发的自上而下的设计思路,或完全由需求驱动的敏捷开发,为业务随需而变的的开发路径。作为程序员,我有理想,我自认为技术能改变世界。这一切都是程序化思维在影响着我。如果你还不熟悉啥是面向对象,请参考《R的极客理想-高级开发篇》第四章面向对象编程。

后来,当我接触了R语言,通过另一扇门理解世界的时候,我发现世界是不一样的。在没有程序的世界里,你可以通过文字来表达你的做事的方法,你可以感性地认识世界,你也可以让数据来说出这个世界意义。你可以天天看新闻联播,了解国家大事;也可以看微博、朋友圈的爆料,及时了解身边的消息。这并不是程序员的思维,而大众化的社会。这个社会里,程序员只是小众。

改变世界的方法,除了技术还有别的,比如,政策、资本、市场、法律、人事等,从公司运作的层面看,似乎哪个都比技术更重要。也许程序员更不关心这些,但面对市场时,再牛技术也会被其他因素所制约。

我经历过创业,一个很深刻的教训就是,要让自己跳出原有的思维定式,通过多维的视角看世界、看自己。通过R语言,帮我打开了通过数据看世界的窗口。我的能力提升不再是,如何把程序把写得多得漂亮,在时间复杂度上用O(log(N))解决O(N^2)的问题,而变成了怎么收集数据,怎么提高数据质量,用于解决实际的业务问题。当然,作为程序员的职业强迫性,我也会要求自己熬夜一晚上把50行代码优化成40行。

问题被转化了,术业要有专攻,但作为一个有理想的极客,全面掌握跨领域的知识才是我们的目标。我创业时,经常被投资人问到,做量化投资的项目有多难?招几个金融背景的,再招几个IT背景的,捣鼓个项目,很快就做出来了。其实不然,不同背景的人是很难交流和沟通,尤其是金融和IT,一种是封闭不愿意分享,一种是开放毫无保留;一种是先把话说出来,一种是先把事情做起来;一种是所有人都要为我服务,一种是只专注于自己的兴趣。所以,如果没有能够跨界通吃的人,是做不好量化的项目的。

我们就要立志做个跨着学科的人,这才是最核心的点,是不可被替代的。从IT技术出发,你需要扎实的编程功底架构思想,科学的项目管理方法,严谨的产品设计逻辑;你还需要统计、数学等基础学科的知识,数据挖掘与机器学习的数据处理经验;最重要的,你要能结合业务,不管是量化投资或其他的领域,理解市场的规则。

听起来很难,而且是真的很难!虽然很难,但不光是对你,对所有人都是这么难。但是只要能坚持的走下来,一定能通过知识改变命运的。

3. R语言量化工具包

做量化投资,R语言的优势在哪?R语言可以帮助我们从多种维度去理解量化投资。

  • R语言本身就是我们需要掌握的IT的技术,是一个需要编程的技术活,但极大的降低了对编程的要求,短短20-30行R语言代码,已经能干很多事情了。
  • R语言是面向数据的,有方便数据处理操作,对于数学、统计等基础学科有丰富的函数支持,同时提供多种数据挖掘和机器学习的算法库,让我们可以直接使用。
  • 在量化领域更是R语言的强项,有针对投资研究的包,有做回测分析的包,有做金融产品定价的包,有做投资组合优化的包,还有风险管理的包,涵盖了量化投资的方方面面,只是有些包的使用要针对中国市场特点进行改进和优化。

R语言为量化投资提供了丰富的工具包,我做了分类列在下面。再也没有哪种语言会做到这种的支持了。R包,投资研究包,回测分析包,金融产品定价包,投资组合优化包,风险管理包,涵盖了量化投资的方方面面。

完整的量化投资工具包,请参考文章R语言量化投资常用包总结。在《R的极客理想》系列图书的3本书中,分别对于这些包做了介绍。请大家对照包名,进行查看和使用。

4. 量化策略实战应用

利用R语言的便利性,我们可以很容易的通过上面介绍的这些工具包,做一个交易模型。构建一个简单的投资策略,甚至都不需要有太多的代码。

接下来,我就举例说明一下,怎么把R语言提供的程序包合在一起使用。按照下面的步骤做一个简单的交易策略,基于移动平均线MACD,针对全球指数的投资方案。如果你还是金融新手,不了解MACD策略,那么请请参考《R的极客理想-高级开发篇》书中,2.3节二条均线打天下。

本文所使用的系统环境

  • Win10 64bit
  • R: 3.2.3 x86_64-w64-mingw32/x64 b4bit

下面是一个简化的量化策略的研究过程,分为如下的6步进行。

  1. 用quantmod包下载数据。
  2. 用zoo包和xts包进行数据格式标准化。
  3. 用TTR包进行模型计算。
  4. 用PerformanceAnalytics包进行指标风险。
  5. 用ggplot2包进行可视化输出。
  6. 最后,进行结果分析。

首先,我们要获取数据,个人玩可以通过互联网免费下载数据,专业机构通常都是买专业数据库。这里我们通过quantmod包,从Yahoo财经下载数据的。

我选择了全球的5个市场的指数进行比较,代码和名称对应关系。

指数名称指数代码(Yahoo财经代码)简称
标普500^GSPCGSPC
日经225^N225N225
恒生指数^HSIHSI
富时新加坡STI^STISTI
上证综指000001.SSSSE

下面通过R语言代码,我们来完成这个交易策略模型的构建。当然,这里只是为了说明整个过程,给大家一个直观的感觉,这里会省略对于策略的细节处理。


# 加载程序库
> library(quantmod)
> library(TTR)
> library(PerformanceAnalytics)
> library(ggplot2)
> library(scales)

# 从Yahoo财经下载各全球指数数据
> options(stringsAsFactors = FALSE) 
> symbols<-c("^GSPC","^N225","^HSI","^STI","000001.SS")
> suppressWarnings(getSymbols(symbols,src = "yahoo",from="2012-01-01"))
[1] "GSPC"      "N225"      "HSI"       "STI"       "000001.SS"

# 取指数价格调整后的数据,合并数据集
> df<-merge(GSPC$GSPC.Adjusted,HSI$HSI.Adjusted,N225$N225.Adjusted,STI$STI.Adjusted,`000001.SS`$`000001.SS.Adjusted`)

# 对列重命名
> names(df)<-c("GSPC","HSI","N225","STI","SSE")

接下来,让我看数据是什么样子的,并画出全球指数。


# 查看数据前6行
> head(df)
              GSPC      HSI    N225     STI     SSE
2012-01-03 1277.06 18877.41      NA 2688.36      NA
2012-01-04 1277.30 18727.31 8560.11 2711.02 2169.39
2012-01-05 1281.06 18813.41 8488.71 2713.02 2148.45
2012-01-06 1277.81 18593.06 8390.35 2715.59 2163.40
2012-01-09 1280.70 18865.72      NA 2691.28 2225.89
2012-01-10 1292.08 19004.28 8422.26 2719.83 2285.74

# 查看数据最后6行
> tail(df)
              GSPC      HSI     N225     STI     SSE
2017-02-24 2367.34 23965.70 19283.54 3117.03 3253.43
2017-02-27 2369.73 23925.05 19107.47 3108.62 3228.66
2017-02-28 2363.64 23740.73 19118.99 3096.61 3241.73
2017-03-01 2395.96 23776.49 19393.54 3122.77 3246.93
2017-03-02 2381.92 23728.07 19564.80 3136.48 3230.03
2017-03-03 2383.12 23552.72 19469.17 3122.34 3218.31

# 查看数据类型,为xts
> class(df)
[1] "xts" "zoo"

整个数据集是从2012年01月03日到2017年03月03日之间数据,数据为xts类型,xts类型是R语言中专用的时间序列类型。 关于xts的详细介绍,可以参考《R的极客理想-工具篇》书中,2.2节可扩展的时间序列xts。

画出全球指数,曲线图。

由于各国指数成立时间不同,成份股也不同,所以指数值有的很大有的相对比较小,我们不能用指数大小来判断好坏。 通常情况下,我们会转换成收益率进行比较,通过收益率进行度量后,这样所有的标的都是在同一个维度了。

画出全球指数的每日累计收益率,曲线图。

收益率越高,说明指数在这期间是表现越多的,我们越应该去投资。上图中日经225(N225)指数大幅超越了其他指数,中国的上证综指(SSE)一起一落波动非常大,标普500(GSPC)走势稳健。

计算指数的平均年化收益率,如果我们把钱一直投资在这些看指数上面,那么我们每年的平均回报是多少呢?


> Return.annualized(ret_df)
                       GSPC       HSI      N225        STI        SSE
Annualized Return 0.1133813 0.0619811 0.1927681 0.03696703 0.04817027

这里日经指数(N225)年化回报率是最高的,有每年平均有19.28%的年化收益率,与图1-3的累计收益率走势相符。 而中国的上证综指(SSE)仅有4.82%的年化收益率,回报不算高,但波动太大了。 综合来看,标普500(GSPC)其实是投资的首选,11.34%年化收益率,平均波动率也不是太高,所以风险和收益都是相对不错的。

接下来,我们构建一个简单的MACD模型,通过MACD策略再对上面5个指数构建交易策略。


> # MACD 策略模型
> MACD<-function(dt,n=30){ #代码省略
> }

# MACD策略,年化收益率
> lapply(df, function(col) MACD(col,30))
           GSPC       HSI      N225        STI       SSE
close 0.2137435 0.2406476 0.2261996 0.01869112 0.2817241

我们写了一个MACD的策略函数,就相当于是建模的过程,函数的输出为策略的收益率。 然后,我们把指数数据传给MACD()函数,经过计算输出策略收益率。 最后,把策略收益率与纯指数率,放到一起来进行对比。

策略GSPCHSIN225STISSE
指数收益0.11338130.06198110.19276810.036967030.04817027
策略收益0.21374350.24064760.22619960.018691120.2817241

我们可以很明显的看出,用一根均线的MACD策略,平均年收益率会大幅优于纯指数的收益率,如果我们这样交易就可以赚到更多的钱。 其实,这就是量化投资的思想,从数据中发现规律。 可能上面的过程和代码,会让你觉得很迷惑,怎么就能赚到钱了?别着急,本节只是本书的开篇,等你仔细阅读了全书,你就能领悟到这里的玄机了。

一共40行左右代码,完成了很多的事情。 如果要把整个操作都细分列举出来,包括了数据采集,数据清洗,数据标准化,指标计算,数据建模,历史回测,投资组合构建,组合优化,计算结果评价,数据可视化等组成部分。

要搭建一套量化交易的系统,主要就是完成这些部分。对于个人玩家来说,按照上面R语言代码的思路,就已经可以实现了。 如果你想做的更好,不仅是个人玩,通过成立公司把系统做大做强,为更多的用户提供量化服务,那么你还需要有一整套的平台架构方案,同时配合你要做的金融业务。

5. 有理想的极客

本文是新书《R的极客理想-量化投资篇》的开篇内容,希望大家跟着我的思路,通过R语言入手,体会R语言建模的乐趣,并真正地把技术变现。 我认为R语言是非常好的一门语言,从量化投资的角度,我会一直推动R语言在中国的发展,当成一项事业来做。 同时,本书也会译成英文版在全球发行,让中国的技术走出去。加油!!

R语言只是一门计算机语言技术,不能独自承担改写历史的重任,但R语言确实给了我们很大的想像空间,让我们能动手去了解这个世界的规律,找到无穷无尽的交叉点,创造出新的帝国。

如果你和我一样,都能站在这个角度来学习和使用R语言,那么我们一定可以成为并肩向前的同路人。

转载请注明出处:
http://blog.fens.me/r-quant-start/

打赏作者

R语言为量化而生

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。

关于作者:

  • 张丹(Conan), 程序员Java,R,Nodejs
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/r-finance/

r-finance

前言

做数据分析的朋友,一定听说过R语言。R语言是一门统计语言,在数据分析领域优势是非常明显的。

本文以 “R语言,为量化而生”为题,说明R语言真的很适合做金融做量化策略。金融本身是玩数据行业,R的最大的优势就是数据分析,所以用R来做量化投资的策略,真是很配,不仅顺手而且方便,用了你就会知识。

本文将由3个方面来介绍,R语言做量化是多么的适合。

目录

  1. 为什么是R语言?
  2. R语言的数据处理和时间序列
  3. R语言和金融模型

1. 为什么是R语言?

那么为什么是R语言,而不是其他的语言? 先简单介绍一下,我们的个人经历。

我是一个程序员,从2004年开始接触Java写了10多年的Java程序,期间还尝试过多种编程语言,VB、PHP、Python、SAS、R、Nodejs,最后把自己锁定在R,Nodejs和Java。谈不上对每一种语言都有很深的理解,但是每种语言的特点还是有点心得。

之所以选择R,Nodejs和Java这3种语言,有一部分情怀,更多的是理性。从技术发展来看,编程开发变得越来越简单,10年前用JavaEE做一个简单的web项目至少要2人月,现在用Nodejs新人边学边搞只需10人天。而且随着业务的多样化,单一的技术已经不足以支撑业务的发展,业务在从传统的软件开发向互联网和数据产品的方向在进化。根据不同语言的特点,每种都将在开发中占据一席之地,而很难在出现一种语言统一天下的情况。

R语言将在数据分析领域发挥着重要的作用。R语言的3个特性,数学计算、数据建模和数据可视化。R语言封装了多种基础学科的计算函数,我们在R语言编程的过程中只需要调用这些计算函数,就可以构建出面向不同领域、不同业务的、复杂的数学模型。

另外,R的知识体系结构是复杂的,要想学好R,就必须把多学科的知识综合运用,而最大的难点不在于R语言本身,在于使用者的知识基础和综合运用的能力。

r-basic

图中我将R语言知识体系结构分为3个部分:IT技术 + 业务知识 + 基础学科。

  • IT技术:是数据大发展时代必备的技术之一,R语言就是我们应该要掌握的一门技术。
  • 业务知识:是市场经验和法则,不管你在什么公司,你都了解业务是什么,产品是什么,用户是谁,公司的价值在哪里!
  • 基础学科:是我们在学校里学到的理论知识,虽然当初学的时候并不理解,工作中如果你还能掌握并实际运用,那么这将是你最有价值的竞争力。

关于R的知识体系,可以参考文章,R语言知识体系概览

对于金融量化投资来说,刚好是一个交叉学科,你需要懂IT技术,熟悉金融市场的规则,有数学建模的能力。R语言,正好可以帮我们来解决这样的问题,所以“R语言,为量化而生”!

对于做过数据分析的人来说,大家都了解什么是最费时间的!!无疑就是数据处理的部分。

2. R语言的数据处理和时间序列

第二部分,我们来介绍一下R语言的数据类型和数据处理的一些方法。当然,本文并没有介绍如何入门R语言,新手入门请参考文章R的极客理想系列文章

2.1 基本数据类型

在R语言中,数据类型包括向量类型,字符串类型,数字类型,布尔类型,矩阵类型,数据框类型,list类型等,通常我们在使用R语言里做数据处理的时候,大部分都会以数据框(data.frame)类型为一个主要的数据内存类型来使用。

数据框(data.frame)类型是R语言内置的一种数据类型,我们可以简单地把它理解为,与关系型数据库中表的结构是类似的,是一种二维的数据结构。


# 新建一个数据框
> data.frame(A=1:6,B=LETTERS[1:6])
  A B
1 1 A
2 2 B
3 3 C
4 4 D
5 5 E
6 6 F

正是由于R语言内置了这样的数据类型,使我们从数据库读取数据或导入CSV格式的数据时,与R语言有了一个很好的映射关系,直接加载到R语言的内存中变成标准化数据格式。

然后,就可以基于标准化的数据格式,用R语言的功能函数来处理数据了。比如,对于做数据库开发的人员来说,他可以使用sqldf包,在R语言中通过SQL语句对数据进行数据变换。同时,也可以按着数据框(data.frame)的标准方法进行数据处理,通过约定的向量索引下标的方式来按行按列来读取数据,或使用功能函数处理数据。


# sqldf包的使用
> library(sqldf)
> sqldf('select * from iris limit 6')
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

# 向量索引
> iris[1:6,]
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

# head函数使用
> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

我们经常还会对数据进行转型处理,把数据框(data.frame)类型和其他数据类型的进行转化。我们有时会使用矩阵计算,R语言中默认供了矩阵(matrix)数据类型,可以很方便地把数据框转类型成矩阵类型,有时也需要把数据框的某一行或某一列转型为一个向量类型数据,或者把数据框变成一个list类型。通过数据的格式变换,用标准化的数据结构来满足数据分析的要求。

虽然R语言是统计语言,从性能上来说比C++/Java等语言慢不少。但对于数据分析的业务场景,用R语言来做数据处理的时候,你不用考虑程序如何架构,指针怎么定义,内存是否会泄露,只要关注你的数据和算法就行了。唯一需要注意的一点,不要直接用for循环的方式处理数据,尽量使用向量计算或矩阵计算的计算方法。当必须用循环的时候,你就需要用apply家族函数,代替for循环来做数据处理。关于apply家族函数的用法,请参考文章掌握R语言中的apply函数族

如果你的数据量比较大,1GB,10GB,甚至有100GB,对于这种规模比较大的数据集,apply的计算方式就不太能满足计算性能的要求了。你依然可以用data.table包, bigmemory包, ff包等,或者并行计算的包加速R语言在单机上的计算的性能。data.table的使用方法,请参考文章超高性能数据处理包data.table

那么再大规模的数据,超过1TB这个量级,不只是R语言,每种语言都会遇到计算性能的瓶颈。这个时候,我们需要把数据放到分布式系统中,如Hadoop或其他大数据的引擎中进行存储和计算。R语言与各种的大数据平台的通信接口都是通的,比如RHadoop,rhive, rhbase, rmongodb, rCassandra, SparkR, sparklyr等。如果你想了解hadoop的知识,请参考文章Hadoop家族系列文章RHadoop实践系列文章, R利剑NoSQL系列文章 之 Hive

2.2 时间序列类型

除了R语言的内置基础数据类型,对于金融的数据处理,一般我会把它变成标准的时间序列类型的数据,R语言中基本的时间序列的类型为 zoo 和 xts类型,当然还有一些其他包提供的数据类型。关于zoo和xts的详细介绍,请参考文章 R语言时间序列基础库zoo可扩展的时间序列xts

通过类型变换可以很方便地把的data.frame或者matrix等基础类型数据,变成xts时间序列类型的数据。时间序列类型的好处是它默认会以时间作为索引,对于量化策略来说,每条数据记录他都会有数据产生的时间,那这个时间就正好可以作为索引列的时间。


# 数据框
> df<-data.frame(A=1:6,B=rnorm(6))

# xts时间序列类型
> xdf<-xts(df,order.by=as.Date('2016-01-01')+1:6);xdf
           A           B
2016-01-02 1 -1.24013232
2016-01-03 2 -0.21014651
2016-01-04 3 -1.63251615
2016-01-05 4 -0.67279885
2016-01-06 5  0.01487863
2016-01-07 6  0.92012628

# 类型检查
> class(xdf)
[1] "xts" "zoo"

那么以时间作为数据的索引列的好处是,可以很方便地把数据以时间维度进行对齐。比如,你设计了一个股票交易策略和一个期货交易策略,由于股票是T+1交易,今天买了明天才能卖;而期货是T+0交易,今天买了马上就可以卖出。针对不同的市场规则,在设计交易策略时,可能就会选择不同的交易周期,那么这时两个策略的交易周期就会不一样,那么时间维度可能也不是对齐的。如果这两个策略是对冲的,那么我们就需要把它们以时间维度进行对齐,才能进行实现对策略模型对冲的准确计算。

把不同时间的维度的数据转化成同一个时间维度,相当于做时间的标准化。通过标准化的操作,让数据变成同一时间维度,数据之间才能够进行计算。

举个简单的例子,我们做股票交易,在实盘交易过程中,你可能最关心的是每秒最新的价格数据,每一秒都会产生一条数据,这是属于日内交易策略。另外,我们再做一个周期稍微长一点的策略,以日线为基础的,那么这里一条记录就是一天收盘价。对比日内策略,1秒钟一条数据和1天一条数据,它们不同维度的数据,是不能直接进行计算。

我们要处理这种不同周期维度数据的时候,就需要把数据转成同一个维度的。比如,我们对日线和周线的数据进行合并的时候,可以是把周线数据拆成日线数据,就是把一周分成五天。反过来,也可以把日线数据合并为周线数据,把5天的数据合并成一周。

所以这个时候就需要一个统一的数据格式进行标准化的数据定义,zoo和xts就是我们作为时间序列基础数据类型。这两个包是由第三方开发的,提供了很丰富的时间序列处理函数,我们可以直接使用这些函数来操作金融数据。很多其他的第三方金融算法分析包,也都是以这两个包作为基础开发。

3. R语言和金融模型

当我们掌握了R语言处理数据的方法,了解了如何使用R语言的基础数据类型和时间序列数据类型,下面我们就可以构建金融的策略模型。

金融建模跟其他行业的数据建模是类似的,只是由于行业不一样,金融行业有很多背景知识和金融市场规则需要我们了解。金融本身就是一个玩数据的行业,你可以通过获得交易数据,财务数据,上市公司的各种事件数据,基本面数据,宏观数据,舆情数据,互联网数据等,来构建你自己的交易策略。

我们需要把这些数据进行组合整理,结合你自己对业务的理解,使用R语言从数据中发现规律,并构建交易模型。用程序对历史数据进行回测,来验证规律的可靠性,是否会长期有效,并控制风险,最后把验证过的规律变成算法模型,这个就是金融策略建模的过程。

从金融交易分析的角度,可以从3个维度进行分析 基本面分析,技术面分析和消息面分析。

  • 基本面:指对宏观经济、行业和公司基本情况的分析,包括公司经营理念策略、公司报表等的分析。长线投资一般用基本面分析,通过基本面可以判断是否值去交易。
  • 技术面:指通过技术指标变化,判断股票走势形态,进行K线组合等,通过技术面可以判断如何进行交易。
  • 消息面:指上市公司发布的利好和利空的消息,通过消息面可以判断市场的情绪。

对于量化模型,大部分都是基于技术指标的模型,通过技术指标建模,跟踪市场的表现。在不完全了解金融业务和金融市场的情况下,通过几个技术指标来监控市场的走势,发现市场的机会也是有可能的。

量化交易和主观交易并不是对立的,量化交易是对主观交易的补充,当我们以数据作为决策基础的时候,其实可以尽量减少拍脑袋过程,创建数据模型也可以给我们心里建立良好的信心。如果交易没有使用量化的方法,那就跟我们平时做事一样,你可能想到什么就是什么。没有数据基础,那完全就是感觉,这样子交易就是很容易赔钱。

对于中国很多的散户,听到一个消息就跟着风的买卖股票,或者凭自己感觉大盘该涨了就跟进去,这些操作其实都是很不理性的。如果你通过量化的方法,即使再简单,就靠几条均线来进行判断,这样也是能给自己一个数据的基础,建立信心,而不是完全拍脑袋的事儿。

量化交易模型主要是以技术指标为主,常用的技术指标有不少,虽然简单但还是很有用的。对于很多实盘上运行的量化策略,大都会基于这些基础的指标,但并不是把每个指标单独使用。而是把多个指标通过变换组合使用,比如说MACD是均线模型,大部分的趋势策略都以MACD做为基础指标,通过变换再生成新的衍生指标。

常用的技术指标还包括KDJ、Boll、RSI、CCI等,当你直接使用这些指标的时候,可能效果并不是太好。因为市场上普遍接受了这些技术指标,已经被大量使用。单纯地用一个指标,你掌握的信息并不比别人多,所以你可能抓不到市场上赚钱的机会。

我们需要把多种技术指标或者多个维度的指标进行结合,通过组合优化的方式来降低策略的不确定风险,同时提高收益率。如果你找到了一个只有你自己知道市场规律,你的策略产生的信号完全是跟别人有区别的,你抓住了别人看不到的机会,这个才是你的赚钱机会。你领先的越多,越少人知道这个规则,那你可能赚钱的机会就越多。

建立量化模型,其实和我们平时做数据分析的思考试是一样的。要把这件事做好,我们需要把IT技术,业务知识和基础学科知识做进一步的结合,当你发现这个结合是属于你自己特有一个知识体系,你才能更好的发挥你的才能。

我们为什么要用R来做这件事情?

首先,R语言本身提供了很多数学、统计的基础包,让数学计算变得非常容易。R语言提供了常用的数据结构,向量、数据框、矩阵等,把数据变成标准化的数据,你的关注点只在数据上就可以了。另外,R语言是免费开源的,很多的第三方开发者提供了丰富的数据挖掘包,让你可以方便的使用各种算法模型,短短几行代码,就可以搞定一个复杂的事情。

R语言,在金融领域提供了很多交易框架或者计算模型,如果你了解了金融的理论知识以后,同时有一定的金融市场经验,你可以很方便的利用这些别人提供的这些技术框架,来构建自己的交易模型。CRAN上发布的金融项目,你可以去 R的官方网站 (https://cran.r-project.org/),找到Task Views 菜单里的 Finance标签。

task

通过调用第三方的程序包,自己的代码量就变的非常少。我们做一个R语言的策略,如果是很复杂的,你可能要写100-200行,但是如果你要实现同样复杂的策略,放到C++/Java去实现,这个策略就是没有1000-2000行是不可能实现的。在CRAN上面,简单数一下Finance标签下面列出的金融包就有141个,我相信没有哪种语言会比R语言对金融行业支持的更多了。

task2

虽然说R语言在性能上有些问题,但是我们会有多少了交易策略是基于一种高频的模型,对性能要求极高的呢?其实很少。就算是高频交易策略,几秒钟交易一次,R语言都可能满足要求。

海量金融数据我们怎么处理呢?

我们可以把基于海量数据的计算变成离线模型,金融行业每天都会产生大量的数据,像每日产生的交易数据,中国市场每天可能都是以GB的量来增长,跟互联网比起来不是很快,但对于你程序加载10年的数据,他要GB或TB的一个量级。

R语言本身真的很难处理这种量级的数据,但是这种量级数据对于其他语言来说同样是很难处理的。我们并不需要把这种体量的数据,都加载到内存中,进行实时数据计算。变成离线的计算模型,仅用于建模回测。把海量数据能变成离线的方式,放到hadoop或spark计算,用海量数据进行模型的训练。

我们用到的实时数据,一般就是一天或几天的数据,会不很大,每天从开盘到收盘可能也就1-2GB,对于这个大小,我们完全有能力放到内存中,进行各种各样的计算。

做量化交易难点还是在于如何发现市场机会,R语言可以很好的满足数据计算,建模,分析等的所有技术的部分。利用你的擅长,找到市场的机会,然后去实盘交易赚到钱,我们就完成了整个的交易过程。

本文并没有介绍,如何用R语言真正的去实现一个交易策略,你可以通过下面的列表找到对应的文章。

2015年我在创业,希望能推动R语言在金融量化领域的发展,但是由于种种原因项目没有持续发展。接下来,我还会以个人的方式继续努力,继续推动R在金融领域的发展。R对我们的影响和改变是非常大的,我认识R是非常好的一门语言,我会把推动R的发展,当成一项事业来做。希望也能和各位业界朋友,一起努力,把这份事业做下去。

转载请注明出处:
http://blog.fens.me/r-finance/

打赏作者