Implied Volatility Suite

SegaRKO · study · 226 行 · 点赞 3,469 · TradingView 原页

本页源码来自 TradingView 公开发布的开源脚本,版权归原作者所有, 请遵循其原始许可(Pine 脚本常见 CC BY-NC-SA / MPL-2.0 / MIT)。 本项目仅用于研究检索与许可范围内的移植。

Pine Script

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © SegaRKO
 
//@version=4
study("Implied Volatility Suite",precision=1)
 
//Implied Volatility Type
VolCalc= input(title="Calculation of Implied Volatility", defval="Model Implied Volatility", options=["Model Implied Volatility","VixFix"])
 
//Model Implied Volatility
src=close
Minutes = input(0, title="Minutes until expiry (Model-Only)")
Hours = input(0, title="Hours until expiry (Model-Only)")
Days = input(365, minval=0, defval=365, title="Days until expiry, including weekends and holidays (Model-Only)")
Expiry = (Hours + Minutes / 60) / 24 + Days
IVlen=365
Interval_Width = 1
 
LogReturn = log(close[1] / close[2])
Average = sma(LogReturn, IVlen)
STDEV = stdev(LogReturn, IVlen)
Expiry_Average = Expiry * Average
Expiry_STDEV = STDEV * sqrt(Expiry)
 
upper = close * exp(Expiry_Average + Interval_Width * Expiry_STDEV)
lower = close * exp(Expiry_Average - Interval_Width * Expiry_STDEV)
 
width = upper - lower
standard_dev = width / 2
IV = (standard_dev / (close * sqrt(Expiry/365)))*100
 
//Model Volatility Smile
//1 Standard Deviation upside strikes IV
SD1=stdev(close,IVlen)
UP1=SD1+close
 
LogReturnUP1 = log(UP1[1] / UP1[2])
AverageUP1 = sma(LogReturnUP1, IVlen)
STDEVUP1 = stdev(LogReturnUP1, IVlen)
Expiry_AverageUP1 = Expiry * AverageUP1
Expiry_STDEVUP1 = STDEVUP1 * sqrt(Expiry)
 
upperUP1 = UP1 * exp(Expiry_AverageUP1 + Interval_Width * Expiry_STDEVUP1)
lowerUP1 = UP1 * exp(Expiry_AverageUP1 - Interval_Width * Expiry_STDEVUP1)
 
widthUP1 = upperUP1 - lowerUP1
standard_devUP1 = widthUP1 / 2
IV_UP1 = (standard_devUP1 / (UP1 * sqrt(Expiry/365)))*100
 
//1 Standard Deviation downside strikes IV
DOWN1=close-SD1
 
LogReturnDOWN1 = log(DOWN1[1] / DOWN1[2])
AverageDOWN1 = sma(LogReturnDOWN1, IVlen)
STDEVDOWN1 = stdev(LogReturnDOWN1, IVlen)
Expiry_AverageDOWN1 = Expiry * AverageDOWN1
Expiry_STDEVDOWN1 = STDEVDOWN1 * sqrt(Expiry)
 
upperDOWN1 = DOWN1 * exp(Expiry_AverageDOWN1 + Interval_Width * Expiry_STDEVDOWN1)
lowerDOWN1 = DOWN1 * exp(Expiry_AverageDOWN1 - Interval_Width * Expiry_STDEVDOWN1)
 
widthDOWN1 = upperDOWN1 - lowerDOWN1
standard_devDOWN1 = widthDOWN1 / 2
IV_DOWN1 = (standard_devDOWN1 / (DOWN1 * sqrt(Expiry/365)))*100
 
 
//2 Standard Deviation upside strikes IV
SD2=stdev(close,IVlen)*2
UP2=SD2+close
 
LogReturnUP2 = log(UP2[1] / UP2[2])
AverageUP2 = sma(LogReturnUP2, IVlen)
STDEVUP2 = stdev(LogReturnUP2, IVlen)
Expiry_AverageUP2 = Expiry * AverageUP2
Expiry_STDEVUP2 = STDEVUP2 * sqrt(Expiry)
 
upperUP2 = UP2 * exp(Expiry_AverageUP2 + Interval_Width * Expiry_STDEVUP2)
lowerUP2 = UP2 * exp(Expiry_AverageUP2 - Interval_Width * Expiry_STDEVUP2)
 
widthUP2 = upperUP2 - lowerUP2
standard_devUP2 = widthUP2 / 2
IV_UP2 = (standard_devUP2 / (UP2 * sqrt(Expiry/365)))*100
 
//2 Standard Deviation downside strikes IV
DOWN2=close-SD2
 
LogReturnDOWN2 = log(DOWN2[1] / DOWN2[2])
AverageDOWN2 = sma(LogReturnDOWN2, IVlen)
STDEVDOWN2 = stdev(LogReturnDOWN2, IVlen)
Expiry_AverageDOWN2 = Expiry * AverageDOWN2
Expiry_STDEVDOWN2 = STDEVDOWN2 * sqrt(Expiry)
 
upperDOWN2 = DOWN2 * exp(Expiry_AverageDOWN2 + Interval_Width * Expiry_STDEVDOWN2)
lowerDOWN2 = DOWN2 * exp(Expiry_AverageDOWN2 - Interval_Width * Expiry_STDEVDOWN2)
 
widthDOWN2 = upperDOWN2 - lowerDOWN2
standard_devDOWN2 = widthDOWN2 / 2
IV_DOWN2 = (standard_devDOWN2 / (DOWN2 * sqrt(Expiry/365)))*100
 
//3 Standard Deviation upside strikes IV
SD3=stdev(close,IVlen)*3
UP3=SD2+close
 
LogReturnUP3 = log(UP3[1] / UP3[2])
AverageUP3 = sma(LogReturnUP3, IVlen)
STDEVUP3 = stdev(LogReturnUP3, IVlen)
Expiry_AverageUP3 = Expiry * AverageUP3
Expiry_STDEVUP3 = STDEVUP3 * sqrt(Expiry)
 
upperUP3 = UP3 * exp(Expiry_AverageUP3 + Interval_Width * Expiry_STDEVUP3)
lowerUP3 = UP3 * exp(Expiry_AverageUP3 - Interval_Width * Expiry_STDEVUP3)
 
widthUP3 = upperUP3 - lowerUP3
standard_devUP3 = widthUP3 / 2
IV_UP3 = (standard_devUP3 / (UP3 * sqrt(Expiry/365)))*100
 
 
//3 Standard Deviation downside strikes IV
DOWN3=close-SD3
 
LogReturnDOWN3 = log(DOWN3[1] / DOWN3[2])
AverageDOWN3 = sma(LogReturnDOWN3, IVlen)
STDEVDOWN3 = stdev(LogReturnDOWN3, IVlen)
Expiry_AverageDOWN3 = Expiry * AverageDOWN3
Expiry_STDEVDOWN3 = STDEVDOWN3 * sqrt(Expiry)
 
upperDOWN3 = DOWN3 * exp(Expiry_AverageDOWN3 + Interval_Width * Expiry_STDEVDOWN3)
lowerDOWN3 = DOWN3 * exp(Expiry_AverageDOWN3 - Interval_Width * Expiry_STDEVDOWN3)
 
widthDOWN3 = upperDOWN3 - lowerDOWN3
standard_devDOWN3 = widthDOWN3 / 2
IV_DOWN3 = (standard_devDOWN3 / (DOWN3 * sqrt(Expiry/365)))*100
 
//Model-Based Skew Index
Model_Based_Skew=avg(IV_UP1,IV_UP2,IV_UP3)-avg(IV_DOWN1,IV_DOWN2,IV_DOWN3)
 
 
//VixFix Implied Vol.
VIXFixLength = input(252, defval=22, title="VixFix Length (recommended values: 9, 22, 66, 132, or 252)")
VIXlength2 =252
//Synthetic IV (VixFix) Calculation
VixFix = (highest(close, VIXFixLength) - low) / highest(close, VIXFixLength) * 100
 
 
//VixFix Volatility Smile
//1 Standard Deviation upside strikes IV
VixUP1Close=stdev(close,VIXFixLength)+close
VixUP1Low=stdev(low,VIXFixLength)+low
VixUP1=(highest(VixUP1Close, VIXFixLength) - VixUP1Low) / highest(VixUP1Close, VIXFixLength) * 100
//1 Standard Deviation downside strikes IV
VixDOWN1Close=close-stdev(close,VIXFixLength)
VixDOWN1Low=low-stdev(low,VIXFixLength)
VixDOWN1=(highest(VixDOWN1Close, VIXFixLength) - VixDOWN1Low) / highest(VixDOWN1Close, VIXFixLength) * 100
 
//2 Standard Deviation upside strikes IV
VixUP2Close=(stdev(close,VIXFixLength)*2)+close
VixUP2Low=(stdev(low,VIXFixLength)*2)+low
VixUP2=(highest(VixUP2Close, VIXFixLength) - VixUP2Low) / highest(VixUP2Close, VIXFixLength) * 100
//2 Standard Deviation downside strikes IV
VixDOWN2Close=close-(stdev(close,VIXFixLength)*2)
VixDOWN2Low=low-(stdev(low,VIXFixLength)*2)
VixDOWN2=(highest(VixDOWN2Close, VIXFixLength) - VixDOWN2Low) / highest(VixDOWN2Close, VIXFixLength) * 100
 
//3 Standard Deviation upside strikes IV
VixUP3Close=(stdev(close,VIXFixLength)*3)+close
VixUP3Low=(stdev(low,VIXFixLength)*3)+low
VixUP3=(highest(VixUP3Close, VIXFixLength) - VixUP3Low) / highest(VixUP3Close, VIXFixLength) * 100
//3 Standard Deviation downside strikes IV
VixDOWN3Close=close-(stdev(close,VIXFixLength)*3)
VixDOWN3Low=low-(stdev(low,VIXFixLength)*3)
VixDOWN3=(highest(VixDOWN3Close, VIXFixLength) - VixDOWN3Low) / highest(VixDOWN3Close, VIXFixLength) * 100
 
VixFix_Skew=avg(VixUP1,VixUP2,VixUP3)-avg(VixDOWN1,VixDOWN2,VixDOWN3)
 
//Logic Statements
//Implied Volatility Logic
Volatility=if(VolCalc=="VixFix")
    VixFix
else
    IV
 
//Length for rank and percentile logic
Len=if(VolCalc=="VixFix")
    VIXlength2
else
    IVlen
    
//Implied Volatility Rank
IVR=(Volatility - lowest(Volatility, Len)) / 
   (highest(Volatility, Len) - lowest(Volatility, Len)) * 100
   
//Implied Volatility Percentile
pctileRank = percentrank(Volatility, Len)
 
//Skew Index Logic
Skew_Index=if(VolCalc=="VixFix")
    VixFix_Skew
else
    Model_Based_Skew
 
VolatilityChoice= input(title="Choose Volatility Data", defval="IV Rank", options=["Implied Volatility", "IV Rank","IV Percentile","Volatility Skew Index"])
 
//Volatiliy Data Logic
VolatilityData=if(VolatilityChoice=="IV Percentile")
    pctileRank
else if(VolatilityChoice=="IV Rank")
    IVR
else if(VolatilityChoice=="Volatility Skew Index")
    Skew_Index
else if(VolatilityChoice=="Implied Volatility")
    Volatility
 
 
//Color Logic
col=if(VolatilityChoice=="IV Percentile")
    pctileRank < 50 ? color.red : pctileRank >= 50 ? color.green : color.green
else if(VolatilityChoice=="IV Rank")
    IVR < 50 ? color.red : IVR >= 50 ? color.green : color.green
else if(VolatilityChoice=="Volatility Skew Index")
    color.aqua
else if(VolatilityChoice=="Implied Volatility")
    color.yellow
 
 
//Plot Statements
plot(VolatilityData, color=col, title="Volatility Data")

← 返回列表