• Archive by category "R语言实践"

Blog Archives

2016IAIS人工智能产业论坛:用R语言进行投资组合管理

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

关于作者

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

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

ai-title-v2

前言

很荣幸能够参加人工智能产业论坛,正巧手头有向项目是做智能投顾,算是人工智能在金融领域的应用。会议在武汉光谷,我是第一次到武汉,住在东湖边,非常漂亮,也逛了传说中的美丽的武汉大学。

本次会议包括了8个专场,金融专场、医疗专场、智能机器人专场、图像声音算法专场、深度学习专场、大数据应用专场、人工智能应用专场、投融资专场。有1600人报名,嘉宾阵容也是非常强大,大部分都是PHD。我非常认真地听了6场分享,深刻地体会到了人工智能在崛起,在慢慢地改变着我们的生活。

我非常有幸参加2016年的人工智能产业论坛,作为智能金融场的分享嘉宾,分享R语言在金融领域中的应用。

目录

  1. 我的演讲主题:用R语言进行投资组合管理
  2. 会议体验和照片分享

1. 我的演讲主题:用R语言进行投资组合管理

用R语言进行投资组合管理,PPT下载,主要内容来自我的一篇博文:用R语言解读资本资产定价模型。(未发布)

01

我本次分享的主要是介绍的是 资本资产定价模型(CAPM),这是奠定现代金融基础的理论,从背景、理论研究、到数学模型、再到R语言建模、最后结合实战分析一个投资组合的案例。

分享的目录大纲如下:

  • 故事开始
  • 资本市场线
  • 资本资产定价模型
  • Beta VS Alpha
  • 用R构建投资组合模型
  • 总结

如果你接触过金融二级市场的交易,你可能经常会听到Beta,Alpha,马克维茨,CAPM等名词。但是能把这些词的准确含义讲清楚的人其实并不多,可能就连有些专业的人也讲不清楚。对于对冲基金经理,他们每天都在根这些概念打交道,有了这些金融的理论基础,你的交易风格就会很专业,和散户的明显区别。

我还是一直延续了一贯的演讲风格,有内容,有图片,有代码,有互动。从方法理论的思路开始,到市场特征检验,再到数学公式,R语言建模,把知识和市场操作联系起来,听完我的分享,你回去把上就可以动手实践。利用IT人的技术优势,可以真正地与实际操作结合起来,实现从IT技术到价值的转变。

2. 会议体验和照片分享

本次会议给我感觉非常专业,大部分都是PHD,而且嘉宾讲话思路非常清楚,干货拿出来,真的非常棒。我是完全没有想到,在武汉能够做出这么高水平的会议。不得不说一句,所有的工作人员辛苦了!

IAIS2016立足中国光谷,辐射全球,本届大会由湖北省唯一一家提供“智能交互”服务的企业飔拓承办,大会将汇聚国内外人工智能、大数据领域产学研用专家,共同探讨行业趋势、应用案例、技术动态,旨在推动产业与技术结合、合作创新、联合共赢,助力企业、社会、个人提升效能,构建起以人工智能为核心的产业生态圈。

本次会议的主页:http://www.bagevent.com/event/194596。我在本次大会中结实了,很多不同领域教授和专家,让我深刻地了解到了,机器学习、机器人、人工智能领域正在大踏步的进步。

02

2.1 我的分享是在10月25日下午的智能金融专场,第二位分享嘉宾。

03

金融专场5位嘉宾:

张连平,本场的主持人,高伟达研发中心VP,主题:银行业大数据IT运维探索。
吴炜 ,万达网络数据专家,主题:欺诈检测中的特征自动发现。(能把GBRT算法用自己话讲明白)
张丹,《R的极客理想》系列图书作者,前况客创始人兼CTO,主题:用R语言进行投资组合管理。
邢艳凯 ,中关村大数据产业联盟副秘书长,主题:金融征信主题。
杜小军 ,中润普达总裁,主题: 基于大数据的产业金融创新应用及商业机会。

金融会场,嘉宾在分享的照片。

吴炜
09

张丹
14

张连平
12

邢艳凯
10

杜小军
11

2.2 会议相关照片

晚宴后,嘉宾全家福,我错过了……555555555555
08

李成华 博士,飔拓科技董事长,原京东DNN实验室首席科学家
21

苏中 博士,IBM中国研究院研究总监、大数据及认知计算研究方向首席科学家
20

杜子东 博士,寒武纪科技高级研究员
17

颜深根 博士,商汤公司主任研究员
18

向磊,EasyHadoop创始人
16

谢邦昌,台北醫學大學管理學院及大數據研究中心 院長/主任
13

兴宝,会议主办方负责人
22

10年没见的大学同学,在武汉相遇
23

智能小机器人
06

24

最后,感谢IAIS工作人员的辛苦劳动,希望保持高水平会议越办越好!

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

打赏作者

2016CDAS中国数据分析师行业峰会:如何用R语言进行量化分析

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

关于作者

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

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

cdas2016

前言

今年的数据分析师大会,非常火爆!所说报名有5000人,到时参会达到3000+人的规模,比去年的场面大了10倍。分享主题也开拓到15个,包括了 大数据与金融,大数据与人工智能,大数据与生物医疗,大数据人力资源管理,电子表格应用大会,CDA数据分析师专场,大数据与云计算,数据库技术与实战,大数据与交通旅游,网络与通讯大数据,数据可视化与商业BI,电商大数据,互联网大数据,大数据与人才培养,大数据与共享。其中,大数据与金融 和 大数据与人工智能爆满,不仅坐位坐满,而且地面都坐了满,盛况空前。

我非常有幸参加2016年的中国数据分析师行业峰会,作为大数据与金融场的分享嘉宾,分享R语言在金融领域中的应用。

目录

  1. 我的演讲主题:如何用R语言进行量化分析
  2. 会议体验和照片分享

1. 我的演讲主题:如何用R语言进行量化分析

如何用R语言进行量化分析,PPT下载,主要内容来自我的一篇博文:R语言为量化而生

ppt

本次分享的主题全面的论述了,为什么我们要用R来做量化投资这件事,从理论到操作方法,再到实战案例;从研究方法到工程实践的过程。

R语言适合做量化分析的5个理由:

  • R语言是统计语言,对数学计算和统计计算有良好的支持。
  • R语言是面向数据的,金融玩的就是数据。
  • R语言有完善第三方包体系,提供很多的量化工具包支持。
  • R语言本身很简单,易学易上手。
  • R语言有清晰的体系结构。

看上去5个理由很清晰和简单,我也是花了很长的时间才得出的总结。为了让现场的听众,能快速理解主题,我加了不少的数据分析方法和例子。比如,用R解一个一元二次方程组,用R计算移动平均线,根据期货黑色系的上下游关系进行多元回归分析等。R语言给了我们非常大的帮助,短短的几行代码就可以设计一个复杂的模型出来。

我还是一直延续了一贯的演讲风格,有内容,有图片,有代码,有互动。从方法理论的思路开始,到市场特征检验,再到数学公式,R语言建模,把知识和市场操作联系起来,听完我的分享,你回去把上就可以动手实践。利用IT人的技术优势,可以真正地与实际操作结合起来,实现从IT技术到价值的转变。

2. 会议体验和照片分享

今年的数据分析师大会太火爆了,比去年的场面大很多,从分享嘉宾规模,分享主题,到参会人员都达到了大型会议的组织规模。不得不说一句,所有的工作人员辛苦了!

“万象尽说,慧聚未来”是本次会议的主题,会议主页:http://cdas.cda.cn/。本次大会结实了,很多不同领域对于数据的高手,特别是大数据人力资源管理,让我了解到了一个新的方向。

01

去年的数据分析师大会,我也参加了分享,请参考文章,2015CDAS中国数据分析师行业峰会:R语言量化投资数据分析应用

2.1 我的分享是在9月3日下午的大数据与金融,第五位分享嘉宾。

intro

鲍忠铁,本场的主持人,Talkingdata首席金融行业专家,主题:深度商业分析在金融行业的实践
曹犟,神策数据联合创始人,主题:数据驱动与指标体系构建。
丁磊,汇百川信用CTO,主题:人工智能助力新金融。
于建明,京东金融量化交易研发负责人,主题:京东股票之量化交易实践。
张丹,R语言资深用户,系统架构师,前况客创始人兼CTO,主题:如何用R语言做量化分析。

我在分享的照片(照相技术差了点)
07

金融会场照片
06

2.2 会议相关照片

大会开幕式
05

08

10

14

13

16

02

15

17

11

12

最后,感谢CDAS工作人员的辛苦劳动,希望保持高水平会议越办越好!

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

打赏作者

当R语言遇上Docker

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

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

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

关于作者:

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

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

r-docker

前言

R语言作为数据分析的工具,已经广泛被大家所接受并使用。但要把R语言项目工程化,部署到生产环境,提供在线用户使用却是难度很大的。主要原因就是R本身是单线程的,不支持并行处理。

当R遇到上了Docker会发生什么呢?本文将做详细的解释。

目录

  1. 当R遇到上了Docker
  2. 用Docker来管理R的程序

1. 当R遇到上了Docker

前言中提到,R运行时环境是单线程的,不支持并行处理,所以我们很难把R直接应用到生产环境中。当R遇到上了Docker,就出现了一个可以解决上面问题的方案。

通过Docker的容器化技术,把R的应用Docker化。每当用户发出请求,程序可以自动地在线启动一个Docker化的容器,来装载R的任务,部署,运行,计算,并返回结果。

r-docker2

从极端的情况考虑,如果要面对100万次并发的请求,我们需要启动100万个Docker的容器,每次容器单独执行自己的任务。但这种情况是要避免的,因为R本身来说,是做数据任务的,并不善于处理web是请求。如果可以把用户的大批量请求,转换成少量的数据计算的任务,那么这个设计就完美地解决了R由于并发而不能被工程化的问题。

r-docker3

比如,针对大量用户的重复性计算,把R的计算结果保存在缓存池中。

2. 用Docker来管理R的程序

设计方案定好,接下来就是就是动手实践了。

操作过程分成4步:

  • 1. 要有Docker的环境
  • 2. 找到第三方成熟的R语言的Docker镜像
  • 3. 把我们的R程序装进去
  • 4. 打包,运行,上传

1. Docker的环境。

安装Docker环境,就不在本文中介绍了,Docker环境的安装,请参考文章在Ubuntu中安装Docker

2. 找到第三方成熟的R语言的Docker镜像。

在docker hub中,搜索关键字 r, 共有535条结果。我们直接选用,排在第一位的r-base做为Docker容器的基础就行了。

docker-r

从仓库中,下载r-base镜像。


# 下载r-base镜像,大概300mb要下一会儿
~ sudo docker pull r-base
Using default tag: latest
latest: Pulling from library/r-base
9cd73496e13f: Pull complete 
f10af350cd29: Pull complete 
eea7b33eea97: Pull complete 
c91475e50472: Pull complete 
1e5e5f6785b4: Pull complete 
8c4091261ff6: Pull complete 
Digest: sha256:5f06e5a89cc64cbc513d02a8c650ea8bcbf0499795add57d18793069795c6f8d
Status: Downloaded newer image for r-base:latest

# 查看本地镜像列表
~ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
bsspirit/fensme     latest              8496b10e857a        2 hours ago         182.8 MB
ubuntu              latest              f8d79ba03c00        2 weeks ago         126.4 MB
r-base              latest              e2abe45e47d7        3 weeks ago         959.9 MB

3. 把我们的R程序装进去。

把R程序放进去之前,我们要先通过命令交互的方法,看看r-base容器中,是什么样子的。

运行r-base容器,会直接打开一个R的命令行窗口。


~ sudo docker run -ti --rm r-base

R version 3.3.1 (2016-06-21) -- "Bug in Your Hair"
Copyright (C) 2016 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

  Natural language support but running in an English locale

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> 

我们通过执行R语言程序,了解一下Docker环境的信息。


# R程序启动路径
> getwd()
[1] "/"

# 当前路径中的目录
> dir()
 [1] "bin"   "boot"  "dev"   "etc"   "home"  "lib"   "lib64" "media" "mnt"  
[10] "opt"   "proc"  "root"  "run"   "sbin"  "srv"   "sys"   "tmp"   "usr"  
[19] "var"  

# 用户身份
> system('whoami')
root

# 系统信息
> sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux stretch/sid

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base    

# R语言版本
> R.Version()
$platform
[1] "x86_64-pc-linux-gnu"

$arch
[1] "x86_64"

$os
[1] "linux-gnu"

$system
[1] "x86_64, linux-gnu"

$status
[1] ""

$major
[1] "3"

$minor
[1] "3.1"

$year
[1] "2016"

$month
[1] "06"

$day
[1] "21"

$`svn rev`
[1] "70800"

$language
[1] "R"

$version.string
[1] "R version 3.3.1 (2016-06-21)"

$nickname
[1] "Bug in Your Hair"

通过上面的几条命令,r-base容器的系统环境已经掌握。接下来,我们可以写一个R的算法,让这个程序在r-base的容器中运行。退出容器。

新建项目目录


~ mkdir ret && cd ret
~ pwd
/home/conan/ret

我们用a.r写一个计算万科(WANK)000002.SZ股票收益率的程序。数据从yahoo财经进行采集,R语言用于收益率计算,计算结果通过在控制台打印。

wanke

新建R语言算法文件,a.r。


~ vi a.r

install.packages(c('quantmod','PerformanceAnalytics'))
library(quantmod)
library(PerformanceAnalytics)
VANKE<-getSymbols("000002.SZ",auto.assign = FALSE, from = '2010-10-10')
close<-VANKE$'000002.SZ.Close'
ret<-CalculateReturns(close, method = "discrete")
cumret<-cumprod((ret+1)[-1])-1
VANKE_ret<-merge(close,ret,cumret)
names(VANKE_ret)<-c('close','ret','cumret')
print(tail(VANKE_ret))

我们先在本机中运行这段代码。


> 安装类库
> install.packages(c('quantmod','PerformanceAnalytics'))
> # 装载类库
> library(quantmod)
> library(PerformanceAnalytics)
> 
> # 获得VANKE每K线数据
> VANKE<-getSymbols("000002.SZ",auto.assign = FALSE, from = '2010-10-10')
>
> # 收盘价
> close<-VANKE$'000002.SZ.Close'
> 
> # 每日收益率 = (T日收盘价 - (T-1日收盘价))/T-1日收盘价
> ret<-CalculateReturns(close, method = "discrete")
> 
> # 每日累计收盘率 = (T日收益率+1)*(T+1日收益率+1)*...*(T+N日收益率+1)-1
> cumret<-cumprod((ret+1)[-1])-1
> 
> # 合并数据集
> VANKE_ret<-merge(close,ret,cumret)
> names(VANKE_ret)<-c('close','ret','cumret')
> 
> # 查看VANKE最近几日收益率
> print(tail(VANKE_ret))
           close          ret   cumret
2016-08-18 25.58 -0.010444874 1.893665
2016-08-19 24.59 -0.038702111 1.781674
2016-08-22 24.70  0.004473363 1.794118
2016-08-23 24.70  0.000000000 1.794118
2016-08-24 23.99 -0.028744939 1.713801
2016-08-25 23.54 -0.018757816 1.662896

接下来,编写Dockerfile通过加载外部文件的方法。


~ vi Dockerfile

FROM r-base
COPY . /usr/local/src/myscripts
WORKDIR /usr/local/src/myscripts
CMD ["Rscript", "a.r"]

4. 打包,运行,上传。

打包,生成Docker的镜像文件a.r。


~ sudo docker build -t a.r .
[sudo] password for conan: 
Sending build context to Docker daemon 3.072 kB
Step 1 : FROM r-base
 ---> e2abe45e47d7
Step 2 : COPY . /usr/local/src/myscripts
 ---> e6ef215d3683
Removing intermediate container aaabfdfe92ab
Step 3 : WORKDIR /usr/local/src/myscripts
 ---> Running in e3f2c65b947a
 ---> c667baee06bf
Removing intermediate container e3f2c65b947a
Step 4 : CMD Rscript a.r
 ---> Running in dc040bbdd3b9
 ---> 9a48d6dc02fe
Removing intermediate container dc040bbdd3b9
Successfully built 9a48d6dc02fe

启动r-base容器,运行a.r的脚本。


~  sudo docker run a.r

看着大段的日志从眼前飞过,计算出了万科的收益率的结果。

docker-r2

最后一步,不忘上传到docker hub,仓库地址为:https://hub.docker.com/r/bsspirit/ret/

上传镜像的操作命令:


~ sudo docker tag 9a48d6dc02fe bsspirit/ret
~ sudo docker push bsspirit/ret

如果你有Docker的环境,你可以直接用下面的命令,进行容器下载和运行。


~ sudo docker run bsspirit/ret

R和Docker的相遇,给R提供了并行计算施展的空间。Docker和R的相遇,也让Docker能够切入数据处理领域,有了更广阔的应用场景。感谢R和Docker给程序员的世界,带来了新的机会!!

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

打赏作者

R语言解读自回归模型

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

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

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

关于作者:

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

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

r-ar

前言

时间序列是金融分析中常用到的一种数据格式,自回归模型是分析时间序列数据的一种基本的方法。通过建立自回归模型,找到数据自身周期性的规律,从而帮助我们理解金融市场的发展变化。

在时间序列分析中,有一个常用的模型包括AR,MA,ARMA,ARIMA,ARCH,GARCH,他们的主要区别是适用条件不同,且是层层递进的,后面的一个模型解决了前一个模型的某个固有问题。本文以AR模型做为开始,将对时间序列分析体系,进行完整的介绍,并用R语言进行模型实现。

由于本文为非统计的专业文章,所以当出现与教课书不符的描述,请以教课书为准。本文力求用简化的语言,来介绍自回归模型的知识,同时配合R语言的实现。

目录

  1. 自回归模型介绍
  2. 用R语言构建自回归模型
  3. 模型识别ACF/PACF
  4. 模型预测

1. 自回归模型(AR)

自回归模型(Autoregressive model),简称AR模型,是统计上一种处理时间序列的方法,用来描述当前值与历史值之间的关系,用变量自身的历史时间数据对自身进行预测,自回归模型必须满足平稳性的要求。比如,时间序列数据集X 的历史各期数据从X1至Xt-1,假设它们为线性关系,可以对当期Xt的表现进行预测。X的当期值等于一个或数个落后期的线性组合,加常数项,加随机误差。

p阶自回归过程的公式定义:

ar-forumla

字段解释:

  • Xt是当期的X的表现
  • c是常数项
  • p是阶数,i为从1到p的值
  • φi是自相关系数
  • t为时间周期
  • εt是均值为0,标准差为δ 的随机误差,同时δ是独立于t的

对于一阶自回模型,用AR(1)来表示,简化后的公式为:

ar1-forumla

自回归是从线性回归分析中发展而来,只是把自变量x对因变量y的分析,变成自变量x对自身的分析。如果你需要了解线性回归的知识,请参考文章R语言解读一元线性回归模型

自回归模型的限制

自回归模型是用自身的数据来进行预测,但是这种方法受到一定的限制:

  • 必须具有平稳性,平稳性要求随机过程的随机特征不随时间变化。
  • 必须具有自相关性,如果自相关系数(φi)小于0.5,则不宜采用,否则预测结果极不准确。
  • 自回归只适用于预测与自身前期相关的现象,即受自身历史因素影响较大的现象。对于受其他因素影响的现象,不宜采用自回归,可以改用向量自回归模型。

平稳性时间序列的特点

平稳性要求产生时间序列Y的随机过程的随机特征不随时间变化,则称过程是平稳的;假如该随机过程的随机特征随时间变化,则称过程是非平稳的。

平稳性是由样本时间序列所得到的拟合曲线,在未来的一段期间内能顺着现有的形态能一直地延续下去;如果数据非平稳,则说明样本拟合曲线的形态不具有延续的特点,也就是说拟合出来的曲线将不符合当前曲线的形态。

  • 随机变量Yt的均值和方差均与时间t无关
  • 随机变量Yt和Ys的协方差只与时间差(步长)t-s有关
  • 对于平稳时间序列在数学上有比较丰富的处理手段,非平稳的时间序列通过差分等手段转化为平稳时间序列处理

2. 用R语言构建自回归模型

了解了自回归模型的定义,我们就可以用R语言来模拟一下自回归模型的构建和计算过程。

生成一个随机游走的数据集,满足平稳性的要求。


# 随机游走的数据集
> set.seed(0)
> x<-w<-rnorm(1000)       # 生成符合正态分布N(0,1)的数据
> for(t in 2:1000) x[t]<-x[t-1]+w[t]
> tsx<-ts(x)              # 生成ts时间序列的数据集

# 查看数据集
> head(tsx,15)
 [1] 1.2629543 0.9367209 2.2665202 3.5389495 3.9535909 2.4136409
 [7] 1.4850739 1.1903534 1.1845862 3.5892396 4.3528331 3.5538238
[13] 2.4061668 2.1167053 1.8174901

> plot(tsx)            # 生成可视化图形 
> a<-ar(tsx);a         # 进行自回归建模

Call:
ar(x = tsx)

Coefficients:
     1  
0.9879  

Order selected 1  sigma^2 estimated as  1.168

数据的如图展示:
01

自相关系数为0.9879 ,这是一个非常强的自相关性,所以上述的数列符合自相关的特性。

R语言中ar()函数提供了多种自相关系数的估计,包括"yule-walker", "burg", "ols", "mle", "yw",默认是用yule-walker方法,常用的方法还有最小二乘法(ols),极大似然法(mle)。

我们用最小二乘法,来进行参数估计。


> b<-ar(tsx,method = "ols");b

Call:
ar(x = tsx, method = "ols")

Coefficients:
     1  
0.9911  

Intercept: -0.017 (0.03149) 

Order selected 1  sigma^2 estimated as  0.9906

用最小二乘法的计算结果,则自相关系统数为0.9911,截距为-0.017。只有使用最小二乘法进行参数估计的时候,才会有截距。

我们用极大似然法,来进行参数估计。


> d<-ar(tsx,method = "mle");d

Call:
ar(x = tsx, method = "mle")

Coefficients:
     1  
0.9904  

Order selected 1  sigma^2 estimated as  0.9902

用极大似然法计算结果,则自相关系统数为0.9904。对于上面3种估计方法,自相关系数的值都是很接近的。

3. 模型识别ACF/PACF

在上面的例子中,我们默认是用一阶的自回归模型AR(1),进行程序实现的。在实际应用中,自回归模型AR时间序列的阶数P是未知的,必须根据实际数据来决定,就要对AR模型定阶数。常的方法就是利用自相关函数(ACF)和偏自相关函数(PACF)来确定自回归模型的阶数。在ACF/PACF不能确定的情况下,还需要用AIC(Aikaike info Criterion)、BIC(Bayesian information criterion)的信息准则函数来确定阶数。

自回归模型的确立过程,是通过确定阶数,参数估计,再次确定阶数的方法进行判断。自相关函数ACF,用来确定采用自回归模型是否合适。如果自相关函数具有拖尾性,则AR模型为合适模型。偏自相关函数PACF用来确定模型的阶数,如果从某个阶数之后,偏自相关函数的值都很接近0,则取相应的阶数作为模型阶数,偏自相关函数通过截尾性确定阶数。

1. 自相关函数ACF(autocorrelation function)

将一个有序的随机变量序列与其自身相比较,这就是自相关函数在统计学中的定义。每个不存在相位差的序列,都与其自身相似,即在此情况下,自相关函数值最大。如果序列中的组成部分相互之间存在相关性(不再是随机的),则由以下相关值方程所计算的值不再为零,这样的组成部分为自相关。

自相关函数反映了同一序列在不同时序的取值之间的相关程序。

ACF的公式为:

acf-forumla

字段解释

  • Pk,为ACF的标准误差
  • t,为数据集的长度
  • k,为滞后,取值从1到t-1,表示相距 k个时间间隔的序列值之间的相关性
  • Yt,为样本在t时期的值
  • Yt-k,为样本在t-k时期的值
  • μ,为样本的均值

所得的自相关值Pk的取值范围为[-1,1],1为最大正相关值,-1则为最大负相关值,0为不相关。

根据上面公式,我们可以手动计算出tsx数据集的ACF值


> u<-mean(tsx)  #均值
> v<-var(tsx)   #方差

> # 1阶滞后
> p1<-sum((x[1:length(tsx)-1]-u)*(x[2:length(tsx)]-u))/((length(tsx)-1)*v);p1
[1] 0.9878619
> # 2阶滞后
> p2<-sum((x[1:(length(tsx)-2)]-u)*(x[3:length(tsx)]-u))/((length(tsx)-1)*v);p2
[1] 0.9760271
> # 3阶滞后
> p3<-sum((x[1:(length(tsx)-3)]-u)*(x[4:length(tsx)]-u))/((length(tsx)-1)*v);p3
[1] 0.9635961

同时,我们可以用R语言中的acf()函数来计算,会打印前30个滞后的ACF值。


> acf(tsx)$acf
, , 1

           [,1]
 [1,] 1.0000000
 [2,] 0.9878619
 [3,] 0.9760271
 [4,] 0.9635961
 [5,] 0.9503371
 [6,] 0.9384022
 [7,] 0.9263075
 [8,] 0.9142540
 [9,] 0.9024862
[10,] 0.8914740
[11,] 0.8809663
[12,] 0.8711005
[13,] 0.8628609
[14,] 0.8544984
[15,] 0.8462270
[16,] 0.8384758
[17,] 0.8301834
[18,] 0.8229206
[19,] 0.8161523
[20,] 0.8081941
[21,] 0.8009467
[22,] 0.7942255
[23,] 0.7886249
[24,] 0.7838154
[25,] 0.7789733
[26,] 0.7749697
[27,] 0.7709313
[28,] 0.7662547
[29,] 0.7623381
[30,] 0.7604101
[31,] 0.7577333

比较前3个值的计算结果,与我们自己的计算结果是一样的,同时可以用R语言进行可视化输出。


> acf(tsx)

02

从上图中看出,数据的ACF为拖尾,存在很严重的自相关性。接下来,这时候我们用偏自相关函数确定一下AR的阶数。

2. 偏自相关函数(PACF)(partial autocorrelation function)

偏自相关函数是有自相关函数推到而来。对于一个平稳AR(p)模型,求出滞后k自相关系数p(k)时,实际上得到并不是x(t)与x(t-k)之间单纯的相关关系。因为x(t)同时还会受到中间k-1个随机变量x(t-1)、x(t-2)、……、x(t-k+1)的影响,而这k-1个随机变量又都和x(t-k)具有相关关系,所以自相关系数p(k)里实际掺杂了其他变量对x(t)与x(t-k)的影响。

为了能单纯测度x(t-k)对x(t)的影响,引进偏自相关系数的概念。对于平稳时间序列{x(t)},所谓滞后k偏自相关系数指在给定中间k-1个随机变量x(t-1)、x(t-2)、……、x(t-k+1)的条件下,或者说,在剔除了中间k-1个随机变量x(t-1)、x(t-2)、……、x(t-k+1)的干扰之后,x(t-k)对x(t)影响的相关程度。

简单来说,就是自相关系数ACF还包含了其他变量的影响,而偏自相关系数PACF是严格这两个变量之间的相关性。在ACF中存在着线性关系和非线性关系,偏自相关函数就是把线性关系从自动关系性中消除。当PACF近似于0,表明两个时间点之间的关系性是完全由线性关系所造成的。

通过R语言的pacf()函数来进行偏自相关函数计算。


> pacf(tsx)$acf
, , 1

              [,1]
 [1,]  0.987861891
 [2,]  0.006463542
 [3,] -0.030541593
 [4,] -0.041290415
 [5,]  0.047921168
 [6,] -0.009774246
 [7,] -0.006267004
 [8,]  0.002146693
 [9,]  0.028782423
[10,]  0.014785187
[11,]  0.019307564
[12,]  0.060879259
[13,] -0.007254278
[14,] -0.004139848
[15,]  0.015707900
[16,] -0.018615370
[17,]  0.037067452
[18,]  0.019322565
[19,] -0.048471479
[20,]  0.023388065
[21,]  0.027640953
[22,]  0.051177900
[23,]  0.028063875
[24,] -0.003957142
[25,]  0.034030631
[26,]  0.004270416
[27,] -0.029613088
[28,]  0.033715973
[29,]  0.092337583
[30,] -0.031264028

# 可视化输出 
> pacf(tsx)

03

从上面的这个结果分析,当滞后为1时AR模型显著,滞后为其他值是PACF的值接近于0不显著。所以,对于数据集tsx来说,数据满足AR(1)的自回归模型。对于上文中参数估计出的1阶自相关系数值是可以用的。

4. 模型预测

通过模型识别,我们已经确定了数据集tsx是符合AR(1)的建模条件的,同时我们也创建了AR(1)模型。接下来,就可以利用这个自回测的模型的进行预测,通过规律发现价值。在R语言中,我们可以用predict()函数,实现预测的计算。

使用AR(1)模型进行预测,并保留前5个预测点。


> predict(a,10,n.ahead=5L)
$pred
Time Series:
Start = 2 
End = 6 
Frequency = 1 
[1] 9.839680 9.681307 9.524855 9.370303 9.217627

$se
Time Series:
Start = 2 
End = 6 
Frequency = 1 
[1] 1.080826 1.519271 1.849506 2.122810 2.359189

上面结果中,变量$pred表示预测值,变量$se为误差。

我可以生成可视化的图,更直观的看到预测的结果。


# 生成50个预测值 
> tsp<-predict(a,n.ahead=50L)

# 把原数据画图 
> plot(tsx)

# 把预测值和误差画出来
> lines(tsp$pred,col='red')                
> lines(tsp$pred+tsp$se,col='blue')
> lines(tsp$pred-tsp$se,col='blue')

04

图中,黑色线为原始数据的,红色线为预测值,蓝色线为预测值的范围。这样我们就利用AR(1)模型,实现了对规律的预测计算。

上面关于预测和可视化的过程,我们是通过原生的predict()函数和plot()函数完成的。在R语言中,可以用forecast包来简化上面的操作过程,让代码更少,操作更便捷。


# 加载forecast包
> library('forecast')

# 生成模型AR(1) 
> a2 <- arima(tsx, order=c(1,0,0))
> tsp2<-forecast(a2, h=50)
> plot(tsp2)

05

查看forecast()计算后的预测结果。


> tsp2
     Point Forecast     Lo 80      Hi 80     Lo 95       Hi 95
1001      -15.71590 -16.99118 -14.440628 -17.66627 -13.7655369
1002      -15.60332 -17.39825 -13.808389 -18.34843 -12.8582092
1003      -15.49181 -17.67972 -13.303904 -18.83792 -12.1456966
1004      -15.38136 -17.89579 -12.866932 -19.22685 -11.5358726
1005      -15.27197 -18.06994 -12.474000 -19.55110 -10.9928432
1006      -15.16362 -18.21425 -12.112996 -19.82915 -10.4980922
1007      -15.05631 -18.33593 -11.776682 -20.07206 -10.0405541
1008      -14.95001 -18.43972 -11.460312 -20.28705  -9.6129750
1009      -14.84474 -18.52891 -11.160567 -20.47919  -9.2102846
1010      -14.74046 -18.60591 -10.875013 -20.65216  -8.8287673
1011      -14.63718 -18.67257 -10.601802 -20.80877  -8.4655994
1012      -14.53489 -18.73030 -10.339486 -20.95121  -8.1185723
1013      -14.43357 -18.78024 -10.086905 -21.08123  -7.7859174
1014      -14.33322 -18.82333  -9.843112 -21.20026  -7.4661903
1015      -14.23383 -18.86034  -9.607319 -21.30947  -7.1581923
1016      -14.13538 -18.89190  -9.378864 -21.40985  -6.8609139

通过forecast()函数,直接生成了Forecast值,80%概率的预测值范围,和95%概率的预测值范围。

在明白了整个自回归模型的设计思路、建模过程、检验条件、预测计算、可视化展示的完整操作后,我们就可以真正地把自回归模型用到实际的业务中。发现规律,发现价值!!

自回归模型只是开始,下一篇继续介绍移动平均模型(MA)的建模和使用过程。

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

打赏作者

R语言量化投资常用包总结

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

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

关于作者:

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

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

quant-packages

前言

总是被很多的人问,为什么用R语言做量化投资,R、Python、Matlab比起来哪个更好?其实,答案很简单,你哪个用的熟就用哪个,工具是用来提升效率的,结果才是你会得到的。认准一门语言,坚持把它做好你就会成长。

每个领域,每种编程语言都用推动它前进的人,跟上牛人的脚步,你慢慢地也会变牛。

目录

  1. 为什么用R语言做量化投资?
  2. 常用量化投资工具包

1. 为什么用R语言做量化投资?

R做量化投资到底有哪些优势呢?最主要的一点,就是R语言有很多第三方包的支持。通常编程语言的设计,都是为了解决软件开发和程序实现的问题。但R语言在开始时,就被设计为主要解决数据的问题。量化投资就是对数据进行各种数据处理、数据分析,从而找到数据的规律。所以,有很多从事量化投资的人,把R语言用来构建量化交易的模型,进行回测,风险管理等,最后把研究成果开源并贡献给R语言的社区,为后面的人提供了非常大的帮助。

相比Python来说也有很多的第三方包的支持,这些第三方大部分提供是Web开发,数据爬虫,系统管理,数据库调用,数学计算等,这些都是属于通用的软件需求,而非某个行业的数据需求。当某个Python大神,开始关注量化投资领域,并用Python实现了一套量化的程序库,后面的人就会进入这个领域,只是沿着大神的路线走,等待下一个大神的出现。所以本质上,Python是面向程序设计的语言,而R是面向数据的语言。

R语言在量化投资领域,已经有很多年的积累,很多的算法已经成型。从投资研究到交易分析,再到风险管理,有着完整的体系结构。我们同样可以沿着前人走出来的路,快速学习,快速搭建出量化投资的系统来。对于有IT但背景缺乏金融知识的人来说,有很多的部分知识上手比较困难,同时看不太懂各种统计指标,对学习造成了很大的阻力。这其实是你深入到具体地某个行业后,都会面临的问题。行业知识和数学知识才是最难的,只有突破了,你才能打开认知新领域的方法。

R语言让我们更接近数据,同时提供了各种数学统计的工具,又有大量由第三方贡献的行业知识库,所以我会选择R语言,我会把R语言作为最好的工具,进行量化投资的分析。

2. 常用量化投资工具包

R语言在金融领域提供了很多的金融计算框架和工具,当你具备金融理论知识和市场经验,你可以利用这些第三方提供的技术框架来构建自己的金融模型。我们可以从CRAN上找到各种的金融项目,访问R的官方网站 (https://cran.r-project.org/),找到Task Views 菜单里的 Finance标签。

task

金融领域涉及范围是非常广的,包括银行业、保险业、信托业、证券业、租赁业等。金融行业都具有指标性、垄断性、高风险性、效益依赖性和高负债经营性的特点。量化投资是证券投资的一个很细分的专业领域,涉及到的金融工具包其实并不是太多。我们其实能把这些工具包研究好了,就可以方便地做量化的模型和交易了。

如果我们想用R构建自己的量化交易系统,你需要用到5方面的R语言工具包:数据管理、指标计算、回测交易、投资组合、风险管理。

quant-lib

  • 数据管理:包括数据集抓取、存储、读取、时间序列、数据处理等,涉及R包有 zoo(时间序列对象), xts(时间序列处理), timeSeries(Rmetrics系时间序列对象) timeDate(Rmetrics系时间序列处理), data.table(数据处理), quantmod(数据下载和图形可视化), RQuantLib(QuantLib数据接口), WindR(Wind数据接口), RJDBC(数据库访问接口), rhadoop(Hadoop访问接口), rhive(Hive访问接口), rredis(Redis访问接口), rmongodb(MongoDB访问接口), SparkR(Spark访问接口),fImport(Rmetrics系数据访问接口)等。
  • 指标计算:包括金融市场的技术指标的各种计算方法,涉及R包有 TTR(技术指标), TSA(时间序列计算), urca(单位根检验), fArma(Rmetrics系ARMA计算), fAsianOptions(Rmetrics系亚洲期权定价), fBasics(Rmetrics系计算工具), fCopulae(Rmetrics系财务分析), fExoticOptions(Rmetrics系期权计算), fGarch(Rmetrics系Garch模型), fNonlinear(Rmetrics系非线模型), fOptions(Rmetrics系期权定价), fRegression(Rmetrics系回归分析), fUnitRoots(Rmetrics系单位根检验) 等。
  • 回测交易:包括金融数据建模,并验证用历史数据验证模型的可靠性,涉及R包有 FinancialInstrument(金融产品), quantstrat(策略模型和回测), blotter(账户管理), fTrading(Rmetrics系交易分析)等。
  • 投资组合:对多策略或多模型进行管理和优化,涉及R包有 PortfolioAnalytics(组合分析和优化), stockPortfolio(股票组合管理), fAssets(Rmetrics系组合管理)等
  • 风险管理:对持仓进行风险指标的计算和风险提示,涉及R包有 PerformanceAnalytics(风险分析),fPortfolio(Rmetrics系组合优化), fExtremes(Rmetrics系数据处理)等。

基于上文中列出的R包,我们可以选择使用独立地第三方R包来构建我们的量化交易的系统,也可以选用完整的Rmetrics体系来构建量化交易的系统。这两类R包也可以混合使用,如果在混用时,由于他们基于的时间序列的底层对象是不一样的,那么类型转换的时候,可以你需要花点功夫处理一下。

上文中列出的R语言,并不是所有的R语言量化投资的R包,仅仅我关注的一些包。还有很多其他的,比如用于配对交易的包PairTrading;在Github上发布的,我并没有发现的R包等。

对于我自己来说,倾向于用独立地第三方R包来做量化交易系统,会用到其中的几个独立的R包。这样选择的主要原因有2个,一是中国市场比较特别,很多规则并不完全符合世界的标准。比如,股票T+1交易就是全球唯一的。另外一点是第三方的开源包,有一些可能有错误,所以你不应该把程序完全依赖于第三方包,要有独立的思考和判断,第三方包只是给我们提供了便利性。

那么常用的第三方R包的组合为:zoo, xts, TTR, quantmod, FinancialInstrument, quantstrat, blotter, PortfolioAnalytics, PerformanceAnalytics。这其中的任何一个包,都可以被替换或自己实现,从而保证自己量化交易系统的独特性。引用国外量化的教材上的一张图,国外用R来研究量化交易已经体系。

quantitative-analysis

图片摘自Introduction to Trading Systems,作者Guy Yollin。

本系列文章,稍后将对整个量化体系的金融R包进行全面的介绍,并加上我自己的理解。量化相关R包介绍的相关文章列表,持续更新中。。。

数据管理

策略模型

量化交易一条程序员可以利用技术优势,突破自己过上幸福生活的一条路,很艰难也很兴奋。我会一直坚持,希望路上的朋友一起加油!

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

打赏作者