이 스크립트는 quantmod의 함수를 통해 yahoo 데이터를 가져온 다음 RGA 라이브러리가있는 3D 그래프를 게시하기 위해 데이터를 마사지합니다. 첨부 된 ggplot은 내가 시도하는 데이터를 표시합니다. 별도의 라인 기하 구조로 표면을 생성합니다. 문제는 3D 그래프가 매우 못 생겼고 앞쪽 만기에 제한된 양의 포인트 때문에자를 수 있다는 것입니다. 아무도 내가 여기에 무슨 일이 일어나는지 말할 수 없으며이 문제를 해결하기 위해 할 수있는 일은 .. 부드럽게 할 필요가 있습니까? 각 만료 라인은 다음 보간 .... volsurface http://img15.imageshack.us/img15/7338/surface.png ggplot2_smile http://img402.imageshack.us/img402/1272/volatilitysmilegoog.pngR 프로그래밍에서 변동성 표면 그래프에 고정 보간
library(RQuantLib)
library(quantmod)
library(rgl)
library(akima)
library(ggplot2)
library(plyr)
GetIV <- function(type, value,
underlying, strike,dividendYield, riskFreeRate, maturity, volatility,
timeSteps=150, gridPoints=151) {
AmericanOptionImpliedVolatility(type, value,
underlying, strike,dividendYield, riskFreeRate, maturity, volatility,
timeSteps=150, gridPoints=151)$impliedVol
}
GetDelta <- function(type, underlying, strike,
dividendYield, riskFreeRate, maturity, volatility,
timeSteps=150, gridPoints=149, engine="CrankNicolson") {
AmericanOption(type,underlying, strike, dividendYield, riskFreeRate, maturity, volatility,
timeSteps=150, gridPoints=149, engine="CrankNicolson")$delta
}
# set what symbol you want vol surface for
underlying <- 'GOOG'
# set what your volatility forcast or assumption is
volforcast <- .25
# Get symbols current price
underlying.price <- getQuote(underlying,what=yahooQF("Last Trade (Price Only)"))$Last
OC <- getOptionChain(underlying, NULL)
#check data
head(OC)
lputs <- lapply(OC, FUN = function(x) x$puts[grep("[A-Z]\\d{6}[CP]\\d{8}$", rownames(x$puts)), ])
head(lputs) #check for NA values, yahoo returns all NA values sometimes
puts <- do.call('rbind', lputs)
#check data
head(puts,5)
symbols <- as.vector(unlist(lapply(lputs, rownames)))
expiries <- unlist(lapply(symbols, FUN = function(x) regmatches(x=x, regexpr('[0-9]{6}', x))))
puts$maturity <- as.numeric((as.Date(expiries, "%y%m%d") - Sys.Date())/365)
puts$IV <- mapply(GetIV, value = puts$Ask, strike = puts$Strike, maturity = puts$maturity,
MoreArgs= list(type='put', underlying= underlying.price,
dividendYield=0, riskFreeRate = 0.01,
volatility = volforcast), SIMPLIFY=TRUE)
puts$delta <- mapply(GetDelta, strike = puts$Strike, volatility = puts$IV,
maturity = puts$maturity, MoreArgs= list(type='put',
underlying=underlying.price, dividendYield=0,
riskFreeRate = 0.01), SIMPLIFY=TRUE)
# subset out itm puts
puts <- subset(puts, delta < -.09 & delta > -.5)
expiries.formated <- format(as.Date(levels(factor(expiries)), format = '%y%m%d'), "%B %d, %Y")
fractionofyear.levels <- levels(factor(puts$maturity))
xyz <- with(puts, interp(x=maturity, y=delta*100, z=IV*100,
xo=sort(unique(maturity)), extrap=FALSE))
with(xyz, persp3d(x,y,z, col=heat.colors(length(z))[rank(z)], xlab='maturity',
ylab='delta', zlab='IV', main='IV Surface'))
putsplot <- ggplot(puts, aes(delta, IV, group = factor(maturity), color = factor(maturity))) +
labs(x = "Delta", y = "Implied Volatilty", title="Volatility Smile", color = "GooG \nExpiration") +
scale_colour_discrete(breaks=c(fractionofyear.levels),
labels=c(expiries.formated)) +
geom_line() +
geom_point()
putsplot
이에 아무런 도움 : 여기에 그 모습 것이 무엇입니까? – cdcaveman
누구나 앞에서 보간을 고치는 법을 아십니까? – cdcaveman
포인트를 일종의 라인 오브젝트로 바꾸고 모든 라인을 보간하면 점 대신에 – cdcaveman