Could someone please suggest ways of improving the following two functions for use in fPortfolio? (fPortfolio is an extremely powerful and comprehensive package for constructing and testing portfolios.See the Rmetrics ebook, entitled 'Portfolio Optimization with R/Rmetrics'. http://www.rmetrics.org/ebook.htm) The first function aims to replace the matrix of returns used in running fPortfolio by a matrix of returns in which the mean of each asset is equal to a forecast specifed by the user. It works but is incredibly slow, mainly I think because of the loops used. ?forec=function(x,forc) { newx=x if (length(forc)!=ncol(x)) stop("Forecast columns do not match up with data") cm=colMeans(x) nc=ncol(x) nr=nrow(x) for (j in 1:nc){for (i in 1:nr) newx[i,j]=x[i,j]-cm[j]+forc[j]} newx } #Used as in this example: library(fPortfolio) lppAssets=100*LPP2005.RET[,c("SBI","SPI","LMI","MPI")] forc=c(.1,.2,.1,.2) newAss=forec(lppAssets,forc) colMeans(lppAssets) colMeans(newAss) The second addresses a problem which is common in real estate asset returns which arises because of the way in which the returns are generated (through appraisals rather than through market prices). The function is designed to "de-smooth" the appraisal-based returns. For references to the problem see, the summary of a report for the Investment Property Forum in the UK https://members.ipf.org.uk/membersarealive/downloads/listings1.asp?pid=292 or google "desmoothing real estate returns" The function requires a column of asset returns and effectively removes the AR(1) component.The alpha is the AR(1) coefficient but users can enter a lower coefficient if preferred for reasons that are discussed in the literature! Again improvements would be welcome.e.g reading in a matrix rather than a single column and specifying say a standard deviation rather than the alpha. Thank you for any comments Charles Ward desmooth<-function(x1,alpha=0,plot=TRUE,print=TRUE) { x1=ts(x1) x2=x1 tab01=matrix(ncol=4,nrow=4) rnd<-function(x) {x=round(100000*x)/100000;x} r1=pacf(x1,plot=FALSE) if (alpha==0) alpha=r1$ac[1] for (i in 2:length(x1)) x2[i]=(x1[i]-alpha*x1[i-1])/(1-alpha) if (plot==TRUE) {plot(x2,col="red",type="l");lines(x1,col="black"); legend("topleft",c("Original","De-smoothed"), col=1:5,lty=1:1)} if (print==TRUE) { tab01[1,]=c("", "Original","De-Smoothed","Alpha"); tab01[2,1]="Mean"; tab01[3,1]="Std. Dev."; tab01[2,2]=rnd(mean(x1));tab01[2,3]=rnd(mean(x2)); tab01[3,2]=rnd(sd(x1));tab01[3,3]=rnd(sd(x2)); tab01[2,4]=""; tab01[3,4]=rnd(alpha); dimnames(tab01)<-list(rep("",3),rep("",4)); print(tab01,quote=FALSE)} x2 } Used as in this example library(fPortfolio) PropInd=c(.0093,.0085,.009,.0098,.0084,.01294,.0136,.0165,.0235,.0150,.0178,.0131, .0233,.0156,.0258,.026,.0284,.0261,.0230,.0235 ,.0209,.0218,.0241,.0152,.0161) DesPropInd=desmooth(PropInd) #or to take a less Efficient Market line DesPropInd=desmooth(PropInd,alpha=0.4)
fPortfolio and R/Rmetrics
2 messages · Charles Ward, Gabor Grothendieck
On Sun, Jun 7, 2009 at 4:34 PM, Charles Ward<cwrward at gmail.com> wrote:
Could someone please suggest ways of improving the following two functions for use in fPortfolio? (fPortfolio is an extremely powerful and comprehensive package for constructing and testing portfolios.See the Rmetrics ebook, entitled 'Portfolio Optimization with R/Rmetrics'. http://www.rmetrics.org/ebook.htm) The first function aims to replace the matrix of returns used in running fPortfolio by a matrix of returns in which the mean of each asset is equal to a forecast specifed by the user. ?It works but is incredibly slow, mainly I think because of the loops used. ?forec=function(x,forc) { newx=x if (length(forc)!=ncol(x)) stop("Forecast columns do not match up with data") cm=colMeans(x) nc=ncol(x) nr=nrow(x) for (j in 1:nc){for (i in 1:nr) newx[i,j]=x[i,j]-cm[j]+forc[j]} newx }
sweep(x, 2, colMeans(x) - forc, "-")
#Used as in this example:
library(fPortfolio)
lppAssets=100*LPP2005.RET[,c("SBI","SPI","LMI","MPI")]
forc=c(.1,.2,.1,.2)
newAss=forec(lppAssets,forc)
colMeans(lppAssets)
colMeans(newAss)
Try this: colMeans(sweep(lppAssets, 2, colMeans(lppAssets) - forc, "-"))
The second addresses a problem which is common in real estate asset returns which arises because of the way in which the returns are generated (through appraisals rather than through market prices). The function is designed to "de-smooth" the appraisal-based returns. For references to the problem see, the summary of a report for the Investment Property Forum in the UK https://members.ipf.org.uk/membersarealive/downloads/listings1.asp?pid=292 or google "desmoothing real estate returns" The function requires a column of asset returns ?and effectively removes the AR(1) component.The alpha is the AR(1) coefficient but users can enter a lower coefficient if preferred for reasons that are discussed in the literature! Again improvements would be welcome.e.g reading in a matrix rather than a single column and specifying say a standard deviation rather than the alpha. Thank you for any comments Charles Ward desmooth<-function(x1,alpha=0,plot=TRUE,print=TRUE) { x1=ts(x1) x2=x1 tab01=matrix(ncol=4,nrow=4) rnd<-function(x) {x=round(100000*x)/100000;x} r1=pacf(x1,plot=FALSE) if (alpha==0) alpha=r1$ac[1] for (i in 2:length(x1)) x2[i]=(x1[i]-alpha*x1[i-1])/(1-alpha) if (plot==TRUE) {plot(x2,col="red",type="l");lines(x1,col="black"); ? ? ? ?legend("topleft",c("Original","De-smoothed"), col=1:5,lty=1:1)} if (print==TRUE) { ? ? ? ?tab01[1,]=c("", "Original","De-Smoothed","Alpha"); ? ? ? ?tab01[2,1]="Mean"; ? ? ? ?tab01[3,1]="Std. Dev."; ? ? ? ?tab01[2,2]=rnd(mean(x1));tab01[2,3]=rnd(mean(x2)); ? ? ? ?tab01[3,2]=rnd(sd(x1));tab01[3,3]=rnd(sd(x2)); ? ? ? ?tab01[2,4]=""; ? ? ? ?tab01[3,4]=rnd(alpha); ? ? ? ?dimnames(tab01)<-list(rep("",3),rep("",4)); ? ? ? ?print(tab01,quote=FALSE)} ? ? ? ?x2 }
if (plot==TRUE) is the same as if (plot)
Used as in this example library(fPortfolio) PropInd=c(.0093,.0085,.009,.0098,.0084,.01294,.0136,.0165,.0235,.0150,.0178,.0131, .0233,.0156,.0258,.026,.0284,.0261,.0230,.0235 ?,.0209,.0218,.0241,.0152,.0161) DesPropInd=desmooth(PropInd) #or to take a less Efficient Market line DesPropInd=desmooth(PropInd,alpha=0.4)
_______________________________________________ R-SIG-Finance at stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance -- Subscriber-posting only. -- If you want to post, subscribe first.