• Bots
  • Nasdaq
  • Alpha
  • Research
  • Blog
  • My Bots
  • About
  • Contact
  • Privacy
  • Terms
AlphaBlock
  • Bots
  • Nasdaq
  • Alpha
  • Research
  • Blog
  • Log in

Lupin's 1,000 days

Mukul Pal · August 26, 2015

Lupin
Dacian Jurj
dacian.jurj@orpheusindices.com
A system based investing is different from news based investing. It’s hard to quantify news and how up or down the market would go. This is why we let our models do the work for us. The current India Active has outperformed India top 50 by 5.27% year to date. Today we look at one of the top India holdings in our Active 10 model, which selects 10 components from 50 and goes cash in case markets decide to go down, all system based.
What does top holding mean?
A top selected stock by a portfolio model should deliver high returns and this selection should also be accompanied by a longer holding period. This is what happened with RMI selection with Lupin. The stock was selected by Orpheus India Active 10 model on 8 of February in 2012 and has returned 317% since then. Lupin stands out as an outlier delivering nearly 15 times more than the average winner in RMI, which has an average gain at 25%. This makes it a top selection. Rather out of curiosity when we looked at our other active models running on UK, US, Canada, and other European markets, Lupin was indeed the top RMI active holding globally. This makes it special.
Lupin and the India Active
The Lupin entry to the model is now more than 1000 days and still running. This is nearly 4 times the average holding of the model selection at 250 days. There are few strengths we want to emphasize about RMI here. First; our Active models are for Investors who want to hold components for longer durations while still designed to conserve capital. RMI Active models go cash and stay cash in case markets are in a downtrend. This makes our Active models different from our Passive models. So RMI Active is unique in its ability to select a component for a longer duration like a passive holding but still offer protection (by going cash).
Though Lupin stands out as an outlier in holding period and returns, RMI has other top holdings too. Kotak Mahindra Bank at 900 days and Sun Pharmaceuticals at 700 days are the other top holdings. The model closed the entries at a profit of 400% (Sun) and 180% (Kotak Bank) respectively.
6 5
History of Lupin entries and exits
The great selection was not an accident. The model selected the stock on previous occasions starting 2007. The selection in July 2007 and Oct 2008 saw the stock exit with marginal losses at 11% and 3% after staying invested for 4 months and 12 months respectively. It was in 2009 when the trend changed and the stock delivered 190%. It was then the model selected the current running entry.
What if there was no Lupin?
To check the stability of RMI, we did a small test. We assumed there was no Lupin in the universe and we tested the model with and without Lupin. Not so surprisingly the parameters as illustrated in the tables below were consistent whether it was the average holding periods, average cash in the portfolio, average expected gains per trade, annualized returns and the average volatility. Only thing, which was different, was the current percentage of cash, which was higher for the RMI portfolio without Lupin. This validated the RMI framework as a stable selection system, which can operate even if there were no big winners like Lupin.
RECOLORED2
We also plotted the relative performance of the two models and did not find a substantial difference in the working of the models. Both cases relative performing moved up near 2, which means RMI delivered 2 times outperformance compared to the benchmark. The periods of underperformance were also similar.
The plots above are the comparison of RMI with and without Lupin vs. the Benchmark. Here also we see a consistency in the model and it’s selections. The plot below displays how a portfolio of 100 units invested in RMI and Benchmark would evolve from 09/2005.
RMI India Active 10 with and without LUPIN: Monthly Performance Table
9 8
R Code: Libraries
library(xts)
library(ggplot2)
library(TTR)
library(PerformanceAnalytics)
library(xtable)
require(utils)
library(Hmisc)
library(R.oo)
library(grid)
library(fTrading)

R Code: Running components
setwd("~/India Research (Dacian)")
xw<-data.frame(read.table("Active .csv",sep=",",header=T,stringsAsFactors=F))
ll<-seq(1,dim(xw)[1],1)
xw<-cbind(ll,xw)
xw[,6]<-round(xw[,6],2)
xw=xw[,-5]
colnames(xw)<-c("No.","Dates","Symbols","Asset","Price", "Entry Price","P&L","Proportion","Holding Period", "Exit 1","Exit 2" )
xx<-xtable(xw,type="latex",caption="RMI Running Components.")
print(xx, scalebox=0.6,include.rownames=FALSE)


R Code: Equity Plots
setwd("~/India Research (Dacian)")
aaa<-data.frame(read.table("Active .csv",sep=",",header=TRUE,stringsAsFactors=F))
aaa=aaa[-which(duplicated(aaa[,1])),]
bbb<-data.frame(read.table("Active.csv",sep=",",header=TRUE,stringsAsFactors=F))
bbb<-bbb[(dim(bbb)[1]-dim(aaa)[1]+1):dim(bbb)[1],1:2]
bbb[1,3]=100
for(i in seq(1,dim(bbb)[1]-1,1)){
bbb[i+1,3]=bbb[1,3]/bbb[1,2]*bbb[i+1,2]
}
m<-data.frame(matrix(NA,nrow=dim(aaa)[1],ncol=6))
m[,1]<-aaa[,1]
m[,2]<-aaa[,4]
m[,3]=bbb[,3]
m[,4]=aaa[,2]
m[,5]=aaa[,3]
m[,6]=bbb[,2]
colnames(m)<-c("Date","RMI India","India 50 Indexed","RMI Running","Cash","GSPTSE")
m<-m[-c(1582,1608,1617),]
Active.csv",sep=",",header=TRUE,stringsAsFactors=F))
m[,1]<-as.Date(as.character(m[,1]),"%m/%d/%Y")
x<-as.xts(m[,2:6],order.by=m[,1])
Active.csv",sep=",",header=T,stringsAsFactors=F))
xx<-as.xts(m[,2:6],order.by=m[,1])
xx1<-(xx[,4]/xx[,1])*100
xx2<-xx[,5]
k<-dim(x)
Portfolio<-data.frame(Date=m[,1],(x[,1:2]))
colnames(Portfolio)[2:3]<-c("RMI India Active 10","India 50 Indexed")
colnames(Portfolio)[1:4]<-c("Date","RMI India Active 10 no Lupin","RMI India Active 10","India 50 Indexed")
f<-ggplot(data=Portfolio,aes(as.Date(as.character(Date))))+geom_line(aes(y=Portfolio[,2],col=colnames(Portfolio)[2]))+geom_line(aes(y=Portfolio[,3],col=colnames(Portfolio)[3]))+geom_line(aes(y=Portfolio[,4],col=colnames(Portfolio)[4] ))+geom_abline(intercept = 1000000, slope = 0,color="#999999")
f<-f+xlab("Date")+ylab("Indices")
f<-f+scale_colour_manual(name="Indices",breaks = c(colnames(Portfolio)[2],colnames(Portfolio)[3],colnames(Portfolio)[4] ), values = c("green","red","blue"))


R Code: Generating the statistical tables
setwd("~/India Research (Dacian)")
xw<-data.frame(read.table("Active .csv",sep=",",header=T,stringsAsFactors=F))
ll<-seq(1,dim(xw)[1],1)
xw<-cbind(ll,xw)
xw[,6]<-round(xw[,6],2)
xw=xw[,-5]
colnames(xw)<-c("No.","Dates","Symbols","Asset","Price", "Entry Price","P&L","Proportion","Holding Period", "Exit 1","Exit 2" )
xx<-xtable(xw,type="latex",caption="RMI Running Components.")
print(xx, scalebox=0.6,include.rownames=FALSE)
z1=z1
colnames(z1)<-c("RMI","India 50")
xx<-xtable(z1,type="latex",caption="RMI vs. Benchmark performance.")
print(xx, scalebox=0.8,include.rownames=TRUE)

R Code: Relative Performance
PortfolioXts<-as.xts(Portfolio[,2:3],order.by=Portfolio[,1])
Port<-diff(log(PortfolioXts[,1]))
k<-dim(PortfolioXts)
Port<-Port[2:k[1]]
Port_bench<-diff(log(PortfolioXts[,2]))
Port_bench<-Port_bench[2:k[1]]
my=cbind(Portfolio[2:k[1],1],data.frame(Port),data.frame(Port_bench))
RelativePerformance1<-chart.RelativePerformance(Port,Port_bench,main = "Relative Performance without LUPIN",colorset=4)
#old.par <- par(mfrow=c(1, 2))

R Code: Monthly Return
setwd("~/India Research (Dacian)")
aaa<-data.frame(read.table(" Active.csv",sep=",",header=TRUE,stringsAsFactors=F))
aaa=aaa[-which(duplicated(aaa[,1])),]
bbb<-data.frame(read.table("Active.csv",sep=",",header=TRUE,stringsAsFactors=F))
bbb<-bbb[(dim(bbb)[1]-dim(aaa)[1]+1):dim(bbb)[1],1:2]
bbb[1,3]=100
for(i in seq(1,dim(bbb)[1]-1,1)){
bbb[i+1,3]=bbb[1,3]/bbb[1,2]*bbb[i+1,2]
}
m<-data.frame(matrix(NA,nrow=dim(aaa)[1],ncol=6))
m[,1]<-aaa[,1]
m[,2]<-aaa[,4]
m[,3]=bbb[,3]
m[,4]=aaa[,2]
m[,5]=aaa[,3]
m[,6]=bbb[,2]
colnames(m)<-c("Date","RMI India Active 10"," India 50 Indexed","RMI Running","Cash"," India 50")
Active.csv",sep=",",header=TRUE,stringsAsFactors=F))
m[,1]<-as.Date(as.character(m[,1]),"%m/%d/%Y")
temp1=as.numeric(format(as.Date(as.character(m[,1])), "%m"))
temp=1
i=2
while(i<=nrow(m)){
if(temp1[i]!=temp1[i-1]) temp<-c(temp,i)
i=i+1
}
if(nrow(m)>temp[length(temp)]) temp=c(temp,nrow(m))
s<-temp
x<-as.xts(m[,2:6],order.by=m[,1])
k<-dim(x)
Portfolio<-data.frame(Date=m[s,1],(x[s,1:2]))
vv=Return.calculate(Portfolio[,2:3],method=c("simple"))
Port<-diff(log(x[s,1]))
k<-dim(Port)
Port<-Port[-nrow(Port)]
Port[(1:nrow(Port)),1]=vv[(2:nrow(vv)),1]
Port_bench<-diff(log(x[s,2]))
k<-dim(Port_bench)
Port_bench<-Port_bench[-nrow(Port_bench)]
Port_bench[(1:nrow(Port_bench)),1]=vv[(2:nrow(vv)),2]
z2=table.CalendarReturns(Port,digits = 3,geometric=TRUE)
z2<-as.data.frame(z2)
z3=table.CalendarReturns(Port_bench,digits = 3,geometric=TRUE)
z=data.frame(matrix(NA,nrow=nrow(z2)*2,ncol=ncol(z2)))
colnames(z)=colnames(z2)
j=0
for(i in seq(1,nrow(z2),1)){
z[j+1,(1:13)]=z2[i,(1:13)]
rownames(z)[j+1]=paste(colnames(Port),"-",rownames(z2)[i])
z[j+2,(1:13)]=z3[i,(1:13)]
rownames(z)[j+2]=paste(colnames(Port_bench),"-",rownames(z2)[i])
j=j+2
}
colnames(z)[13]=c("Total Returns")
sr=NULL
for(i in seq(1,nrow(z),1)){
sr=c(sr,((as.numeric(z[i,13])))/(sqrt(12)*sd(na.omit(as.numeric(z[i,1:12]))))) }
sr=round(sr,2)
sr1=NULL
for(i in seq(1,nrow(z),1)){
sr1=c(sr1,(sqrt(12)*sd(na.omit(as.numeric(z[i,1:12]))))) }
sr1=round(sr1,2)
z=cbind(z,sr1,sr)
colnames(z)[14]="Ann. Volatility"
colnames(z)[15]="Total Return/Volatility"
xx<-xtable(z,type="latex",caption="Monthly returns for RMI Index and Benchmark" )
print(xx,scalebox=0.6,include.rownames=TRUE)

Plotly Stationarity
Reversion Diversion Hypothesis

Primary

Categories

  • Forecasts
  • News
  • Primers
  • Research
  • RMI
  • Visuals

Blog Archives

  • 2019 (1)
  • 2018 (2)
  • 2017 (21)
  • 2016 (32)
  • 2015 (21)
  • 2014 (13)
  • 2013 (116)
  • 2012 (231)
  • 2011 (542)
  • 2010 (969)
  • 2009 (733)
  • 2008 (79)
  • 2007 (36)
  • 2006 (4)
  • 2005 (1)

Recent posts

  • SWOT your AI
  • Real Ventures invests in AlphaBlock
  • Nasdaq RMIVG20 nears 80%
  • Nasdaq Orpheus RMIVG20 makes a new high.
  • Nasdaq Orpheus RMIVG20 up 60%

©2025 AlphaBlockalphablock

  • About
  • Contact
  • Privacy
  • Terms