[关闭]
@fanxy 2021-09-15T12:17:44.000000Z 字数 11702 阅读 12427

第一讲 R 语言入门与金融数据获取

樊潇彦 复旦大学经济学院 金融数据


下载文件:
1. 数据和笔记样本 Ch01.rar,解压缩到工作目录下,存在文件夹 Ch01 中;
2. 里面有数据文件 inc.csv 和笔记样本 Note1.rmd

设置中文显示:
1. Tools --> Global Options --> Code --> Saving,在 Change 菜单中选择 UTF-8 --> Apply
2. 双击打开 Note1.rmd,如果乱码用记事本等软件打开,全选后考回 Note1.rmd,再选 File --> Save with Encoding

1. R语言入门

1.1 准备工作

  1. setwd("D:\\...\\Ch01") # 设定工作目录
  2. # 用 getwd() 可查看当前工作目录
  3. rm(list=ls()) # 清内存
  4. # "Ctrl"+"L" 清除命令窗口
  5. install.packages(c("zoo","xts","timeSeries","quantmod","tseries","Ecdat")) # 安装包
  6. install.packages(TTP)
  7. library(zoo)
  8. library(xts)
  9. library(timeSeries)
  10. library(quantmod)
  11. library(tseries)

1.2 数据类型与结构

1.2.1 五种基本数据类型

  1. x = c(1, 2, 3, 4) # 构造数值型向量x
  2. x # 显示
  3. class(x) # 显示数据类型
  1. x1 = as.integer(x) # 转换为整数型向量x1
  2. class(x1)
  1. is.logical(x) # 判断向量x是否为逻辑型数据
  2. x==2 # 判断向量x中元素是否等于2
  3. x2=!(x<2) # 判断向量x中元素是否大于等于2,存为逻辑型向量x2
  4. which(x<2) # 显示向量x中小于2的元素所在的位置
  1. y = c("I", "love", "R") # 构造元素依次为字符串“I”,“love”,“R”的向量y
  2. y # 输出y的值
  3. class(y) # 显示向量y的数据类型
  4. length(y) # 显示向量y的维度,即元素个数
  5. nchar(y) # 显示向量y中每个元素的字符个数
  6. y=="R" # 判断向量y中为“R”的元素
  1. sex = factor(c(1,1,0,0,1), levels=c(0,1), labels=c("male","female")) # 因子型数据sex,加变量标签
  2. sex # 输出sex的值
  3. class(sex) # 显示sex的数据类型
  4. num1 = factor(c("b","a","d","c"), ordered= TRUE) # 字符型因子变量不设levels和labels,按字母排序编号
  5. as.numeric(num1) # 显示编号

1.2.2 五种基本数据结构

DataStructure

  1. a <- c(1, 2, 5, 3, 6, -2, 4)
  2. b <- c("one", "two", "three")
  3. c <- c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE)
  4. a[3]
  5. a[c(1, 3, 5)]
  6. a[2:6]
  1. y <- matrix(1:20, nrow=5, ncol=4)
  2. y
  3. cells <- c(1,26,24,68)
  4. rnames <- c("R1", "R2")
  5. cnames <- c("C1", "C2")
  6. mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=TRUE,
  7. dimnames=list(rnames, cnames))
  8. mymatrix
  9. mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=FALSE,
  10. dimnames=list(rnames, cnames))
  11. mymatrix
  12. y[2,]
  13. y[,2]
  14. y[1,4]
  15. y[1, c(2,4)]
  1. dim1 <- c("A1", "A2")
  2. dim2 <- c("B1", "B2", "B3")
  3. dim3 <- c("C1", "C2", "C3", "C4")
  4. z <- array(1:24, c(2,3,4), dimnames=list(dim1, dim2, dim3))
  5. z
  1. patientID <- c(1, 2, 3, 4)
  2. age <- c(25, 34, 28, 52)
  3. diabetes <- c("Type1", "Type2", "Type1", "Type1")
  4. status <- c("Poor", "Improved", "Excellent", "Poor")
  5. patientdata <- data.frame(patientID, age, diabetes, status)
  6. patientdata
  7. patientdata[1:2]
  8. patientdata[c("diabetes","status")]
  9. patientdata$age
  10. # 将diabetes和status由字符型变为因子型和有序因子型
  11. diabetes <- factor(diabetes)
  12. status <- factor(status, order=TRUE)
  13. patientdata <- data.frame(patientID, age, diabetes, status)
  14. str(patientdata)
  15. summary(patientdata)
  1. g <- "My First List"
  2. h <- c(25, 26, 18, 39)
  3. j <- matrix(1:10, nrow=5)
  4. k <- c("one", "two", "three")
  5. mylist <- list(title=g, ages=h, j, k)
  6. mylist

1.2.3 日期类变量

金融数据中的时间变量有三种常用类型:DatePOSIXctPOSIXt

  1. Sysdate <- Sys.Date() # 系统当前日期
  2. class(Sysdate) # 日期型变量
  3. Sysdate
  4. Systime <- Sys.time() # 系统当前时间
  5. class(Systime) # "POSIXct"和"POSIXt"是两种精准到秒的时间变量
  6. Systime
  7. p <- as.POSIXlt(Systime) # 提取日期中的各个组成部分信息
  8. class(p); mode(p)
  9. p
  10. p$year+1900 # p$year 自1900年以来的年份
  11. p$mon+1 # p$mon 表示0-11月
  12. p$mday # p$mday 该月的第几天
  13. p$yday+1 # p$yday 该年的第几天,0-365天,元旦当天是第0天
  14. p$wday # p$wday 对应周几,0-6,周日为0,其他时间和我们日常习惯一致
  15. # 用字符和数字生成日期对象
  16. t <- as.Date("2014/4/17",tz="CST") # tz为时区,CST为北京时间
  17. class(t)
  18. t
  19. t <- ISOdate(2014,4,17)
  20. class(t) # ISOdate()函数得到的是一个POSIXct对象
  21. t <- ISOdatetime(2014,4,17,15,28,48) # 继续加入小时、分钟、秒数信息

2. 时间序列程序包

下表列出了一些常用的获取和处理金融数据的程序包,其中TTP是一个技术分析包,感兴趣的同学可以自己查阅,本节将逐一介绍zoo, xts, timeSeries, quantmod, tseries等包的主要命令。

功能 软件包
时间序列数据处理 zoo:以时间为Index
xts:zoo包的扩展
timeSeries:时间为名为Date的指标
金融数据处理 quantmod:数据获取与作图
tseries:数据获取与分析
TTR:技术分析

2.1 用zooxtstimeSeries设置时序数据对象

  1. intc=read.table(file="intc.csv",header=TRUE,sep=",") # 读入数据
  2. head(intc,3); tail(intc,3)
  3. class(intc)
  4. library(zoo)
  5. intc.z=zoo(x=intc[,"Adj.Close"],order.by=as.Date(intc[,"Date"])) # 转换成zoo类型
  6. class(intc.z)
  7. head(intc.z);tail(intc.z)
  8. class(coredata(intc.z))
  9. class(index(intc.z))
  10. plot(intc.z,main="Intel Stock Price 1980-03 to 2016-02",ylab="$")
  11. library(xts)
  12. intc.x <- xts(x=intc[,"Adj.Close"],order.by=as.Date(intc[,"Date"])) # 转换成xts类型
  13. colnames(intc.x)="Adj.Close"
  14. head(intc.x); tail(intc.x)
  15. class(intc.x)
  16. library(timeSeries)
  17. intc.ts=timeSeries(intc) # 转成timeSeries格式
  18. intc.ts=intc.ts[,c("Date","Adj.Close")]
  19. head(intc.ts); tail(intc.ts)
  20. class(intc.ts)
  21. data(Tbrate,package="Ecdat")
  22. class(Tbrate) # 时间序列ts,多变量时序mts
  23. window(Tbrate,start=start(Tbrate),end=c(1950,4))
  24. tsp(Tbrate)
  25. plot(Tbrate)
  26. ts.plot(Tbrate,col=2:4)
  27. legend(x="topleft",legend=c("t-bill rate","log GDP","inflation"),
  28. lty=1,col=2:4,bty="n")
  29. Tbrate.z=zoo(Tbrate,frequency =4) # 将ts转换为zoo

2.2 用quantmodtseries提取金融数据

  1. library(quantmod)
  2. args(getSymbols) # 查看命令选项
  3. getSymbols("^GSPC") # S&P500,默认 scr="yahoo"
  4. tail(GSPC,4) # 查看最后4个数据
  5. class(GSPC) # 数据类型
  6. class(index(GSPC)) # 日期类型
  7. dim(GSPC) # 数据行列数
  8. colnames(GSPC) # 指标名称
  9. tail(Cl(GSPC),4)
  10. args(chartSeries)
  11. ## chartSeries(x, type = c("auto", "candlesticks", "matchsticks",
  12. ## "bars", "line"), subset = NULL, show.grid = TRUE, name = NULL,
  13. ## time.scale = NULL, log.scale = FALSE, TA = "addVo()", TAsep = ";",
  14. ## line.type = "l", bar.type = "ohlc", theme = chartTheme("black"),
  15. ## layout = NA, major.ticks = "auto", minor.ticks = TRUE, yrange = NULL,
  16. ## plot = TRUE, up.col, dn.col, color.vol = TRUE, multi.col = FALSE, ...)
  17. chartSeries(GSPC,subset="2018::2020",theme="white") # 背景为白色,但上涨为绿色、下跌为红色
  18. whiteTheme <- chartTheme("white") # 在此基础上自定义作图模版
  19. names(whiteTheme)
  20. whiteTheme$bg.col <- "white"
  21. whiteTheme$dn.col <- "lightgreen" # 下降为淡绿色
  22. whiteTheme$up.col <- "pink" # 上涨为粉色
  23. whiteTheme$border <- "lightgray"
  24. x <- chartSeries(GSPC,subset="last 3 months",theme=whiteTheme,TA=NULL)
  25. class(x)
  26. # 选取不同时段作图
  27. chartSeries(GSPC["2020"],theme=whiteTheme,name="S&P 500")
  28. chartSeries(GSPC["2019/2020"],theme=whiteTheme,name="S&P 500")
  29. chartSeries(GSPC["2019-08::2020-03"],theme=whiteTheme,name="S&P 500")
  30. chartSeries(GSPC["20161109::"],theme=whiteTheme,name="S&P 500")

SP500.png

  1. getSymbols("INTC")
  2. head(INTC)
  3. chartSeries(INTC,theme=whiteTheme,name="INTC.adj",minor.ticks=FALSE)
  4. getSymbols("INTC",index.class="POSIXct",from="2000-01-01") # 提取英特尔数据
  5. head(INTC) # 显示前6条
  6. chartSeries(INTC,theme=whiteTheme,name="INTC",minor.ticks=FALSE) # 数据作图
  7. adj_INTC=adjustOHLC(INTC,
  8. adjust = c("split", "dividend"), # 进行拆股、除权的数据调整
  9. symbol.name=deparse(substitute(x)))
  10. head(adj_INTC) # 显示调整后数据
  11. chartSeries(adj_INTC,theme=whiteTheme,name="INTC.adj", # 调整后数据作图
  12. minor.ticks=FALSE)
  1. symbols = c("INTC", "GOOGL","T") # 三只股票代码的字符向量
  2. getSymbols(symbols,from="2010-01-01") # 提取数据
  3. prices <- Cl(get(symbols[1]))
  4. for(i in 2:length(symbols))
  5. prices <- merge(prices,Cl(get(symbols[i]))) # 合并
  6. colnames(prices) <- symbols
  7. head(prices)
  1. getSymbols('DTB3',src='FRED') # 有时无法连接,可用以下命令直接从网上下载
  2. DTB3=read.table("https://research.stlouisfed.org/fred2/series/DTB3/downloaddata/DTB3.csv",
  3. sep = ",", header=TRUE, stringsAsFactors =FALSE)
  4. str(DTB3) # 查看数据类型
  5. DTB3=xts(as.numeric(DTB3$VALUE), order.by =as.Date(DTB3$DATE)) # 变为时间序列xts类型
  6. chartSeries(DTB3,theme="white",minor.ticks=FALSE) # 作图
  1. library(tseries)
  2. args(get.hist.quote)
  3. # function (instrument = "^gdax", start, end, quote = c("Open",
  4. # "High", "Low", "Close"), provider = c("yahoo", "oanda"),
  5. # method = NULL, origin = "1899-12-30", compression = "d",
  6. # retclass = c("zoo", "its", "ts"), quiet = FALSE, drop = FALSE)
  7. BA <- get.hist.quote(instrument="BA",start="2009-01-01",quote="A")
  8. SPY <- get.hist.quote(instrument="SPY",start="2009-01-01",quote="A")
  9. BA.ret <- diff(log(BA))
  10. SPY.ret <- diff(log(SPY))
  11. class(SPY)
  12. class(time(SPY))
  13. tail(SPY,3)
  14. # Color specification rgb(0,0,100,50,maxColorValue=255) makes dense over-plotted areas darker
  15. plot(x=SPY.ret, y=BA.ret, pch=20, asp=1, xlab="Market Return", ylab="Boeing Return", main="Boeing Return versus Market Return", col=rgb(0,0,100,50,maxColorValue=255))

附录:用Wind中R接口提取数据

Wind_command

1 安装启动WindR

先从 http://www.dajiangzhang.com/document 下载安装个人版"Wind资讯开放应用接口"(免费)或机构版"Wind资讯金融终端"(需要用帐号、密码登录),再按照页面左侧"接口安装说明"操作,安装WindR接口。

  1. library(WindR)
  2. w.start() #启动WindR接口

2 提取历史交易报价 w.wsd

  1. #设置起始时间和截止时间,通过wsd接口提取序列数据
  2. begintime<-'20120101'; endtime<-Sys.Date()
  3. wsd090007.IB<-w.wsd('090007.IB','close',begintime,endtime,'Priceadj=CP;tradingcalendar=NIB')
  4. #其中,'Priceadj','CP'表示债券净价,’U’表示不对股票除权,'tradingcalendar','NIB'为银行间市场交易日历。
  1. #设置起始时间和截止时间,通过wsd接口提取序列数据
  2. begintime<-'20120101'; endtime<- Sys.Date()
  3. wsd000001.SZ<-w.wsd('000001.SZ','open,high,low,close','-100d',endtime,'Priceadj=F')
  4. #其中,-100d是日期宏函数,表示前推100天。

3 提取分钟序列数据 w.wsi

  1. #设置起始时间和截止时间,通过wsi接口提取序列数据
  2. fields='open,high,low,close'
  3. begintime= Sys.Date()-100
  4. endtime= Sys.time()
  5. # Sys.time()是R内置的日期函数,表示当前时刻。
  6. wsiIF00.CFE= w.wsi('IF00.CFE',fields,begintime,endtime,'BarSize=3')

4 提取盘口买卖盘数据 w.wst

  1. #设置起始时间和截止时间,通过wsi接口提取序列数据
  2. begintime=format(Sys.time(),'%Y%m%d 09:30:00');
  3. endtime =Sys.time()
  4. fields='last,bid1,ask1';
  5. #last最新价,amt成交额,volume成交量
  6. #bid1 买1价,bsize1 买1量
  7. #ask1 卖1价, asize1 卖1量
  8. wst000001.SZ <- w.wst('000001.SZ',fields,begintime,endtime)

5 提取截面数据 w.wss

  1. codes='600000.SH,000002.SZ,000009.SZ,000012.SZ,000021.SZ'
  2. fields='comp_name,comp_name_eng,ipo_date,float_a_shares,mf_amt,mf_vol'
  3. wss_inform<- w.wss(codes,fields,'tradedate=20121130')
  4. #其中,’tradedate’表示交易日期。
  1. wss_report=w.wss('600267.SH,600276.SH,002038.SZ,600535.SH','oper_rev,opprofit,net_profit_is','rptDate=20121231;rptType=1')
  2. # 营业收入、营业利润、净利润对应的字段为oper_rev、opprofit、net_profit_is,报告期为2012年12月31日(rptDate=20121231),财务报表为合并报表(rptType=1)。

6 提取实时行情数据 w.wsq

  1. w_data=w.wsq('000005.SZ,000006.SZ,000007.SZ,000008.SZ','rt_time,rt_last,rt_bid1,rt_ask1,rt_vwap')
  2. #其中,rt_time,rt_last,rt_bid1,rt_ask1,rt_vwap分别为时间、现价、买入价、卖出价、成交均价字段。

7 提取债券估值数据 w.wsd

  1. wdata=w.wsd('090007.IB','dirty_csi,accruedinterest_csi,modidura_csi','2013-04-06','2013-05-06')
  2. # 注意,目前支持中债公司、中证指数公司、清算所的债券估价,中债公司需要取得授权,清算所的债券估值数据较少。

8 提取数据集 w.wset

目前可以读取板块成分、指数成分股及权重、停牌股票、分红送转等股票数据。目前融资融券数据在个人版中已不能查询。
  1. #取全部 A 股股票代码、名称信息
  2. data<-w.wset("SectorConstituent","date=20160227;sector=全部A股")$Data
  3. data=data[,-2]
  4. #取沪深 300 指数中股票代码和权重
  5. data<-w.wset("IndexConstituent","date=20160101;windcode=000300.SH;field=wind_code,i_weight")
  6. #取停牌信息
  7. data=w.wset("TradeSuspend","startdate=20160101;enddate=20130608;field=wind_code,sec_name,suspend_type,suspend_reason")
  8. #取 ST 股票等风险警示股票信息
  9. data<-w.wset("SectorConstituent","date=20160101;sector=风险警示股票;field=wind_code,sec_name")

9 提取资管报表数据 w.wpf

  1. data=w.wpf('130325','PMS.PortfolioDaily','startdate=20130503;enddate=20130603;reportcurrency=CNY;owner=;field=Portfolio_Name,Portfolio_ID,Total_Asset')

10 提取交易日期 w.tdaysw.tdaysoffsetw.tdayscount

  1. data=w.tdays('2013-05-03','2013-06-03','TradingCalendar=SHFE;')
  2. # 其中,'TradingCalendar=SHFE;'是上海期货交易所代码,默认是上海证券交易所。
  1. data=w.tdaysoffset(-4,'2013-06-03')
  1. data=w.tdayscount('2013-05-03','2013-06-03')

11 读取股票日K线价格并绘制价格图

  1. require(quantmod)
  2. # 读取一只股票并作图
  3. data=w.wsd('600276.SH','open,high,low,close,volume','2013-01-02','2013-04-02')$Data
  4. ts <- xts(data[,-1],data[,1])
  5. chartSeries(ts,TA=c(addVo(),addBBands(),addMACD()),up.col="red",dn.col="#00ffff",name=StockList)
  6. # 读取多只股票
  7. StockList=c('600276.SH','000001.SZ')
  8. for (i in StockList) assign(i, w.wsd(i,'open,high,low,close,volume','2013-01-02','2013-04-02')$Data)

参考资料

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注