• Posts tagged "金融"

Blog Archives

用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 ^GSPC GSPC
日经225 ^N225 N225
恒生指数 ^HSI HSI
富时新加坡STI ^STI STI
上证综指 000001.SS SSE

下面通过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()函数,经过计算输出策略收益率。 最后,把策略收益率与纯指数率,放到一起来进行对比。

策略 GSPC HSI N225 STI SSE
指数收益 0.1133813 0.0619811 0.1927681 0.03696703 0.04817027
策略收益 0.2137435 0.2406476 0.2261996 0.01869112 0.2817241

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

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

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

5. 有理想的极客

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

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

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

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

打赏作者

用数据解读摩羯智投

用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-mojie

mojie-title

前言

进入2016年,伴随世界经济危机的到来,中国互联网创业,也在经历长时间的寒冬,有不少的公司都因资金链断裂,停止了运营。与寒冬反差很大的是,AI技术却火了起来,受到资本的追捧。智能投顾作为金融领域的AI热点,一直在持续升温。

到2016年底,招商银行发布了一个名为“摩羯智投”的应用,一下子吸引了众多人的眼球,打开了银行进军智能投顾领域的大门。本文将用数据来解读“摩羯智投”的到底是怎么玩的。

目录

  1. 摩羯智投介绍
  2. 数据收集
  3. 数据建模分析
  4. 结论

1. 摩羯智投介绍

摩羯智投,是招商银行在2016年12月6日发布的一款手机端应用,嵌入在招商银行的APP中,加入了FinTech理念,把金融和人工智能进行了结合。

按招商银行发布的文章中介绍,摩羯智投是运用机器学习算法,构建的以公募基金为基础的、全球资产配置的“智能基金组合配置服务”。在客户进行投资期限和风险收益选择后,摩羯智投会根据客户自主选择的“目标—收益”要求、构建基金组合,由客户进行决策、“一键购买”并享受后续服务。

摩羯智投并非一个单一的产品,而是一套资产配置服务流程,它包含了目标风险确定、组合构建、一键购买、风险预警、调仓提示、一键优化、售后服务报告等,涉及基金投资的售前、售中、售后全流程服务环节。比如,摩羯智投会实时进行全球市场扫描,根据最新市场状况,去计算最优组合比例,如果客户所持组合偏离最优状态,摩羯智投将为客户提供动态的基金组合调整建议,在客户认可后,即可自主进行一键优化。

摩羯智投的开机画面。

05

看完招商银行官方的介绍,接下来我们从数据进行分析,看看“摩羯智投”到底有多智能。

2. 数据收集

要做数据分析,我们就要以数据来思考。我的思路,要先收集数据,把应用所有的输入项和输出项的数据进行整理,然后我们通过统计的方法和金融知识来找到数据之间的关系。

注:由于应用中没有明确的字段定义,下面字段我按照字面意思进行解读。

数据输入项只有2个字段,包括

  • 大致投资期限:从投资开始到投资结束的期限。
  • 风险承受能力:承担多大的风险,以及风险带来的损失。

数据输出项,字段就比较多,包括

  • 模拟历史年化收益(%):对历史数据回测,所获得的年化收益率。
  • 模拟历史年化波动率(%):对历史数据回测,所获得的年化波动率。
  • 模拟历史收益(元):在投资10000元,并持有一年,所获得的收益金额。
  • 95%的概率下亏损(元):在95%概率下最大亏损金额。
  • 固定收益(%):固定收益类基金的配置比例。
  • 现金及货币(%):现金货币类基金的配置比例。
  • 股票类(%):股票类基金的配置比例。
  • 另类及其他(%):另类投资的类基金的配置比例。
  • 投资组合收益率曲线:按比例构成的组合,生成的收益率曲线。
  • 投资组合配置详情:4类资产对应的具体基金品种和配置比例

对应到“摩羯智投”的操作界面上,我标出了输入数据和输出数据的提取点。

mojie

根据界面来收集到的数据,整理为CSV格式,便于之后的分析。数据收集,我分别存储到了3个CSV文件中。

  • a.csv:用于收集第1-2个界面的数据,用户直接输入和输出数据,包括:大致投资期限(term),风险承受能力(rick),模拟历史年化收益(ret),模拟历史年化波动率(vol),模拟历史收益(gains),亏损(loss),固定收益(fixed),现金及货币(cash),股票类(stock),另类及其他(alter)
  • b.csv:用于收集所有标的基金所对应的市场数据,从wind中采集,包括:基金名称(name),基金代码(code),基金成立时间(create),基金类型(type),净值20140101(first2014),净值20150101(first2015),净值20160101(first2016),净值20161208(last)
  • c.csv:用于收集第3个界面的数据,每个组合的标的基金的配置比例,包括:大致投资期限(term),风险承受能力(rick),基金类型(type),基金代码(code),配置比例(weight)

a.csv的数据样例前10条,如下:
data1

b.csv的数据样例前10条,如下:
data2

c.csv的数据样例前20条,如下:
data3

这里还需要特别说明的事,由于应用的数据,可能会动态的发生变化,我是采集的2016年12月8日的“摩羯智投”应用中的数据。

多说一句,数据花点时间谁都可以在应用中拿到,虽然我已经整理了数据,但请大家不要太随意地张嘴要数据和代码,毕竟写一篇文章非常辛苦。如果你想直接用我的数据和代码,请扫文章下面二维码,请作者喝杯咖啡吧。 :_D

3. 数据建模分析

收集好了数据,接下来就可以进行数据分析了。当然,分析的角度有很多种,可以从金融、统计、数据挖掘等专业方向,也可以计算一些简单的指标,最大值,最小值,平均值等等。我思考的出发点,主要在金融和统计上面,如果存在片面性,还请大家给予指正。

下面将从6个知识点,对“摩羯智投”进行分析。

3.1 分析一:只有2个输入项。

由于只有2个输入项,大致投资期限和风险承受能力。大致投资期限有3个选项,风险承受能力有10个选项,那么实际的组合个数就是3*10=30个。对于只有30个组合来说,并不能完全实现个性化,当有31个用户使用产品时,就会有2个人购买的组合是是重复的。

3.2 分析二:只有17只标的基金

我们对30个组合进行配置尝试后,发现详细持仓方案中,只有17只基金,配置比例不同而矣。标的过少,可能导致风险不能足够的分散化,遇到极端行情会导致大的回撤。17只基金分别是


> paste(dfb$name,"(",dfb$code,")",sep="")
 [1] "工银纯债B(OF000403)"     "易增强回报B(OF110018)"   "建信稳定增利C(OF530008)"
 [4] "工银天颐B(OF485014)"     "南方量化成长(OF001421)"  "中欧潜力价值(OF001810)" 
 [7] "大成500(OF096001)"       "黄金接连C类(OF000217)"   "亚洲美元债C(OF002401)"  
[10] "大摩收益C(OF233013)"     "博时信用债C(OF050111)"   "兴权可转债(OF340001)"   
[13] "创金多因子(OF002210)"    "招商现金增值A(OF217004)" "富国中小盘(OF100061)"   
[16] "工银瑞信全球(OF486002)"  "南方成份(OF202005)"   

3.3 分析三:相关性分析

直接利用a.csv的数据集,查看输入项和输出项的相关性,发现相关关系。

通过R语言程序实现


# 加载数据
> dfa<-read.csv(file="a.csv")
> names(dfa)<-c("term","risk","ret","vol","fixed","cash","stock","alter","gains","loss")

# 画出配对示意图
> pairs(df)

r1

把数据变成可视化来显示,对于我们理解数据非常有帮助。

  • term列,和其他列的散点图,完全呈现离散的分布,说明term列与其他列并没有相关性的关系。
  • risk列,除了和alter列没有线性关系,和其他列呈现明显的线性关系。

我们把上面相关性图,再加上一些元素,如相关系数、拟合曲线、分布图等,重新画出相关性图,如下所示。

r2

这样就清晰了多了。

  • risk列,与模拟历史年化收益(ret),模拟历史年化波动率(vol),拟历史收益(gains),呈现极度正相关,输出项的数字完全受risk值影响。
  • risk列,与固定收益(fixed)和现金及货币(cash),极度负相关;与股票类(stock),极度正相关;另类及其他(alter),负相关。这种情况,与资产的风险收益属性是匹配。
  • vol列,与亏损(loss),是100%线性相关。
  • ret列,与拟历史收益(gains),是100%线性相关,这里可以获得公司:gains = 10000 * ret 。

3.4 分析四:线性回归

通过相关性的检查,我们可以发现risk与很多列都是极度相关的。

那么我们可以用线性回归的方法,把risk与有相关性的列的参数估计出来。如果不太了解,一元线性回归的可以参考文章,R语言解读一元线性回归模型

由于vol和loss是100%线性相关,以vol为x,loss为y,构建一元线性回归方程。


# 回归方程
> lv<-lm(loss~vol,data=dfa)
> summary(lv)
Call:
lm(formula = loss ~ vol, data = dfa)

Residuals:
    Min      1Q  Median      3Q     Max 
-36.119 -31.491  -6.621  27.884  67.305 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -447.514     13.056  -34.28   <2e-16 ***
vol          149.109      1.707   87.34   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 34.2 on 28 degrees of freedom
Multiple R-squared:  0.9963,	Adjusted R-squared:  0.9962 
F-statistic:  7629 on 1 and 28 DF,  p-value: < 2.2e-16

进行线性回归的统计检查:T检查,F检查都非常显著,同时R-squared为0.9963,具有极度相关性。


# 画出散点图和拟合曲线
> plot(loss~vol,data=dfa)
> abline(lv)

r6

从图中看到,拟合效果非常好,可以整理出公式:loss = -447.514 + 149.109*vol。

另外,由于risk决定vol,再让我们算一下risk和loss的关系,以risk为x,loss为y,构建一元线性回归方程。


# 构建一元线性回归方程
> lm(loss~risk,data=dfa)
Call:
lm(formula = loss ~ risk, data = dfa)

Coefficients:
(Intercept)         risk  
     -435.8        180.0 

# 详细指标
> summary(lr)
Call:
lm(formula = loss ~ risk, data = dfa)

Residuals:
    Min      1Q  Median      3Q     Max 
-219.88 -136.93  -59.26  100.69  508.31 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -435.84      72.38  -6.021 1.73e-06 ***
risk          179.95      11.67  15.426 3.23e-15 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 183.5 on 28 degrees of freedom
Multiple R-squared:  0.8947,	Adjusted R-squared:  0.891 
F-statistic:   238 on 1 and 28 DF,  p-value: 3.232e-15 

T检查和F检查,非常显著;R-squared 也比较高。

下面进行残差检查,发现30号点,是偏离比较大,可能是离群值。

r3

我们把30号点去掉,再做显著性检查和残差分析。


> dfa2<-dfa[-30,]
> lr2<-lm(loss~risk,data=dfa2)
> summary(lr2)
Call:
lm(formula = loss ~ risk, data = dfa2)

Residuals:
    Min      1Q  Median      3Q     Max 
-203.00 -100.98  -58.98   83.53  327.46 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -397.55      62.23  -6.389 7.64e-07 ***
risk          169.51      10.32  16.431 1.39e-15 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 155.3 on 27 degrees of freedom
Multiple R-squared:  0.9091,	Adjusted R-squared:  0.9057 
F-statistic:   270 on 1 and 27 DF,  p-value: 1.391e-15

在去掉30号点后,R-squared为0.9091,比之前的0.8947,有所提升。

r4

从残差图中,我们看到没有明显的离群值点,所以去掉30号点,是符合统计提升标准的。

3.5 分析五:关于30号点的金融思考

从数据中,我们发现30号点的最大亏损已经超过了收益,也就是说你可能承担了过大了风险,但是没有获得风险所给你带来的收益。

10

按照资本资产定价模型的理解,我们投资组合的收益来自2部分,无风险收益和风险收益。无风险收益可以用现金或货币类的基金获得,风险收益主要来自股票基金,债券基金,另类投资最基金。直观上理解,风险收益比至少是1:1,即损失100元时,要获得100元风险补偿。对于私募业务来说,投资人可能会要求更高,比如 风险:收益=1:2。

从另外一个角度分析,上面我所说的风险收益比并没有涉及到概率的部分,我猜95%是通过VaR值来做的概率计算。

3.6 分析六:通过标的基金计算收益率

在“摩羯智投”的应用中,我们可以获得各个基金的配置比例,基金净值的数据又可以在公开市场中获得,所以对于预期收益率,我们也可以自己计算一下,看看是不是与“摩羯智投”提供的结果是一致的。

接下来,就利用到上文介绍的数据集,b.csv和c.csv。


# 加载数据
> dfb<-read.csv(file="b.csv",encoding="utf-8",fileEncoding = "utf-8")
> names(dfb)<-c("name","code","create","type","first2014","first2015","first2016","last")

# 分别计算2014,2015,2016收益率
> dfb$ret2014<-(dfb$first2015-dfb$first2014)/dfb$first2014
> dfb$ret2015<-(dfb$first2016-dfb$first2015)/dfb$first2015
> dfb$ret2016<-(dfb$last-dfb$first2016)/dfb$first2016

# 把非法值赋值为0
> dfb$ret2014[c(which(is.na(dfb$ret2014)),which(is.infinite(dfb$ret2014)))]<-0
> dfb$ret2015[c(which(is.na(dfb$ret2015)),which(is.infinite(dfb$ret2015)))]<-0
> dfb$ret2016[c(which(is.na(dfb$ret2016)),which(is.infinite(dfb$ret2016)))]<-0

# 打印前6条
> head(dfb)
          name     code   create  type first2014 first2015 first2016   last    ret2014     ret2015      ret2016
1      工银纯债B OF000403 20140516 fixed    0.0000    1.0850    1.2200 1.2520 0.00000000  0.12442396  0.026229508
2    易增强回报B OF110018 20080319 fixed    1.4403    1.8124    2.1180 2.1693 0.25834896  0.16861620  0.024220963
3  建信稳定增利C OF530008 20080625 fixed    1.4529    1.8030    2.0304 2.0608 0.24096634  0.12612313  0.014972419
4      工银天颐B OF485014 20110810 fixed    1.2090    1.7300    1.9740 1.9680 0.43093466  0.14104046 -0.003039514
5   南方量化成长 OF001421 20150629 stock    0.0000    0.0000    1.2300 1.3400 0.00000000  0.00000000  0.089430894
6   中欧潜力价值 OF001810 20150930 stock    0.0000    0.0000    1.1010 1.2170 0.00000000  0.00000000  0.105358765

由于基金中,招商现金增值A(OF217004)为现金类基金,所以收益率需要直接取年化收益,而不是按上面的计算方法。


#现金类,收益率从wind查年化收益率,进行赋值
dfb[which(dfb$code=='OF217004'),]$ret2014<-0.0452
dfb[which(dfb$code=='OF217004'),]$ret2015<-0.036
dfb[which(dfb$code=='OF217004'),]$ret2016<-0.0237

再加载c.csv基金的详细配置方案。


> dfc<-read.csv(file="c.csv")
> names(dfc)<-c("term","risk","type","code","weight")

# 查看数据
> head(dfc)
  term risk  type     code weight
1    1    1 fixed OF000403   0.20
2    1    1 fixed OF110018   0.14
3    1    1 fixed OF530008   0.11
4    1    1 fixed OF233013   0.10
5    1    1 fixed OF050111   0.05
6    1    1 fixed OF485014   0.05

把数据变型,以type列转置为横表,去掉code列,以weight值进行填充,得到新数据集为r1。


> head(r1)
  term risk  alter   cash  fixed  stock
1    1    1 0.1000 0.2000 0.6500 0.0500
2    1    2 0.1500 0.1965 0.5491 0.1044
3    1    3 0.1562 0.1842 0.4881 0.1715
4    1    4 0.1011 0.1490 0.5162 0.2337
5    1    5 0.1137 0.1416 0.4943 0.2504
6    1    6 0.1143 0.1208 0.4655 0.2994

我们生成plan1的配置方案,当term=1,risk=1时。


# 只保留term=1,risk=1时数据
> plan1<-dfc[dfc$term==1 & dfc$risk==1,]

# 合并plan1数据集和dfb数据集
> plan1m<-merge(plan1[,c("term","risk","code","type","weight")],dfb[,c("code","ret2014","ret2015","ret2016")],by="code")

# 按分配比例计算收益率
> plan1m$ret2014w<-plan1m$weight*plan1m$ret2014
> plan1m$ret2015w<-plan1m$weight*plan1m$ret2015
> plan1m$ret2016w<-plan1m$weight*plan1m$ret2016

# plan1的,各基金分别在2014,2015,2016贡献的收益率
> plan1m
       code term risk  type weight    ret2014     ret2015      ret2016     ret2014w     ret2015w      ret2016w
1  OF000217    1    1 alter   0.05 0.01590909 -0.06711409  0.194844125 0.0007954545 -0.003355705  0.0097422062
2  OF000403    1    1 fixed   0.20 0.00000000  0.12442396  0.026229508 0.0000000000  0.024884793  0.0052459016
3  OF001810    1    1 stock   0.05 0.00000000  0.00000000  0.105358765 0.0000000000  0.000000000  0.0052679382
4  OF002401    1    1 alter   0.05 0.00000000  0.00000000  0.000000000 0.0000000000  0.000000000  0.0000000000
5  OF050111    1    1 fixed   0.05 0.87631433  0.12603844  0.034050727 0.0438157167  0.006301922  0.0017025363
6  OF110018    1    1 fixed   0.14 0.25834896  0.16861620  0.024220963 0.0361688537  0.023606268  0.0033909348
7  OF217004    1    1  cash   0.20 0.04520000  0.03600000  0.023700000 0.0090400000  0.007200000  0.0047400000
8  OF233013    1    1 fixed   0.10 0.24233716  0.20354665  0.047405509 0.0242337165  0.020354665  0.0047405509
9  OF485014    1    1 fixed   0.05 0.43093466  0.14104046 -0.003039514 0.0215467328  0.007052023 -0.0001519757
10 OF530008    1    1 fixed   0.11 0.24096634  0.12612313  0.014972419 0.0265062977  0.013873544  0.0016469661

把数据进行合并,分别计算plan1方案的收益率,和plan1方案不同资产的收益率贡献。


# plan1方案的收益率
> plan1r<-ddply(plan1m,.(term,risk),summarise,ret2016=sum(ret2016w),ret2015=sum(ret2015w),ret2014=sum(ret2014w))
> plan1r
  term risk    ret2016    ret2015   ret2014
1    1    1 0.03632506 0.09991751 0.1621068

#计算3年的累积收益率曲线
> plan1r$cumret<-sum(c(plan1r$ret2016,plan1r$ret2015,plan1r$ret2014))
> plan1r
  term risk    ret2016    ret2015   ret2014    cumret
1    1    1 0.03632506 0.09991751 0.1621068 0.2983493

# plan1方案不同资产的收益率贡献
> plan1rm<-ddply(plan1m,.(term,risk,type),summarise,ret2016=sum(ret2016w),ret2015=sum(ret2015w),ret2014=sum(ret2014w))
> plan1rm
  term risk  type     ret2016      ret2015      ret2014
1    1    1 alter 0.009742206 -0.003355705 0.0007954545
2    1    1  cash 0.004740000  0.007200000 0.0090400000
3    1    1 fixed 0.016574914  0.096073214 0.1522713174
4    1    1 stock 0.005267938  0.000000000 0.0000000000

用我计算的结果,分别对比“摩羯智投”中,近1年和近3年的收益率曲线。

13

近1年对应plan1r$ret2016=0.03632506=3.63%,近3年对应plan1r$cumret=0.2983493=29.83%。我发现计算结果存在差异,从最终结果的数字上来看差异并不大。但对于近3年的收益率曲线的走势来看,差异还是非常明显的。“摩羯智投”给出的近3年收益率曲线是,均匀平稳上升的,而我算出来的,3年数据2014年涨了16%,2015年涨了9%,2016年涨了3%,逐年收益率在递减。所以不应该呈现均匀平稳上升的形状。

究其原因,再来看plan1的组合数据,发现股票基金只有配了一只中欧潜力价值(OF001810),而这只基金在2015年09月30日才成立,所以并不能构建出该基金在2014,2015的年度收益率组合。以此来判断,这个组合势必存在着中间调仓的过程,而“摩羯智投”的收益率曲线,并没有展示出调仓过程的数据,所以收益率曲线是不透明的,不能够直接做为用户购买决策的依据。

接下来,我们把30种组合的收益率,都计算出来。再与“摩羯智投”给出的收益率进行比较。

14

上图中,ret列为“摩羯智投”界面上采集的数据;ret2016,ret2015,ret2014分别为我们根据基金的公开市场的数据,计算出来的百分比结果;mean为ret2016,ret2015,ret2014算数平均数。从数据上看,ret列和mean列,有部分值接近。我们再做一次相关性分析。

r5

这样解读结果就容易多了,ret与2016年的收益率是线性相关的,而mean与2014年的收益率是线性相关的,我猜2014底的“股债双牛”使均值发生了偏离。所以,ret和mean没有关系,“摩羯智投”对于收益率的预期,对于近1年的组合收益可能有更大的权重分配。

所以对于“摩羯智投”给出预期收益和净值曲线,我们并不能通过已知的数据计算出来,这些可能就涉及到它背景的算法,我们就无从知晓了。

4. 结论

以上从数据的角度给对“摩羯智投”进行了分析,首先摩羯构建的组合是线性组合,符合风险收益为基础资本资产定价模型(CAPM)。但由于组合数量有限,基金标的有限,算法不够透明、无法利用已知数据重现结果,缺少客户持续跟踪等部分,所以我把“摩羯智投”理解为是基于金融专业性架构,结合快速上线为目标的试水。可以实现对散户的简单、高效的财富管理体验,部分解放理财经理的压力。但对于专业的投资经理来说,这还仅仅是个玩具,还有相当大的提升空间。

本文只是人个出于兴趣,对“摩羯智投”应用的从数据角度的分析,不代表任何公司或其他第三方机构的立场。由于所获得数据有限,以及个人知识能力有限,如有片面的理解,还指大家指正。

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

打赏作者

2016天善智能交流会第22场: R语言为量化而生

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

关于作者

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

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

meeting-hellobi

前言

感谢天善智能社区的邀请,有幸参加每周一期的跟数据有关的行业、工具、技术的交流盛宴,活动的口号是“Friday BI Fly 周五BI飞起来”。

目录

  1. 我的分享主题:R语言为量化而生
  2. 会议体验
  3. 自由讨论

1. 我的分享主题:R语言为量化而生

本次分享的主题 R语言为量化而生,主要内容来自我的一篇博客文章:R语言为量化而生。希望能够解释清楚,在量化投资中为什么要用R语言。从程序员的角度看,C++,Java,Python, C#都是可行方案;从数据人员的角度看,Excel, SAS, Matlab更是不错的。那么为什么是R语言呢,R语言的优势在哪里体现?

这类的问题,总是会被问到。那么答案,就在于你对量化这件事情的了解,和对各种编程语言的理解。最近3年,互联网在量化领域的大发展,以Quantopian为代表的在线策略研发平台,用Python做为核心语言,国内同样支持Python的平台也有 优矿聚宽米筐。这些平台主是面向程序员群体的平台,希望通过挖掘草根明星,来推动量化的发展。传统的量化交易软件,像文华MC, TB, TS 都有自己一套的脚本化的编程语言。有实力的专业团队,通常会自成体系的独立开发一套自己的系统。如果面向更广泛的人群,最常用的方法就是Wind导数据,Excel中拉个表出来。

所以,其实用什么语言不重要,关键是怎么理解做量化这件事情。那么R语言的天生优势就是数学计算,数据处理,免费开源,大量支持库。试试吧,你一定会喜欢的。

2. 会议体验

本次分享受天善智能社区的邀请,我真的非常高兴。天善智能是新一代的商业智能和大数据的垂直社区,聚集了大量的数据分析从业人员。活动介绍,https://ask.hellobi.com/blog/tianshansoft/4229。 本次活动同时有30个微信群进行直播,参加的人员,至少有2000人以上。可以天善智能社区,在行业的影响力是非常大的。

发个截图,体会一下微信同步直播的震撼吧!

wx

本此的分享基于微信的直播,我也第一次体验,要用纯文字的方式来进行介绍。想把一个事情说清楚,又增加了不少的难度。由于不能分享屏幕,代码部分会通过图片截屏。

本次活动的总结,https://ask.hellobi.com/blog/tianshansoft/4271,感谢天善社区的工作人员进行整理。

远程分享,就是没能与大家合照,有点遗憾!!贴张自己的照片吧。

01

3. 自由讨论

分享后,很多朋友都对于R语言都是非常的好奇,提了很多的问题,用户的参与性非常强。下列直接贴出用户的问题和我的回复。

1、替新手问一个,请教一下,R语言的数据分析应该从哪方面入手练习啊?因为目前工作上不是用R的,看完书之后想具体去试一下。

张丹: R其实上手很快,找一本书,认真操作练习一遍就上手了。

2、玉琴:不建议用for loop的原因是考虑到性能问题吗

张丹:for loop是调用的R的循环库,apply是调用C的循环库,性能差距还是很大的

3、来自20群的提问:提个问题,微软对R的收购会对R语言的发展产生什么影响?

张丹:我觉得这是正向发展的,是好事情。大公司看到了R的潜力!

4、尚林栋:R语言金融建模的具体步骤能说一下吗

金融建模的具体步骤,你可以参考这篇文章,http://blog.fens.me/finance-stock-ma/

5、刘嘉丰Alan:丹哥,现在有很多量化平台,提供打包好的函数,在线回测,和自己造轮子拿R语言相比,您觉得各有什么优势呢?

张丹:R的优势就是在数学计算,数据处理上。行业标准还没有统一,所以不一定在线平台的轮子就一定好用。但另外,我们从开发或使用的角度,更多的用到的R包,都是RStudio公司的产品,我觉得是RStudio在推动R的整个的进化过程。

6、我也觉得r语言不错,但经常想不到商业场景,到现在,我只是用它统计考勤,各种绩效kpi,每月算一次奖金,已经这样过去2年了,r语言路在何方哪?

张丹: 你所说的统计,只能说简单计数。比如,你要预测下个月的考勤情况,从而设计预算方案。你可能就需要做个回归分析,这时R就能给你很大的帮助了。生活和工作中,随处都是数据分析的场景。

7、Allen:r在拟合上感觉比python用起来更爽一些,其返回的结果较多

张丹:那么R和python比,R更面向数据,特别是对于没有编程基础的人。PYTHON,还是程序语言,还要了解程序结构,程序架构,代码量不会少。

有IT背景程序员,可能更倾向于PYTHON;如果没有IT背景,R更容易上手。

8、越中女儿:请教一个问题:quantmod对美股的实时接口很好用,对A股不支持,且A股基本面数据才更新到2013.09,请问有好用的ETL包么,类似于python的tushare那样对A股友好的,各种etl啊清洗的脏活累活感觉python更好啊,R就是安安静静做做统计,玩玩图形。

张丹: quantmod使用的是yahoo等国外的数据源,这些数据源本身没有A股数据,如果需要A股数据,用tushare还是不错的。 R特有的data.frame,matrix 等类型和操作方法,在python也需要单独去实现。

9、柠檬味的香草:最近想研究一些互联网文本数据与指数或各股走势的关系,但是在使用R语言处理文本数据不是很方便,丹哥可有一些强大的library推荐,对于非结构,文本数据的处理。

张丹:“尽量使用向量计算或矩阵计算的计算方法”,可以这样理解,对于一个二维结构,for需要2次,0(N^2)的时间复杂度。如果我们把数据,直接就按矩阵存储, 你让矩阵里的每个点都加1, 只需要算一次。Hadley提供的包,源代码我都看过,写很棒,也很实用。

r在拟合上感觉比python用起来更爽一些,其返回的结果较多

其实R有很多的第三方的包,已经有了大量的算法包,而其他语言相对较少。只是我们平时接触的不多,所以觉得用不到。R有大量的统计包,你可以从官方网站找到,输出的结果,大部分也都是统计的结果。

R所支持的行业领域,非常广泛。而工程的语言,不会做细粒度的区分,只是通用的解决方法。

10、郑州—金融数据:python有pandas.DataFrame,pandas应该是第三方的数据库结构吧?R的data.frame是内置的。

张丹:pandas.DataFrame,在底层处理,还需要对原PYTHON的数据结构做映射。当然他可以解决的很好,但你看到的内存结构,可能并不是真正的内存结构。

R内置数据类型,就可以理解是内存结构。不需要再考虑转换了。找一个自己熟悉的语言,大多数的功能,每种语言都是能实现。只有很细的领域,才会进一步区分。

11、RHaoop采用分布式并行计算,那请问如何解决需要嵌套循环的算法。

张丹:对于基于hadoop大数据的MR计算,建议做数学变成,通过数学的角度处理。我写过2个例子,一个是pagerank, 一个是itemcf。

12、@柠檬味的香草:想听听丹哥对传统数据挖掘转量化投资的建议。比如前景?竞争力?

张丹:量化投资,其实是IT人都想转的行业。你写的代码,不是通过工资来赚钱,而直接通过交易赚钱,代码的效用是最大化的。但这个行业竞争很大,聪明人都在这里,要么你的技术牛,要么你了解市场,要么的算法是独特的,不然也很难。

JhT: 做量化交易和策略的都是高智商的

越中女儿:我觉得量化对金融市场的理解比对技术本身更重要,R的需求应该会很快凸显出来。因为数据基础都有了,后面就是差会分析的人了。通常懂数据分析的程序员,比纯程序员待遇高。

13、老师,有好的spark或者hadoop入门的书吗,计算机能力弱和java不懂啊

张丹:hadoop有很多书了,我当初看的是 权威指南。spark的书不了解,我的是网上文档。

14、@Mia.W 学RHadoop需要对Hadoop或Mapreduce了解到什么程度,需要从头学hadoop或java吗

张丹:hadoop的MR的原理要了解,找到懂JAVA的同事,帮你把环境搭好。

15、@JhT 我是刚进来的,R的优势是什么?

张丹:R是免费开源的,CRAN上有8000多个包,遍布各行各业。R语言的3个特性,数学计算,数据建模,可视化。

16、@郑州—金融数据个人感觉商业上matlab比R和python支持度都要好,不管是分析,统计,挖掘还是量化方便,收费的毕竟是收费的

张丹:有商业推动,当然要比免费的好了。不过,像SAS和Matlab也在打通和R的接口,毕竟由全球第三方贡献包,要比一家公司提供的包要多很多的。

17、@越中女儿 有用R做过实盘风控么

张丹:有做,其实不太复杂。你把需要的实时数据,都同步存到redis中,用R在秒级调reids取数据,计算完成再写回去。

18、@Jason.k计算机8g内存,数据虽然行数不多,但是很多列,所以数据csv格式大小会高达几个G,这个规模数据量,内存应该是不够的。

张丹:R的机制,会把数据一次性加载到内存中。就算能读到内存,每次计算时,也会有中间变量,所以你的基础内存是不够的。而且对于win性能会更差。

最后,再次感谢 天善社区的小伙伴们的努力,谢谢大家!

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

打赏作者

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/

打赏作者

尚书视频群活动:投资分析师笔试题

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

关于作者

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

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

uibe

前言

投资分析师一直是大家眼中光鲜耀眼的职业,通常受雇于银行,保险公司,投资公司,制造公司,信托公司,基金管理公司等。他们不仅需要了解国内国际的宏观经济形势,还要为公司和客户提供财政和投资融资建议,是一向非常有挑战性工作。

这次非常高兴,况客能与对外经济贸易大学深度合作,开发“投资分析师”的课程,帮助学生了解职场,提高动手和实战的能力。本次合作项目一经推出,就吸引了外经贸的230位从本科到博士的同学报名,其中170位同学参加了笔试,60位同学入围了面试,最后30位精英同学入选参加第一期的况客训练营。

尚书视频网站也使用了本次题目,拿这次笔试的试卷搞个竞答的活动!尚书视频网站以知识积累,聚集各路跨学科的大侠,经常一边讨论R,一边讨论Node,一会儿聊聊金融量化模型,一会儿又说到了Hadoop大数据的开发,一个跨学科的交流平台。本次的题目也是多种学科知识综合的问题,正巧可以看看大侠们思路,到底有多不一样。

目录

  1. 活动介绍
  2. 笔试题目
  3. 现场照片

1. 活动介绍

作为一名优秀的投资分析师,不仅要具备金融的基础知识,还要理解市场,冷静的思考,逻辑思维,并有一定的数据处理能力。那么,本次况客训练营,为了选拔出优秀的同学,我们在笔试题上面,确实下了一番功夫,包括了3道金融题,1道IT基础题,1道算法题,1道综合建模题。题目都是况客公司各种精英鬼才想出的,其实都是非常有意思题目。

想知道自己的技术到底在一个什么段位? 快来答题吧~~~\(^o^)/~

01

下面引用活动规则:活动规则下载


张丹老师所在的况客科技(北京)有限公司与对外经济贸易大学联合推出的“UIBE-况客投资分析师发展计划”已于2015年10月26日正式启动了。并于10月26日进行了第一轮的笔试考试。管理员我有幸看到了考试试卷,觉着有点儿意思,所以一拍大腿,决定拿这次笔试的试卷搞个竞答的活动!

这次使用的题目,都是张丹老师公司第一轮笔试的考试题啦。当天笔试规定的时间是2个小时,开卷笔试,可以上网。我琢磨着,咱们群里时间给宽松点儿吧,一周吧!依旧是开卷,可以上网,随便查,群内的兄弟姐妹老少爷们儿们都可以参加,没门槛限制!答完了就发送到我邮箱里,其中一定要包括“姓名”、“QQ号”、“群名片”呦!张丹老师统一阅卷,得分最高的前三名送张丹老师写的《R的极客理想-高级开发篇》一本!!

  • 活动时间:2015.10.30—2015.11.6
  • 活动范围:尚书视频 QQ群 内所有成员
  • 活动方式:开卷笔试,可以上网,随便查!!!
  • 答案提交方式:邮件提交
  • 答案提交截止日期:2015.11.6
  • 邮箱地址:onbook001@163.com
  • 活动奖品:《R的极客理想-高级开发篇》
  • 活动咨询:尚书视频 QQ群内 助理-管理员
  • QQ群:383275651

r2-200

还没有加群的朋友,快来申请吧,QQ群:383275651

非常感谢 华章公司-机械工业出版社 为本次活动提供图书奖品!!

2. 笔试题目

“UIBE-况客投资分析师发展计划”:旨在通过对外经济贸易大学重点金融实验室的优秀资源和况客公司的金融技术优势,在金融建模、量化编程、投研报告撰写等方面对学员进行系统的培训,使得学员的投资实战能力大大提高。作为投资分析师的摇篮计划,该项目不仅培养学生的投资研究实战能力,并将优秀学员推荐至国内外著名金融机构进行实习和工作。

接下来,就是本次的题目的,全都是简答题。祝大家好运!

02

1. 阐述个人选择股票的逻辑,并介绍在实际操作中如何实现。

2. 假设作为FOF的基金经理,你管理着1000万人民币的投资组合,可投资范围包括A和B两个指数增强型基金,此外可以投资于IC、IF和IH等股指期货合约。A基金的参考基准为沪深300指数,预计基金超额业绩为年化2%;B基金的参考投资基准为中证500指数, 预计基金超额业绩为年化5%。在要求组合业绩相对于沪深300指数的beta不能显著偏离1的情况下,尽可能地提高投资组合的业绩。请阐述你如何构建投资组合。

3. 资产管理是个竞争非常激烈的行业,对于大部分的基金管理人来说都会面临与同行进行排名的压力。国内一般采用年度考核的方式来评估一个基金经理的能力,现在假设你管理的同类型基金有N个同行业竞争者,目前距离年度结束只有T天,而你所管理的基金的最新排名在m,而你的目标是尽量在年度结束的时候获得尽量靠前的排名。假设市场是完全有效的市场,金融资产的收益率服从均值为0的正态分布,但是基金经理可以选择所配置金融资产的波动率d(也就是正态分布的标准差)。根据基金经理的从业经验,如果排名越落后的情况下,在剩下的时间T里,一般会选择提高所配置资产的风险水平d。请设计一套量化分析的方法验证该经验是否合理(本题目为开放型题目,没有标准答案; 可以从数学角度或者计算机程序设计的角度出发回答这个问题)。

4. 列出你所熟悉的编程或建模工具,并描述工具的特点,以及你的使用场景。

5. 实现一个回字形矩阵,内圈比外圈每一圈小1,最内圈为数字1。要求给定初始值,画出整个矩阵,请提供思路和伪代码。比如,初始值为3的回字形矩阵,如下所示:


3  3  3  3  3
3  2  2  2  3
3  2  1  2  3
3  2  2  2  3
3  3  3  3  3

6. “月上柳梢头,人约黄昏后”,出自北宋文学家欧阳修的《生查子》,全词富于诗情画意,此句更是唯美,被广为传唱。 请查阅天文学资料,建立模型,实现如下要求:

  • 定义画面中的时间;
  • 定义模型的各个因子,选用文字、图表、算法等形式描述模型;
  • 运用模型,推算北京今年有几次这样的时间;
  • 3年后,去国外哪个城市,什么时间去才能满足上述画面?

嘿嘿,一共6道题,记得发邮件!

3. 现场照片

笔试的考场

03

火爆的笔试现场

5

6

7

8

3个严肃的面试官

10

9

面试过程中的小组讨论环节

11

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

打赏作者