量化投资数据篇(1)

量化投资,特别是回测时,非常注重数据的质量。可以说,数据质量高低,是决定量化投资策略优劣的先决条件。因此,如何获取量化数据,特别是高质量的数据,则显得非常重要。
下面从基于R语言,从以下四个方面,分析量化数据来源的主要渠道。
1、 利用quantmod包直接下载来源yahoo的数据
利用quantmod包相关函数下载数据应该说是R语言中比较方便简洁获取股票数据的一种方式了。quantmod的全称是Quantitative Financial Modelling & Trading Framework for R,quantmod的设计目标是在R中为量化交易者开发、测试和评估交易策略提供一个统一的计算框架。他的作者是Jeffrey A. Ryan和Joshua M. Ulrich等人,他们都是Rfinance团队的关键人员。利用quantmod,并结合TTR、quantstrat、PerformanceAnalytics、blotter等工具包,可以进行完整的量化投资策略的开发、回测和评估。
下面简单介绍获取股票数据的方法。
>library(quantmod)  #加载包
>sh<-getSymbols ('^SSEC',src='yahoo',from='2010-01-01',to=Sys.Date(),auto.assign=F)
>head(sh)
           SSEC.Open SSEC.High SSEC.Low SSEC.Close SSEC.Volume SSEC.Adjusted
2010-01-04  3289.750  3295.279 3243.319   3243.760      109400      3243.760
2010-01-05  3254.468  3290.512 3221.462   3282.179      126200      3282.179
2010-01-06  3277.517  3295.868 3253.044   3254.215      123600      3254.215
2010-01-07  3253.991  3268.819 3176.707   3192.776      128600      3192.776
2010-01-08  3177.259  3198.920 3149.017   3195.997       98400      3195.997
2010-01-11  3301.611  3306.750 3197.328   3212.750      136400      3212.750
>chartSeries(sh)


其中,第二行表示下载2010年初到现在的上证综指的开盘、收盘、最高、最低价等数据。getSymbols函数的工作原理是获取来自yahoo网站的csv格式的股票数据(这个csv可以直接从网站下载),类似于网页爬虫。第三行是简单查看前面6行数据,第四行是利用默认的主题画上证综指从2010年以来的K线图。
从上可以看出,几行简单的代码便能获取相应股票的数据,并得到K线图走势。
不过这种获取数据的方式饱受国内量化分析和研究者的诟病,因为自从yahoo退出中国市场以来,关于中国股票数据的搜集和采集工作相对滞后,股票数据在开盘、收盘、调整价等方面都存在不同程度的误差。
值得高兴的是,这种情况将成为过去,随着沪港通的开通、沪伦通正处于议事日程当中,同时伴随着中国股市逐步纳入MSCI指数,中国金融市场的国际化逐渐加强的背景下,yahoo正在努力提高中国股票数据的质量。通过与通达信软件和新浪等网页数据对比可知,在除权除息之后的近期数据没有任何差异。
不过值得注意的是,比较久远的数据,经过比对,得到的结果与网易,通达信和新浪等股票数据存在较大的差异。这种差异并不一定表示数据的不准确性,也可能是由于复权等原因造成。
总体而言,随着yahoo对中国市场的重视,中国境内的上市公司股票数据的精确性越来越高,但长期数据的可靠性有待考证。这种数据的精确性提高,对量化分析者而言,是非常振奋的一件事情。顺便一提的是,英美等国家的股票数据完全是精确的。
不过,对于策略分析者而言,唯一的数据来源,且无法完全判断数据的准确性,策略的稳定性和可靠性存在较大风险,因此,需要通过多种渠道获取股票数据。
2、 抓取网易、新浪等网页数据
抓取网易、新浪等股票数据也称为网络爬虫,工作原理与quantmod类似,主要通过编写代码获取网页表格数据,也包括能够直接下载成csv或txt等格式的数据。下面就借花献佛,主要借鉴知乎(网页链接,顺便表示感谢!)的方式,以新浪股票历史复权交易数据(美好集团:000667)为例,具体如下。
主要有以下几个步骤:
(1)找到对应的股票数据网址,如首先找到股票复权数据的网址如下:
网页链接
此网页对应最近季度的股票数据,但这远远不够,最好能获取从1996年四季度上市来所有的复权交易数据或者自己定义时间段数据。因此还需要对时间进行重新选择,如选择最开始的数据,网址发生变化,具体为:
网页链接
在此基础上,分析上述网址不同部分的含义。具体来看,stockid前面都是一样的,这个就不需要管,000667对应为股票代码,修改对应的代码则得到其他股票数据,1996和4分别表示年度和季度,分别加以修改就得到相应季度的数据的网址。
仅有网址远远不够,我们需要的是对应网址中的的表格数据,而不是其他。
(2)了解网页设计的基本结构。如HTML的结构包括头部(Head)、主体(Body)两大部分,其中头部描述浏览器所需的信息,而主体则包含所要说明的具体内容,其内容比较复杂,可以有大量的分支节点,如果完全掌握这部分内容个人觉得需要至少半个月时间(非计算机专业),幸好,有专门的工具对网页的分支结构及其数据进行处理。网页的分支结构处理,此处用firefox中的firebugs插件获取表格对应的分支结构(当然也有人提及用google chrome浏览器也可以获取网页节点,具体可参见知乎提出的方法)。
如下是安装好firebug后的某部分显示结果:


看起来非常复杂,其实用起来非常简便,只要点右键复制其中的xpath就OK了。
比如新浪复权表格数据对应的节点xpath 为:
'/html/body/div[1]/div[9]/div[2]/div/div[3]/table[2] '
可以看出,其结点比较复杂,如果不是借助工具,而是凭自己判断,那需要学习专业知识且容易出错。
不过有个问题就是,不同的股票上市时间并未已知,利用R语言编程获取数据时,需要对此进行确定。上市时间的确定有两种方式,一种是分析网易网页数据的方式获取上市日期;另一种是直接到上证和深证交易所获取相应的股票代码和对应的上市日期,并保存为txt文档,方便随时调用。其中第二种方法比第一种方法要简单。
(3)根据给定的初始时间,连续抓取对应的网页表格数据并连接起来,则得到连续的股票数据。此处利用R语言进行处理,具体涉及到的工具包为rvest、magrittr、data.table等(注:rvest+magritte是网络数据抓取中比较简单的,其他包如:XML/Rcurl等包也可以对数据进行获取,但过程比较复杂)。步骤简述如下:
首先读取股票代码的txt文档数据,获取股票代码和相应的上市日期,并把上市日期转换成上市季度,并生成上市季度到现季度的连续季度时间(注意31号会出现问题,需要特别处理一下),然后利用rvest包连续读取同一股票不同年份和季度的数据,把不同季度的数据串联起来即得到完整复权数据。在此基础上设置循环,就可以把所有的上市股票数据全部读取出来。
部分代码如下:
library(rvest)
library(magrittr)
library(data.table)
stock.index<-read.csv(&# 39;E://OneDrive//index//stock.A.list.txt',header=T,
                      sep=&# 39;\t',colClasses=&# 39;character')
to<-Sys.Date()
for (i in 1:nrow(stock.index)) {
  symbol<-stock.index[i,1]
  from<-stock.index[i,3]
  prices<-get.sina.stock(symbol,from,to)
  filename<-paste0(&# 39;e://datasets//Astocks.weighted//',symbol,&# 39;.csv')
  write.csv(prices,file=filename,row.names=F)
}
print(&# 39;All the stocks data are updated!')
我习惯性把读取的数据保存到当地文件夹,方便随时调用。如得到的部分结果如下:


由于代码比较长,所以暂且省略,等有机会再全贴出来。
雪球转发:0回复:2喜欢:6

全部评论

台答2017-05-07 21:56

good@

hechao2016-08-03 04:56