📄 impliedvolatilitysmile.java
字号:
jButton1.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jButton1MouseClicked(evt); } }); jPanel2.add(jButton1); jSplitPane2.setRightComponent(jPanel2); jSplitPane1.setRightComponent(jSplitPane2); getContentPane().add(jSplitPane1); pack(); }//GEN-END:initComponents private void jSlider15MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jSlider15MouseDragged prop_trc=1.0*jSlider15.getValue()/1000; jTextField16.setText("Proportional transaction cost = "+prop_trc); }//GEN-LAST:event_jSlider15MouseDragged private void jSlider14MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jSlider14MouseDragged K_max=jSlider14.getValue()/100; jTextField15.setText("K_max = "+K_max); }//GEN-LAST:event_jSlider14MouseDragged private void jSlider13MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jSlider13MouseDragged K_min=jSlider13.getValue()/100; jTextField14.setText("K_min = "+K_min); }//GEN-LAST:event_jSlider13MouseDragged //underlying at ime t=0 private void jSlider1MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jSlider1MouseDragged S_0=(double)jSlider1.getValue()/100; jTextField1.setText("S(0) = "+S_0); }//GEN-LAST:event_jSlider1MouseDragged //market drift private void jSlider2MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jSlider2MouseDragged mu=(double)jSlider2.getValue()/100; jTextField2.setText("market drift = "+mu); }//GEN-LAST:event_jSlider2MouseDragged //volatility private void jSlider3MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jSlider3MouseDragged sigma=(double)jSlider3.getValue()/100; jTextField3.setText("volatility = "+sigma); }//GEN-LAST:event_jSlider3MouseDragged //dividend yield private void jSlider4MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jSlider4MouseDragged q=1.0*jSlider5.getValue()/100; jTextField4.setText("dividend yield = "+q); }//GEN-LAST:event_jSlider4MouseDragged //risk free rate private void jSlider5MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jSlider5MouseDragged r=1.0*jSlider5.getValue()/100; jTextField5.setText("risk free rate = "+r); }//GEN-LAST:event_jSlider5MouseDragged //size of time step private void jSlider6MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jSlider6MouseDragged dt=(double)jSlider6.getValue()/1000; //time step in years T=(int)Math.round(Tc/dt); jTextField6.setText("rehedge interval (years) = "+dt); }//GEN-LAST:event_jSlider6MouseDragged //number of paths private void jSlider7MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jSlider7MouseDragged nPaths=jSlider7.getValue(); jTextField7.setText("number of paths = "+nPaths); }//GEN-LAST:event_jSlider7MouseDragged //number of interpolating points private void jSlider8MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jSlider8MouseDragged nPoints=jSlider8.getValue(); jTextField8.setText("number of sample points = "+nPoints); }//GEN-LAST:event_jSlider8MouseDragged //time to expiry private void jSlider9MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jSlider9MouseDragged Tc=(double)jSlider9.getValue()/100; //time to expiry in years T=(int)Math.round(Tc/dt); //time steps to expiry jTextField9.setText("time to expiration (years) = "+Tc); }//GEN-LAST:event_jSlider9MouseDragged //fixed transaction cost private void jSlider10MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jSlider10MouseDragged fixed_trc=(double)jSlider10.getValue()/1000; jTextField10.setText("fixed transaction cost = "+fixed_trc); }//GEN-LAST:event_jSlider10MouseDragged //target return private void jSlider11MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jSlider11MouseDragged int Rho=jSlider11.getValue(); //target return in % rho=(double)Rho/100; jTextField11.setText("targeted return = "+Rho+"%"); }//GEN-LAST:event_jSlider11MouseDragged //probability of success private void jSlider12MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jSlider12MouseDragged p=(double)jSlider12.getValue()/100; jTextField12.setText("probability of success = "+p); }//GEN-LAST:event_jSlider12MouseDragged //starts off computation private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jButton1MouseClicked try{ computeGraph(); } catch(NoSolutionException e){} }//GEN-LAST:event_jButton1MouseClicked /** Exit the Application */ private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm System.exit(0); }//GEN-LAST:event_exitForm /** * @param args the command line arguments */ public static void main(String args[]) { ImpliedVolatilitySmile mainWindow=new ImpliedVolatilitySmile(); mainWindow.setTitle("Implied volatility smile"); mainWindow.setBounds(50,50,800,500); //set and display defaults S_0=40; mu=0.3; sigma=0.4; q=0.06; r=0.06; //risk free rate K_min=0.6*mainWindow.S_0; K_max=1.5*mainWindow.S_0; dt=0.05; Tc=0.4; T=(int)Math.round(mainWindow.Tc/mainWindow.dt); rho=0.12; //target return p=0.95; //probability of success fixed_trc=0.01; prop_trc=0.2; nPoints=100; nPaths=2000; nSignChange=10; reportFrequency=200; mainWindow.jTextField16.setText ("Proportional transaction cost = "+prop_trc); mainWindow.jTextField15.setText("K_max = "+K_max); mainWindow.jTextField14.setText("K_min = "+K_min); mainWindow.jTextField1.setText("S(0) = "+S_0); mainWindow.jTextField2.setText("market drift = "+mu); mainWindow.jTextField3.setText("volatility = "+sigma); mainWindow.jTextField4.setText("dividend yield = "+q); mainWindow.jTextField5.setText("risk free rate = "+r); mainWindow.jTextField6.setText("rehedge interval (years) = "+dt); mainWindow.jTextField7.setText("number of paths = "+nPaths); mainWindow.jTextField8.setText("number of sample points = "+nPoints); mainWindow.jTextField9.setText("time to expiry (years) = "+Tc); mainWindow.jTextField10.setText("fixed transaction cost = "+fixed_trc); mainWindow.jTextField11.setText("targeted return = "+rho); mainWindow.jTextField12.setText("probability of success = "+p); mainWindow.show(); }//end main // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JSlider jSlider4; private javax.swing.JSlider jSlider3; private javax.swing.JSlider jSlider2; private javax.swing.JSlider jSlider1; private javax.swing.JSlider jSlider15; private javax.swing.JButton jButton1; private javax.swing.JSlider jSlider14; private javax.swing.JSlider jSlider13; private javax.swing.JSlider jSlider12; private javax.swing.JSlider jSlider11; private javax.swing.JTextArea jTextArea1; private javax.swing.JSlider jSlider10; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JLabel jLabel10; private javax.swing.JTextField jTextField16; private javax.swing.JTextField jTextField15; private javax.swing.JTextField jTextField14; private javax.swing.JTextField jTextField12; private javax.swing.JPanel jPanel2; private javax.swing.JTextField jTextField11; private javax.swing.JPanel jPanel1; private javax.swing.JTextField jTextField10; private javax.swing.JTextField jTextField9; private javax.swing.JTextField jTextField8; private javax.swing.JTextField jTextField7; private javax.swing.JTextField jTextField6; private javax.swing.JTextField jTextField5; private javax.swing.JTextField jTextField4; private javax.swing.JTextField jTextField3; private javax.swing.JTextField jTextField2; private javax.swing.JTextField jTextField1; private javax.swing.JLabel jLabel9; private javax.swing.JLabel jLabel8; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel1; private javax.swing.JSlider jSlider9; private javax.swing.JSlider jSlider8; private javax.swing.JSlider jSlider7; private javax.swing.JSlider jSlider6; private javax.swing.JSplitPane jSplitPane2; private javax.swing.JProgressBar jProgressBar1; private javax.swing.JSplitPane jSplitPane1; private javax.swing.JSlider jSlider5; // End of variables declaration//GEN-END:variables //asset,simulation parameters static double S_0, //underlying at time t=0 mu, //underlying, market drift sigma, //underlying, volatility q, //underlying, volatility r, //risk free rate dt, //size of time step in years Tc, //time to expiry in years K, //call strike K_min, //minimum strike K_max, //maximum strike rho, //targeted return p, //probability of success fixed_trc, //fixed transaction costs prop_trc; //proportional transation costs float x_p; //p-th stanard normal percentile (N(x_p)=p) static int T, //time steps to expiration nPaths, //number of paths used to compute statistics nBranch, //irrelevant here but needed for constructor nPoints, //number of points interpolating nSignChange, reportFrequency; //main computation private void computeGraph() throws NoSolutionException { //asset and call hedge analysis allocation: ConstantVolatilityAsset asset=new ConstantVolatilityAsset(T,dt,nSignChange,S_0,r,q,mu,sigma); CallHedgeStatisticsGraphs stats=new CallHedgeStatisticsGraphs(asset,nPaths,nBranch,nPoints, jProgressBar1,reportFrequency); /* * The arrays float[j][i], j=0,1, of hedge of hedge means (j=0) and standard * deviations (j=1) corresponding to strikes K[i]=K_min+i*(K_max-K_min)/n, * where n=nPoints-1. * Note: VisAD requires float[]s and not double[]s. */ double[][] hedgeStatistics= stats.functionOfStrike(K_min,K_max,fixed_trc,prop_trc); double[] means=hedgeStatistics[0]; double[] standardDeviations=hedgeStatistics[1]; //compute the implied sigmas from means and standard deviations //p-th standard normal percentile double x_p=FinMath.N_Solve1(p); double[] implied_sigmas=new double[nPoints]; int n=nPoints-1; for(int i=0;i<nPoints;i++) { double K_i=K_min+i*(K_max-K_min)/n; Call call_i=new Call(K_i,asset); double fairPrice=call_i.discountedAnalyticPrice(0), sellersPrice=(1+rho*Tc)*fairPrice+ x_p*standardDeviations[i]-means[i], Q=asset.forwardPrice(0), Sigma=0; //don't use Newton here: try{ Sigma=FinMath.BisectionSolveBSF(Q,K_i,sellersPrice); } catch(NoSolutionException e){} implied_sigmas[i]=Sigma/Math.sqrt(T*dt); /** * rescale means and standardDeviations as percentage of price * and the implied sigmas as a percentage * since this is how we want to display them */ means[i]/=(fairPrice/100); standardDeviations[i]/=(fairPrice/100); implied_sigmas[i]*=100; } double percent_sigma=100*sigma, y_axis_min=percent_sigma; String chartTitle= "Implied volatility"+" (true vol: "+percent_sigma+"%), "+ "time to expiry: "+T*dt; JGraph jGraph=new JGraph(K_min,K_max); jGraph.addSeries(implied_sigmas,"Implied volatility"); jGraph.setTitle(chartTitle); jGraph.setXAxisLabel("call_strike"); jGraph.setYAxisLabel("Implied volatility (%)"); jGraph.setYAxisMin(40); jGraph.setVisible(true); jGraph.saveAsPNG(); }//computeGraph }//end class ImpliedVolatilitySmile
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -