Friday, February 26, 2016

TastyTrade did a great segment explaining the difference between IV rank and IV percentile. It is on the 2/19 Options Jive episode They also have the TOS script for plotting the code.


Here is the code
Source:Tastytrade:

This will only work on the live money TOS platform.
The IV Rank & IV Percentile Scripts will only load initially when looking at a daily chart ("1 year D" for example).
�
For IV Rank & IV Percentile Overlayed (Will Work For Futures):
1) Go to 'Charts' tab
2) Click on the "research" icon (officially called "studies"...same line where you type in the ticker same symbol, on the right hand side)
3) Click on "Edit Studies" and then "New"... Lower left hand corner
4) Delete everything in the box. (plot Data = close;)
5) Paste the entire code listed below
6) Name the study RankLevels
7) Click 'OK'
8) Click 'Apply'
9) Click 'Ok'

# tastytrade/dough
# m.r. v1.6
#
# plots both IV Rank and IV Percentile
#
# IV Rank is a description of where the current IV lies in comparison to its yearly high and low IV
# IV Percentile tells the percentage of days over the last year, that were below the current IV
#
# for information on the two, see Skinny on Options Data Science, titled "IV Rank and IV Percentile"
# http://ontt.tv/1Nt4fcS

declare lower;
declare hide_on_intraday;
input days_back = 252; # we usually do this over one year (252 trading days)

# implied volatility
# using proxies for futures
def df = if (GetSymbol() == "/ES") then close("VIX") / 100
else if (GetSymbol() == "/CL") then close("OIV") / 100 
else if (GetSymbol() == "/GC") then close("GVX") / 100 
else if (GetSymbol() == "/SI") then close("VXSLV") / 100 
else if (GetSymbol() == "/NQ") then close("VXN") / 100 
else if (GetSymbol() == "/TF") then close("RVX") / 100 
else if (GetSymbol() == "/YM") then close("VXD") / 100 
else if (GetSymbol() == "/6E") then close("EVZ") / 100 
else if (GetSymbol() == "/ZN") then close("VXTYN") / 100 
else imp_volatility();

def df1 = if !IsNaN(df) then df else df[-1];

# display regular implied volatility
# ---------------------------
AddLabel(yes, "IV: " + Round(df1 * 100.0, 0), Color.ORANGE);

# calculate the IV rank
# ---------------------------
# calculate the IV rank
def low_over_timespan = Lowest(df1, days_back);
def high_over_timespan = Highest(df1, days_back);

def iv_rank = Round( (df1 - low_over_timespan) / (high_over_timespan - low_over_timespan) * 100.0, 0);
plot IVRank = iv_rank;
IVRank.SetDefaultColor(Color.GRAY);
AddLabel(yes, "IV Rank: " + iv_rank + " (i.e. our default metric for analyzing IV)", Color.GRAY);

# calculate the IV percentile
# ---------------------------
# how many times over the past year, has IV been below the current IV
def counts_below = fold i = 1 to days_back + 1 with count = 0 
do 
  if df1[0] > df1[i] then 
    count + 1
  else
    count;

def iv_percentile = Round(counts_below / days_back * 100.0, 0);
plot IVPercentile = iv_percentile;
IVPercentile.SetDefaultColor(Color.RED);
AddLabel(yes, "IV Percentile: " + iv_percentile + " (i.e. " + iv_percentile + "% of days or " + counts_below + " days out of " + days_back + " days were below the current IV)", Color.RED);

AddCloud(iv_rank, iv_percentile, Color.PINK, Color.YELLOW);

0 comments: