Market Profile是1986年CBOT委托Peter Steidlmayer开发的一款划时代的金融数据分析软件,相对于本间宗久的K线系统,Market Profile 是一次革命,使二维视角的K线升华到三维的视角。
简单地介绍一下Market Profile:以半小时为基准,用一个大写字母表示,比如从当天开盘开始算起,第一个半小时用字母A表示,在第一个半小时内,价格无论到达哪里,都标记A,第二个半小时用字母B表示,以此类推。在价格运动过程中必将形成一个正态分布,然后找到正态分布的重心,以这个重心为基准,考虑70%(一个标准差)的区域为价值核心区,价格偏离这个区域,表示操作机会来临,择机入场交易。
为此,Steidlmayer还成立了公司,开发了基于Market Profile的软件在市场上销售,搞培训,忙的不亦乐乎。
其实从统计的角度上看,Market Profile非常简单,无非是把统计中经常使用的直方图竖起来后放到金融市场中,用R,可以非常容易画出Market Profile所需要的图形。
多说无益,直接把代码奉上,看看用R如何简单轻松的实现Market Profile的功能。
<br />
library(data.table)<br />
library(ggplot2)<br />
library(grid)<br />
MP = function(){<br />
# 用30分钟作为面板的划分区段</p>
<p> m30 = data.table(a = 1:225,b = cut(1:225,8,LETTERS[1:8]))<br />
setkey(m30,a)</p>
<p> # 用15分钟作为图形显示字符</p>
<p> m15 = data.table(a = 1:225,b = cut(1:225,15,LETTERS[1:15]))<br />
setkey(m15,a)</p>
<p> # 整理数据</p>
<p> dat = fread("C:/temp/rbtick.csv")[,list(Time = substr(时间,12,16),Price = 开盘价)]<br />
dat = dat[,list(Freq = .N),by = list(Time,Price)]<br />
data = dat[,nb := rep(1:length(unique(Time)),rle(Time)$lengths)]<br />
setkey(data,nb)</p>
<p> data = data[,lab := m30[data][,b]]<br />
dat = lapply(1:length(unique(data[,lab])),function(i) data[lab == LETTERS[i]])</p>
<p> # 用时间替换面板标签</p>
<p> lbl = data[,.SD[.N],by = lab][,Time]<br />
labdata = function(x,y) if(x=="lab") y = lbl</p>
<p> # 整理每个时段的数据</p>
<p> fun = function(x){<br />
data = x[,nb := m15[x][,b]]<br />
data = data[,list(char = paste(nb,collapse = '')), by = Price]<br />
data = data[,':='(char = format(char,justify = 'left'),<br />
Freq = nchar(gsub("[[:space:]]", "", char)),<br />
lab = rep(x[,lab][1],length(nrow(data))))][order(Price,decreasing = T),]<br />
return(data)<br />
}</p>
<p> data = rbindlist(lapply(1:length(unique(data[,lab])),function(i) fun(dat[[i]])))</p>
<p> # 画图</p>
<p> q = ggplot(data ,aes(x = Freq,y = Price))<br />
q + geom_text(aes(label = char,x = 0,hjust = 0),size = 2) +<br />
geom_point(size = 0) + facet_grid(.~lab,scales = "free",space = "free",labeller = labdata) +<br />
theme(panel.margin = unit(0, "lines")) + theme(axis.text.x = element_blank()) +<br />
theme(axis.ticks = element_blank()) +xlab("用R实现Market Profile太轻松了!") + ylab("") +<br />
theme(panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank()) +<br />
theme(panel.grid.major.y = element_blank(), panel.grid.minor.y = element_blank())<br />
}<br />
</p>