Path: blob/master/sandbox/FFEV/HermiteGrid_demo.R
1433 views
# This script compares the performance of plain Monte Carlo1# versus grid in applying Entropy Pooling to process extreme views2# This script complements the article3# "Fully Flexible Extreme Views" A. Meucci, D. Ardia, S. Keel available at www.ssrn.com4# The most recent version of this code is available at MATLAB Central - File Exchange5library(matlab)67####################################################################################8# Prior market model9####################################################################################10# analytical (normal) prior11emptyMatrix = matrix( nrow=0 , ncol=0 )12market.mu = 0.013market.sig2 = 1.014market.pdf = function(x) dnorm( x , mean = market.mu , sd = sqrt(market.sig2) )15market.cdf = function(x) pnorm( x , mean = market.mu , sd = sqrt(market.sig2) )16market.rnd = function(x) rnorm( x , mean = market.mu , sd = sqrt(market.sig2) )17market.inv = function(x) qnorm( x , mean = market.mu , sd = sqrt(market.sig2) )1819# numerical (Monte Carlo) prior20monteCarlo = emptyMatrix21monteCarlo.J = 10000022monteCarlo.X = market.rnd( monteCarlo.J )23monteCarlo.p = normalizeProb( 1/monteCarlo.J * ones( monteCarlo.J , 1 ) )2425# numerical (Gauss-Hermite grid) prior26ghqMesh = emptyMatrix27load( "ghq1000" )2829tmp = ( ghqx - min( ghqx ) ) / ( max( ghqx ) - min( ghqx ) ) # rescale GH zeros so they belong to [0,1]30epsilon = 1e-1031Lower = market.inv( epsilon )32Upper = market.inv( 1-epsilon )33ghqMesh.X = Lower + tmp*(Upper-Lower) # rescale mesh3435p = integrateSubIntervals(ghqMesh.X , market.cdf)36ghqMesh.p = normalizeProb(p)37ghqMesh.J = nrow(ghqMesh.X)3839####################################################################################40# Entropy posterior from extreme view on expectation41####################################################################################42# view of the analyst43view = emptyMatrix44view.mu = -3.04546# analytical (known since normal model has analytical solution)47truePosterior = emptyMatrix48truePosterior = Prior2Posterior( market.mu, 1, view.mu, market.sig2, 0 )49truePosterior$pdf = function(x) dnorm( x, truePosterior.mu , sqrt(truePosterior.sig2) )5051# numerical (Monte Carlo)52Aeq = rbind( ones( 1 , monteCarlo.J ) , t(monteCarlo.X) )53beq = rbind( 1 , view.mu )54monteCarloOptimResult = EntropyProg( monteCarlo.p , emptyMatrix , emptyMatrix , Aeq , beq )5556monteCarlo.p_ = monteCarloOptimResult$p_57monteCarlo.KLdiv = monteCarloOptimResult$optimizationPerformance$ml5859# numerical (Gaussian-Hermite grid)60Aeq = rbind( ones( 1 , ghqMesh.J ) , t( ghqMesh.X ) )61beq = rbind( 1 , view.mu )62ghqMeshOptimResult = EntropyProg( ghqMesh.p , emptyMatrix , emptyMatrix , Aeq , beq )6364ghqMesh.p_ = ghqMeshOptimResult$p_65ghqMesh.KLdiv = ghqMeshOptimResult$optimizationPerformance$ml6667####################################################################################68# Plots69####################################################################################70xmin = min(ghqMesh.X)71xmax = max(ghqMesh.X)72ymax = 1.073xmesh = t(linspace(xmin, xmax, ghqMesh.J))7475# Monte Carlo76plotDataMC = pHist( monteCarlo.X , monteCarlo.p_ , 50 )77plot( plotDataMC$x , plotDataMC$f , type = "l" )7879# Gauss Hermite Grid80plotDataGHQ = pHist(data.matrix(ghqMesh.X), ghqMesh.p_ , 50 )81plot( plotDataGHQ$x , plotDataGHQ$f , type = "l" )82838485