Example: Call Option Surface shaded by Vega

A surface chart of call option values shaded by vega is rendered. The X, Y, and Z axes represent Stock Price, Time, and Option Value respectively.

import com.imsl.chart3d.*;
import com.imsl.chart.Colormap;
import com.imsl.math.ZeroFunction;
import com.imsl.stat.Cdf;
import java.awt.Color;


/**
 * Surface chart of call option value shaded by vega.
 */
public class SurfaceEx1 extends JFrameChart3D {
    
    /**
     * Creates new form CallOptionSurface 
     */
    public SurfaceEx1() {   
        Chart3D chart = getChart3D();
        chart.setTextFormat("0.0000");
        
        AxisXYZ axis = new AxisXYZ(chart);
        axis.setAxisTitlePosition(axis.AXIS_TITLE_PARALLEL);
        axis.setTextFormat("0.0");
        
        axis.getAxisX().getAxisTitle().setTitle("Stock Price");
        axis.getAxisY().getAxisTitle().setTitle("Time");
        axis.getAxisZ().getAxisTitle().setTitle("Option Value");
        
        double strike = 20.0;
        double rate = 0.045;
        double sigma = 0.25;
        CallOption callOption = new CallOption(strike, rate, sigma);
        
        double minStock = 0.0;
        double maxStock = 2.0 * strike;
        double minTime = 0.0;
        double maxTime = 1.0;
        Surface surface = new Surface(axis, callOption, minStock, maxStock, minTime, maxTime);
        surface.setColorFunction(callOption);
        surface.setSurfaceType(Surface.SURFACE_TYPE_MESH | Surface.SURFACE_TYPE_NICEST);

        ColormapLegend colormapLegend = new ColormapLegend(chart, Colormap.RED_TEMPERATURE, -10., 60.);
        colormapLegend.setTitle("Vega");
        colormapLegend.setTextFormat("0.00");
        colormapLegend.setNumber(25);
        colormapLegend.setAutoscaleInput(colormapLegend.AUTOSCALE_WINDOW);
        colormapLegend.setAutoscaleOutput(colormapLegend.AUTOSCALE_NUMBER);
        
        
        this.setSize(375, 375);
        render();
    }
    
    
    public class CallOption implements Surface.ZFunction, ColorFunction {
        private double strike, rate, sigma;
        
        /**
         * Compute call option value using the Black-Scholes formula.
         */
        public CallOption(double strike, double rate, double sigma) {
            this.strike = strike;
            this.rate = rate;
            this.sigma = sigma;
            
        }
        
        public double f(double stock, double time) {
            double d1 = (Math.log(stock/strike)+(rate+0.5*sigma*sigma)*time)/(sigma*Math.sqrt(time));
            double d2 = d1 - sigma*Math.sqrt(time);
            return stock*Cdf.normal(d1) - strike*Math.exp(-rate*time)*Cdf.normal(d2);
        }
        
        public double delta(double stock, double time) {
            double d1 = (Math.log(stock/strike)+(rate+0.5*sigma*sigma)*time)/(sigma*Math.sqrt(time));
            return Cdf.normal(d1);
        }
        
        public double vega(double stock, double time) {
            double d1 = (Math.log(stock/strike)+(rate+0.5*sigma*sigma)*time)/(sigma*Math.sqrt(time));
            return stock * Math.sqrt(time) * Cdf.normal(d1);
        }
        
        public Color color(double stock, double time, double optionValue) {
            double vega = vega(stock, time);
            double s = (vega + 10.0) / (60.0+10.);
            return Colormap.RED_TEMPERATURE.color(s);
        }        
    }
    
    
    public static void main(String args[]) {
       new SurfaceEx1().setVisible(true);
    }    
}

Output

Link to Java source.