利用ggplot2画蜡烛图
在做量化策略开发的时候,可视化是个很重要的辅助手段。在R当中,有很多绘制金融时间序列图形的工具,比如quantmod包里的chartSeries(),就是个很不错的工具。但是在实际的使用中,面对不同的问题,这些现有的工具依然不够个性化。利用R的做图系统,可以实现更灵活的可视化表达。
下面是一个简单的例子,利用ggplot2绘制价格走势的蜡烛图(candle chart),加入成交量和技术分析指标。
(1)绘制价格走势的蜡烛图
绘制2014年12月26日的上证指数的1分钟k线图,数据由通达信软件导出。文件名sz141226.csv。
利用ggplot2中关于绘制boxplot的方法,可以画出蜡烛图。把box的lower设为开盘价,upper设为收盘价,middle设为NA,
上须取成最高价,下须取成最低价。
library(ggplot2)
sz<-read.csv('~/sz141226.csv',header=F,encoding='UTF-8',as.is=TRUE)
sz<-sz[,c(1:6,9:11)]
colnames(sz)<-c('time','open','high','low','close','volumn','boll','boll.u','boll.l')
sz$id<-1:240
sz$candleLower<-pmin(sz$open,sz$close)
sz$candleUpper<-pmax(sz$open,sz$close)
sz$candleMiddle <- NA
sz$color <- "red"
sz$color[sz$close<sz$open] = "green"
g1<-ggplot(sz,aes(x=id))+geom_boxplot(stat='identity',alpha=.8, aes(lower=candleLower, middle=candleMiddle, upper=candleUpper, ymin=low, ymax=high,group=id, fill=color))+
scale_fill_manual(values=c('green','red'))+guides(fill=FALSE)
g1
(2)加入技术指标
和价格序列具有相似取值的技术成分,比如均线、通道、买入卖出符号等,都可以在这一张图里绘出。下面加入布林带,去掉背景色,并对坐标轴做必要的修饰:
g2<-g1+geom_line(aes(y=boll.u),color='grey')+geom_line(aes(y=boll.l),color='grey')+
scale_x_discrete(breaks=c(1,60,120,180,240),labels=c('09:30','10:30','11:30/13:00','14:30','15:00'))+
theme_bw()+guides(fill=FALSE)+theme(axis.title=element_blank())
g2
(3) 加入成交量
成交量和价格序列有相同的x轴标度(时间),但两者的y轴标度是完全不同的。一种解决方法是利用gridExtra包,先把价格序列和成交量分别做图,然后合并到一张图中。
library(grid)
library(gridExtra)
g3<-ggplot(sz,aes(x=id))+geom_bar(stat = "identity",aes(y=volumn,fill=color),color='black',alpha=.7)+
scale_fill_manual(values=c('green','red'))+
scale_x_discrete(breaks=c(1,60,120,180,240),labels=c('09:30','10:30','11:30/13:00','14:30','15:00'))+
scale_y_continuous(breaks=c(0, 2.5e+07, 5.0e+07, 7.5e+07),labels=c('0','25M','50M','75M'))+
theme_bw()+guides(fill=FALSE)+
theme(axis.title=element_blank())
g4<-g2+theme(axis.text.x=element_blank(),
axis.title.x=element_blank(),
axis.ticks.x=element_blank())
grid.newpage()
pushViewport(viewport(layout = grid.layout(3, 1)))
print(g4, vp = viewport(layout.pos.row = 1:2, layout.pos.col = 1))
print(g3, vp = viewport(layout.pos.row = 3, layout.pos.col = 1))
另一种很折腾的方法,调整各种变量的取值范围(可以共用一个y轴的标度),把它们绘制到一张图当中。
下面是一个简单的例子,利用ggplot2绘制价格走势的蜡烛图(candle chart),加入成交量和技术分析指标。
(1)绘制价格走势的蜡烛图
绘制2014年12月26日的上证指数的1分钟k线图,数据由通达信软件导出。文件名sz141226.csv。
利用ggplot2中关于绘制boxplot的方法,可以画出蜡烛图。把box的lower设为开盘价,upper设为收盘价,middle设为NA,
上须取成最高价,下须取成最低价。
library(ggplot2)
sz<-read.csv('~/sz141226.csv',header=F,encoding='UTF-8',as.is=TRUE)
sz<-sz[,c(1:6,9:11)]
colnames(sz)<-c('time','open','high','low','close','volumn','boll','boll.u','boll.l')
sz$id<-1:240
sz$candleLower<-pmin(sz$open,sz$close)
sz$candleUpper<-pmax(sz$open,sz$close)
sz$candleMiddle <- NA
sz$color <- "red"
sz$color[sz$close<sz$open] = "green"
g1<-ggplot(sz,aes(x=id))+geom_boxplot(stat='identity',alpha=.8, aes(lower=candleLower, middle=candleMiddle, upper=candleUpper, ymin=low, ymax=high,group=id, fill=color))+
scale_fill_manual(values=c('green','red'))+guides(fill=FALSE)
g1
(2)加入技术指标
和价格序列具有相似取值的技术成分,比如均线、通道、买入卖出符号等,都可以在这一张图里绘出。下面加入布林带,去掉背景色,并对坐标轴做必要的修饰:
g2<-g1+geom_line(aes(y=boll.u),color='grey')+geom_line(aes(y=boll.l),color='grey')+
scale_x_discrete(breaks=c(1,60,120,180,240),labels=c('09:30','10:30','11:30/13:00','14:30','15:00'))+
theme_bw()+guides(fill=FALSE)+theme(axis.title=element_blank())
g2
(3) 加入成交量
成交量和价格序列有相同的x轴标度(时间),但两者的y轴标度是完全不同的。一种解决方法是利用gridExtra包,先把价格序列和成交量分别做图,然后合并到一张图中。
library(grid)
library(gridExtra)
g3<-ggplot(sz,aes(x=id))+geom_bar(stat = "identity",aes(y=volumn,fill=color),color='black',alpha=.7)+
scale_fill_manual(values=c('green','red'))+
scale_x_discrete(breaks=c(1,60,120,180,240),labels=c('09:30','10:30','11:30/13:00','14:30','15:00'))+
scale_y_continuous(breaks=c(0, 2.5e+07, 5.0e+07, 7.5e+07),labels=c('0','25M','50M','75M'))+
theme_bw()+guides(fill=FALSE)+
theme(axis.title=element_blank())
g4<-g2+theme(axis.text.x=element_blank(),
axis.title.x=element_blank(),
axis.ticks.x=element_blank())
grid.newpage()
pushViewport(viewport(layout = grid.layout(3, 1)))
print(g4, vp = viewport(layout.pos.row = 1:2, layout.pos.col = 1))
print(g3, vp = viewport(layout.pos.row = 3, layout.pos.col = 1))
另一种很折腾的方法,调整各种变量的取值范围(可以共用一个y轴的标度),把它们绘制到一张图当中。
对于第(3)个部分,还有一个实现方法:成交量和价格曲线共用x轴但y轴不一样,用ggplot2 package里的facet功能就可以了,只需把scales设成“free_y”。这样x轴刻度一样,y轴刻度依数据自动调整。
然后用subset的方法分别去画价格序列(geom_boxplot)和成交量(geom_bar)。方法参考:http://statbandit.wordpress.com/2011/07/29/a-ggplot-trick-to-plot-different-plot-types-in-facets/
看了您的文章很受益,期待能经常有新东西出现。我也是一名量化交易的热爱者,,希望能得到您的联系方式,方便日后向您请教!我的邮箱是krznz@qq.com
你这些是R语言吧。
老师你好
我试过这段代码,发现中间值设置成NA运行不下去,不知道怎么回事,还请能释疑解惑
> 我来回应