R-code

February 14, 2012

Here is some quick documentation for the code:
Code is designed to calculate and return vectors of expected prices and a range based on standard deviations fitting the data to the following model:
dx=A*t+B*dz; where dz=є√dt and є~N(0,sd^2)

Quick documentation for the functions:

calcSDreturn <- function(tick, t)
%% Calculates SD of returns based on the last t data points in the tick object, returns a single value

calcMeanreturn <- function(tick, t)
%% Calculates Mean of returns based on the last t data points in the tick object, returns a single value.

expectedValue <- function(tick,t,f)
%% Creates a vector of f expected prices, from starting the current day, projecting out into the future, based on the last t days of data.

upperBoundCI <- function(tick,t,sd,f)
%% Creates a vector of f expected prices, sd number of standard deviations above the mean, projected out f periods into the future, based on the last t days of data.

lowerBoundCI <- function(tick,t,sd,f)
%% Creates a vector of f expected prices, sd number of standard deviations below the mean, projected out f periods into the future, based on the last t days of data.

Once you have cut and paste the entire thing into the R console, you only need to select a ticker and run the last function. I have included examples with returns at the bottom:

install.packages(“quantmod”)
library(quantmod)

getSymbols(“SPY”)

calcSDreturn <- function(tick, t)
{
p<- as.double(tick[,4])
if (t > (length(p)-2))
{
stop(“The requested time period is longer than that of the data”)
}
rv<-vector()
for (i in 2:length(p))
{
rv[i]<-100*(log(p[i],base=10)-log(p[i-1],base=10))
}
r<-vector()
for (i in t:1)
{
r[i] <- rv[length(rv)-i+1]
}
sd<-sqrt(var(r))
return(sd)
return(rv)
}

calcMeanreturn <- function(tick, t)
{
p<- as.double(tick[,4])
if (t > (length(p)-2))
{
stop(“The requested time period is longer than that of the data”)
}
rv<-vector()
for (i in 2:length(p))
{
rv[i]<-100*(log(p[i],base=10)-log(p[i-1],base=10))
}
r<-vector()
for (i in t:1)
{
r[i] <- rv[length(rv)-i+1]
}
m<-mean(r)
return(m)
}

expectedValue <- function(tick,t,f)
{
p<- as.double(tick[,4])
a <- calcMeanreturn(tick, t)/t
x <-vector()
x[1]<-p[length(p)]
for(i in 2:f)
{
x[i]<-x[i-1]+a*x[i-1]
}
index<-last(index(tick))+(1:f)
z<-as.xts(x,index)
return(z)
}

upperBoundCI <- function(tick,t,sd,f)
{
p<- as.double(tick[,4])
a <- calcMeanreturn(tick, t)/t
b <- calcSDreturn(tick, t)/t
x<-vector()
x[1]<-p[length(p)]
for(i in 2:f)
{
x[i]<-x[i-1]+a*x[i-1]+(b*sd)*x[i-1]
}
index<-last(index(tick))+(1:f)
z<-as.xts(x,index)
return(z)
}

lowerBoundCI <- function(tick,t,sd,f)
{
p<- as.double(tick[,4])
a <- calcMeanreturn(tick, t)/t
b <- calcSDreturn(tick, t)/t
x<-vector()
x[1]<-p[length(p)]
for(i in 2:f)
{
x[i]<-x[i-1]+a*x[i-1]-(b*sd)*x[i-1]
}
index<-last(index(tick))+(1:f)
z<-as.xts(x,index)
return(z)
}

plotGBM<-function(tick,t,f,sd)
{
u<- upperBoundCI(tick,t,sd,f)
l<- lowerBoundCI(tick,t,sd,f)
p<- expectedValue(tick,t,f)
plot(c(p,l,u),type=’p', main=”GBM Price Projection”, xlab=”Current day + t”, ylab=”Price”)
}

Example: I want to calculate the GBM model of returns in TLT for the next 20 trading days based on the last 60 trading days of data with a variance of one standard deviation from the mean:
getSymbols(“TLT”)
plotGBM(TLT,60,20,1)

This will return:
http://i.imgur.com/IsGu4.png

Using much more data for our projections will significantly lower the deviation:
plotGBM(TLT,300,20,1)

This will return:
http://i.imgur.com/1W2Qo.png

Several problems at the moment are:
1) I have not figured out how to do the indexing in a way that tracks the days the market is actually open, hence right now the x-axis is only an index of days out into the future rather than price on an actual trading day.
2) I have not been able to attach these plots to the chartSeries or any other candlestick plotting functions in R so right now I am stuck with just expected values verses those and underlying prices.

To adapt this code to any model you would like, you only need to change the formula used by the calcMeanreturn() and calcSDreturn() functions. Alternatively, if you wish to vary the way the model forecasts the stock prices you can change the loops in the expectedValue() and lowerBoundCI()/upperBoundCI() functions.


Charting Fix January 23rd

January 24, 2012

First I want to say I see far fewer attractive set ups today than I did last week. I remain stubbornly short via TZA with an average cost of just over $24 and one bullet left in the barrel to add if we get a final spike. Now that that is out of the way, here are some attractive looking charts I see.


Daily Charting Fix

January 19, 2012

Here are the charts I have found tonight. The theme is short squeezes. None of the charts posted here have under 10% of the float short, so there is the potential for explosive upside. I did not check earnings, nor fundamentals, I am posting these as technical setups only. If you like my work, please RT and/or follow me on twitter. Appreciated.


Follow

Get every new post delivered to your Inbox.