Skip to content

Instantly share code, notes, and snippets.

@MilindRCodes
Created June 9, 2016 05:45
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save MilindRCodes/634bab99dc4d0bee7362f8d802c4f7b8 to your computer and use it in GitHub Desktop.
Save MilindRCodes/634bab99dc4d0bee7362f8d802c4f7b8 to your computer and use it in GitHub Desktop.
#####################################################################################
# Strategy - Shorting at High #
#####################################################################################
# Upload the libraries and make other initial settings ##########################################################################################
library(xlsx);library(zoo);library(quantmod);library(rowr);library(TTR);
system.time({
######################################## Part 1 of the coDe ############################################
# Set the parameters here ###########################################################################################################################################
pc_up_level = 2 # Set the high percentage level here
noDays = 2 # No of lookback days, Google finance can go back upto 15 days for 1-minute data.
# Read the xlsx file that contains the Stock tickers that are to be backtested ##################################################################################################################################################################
test_tickers = read.csv("F&O Stock List.csv")
symbol = as.character(test_tickers[,4])
leverage = as.character(test_tickers[,5])
sig_finds = data.frame(0,0,0,0,0,0)
colnames(sig_finds) = c("Ticker","Leverage","Previous Price","Current Price","Abs Change","% Change")
for(s in 1:length(symbol)){
print(s)
source("Stock price data.R") # Custom function to download stock data
intraday_price_data(symbol[s],noDays)
dirPath = paste(getwd(),"/",sep="") # Specify the directory
fileName = paste(dirPath,symbol[s],".csv",sep="") # Specify the filename
data = as.data.frame(read.csv(fileName)) # Read the downloaded file
# When the code is run on the trading day, the last price will point
# to yesterday's closing price. This price is to be extracted to compute
# the % change in today's current price.
data_close =subset(data, select=(CLOSE), subset=(TIME == 1530))
pdp = tail(data_close,1)[,1]
# When the code is run on the trading day, the last price will point
# to the latest price. Use this price to compute the latest percentage
# change for each stock in the stock list.
#(Please note: when the code is run during non-trading hours,
#(both the pdp and the lp will be the same.)
lp = tail(data,1)[,3]
# Compute Percentage change for each stock & include in the dataframe only if significant #############################################
# Compute absolute and the percentage change
apc = round((lp - pdp),2)
pc = round(((lp - pdp) / pdp) * 100,2)
if (pc > pc_up_level ){
# Create a empty data frame, only if the Percentage change is significant
# fill the data frame with symbols price changes
sig_finds_temp = data.frame(0,0,0,0,0,0)
# Only if the change is significant, the respective stock data will be entered
# in the data frame being created below.
colnames(sig_finds_temp) = c("Ticker","Leverage","Previous Price","Current Price","Abs Change","% Change")
sig_finds_temp = c(symbol[s],leverage[s],pdp,lp,apc,pc)
sig_finds = rbind(sig_finds, sig_finds_temp) # combines the previous and current data frame
rm(sig_finds_temp) # deletes the temporary data frame
print(sig_finds)
}
# Deletes the downloaded stock price files for each ticker after processing the data
unlink(fileName)
} # Closes the for loop
# Write the results in an excel sheet
write.xlsx(sig_finds,"Shorting at High.xlsx")
######################################## Part 2 of the code ############################################
# Compute the different metrics which will be used in evaluating the best stock to Short #################################################
source("Stock price data.R") # Following lines pull NIFTY data
daily_price_data("NIFTY",1) # Number of years to lookback into eg. 1 = 1 year
dirPath = paste(getwd(),"/",sep="")
fileName = paste(dirPath,"NIFTY",".csv",sep="")
nifty_data = as.data.frame(read.csv(file = fileName))
test_tickers = read.xlsx("Shorting at High.xlsx",header=TRUE, 1, startRow=1, as.data.frame=TRUE)
t = nrow(test_tickers)
test_tickers$Count = 0
test_tickers$Avg_high = 0
test_tickers$Avg_decline = 0
test_tickers$Next_3d_Change = 0
test_tickers$Low_1Yr = 0
test_tickers$High_1Yr = 0
test_tickers$Neg_Last15_days = 0
test_tickers$RSI = 0
test_tickers$NIFTY_Correlation = 0
symbol = as.character(test_tickers[2:t,2])
noDays = 1
for (s in 1:length(symbol)){
print(s)
table_sig = data.frame(0,0,0,0,0,0,0)
colnames(table_sig) = c("Date","Days High in %","Days Close in %","RSI","Entry Price","Exit Price","Profit/Loss")
source("Stock price data.R")
daily_price_data(symbol[s],noDays) # Using the built-in function
dirPath = paste(getwd(),"/",sep="")
fileName = paste(dirPath,symbol[s],".csv",sep="")
data = as.data.frame(read.csv(file = fileName)) # Read the file
N = nrow(data)
# Initializing variables to zero
nc = 0
Cum_hc_diff = 0
Cum_threshold_per = 0
Cum_next_3d_change = 0
diff = data$HIGH - data$CLOSE
rsi_data = RSI(data$CLOSE, n = 14, maType="WMA", wts=data[,"VOLUME"])
for (i in 2:N) {
days_close = (data$CLOSE[i] - data$CLOSE[i-1])*100/data$CLOSE[i-1]
days_high = (data$HIGH[i] - data$CLOSE[i-1])*100/data$CLOSE[i-1]
condition = ((days_high > pc_up_level) == TRUE)
if (condition)
{
nc = nc + 1
date_table = data$DATE[i]
high_per_table = round(days_high,2)
close_price_per_table = format(round(days_close,2),nsmall = 2)
rsi_table = format(round(rsi_data[i],2),nsmall = 2)
entry_price = format(round(data$CLOSE[i-1]*(1+(pc_up_level/100)),2),nsmall = 2)
exit_price = format(round(data$CLOSE[i],2),nsmall = 2)
pl_trade = format(round(((data$CLOSE[i-1]*(1+(pc_up_level/100))) - data$CLOSE[i]),2),nsmall = 2)
hc_diff = diff[i] # diff between day's high and day's close whenever the price crossed the threshold level.
Cum_hc_diff = Cum_hc_diff + hc_diff # Cumulative of the diff for all trades
Average_hc_diff = round(Cum_hc_diff / nc , 2) # Computing the average for diff between high and low.
Cum_threshold_per = Cum_threshold_per + days_high # Computes the total of Day's high's whenever price crossed the threshold.
Average_threshold_per = round(Cum_threshold_per / nc , 2) # Average of High's
if ( i < (N - 5)){ # Captures the average next 3-day price movement
next_3d_change = data$CLOSE[i+3] - data$CLOSE[i]
Cum_next_3d_change = Cum_next_3d_change + (data$CLOSE[i+3] - data$CLOSE[i])
Average_next_3d_change = round(Cum_next_3d_change / nc,2)
}
# Create a temporary dataframe to add values and then later merge with the final table
table_temp = data.frame(0,0,0,0,0,0,0)
colnames(table_temp) = c("Date","Days High in %","Days Close in %","RSI","Entry Price","Exit Price","Profit/Loss")
table_temp = c(date_table,high_per_table,close_price_per_table,rsi_table,entry_price,exit_price,pl_trade)
table_sig = rbind(table_sig, table_temp)
rm(table_temp)
}
}
table_sig = table_sig[order(table_sig$Date),]
name = paste(symbol[s]," past performance",".xlsx",sep="")
write.xlsx(table_sig,name) # Write the results in an excel sheet
# load it back to format the excel sheet for column width
wb = loadWorkbook(name)
sheets = getSheets(wb)
autoSizeColumn(sheets[[1]], colIndex=1:16)
saveWorkbook(wb,name)
# Price performance in the last 15 days, checks for many days the price change was negative.
nc_last_15 = 0
for ( p in (N-15):N){
condition_1 = (((data$CLOSE[p] - data$CLOSE[p-1])< 0 ) == TRUE )
if (condition_1)
{
nc_last_15 = nc_last_15 + 1
}
}
# Correlation between the ticker and NIFTY
Cor_coeff = round(cor(data$CLOSE , nifty_data$CLOSE),2)
# Filling the Shorting at High.xlsx with the computed metrics
e = s + 1
test_tickers$Count[e] = nc
test_tickers$Avg_high[e] = format(Average_threshold_per,nsmall = 2) # Indicates the Avg. percentage above the threshold in the past
test_tickers$Avg_decline[e] = format(Average_hc_diff,nsmall = 2) # Indicates the Avg. decline in Absolute rupee terms from the Avg. high to the closing price in the past test_tickers$Next_3d_Change[e] = round(Average_next_3d_change,2) # Indicates the next 3 day price movement.
test_tickers$Next_3d_Change[e] = format(Average_next_3d_change,nsmall = 2)
test_tickers$Low_1Yr[e] = format(min(data$CLOSE),nsmall = 2) # 1 year low price
test_tickers$High_1Yr[e] = format(max(data$CLOSE),nsmall = 2) # 1 year high price
test_tickers$Neg_Last15_days[e] = nc_last_15 # Indicates how many times in the last 15 days has the price been negative.
test_tickers$RSI[e] = round(tail(rsi_data,1),2)
test_tickers$NIFTY_Correlation[e] = Cor_coeff # Computes the correlation between the Stock and NIFTY.
unlink(fileName) # Deletes the downloaded stock price files for each ticker after processing the data
rm("data","table_sig")
} # This closes the for loop
test_tickers = test_tickers[-1,-1]
colnames(test_tickers) = c("Ticker", "Leverage","Previous Price","Current Price","Abs. Change","% Change","Count","Avg.High %","Abs Avg.Decline","Next 3-d price move","1-yr low","1-yr high","-Ve last 15-days","RSI","Nifty correlation")
# Write and format the final output file ##########################################################################################
write.xlsx(test_tickers,"Shorting at High.xlsx") # Write the final output back to the same file.
wb = loadWorkbook("Shorting at High.xlsx")
sheets = getSheets(wb)
autoSizeColumn(sheets[[1]], colIndex=1:19)
saveWorkbook(wb,"Shorting at High.xlsx")
#options(warn = oldw)
})
@vishalhawa
Copy link

what was your success rate using this strategy ? did certain category of stocks performed better than others?

@mhdbouza
Copy link

how can I get the CSV file "F&O Stock List.csv"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment