[R-SIG-Finance] fPortfolio and R/Rmetrics

Gabor Grothendieck ggrothendieck at gmail.com
Sun Jun 7 23:03:48 CEST 2009


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.
>



More information about the R-SIG-Finance mailing list