Q461157910
今天遇到一个小的需求,类似于实证金融中常用的投资组合排序方法,但相比起来更简单一些,比较适合learn the hard way。
需求描述如下:
有量级可比拟的两列数据p和ps(比如一支股票的收益率和滞后一期收益率),需要用ps的20%分位点将p分成5份,再统计每一份的均值,并画出每一份的核密度曲线。
代码如下,作为一个简单示意,此处的p和ps分别来自两个参数不同的Vasicek模型的蒙特卡洛模拟。
sp=function(x,q){
res=max(which(q<=x))
if(res==length(q))
res=res-1
return(res)
}
mc=function(r0,T,deltaT,a,b,sigma){
path=rep(r0,T/deltaT)
for(i in 2:length(path)){
path[i]=path[i-1]+a*(b-path[i-1])+sigma*rnorm(1,0,1)
}
path
}
p=mc(0.03,10,0.0001,0.1,0.04,0.02)
ps=mc(0.05,10,0.0001,0.15,0.05,0.10)
q=quantile(ps,seq(0,1,0.2))
c=apply(X=as.array(p), MARGIN = 1, FUN=sp,q)
m=tapply(p,c,mean)
co=tapply(p,c,length)
PS:这个小需求还可以用base里面的cut函数完成,然而不属于hard way范围,不再赘述。