统计学意义是上的均值是描述数据的集中程度的,从古到今大家都认为把N个数相加然后在除以N就可以了。但这种方式只适用于高斯分布,对非高斯分布,如果还是用这种方式描述数据的集中程度就是问题一箩筐,于是就有了各种各样的描述数据集中程度的方法,什么加权平均,中位数,等等,等等。这有点像说了一个谎,后面就要不断地去圆这个谎。
人们一直把自己局限在X轴进行划分的框架内进行辛勤的挖掘,确发现一直是头痛医头。如果跳出X轴的制约,把目光转移到对Y轴的划分,一篇新天地就呈现在眼前,把数据重新排列,然后找出频数最大的那个数作为均值似乎更加合理地描述数据的集中程度。
在某类优化问题中,人们一般都是采用拉格朗日乘数法,找出约束条件,求导,解方程,最后得出一个局部最优的结论,如果换做频数最大对应的值,根本就不需要这么大费周章,并且得出的结果还是全局最优的;还有那个最大熵,费了半天劲,结果还是不如用最大频数对应的数来的方便,这些都不是重点,重点是使用对Y轴进行划分来描述数据的集中程度,可以解决金融市场上的预测问题,这个问题困扰人们上百年,至今也没有一个完美的解决方法。
金融市场的数据是动态的,在这个动态的市场上,你知道的确定性的东西越多,你的胜算就越大,下面来找找看都有哪些确定性的东西,第一个是每天的交易时间,这个是确定的,很多人忽略了这一点,4个小时的交易时间,数据是按照每秒两次来传输的,这样一天的交易结果构成的形态一定是三角形,并且这个三角形的面积是28800(4*3600*2),知道了三角形的面积,那么如果事前知道了三角形的低【高】,那么另一个高【底】就出来了,从而实现了金融市场的预测。
那么如何事前知道三角形的低或高呢,这就用到了如何描述数据的集中程度的问题,传统的路子肯定不行,因为均值在交易时间内不停的变化,找不到确定的东西,用最大频数对应的数表示均值,完美的解决了这个问题,见下图(数据和代码见后面):
上图的下半部分是用传统的均值计算一天的交易时间内均值的变化,可以看出,这个均值直到交易介绍才变得确定,上半部分是用频数的最大值对应的数据作为均值,可以看出在11:01后价格就一直稳定在2221,一直到收盘也没有改变,有半天的时间给你确认这个均值的有效性,因为事前知道了均值的频数,那么三角形的高也就提前预知了,那么计算三角形的底,估计小学生都会计算了。
代码:
library(data.table)
library(ggplot2)
library(gridExtra)
#勒贝格意义下的均值
dat = read.csv("C:/temp/tick.csv")[c(1,2)]
names(dat) = c("Time","Price")
data = as.data.table(dat)
data = data[,Time := substr(Time,12,16)]
data = data[,list(Freq = .N),by = list(Time,Price)]
data = data[,nb := rep(1:length(unique(Time)),rle(Time)$lengths)]
myfun = function(x) subset(data,nb <= x)[,list(Freq = sum(Freq)),by = Price][which.max(Freq)]
da = rbindlist(lapply(1:length(unique(data[,nb])),myfun))
da = da[,':='(Time = unique(data[,Time]),nb = 1:nrow(da))]
num = da[cumsum(rle(da[,Price])$lengths),]
p = ggplot(data = da,mapping = aes(x = nb,y = Price))
p1 = p + geom_line(size = 1) +
geom_text(aes(nb,Price,label = Price),data = num,vjust = -1,size = 5) +
geom_text(aes(nb,Price,label = Time),data = num,vjust = 1,size = 5,colour ='red') +
theme(axis.text.x = element_blank()) + theme(axis.text.y = element_blank()) +
theme(axis.ticks = element_blank()) + ylim(c(min(daPrice)−1,max(daPrice)+1)) +
xlab("") + ylab("") + theme(plot.background = element_rect(fill = "green")) +
theme(panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank()) +
theme(panel.grid.major.y = element_blank(), panel.grid.minor.y = element_blank())
#黎曼意义下的均值
dat = read.csv("C:/temp/tick.csv")[2]
names(dat) = "Price"
dat$nb = 1:nrow(dat)
data = as.data.table(dat)
myfun = function(x) mean(subset(data,nb <= x)[,Price])
da = sapply(1:nrow(data),myfun)
Rmean = data.frame(nb = 1:nrow(dat),Mean = da)
p = ggplot(data = Rmean,mapping = aes(x = nb,y = Mean))
p2 = p + geom_line(size = 1) + xlab("") + ylab("") +
theme(plot.background = element_rect(fill = "green"))
grid.arrange(p1, p2)
数据可以到这里下载:
http://blog.sciencenet.cn/home.php?mod=space&uid=556556&do=blog&id=872813