工欲善其事,必先利其器”。

在 如何搭建量化投资研究系统?(数据篇)中,作者介绍了如何依靠网络爬虫收集整理交易数据,搭建一个金融数据库。在数据的问题基本解决之后,量化投资的研究工作就要正式启动了。根据人类思维的一般规律,一项复杂的研究工作,通常以“个别、感性、直观”的方式开始,在获得了基本的认识和灵感之后,再逐步上升到“整体、理性、抽象”的认知。所以,量化投资研究的第一步就是——“看盘”,下面介绍如何在R中利用quantmod包“优雅、高效”的看盘。

一、quantmod简介

quantmod的全称是Quantitative Financial Modelling & Trading Framework for R,quantmod的设计目标是在R中为量化交易者开发、测试和评估交易策略提供一个统一的计算框架。设想可以说是雄心勃勃,但是在仔细浏览quantmod的官方网站(quantmod: Quantitative Financial Modelling Framework)之后可以感觉到,目前quantmod还不能说是一个“完成品”,特别是和交易策略相关的部分,完成度不高。不过就已经完成的部分来看,quantmod在数据的获取、操作和可视化方面做得相当好。

二、数据获取

在quantmod中获取数据非常方便,quantmod提供了一系列“包装器函数”(“包装器”是一种常用的设计模式)从若干数据源获得金融数据,包括股票和指数数据、汇率数据和期权数据等等。

quantmod中获取股票和指数交易数据的函数是getSymbols,以平安银行和上证指数为例,运行

PAB <- getSymbols("000001.SZ",from = "2014-01-01",to = "2015-07-01",src = "yahoo",auto.assign = FALSE)
SSI <- getSymbols("000001.SS",from = "2014-01-01",to = "2015-07-01",src = "yahoo",auto.assign = FALSE)

就轻松获得了平安银行和上证指数的数据。还可以采用另外一种方式,先配置要参数

setDefaults(getSymbols,auto.assign = FALSE)
setSymbolLookup(PAB = list(name = "000001.SZ",from ="2014-01-01",to ="2015-07-01"),SSI = list(name = "000001.SS",from = "2014-01-01",to = "2015-07-01"))PAB <- getSymbols("PAB")SSI <- getSymbols("SSI")

需要解释一下,上交所和深交所的后缀分别是“.SS”和“.SZ”;from和to分别代表起始时间;src表示数据源(默认以雅虎财经为数据源);auto.assign表示是否自动声明变量(这里取消了自动声明);setDefaults为函数设置默认参数;setSymbolLookup为要取的数据设置参数。

如果不想用网络数据源,getSymbols也可以读取本地csv文件。假设PAB.csv保存有交易数据,文件内容分别是时间、开高低收、成交量和复权价,运行

setSymbolLookup(PAB = list(src="csv",format = "%Y-%m-%d"))
PAB <- getSymbols("PAB")

就可以读取csv中的数据。

getSymbols函数返回的对象的类型是xts,事实上xts类型的对象只要包含“开高低收”和“成交量”的标签,就可以使用quantmod中的大部分函数。如果已经按照《数据篇》的方法建立了数据库,运行

col.names <- c("Open", "High", "Low", "Close", "Volume", "Adjusted")
P <- dbGetQuery(con,"selectdate, open, high, low, close, voturnoverfrom iQI.equity_tradingwherecode = '000001'order by date asc;")
P.xts <- xts(P[,-1],order.by = as.Date(P[,1]))
names(P.xts) <- col.names[1:5]

P.xts和PAB一样可以使用quantmod中的函数。

quantmod中获取股票分红和配股数据的函数是getSymbols和getSplits,运行

setDefaults(getDividends,src = "yahoo")
setDefaults(getSplits,src = "yahoo")
PAB.div <- getDividends("000001.SZ")
PAB.spl <- getSplits("000001.SZ")

分别可以获得平安银行的分红数据和配股数据。

既然用quantmod获取数据如此简单,为什么还要用《数据篇》里的方法自己搭建数据库呢?(在不能翻墙的前提下)雅虎财经是最常用到的数据源,但是雅虎的业务重点并不包括中国,所以中国财经数据的质量难免要打一个折扣。举个例子,平安银行在2015-04-10的收盘价是19.80,而qantmod得到的数据却是16.50;上证指数只有收盘数据,成交量数据是0。

三、数据可视化

金融数据的可视化可以说是quantmod的一大亮点,有大量的作图函数可供选择,而且使用方式非常简便灵活。quantmod中作图的主函数是chartSeries,运行

chartSeries(PAB)

就能画出平安银行的K线图。

平安银行K线图

quantmod默认的绘图风格是美式的,如果想要调整风格或其他参数,需要调用reChart函数,运行

cn.theme <- chartTheme(up.col = "red",dn.col = "green")
reChart(name = "平安银行",subset = "2015",theme = cn.theme,
type = "candlesticks")

平安银行K线图

chartTheme函数用来产生一个控制绘图风格的对象;name用来修改图片标题;subset用来对数据对象做“切片”操作(quantmod通常处理xts类型的对象,xts的切片操作非常灵活和人性化,具体用法请查阅xts包的文档);theme用来设置风格;type用来设置绘图类型(这里设置成“蜡烛图”)。

四、技术指标

quantmod在K线图中添加技术指标的操作非常灵活方便,有两种方式,分别是调用内置函数和自定义指标。常用的技术指标大多都可以在quantmod的内置函数中找到,比如在上图中添加MACD和布林带,可以运行

addMACD()

addBBands()

MACD&布林带

每个指标函数都可以调整具体的参数设置(具体的用法请阅读文档)。

添加自定义指标分为两种方式,一种是调用addTA函数直接添加;另一种是调用newTA函数生成技术指标对象。

如果把收盘价对数值及其指数移动平均作为一种技术指标,运行

addTA(cbind(EMA(log(Cl(PAB))), log(Cl(PAB))),col = c("red", "green"),type = c("o", "o"),pch = c(20, 20),legend = "LogClEMA")

自定义指标(方法一)

另一种方式

LogClEMA <- function(x)
{return (cbind(log(Cl(x)),EMA(log(Cl(x)))))
}addLogClEMA <- newTA(FUN = LogClEMA,col = c("red", "green"),type = c("o", "o"),pch = c(20, 20),legend.name = "LogClEMA")addLogClEMA()

自定义指标(方法二)

如果要去掉某个指标,需要调用dropTA函数,函数的参数是要去掉指标对应的函数名,比如去掉成交量

dropTA("addVo")

去掉“成交量”

有些金融数据并不包含“开高低收”和成交量信息,只是单纯的一列或几列数据,这时如果用chartSeries绘图应该设置图形的类型为“线图”,以基金“华夏成长”的累计净值为例

par(pch = 20)
chartSeries(HXCZ$anv,col="green",subset = "2015",type = "line",line.type = "o",name = "华夏成长")

“华夏成长”累计净值

如果要添加技术分析指标,方法和前面讲的一样。

五、数据计算函数

quantmod提供了一系列函数对数据对象做基本的操作和计算,这些函数和前面讲的数据可视化功能结合起来,对研究工作带来的帮助可谓如虎添翼,也许束缚人的只剩下想象力。

1.提取型函数

函数Op、Hi、Lo、Cl、Vo和Ad分别用来提取交易数据中的开盘价、最高价、最低价、收盘价、成交量和复权价;HLC、OHLC和OHLCV分别提取高低收、开高低收和开高低收成交量;seriesHi和seriesLo分别提取每一列数据中的最高值和最低值。

2.标记型函数

seriesAccel、seriesDecel、seriesIncr和seriesDecr分别标记序列中的节点是否处在加速、减速、增长和下降的状态;findPeaks和findValleys分别标记出局部最高和局部最低点。以seriesIncr为例

par(pch = 20)
chartSeries(Cl(PAB),col="green",subset = "2015-05::",type = "line",line.type = "o",name = "平安银行")
addTA(seriesIncr(Cl(PAB)),
col="red",
legend = "incr")
peak <- Cl(PAB)[findPeaks(Cl(PAB))-1]
addTA(peak,col = "red",
type = "p",
on = 1,
legend = "peak")
valley <- Cl(PAB)[findValleys(Cl(PAB))-1]
addTA(valley,col = "yellow",
type = "p",
on = 1,
legend = "valley")

平安银行收盘价

其中红色的时间段内收盘价在持续增长,红色和黄色的点分别对应局部最高和局部最低点。

3.平移函数

Lag和Next用来向后和向前平移数据

4.对比型函数

函数OpCl、ClCl、HiCl、LoCl、LoHi、OpHi、OpLo和OpOp 分别计算开高低收四种价格的相对变化程度;Delt计算前后不同时期数据的相对变化程度。

5.收益率计算函数

quantmod中计算收益率的主函数是periodReturn,在参数中设置周期就可以计算出不同周期对应的收益率;dailyReturn、weeklyReturn、monthlyReturn、quarterlyReturn、yearlyReturn和allReturns分别计算每日、每周、每月、每季度、每年和所有的收益率。

以华夏成长为例,计算累计净值的收益率,并画出收益率直方图和密度曲线

hist(dailyReturn(HXCZ$anv)*100,
breaks = 50,
probability = TRUE,
main = "华夏成长",
xlab = "returns")
lines(density(dailyReturn(HXCZ$anv)*100),
lwd = 2,
col = "red")
lines(density(weeklyReturn(HXCZ$anv)*100),
lwd = 2,
col = "green")
lines(density(monthlyReturn(HXCZ$anv)*100),
lwd = 2,
col = "blue")
legend(x = -4, y=0.8,legend = c("daily","weekly","monthly"),lty = c(1,1,1),
lwd = c(2,2,2),col = c("red", "green", "blue"))

每日收益率的直方图及3条密度曲线

6.除权函数

adjustOHLC用来计算复权价,方法有两种,一是利用网络数据源(雅虎财经)的分红配股数据计算;二是输入复权因子作为参数来计算。

六、总结

以上简单介绍了quantmod的使用方法,权当是抛砖引玉,要真正做到灵活应用全面掌握,还是应该多加写代码多看文档,最后用一张思维导图总结一下quantmod中的常用函数。

quantmod常用函数

如何搭建量化投资研究系统?(工具篇之quantmod)相关推荐

  1. 如何搭建量化投资研究系统之三(工具篇quantstrat)

    作者:王喆 链接:https://zhuanlan.zhihu.com/p/20232919 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 本篇「科学投资」文章来自 ...

  2. 如何搭建量化投资研究系统?(数据篇之财务数据)

    股票市场的存在为企业融资提供了一个自由开放的环境,在这里投资者们将资金配置于他们认为的优秀.稳健.有潜力的企业,无数的投资决策汇聚而成的"群体智慧"影响着整体的经济运行,最终促进社 ...

  3. 量化投资常用技能——指标篇1:详解 MACD指标绘制、及其计算过程和作用

    量化投资常用技能 系列文章目录 我们已经介绍了三篇关于量化投资方面绘图的文章,大家有兴趣可以了解一下 绘图篇 量化投资常用技能--绘图篇 1:绘制股票收盘价格曲线和ochl烛状图 量化投资常用技能-- ...

  4. 量化投资常用技能——绘图篇 1:绘制股票收盘价格曲线和ochl烛状图

    量化投资常用技能--绘图篇 1 量化投资 绘图技能 Python绘图库:matplotlib 绘制烛状图库:mpl_finance 之后的博客讲解深度会逐渐提升,将包括一下几个方面: 绘图 指标公式与 ...

  5. 量化投资常用技能——绘图篇 2:绘制移动平均线

    量化投资常用技能--绘图篇 2 前言 移动平均线 使用numpy库计算移动平均值 量化投资第三方库:abupy 欢迎大家关注我们 我们的抖音号:金融观察(JRGC8888) 前言 上一篇文章" ...

  6. 量化投资常用技能——指标篇3:详解RSI指标,及其代码实现和绘图

    量化投资常用技能 系列文章目录 我们已经介绍了三篇关于量化投资方面绘图的文章和两篇指标类的推导和介绍的文章,大家有兴趣可以了解一下 绘图篇 量化投资常用技能--绘图篇 1:绘制股票收盘价格曲线和och ...

  7. 量化投资常用技能——指标篇2:详解BOLL(布林线)指标,及其代码实现和绘图

    量化投资常用技能 系列文章目录 我们已经介绍了三篇关于量化投资方面绘图的文章和一篇指标类的推导和介绍的文章,大家有兴趣可以了解一下 绘图篇 量化投资常用技能--绘图篇 1:绘制股票收盘价格曲线和och ...

  8. 量化投资交易python工具干货大全

    http://www.newsmth.net/nForum/#!article/Python/128763 最近程序化交易很热,量化也是我很感兴趣的一块. 国内量化交易的平台有几家,我个人比较喜欢用的 ...

  9. win10 sublime运行php环境,Win10下sublime text3搭建go语言开发环境--工具篇

    进行go语言开发环境的搭建. 最近进行了大量的搜索,因为在搭建的过程中遇到了挺多的问题.先介绍搭建的环境. 系统:Win10 IDE:sublime text3 相关插件:GoSublime 这篇文会 ...

最新文章

  1. 正则式高人谈解答正则式的心得
  2. android asynctask源码分析,Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)...
  3. 阿里巴巴一年投三家AR公司,AR购物或是最终目标
  4. 花卉世界大观园和杂技之游
  5. 使用jsDelivr加速GitHub的静态资源
  6. 计算机网络是由一组结点组成吗,分布式数据库系统是由一组数据组成的,这组数据分布在计算机网络的不同计算机上,网络中的每个结点_考题宝...
  7. Lichee (六) 优化配置的微内核
  8. js请求后台接口返回的图片并转为base64
  9. 大数据平台有什么功能作用
  10. rman一致性备份oracle数据库可以在非归档模式下么,探索ORACLE之RMAN_03一致性备份...
  11. c语言if的判定条件,if条件判断语句,谁能帮我分析一下?
  12. matlab剪切板中内容清除,如何清空剪贴板内容?剪切板内容清理过程
  13. 德语课堂笔记 之 与食物相关的名词
  14. 软考数据库-无损联接分解
  15. 齐次线性方程组系数矩阵的秩与解集的秩
  16. 包包各部位名称图解_七大箱包主要部位的结构专业术语和特性
  17. 过去两三年 互联网科技公司的掌舵人这样看区块链
  18. php常见错误,php常见错误及错误处理 - 小俊学习网
  19. 链表之链表的结点插入
  20. 算法题的几种常见解题思路

热门文章

  1. 数据压缩作业二:PNG图像格式分析
  2. SD-WAN — MPLS 广域网 VPN 技术解析
  3. iOS Masonry
  4. Linux命令英文全称学习
  5. 工具:你一定要知道的项目管理高手常用10张图表
  6. 笔记本电脑插入耳机不能自动切换播放设备,小键盘不能自动打开,蓝屏问题记录
  7. 百度前端三面面试题全部公开,三面的最后一个问题令我窒息
  8. hibernate入门项目(一)
  9. mysql 连接 linux命令行_linux命令行链接mysql数据库
  10. WireShark抓包新手入门教程1