📄 callhedgestatistics.java
字号:
/* WARANTY NOTICE AND COPYRIGHTThis program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public Licenseas published by the Free Software Foundation; either version 2of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.Copyright (C) Michael J. Meyermatmjm@mindspring.comspyqqqdia@yahoo.com*//* * CallHedge.java * * Created on January 9, 2002, 5:50 PM */package Examples.Hedging;import Statistics.*;import Market.*;import Options.*;import Triggers.*;import Exceptions.*;import Hedging.*;import javax.swing.*;import java.awt.CardLayout;/** <p>Computes the mean and standard deviation of the profit/loss from hedging * a European call and several other statistics associated with the hedge. * The mean and standard deviation are reported as a percent * of the fair (Black Scholes) call price. Various hedge deltas can be * chosen:</p> * *<ul> * <li> analytic deltas </li> * <li> minimum variance deltas</li> * <li> quotient deltas</li> * <li> Monte Carlo deltas</li> *</ul> * * <p>The price paths of the underlying are simulated in the market probability. * The hedge using analytic deltas is included automatically. * The computational effort using analytic deltas is <code>O(nPath)</code> * and this goes up to <code>O(nPath*nBranch)</code> for nonanalytic deltas. * Here <code>nPath</code> is the number of price paths of the underlying and * <code>nBranch</code> the number of path branches spent on each conditional * expectation.</p> * * <p>Analytic minimum variance deltas and analytic qotient deltas are not * included since the present implementation computes the values under the * assumption that the hedge is rebalanced at each time step.</p> * * <p>Thus the computational effort using nonanalytic deltas is thousands of * times higher than for analytic deltas. Consequently nonanalytic deltas must * be chosen explicitly by checking the corresponding check box in the GUI. * Values of type <code>double</code> are set using sliders.</p> * * <p>The hedge is rebalanced according to two different policies:</p> * *<ul> *<li><i>Periodic rebalance.</i> The hedge is rebalanced a fixed number of times * at equal time intervals. The actual number of hedge trades can * differ slightly from the number sepcified by the user.</li> *<li><i>Reactive rebalance</i> The hedge is rebalanced as soon as the price * of the underlying has moved by a certain trigger percentage chosen by the * user.</li> *</ul> * * <p><b>Transaction costs</b> have a fixed and a proportional * component. The fixed component also has to be normalized to cost per share. * If you transact in lots of 1000 shares and such a trade costs 10 dollars, * fixed transaction costs are 10/1000=0.01. The proportional transaction * costs come from bid-ask spread etc., 0.1 is a conservative number. * Transaction costs are assumed to remain constant in today's dollars.</p> * * @author Michael J. Meyer */public class CallHedgeStatistics extends javax.swing.JFrame { /** Creates new form CallHedge */ public CallHedgeStatistics() { initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ private void initComponents() {//GEN-BEGIN:initComponents jSplitPane1 = new javax.swing.JSplitPane(); jScrollPane1 = new javax.swing.JScrollPane(); jTextArea1 = new javax.swing.JTextArea(); jPanel1 = new javax.swing.JPanel(); jSplitPane2 = new javax.swing.JSplitPane(); jPanel2 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); jTextField1 = new javax.swing.JTextField(); jTextField2 = new javax.swing.JTextField(); jTextField3 = new javax.swing.JTextField(); jTextField4 = new javax.swing.JTextField(); jLabel2 = new javax.swing.JLabel(); jTextField5 = new javax.swing.JTextField(); jTextField6 = new javax.swing.JTextField(); jTextField7 = new javax.swing.JTextField(); jLabel3 = new javax.swing.JLabel(); jTextField8 = new javax.swing.JTextField(); jTextField9 = new javax.swing.JTextField(); jTextField10 = new javax.swing.JTextField(); jLabel4 = new javax.swing.JLabel(); jTextField11 = new javax.swing.JTextField(); jTextField12 = new javax.swing.JTextField(); jTextField13 = new javax.swing.JTextField(); jTextField14 = new javax.swing.JTextField(); jCheckBox1 = new javax.swing.JCheckBox(); jCheckBox2 = new javax.swing.JCheckBox(); jCheckBox3 = new javax.swing.JCheckBox(); jPanel3 = new javax.swing.JPanel(); jLabel5 = new javax.swing.JLabel(); jSlider1 = new javax.swing.JSlider(); jSlider2 = new javax.swing.JSlider(); jSlider3 = new javax.swing.JSlider(); jSlider4 = new javax.swing.JSlider(); jLabel6 = new javax.swing.JLabel(); jSlider5 = new javax.swing.JSlider(); jSlider6 = new javax.swing.JSlider(); jSlider7 = new javax.swing.JSlider(); jLabel7 = new javax.swing.JLabel(); jSlider8 = new javax.swing.JSlider(); jSlider9 = new javax.swing.JSlider(); jSlider10 = new javax.swing.JSlider(); jLabel8 = new javax.swing.JLabel(); jSlider11 = new javax.swing.JSlider(); jSlider12 = new javax.swing.JSlider(); jSlider13 = new javax.swing.JSlider(); jSlider14 = new javax.swing.JSlider(); jLabel9 = new javax.swing.JLabel(); jButton1 = new javax.swing.JButton(); jPanel4 = new javax.swing.JPanel(); jProgressBar1 = new javax.swing.JProgressBar(); jTextField15 = new javax.swing.JTextField(); jScrollPane2 = new javax.swing.JScrollPane(); jTextArea2 = new javax.swing.JTextArea(); jButton2 = new javax.swing.JButton(); getContentPane().setLayout(new java.awt.GridLayout(1, 1)); setTitle("Call Hedge"); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { exitForm(evt); } }); jSplitPane1.setDividerLocation(50); jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); jScrollPane1.setViewportView(jTextArea1); jSplitPane1.setLeftComponent(jScrollPane1); jPanel1.setLayout(new java.awt.CardLayout()); jSplitPane2.setDividerLocation(250); jSplitPane2.setPreferredSize(new java.awt.Dimension(500, 485)); jSplitPane2.setMinimumSize(new java.awt.Dimension(400, 485)); jPanel2.setLayout(new java.awt.GridLayout(21, 1)); jLabel1.setText(" UNDERLYING"); jLabel1.setForeground(new java.awt.Color(0, 0, 204)); jPanel2.add(jLabel1); jTextField1.setEditable(false); jTextField1.setText("S(0):"); jPanel2.add(jTextField1); jTextField2.setEditable(false); jTextField2.setText("Market drift:"); jPanel2.add(jTextField2); jTextField3.setEditable(false); jTextField3.setText("Volatility:"); jPanel2.add(jTextField3); jTextField4.setEditable(false); jTextField4.setText("Dividend yield:"); jPanel2.add(jTextField4); jLabel2.setText(" CALL"); jLabel2.setForeground(new java.awt.Color(0, 0, 204)); jPanel2.add(jLabel2); jTextField5.setEditable(false); jTextField5.setText("Strike:"); jPanel2.add(jTextField5); jTextField6.setEditable(false); jTextField6.setText("Time to expiration (years):"); jPanel2.add(jTextField6); jTextField7.setEditable(false); jTextField7.setText("Risk free rate (decimal):"); jPanel2.add(jTextField7); jLabel3.setText(" SIMULATION"); jLabel3.setForeground(new java.awt.Color(0, 0, 204)); jPanel2.add(jLabel3); jTextField8.setEditable(false); jTextField8.setText("Time step:"); jPanel2.add(jTextField8); jTextField9.setEditable(false); jTextField9.setText("Number of paths:"); jPanel2.add(jTextField9); jTextField10.setEditable(false); jTextField10.setText("Number of branches per path:"); jPanel2.add(jTextField10); jLabel4.setText(" HEDGE"); jLabel4.setForeground(new java.awt.Color(0, 0, 204)); jPanel2.add(jLabel4); jTextField11.setEditable(false); jTextField11.setText("Fixed transaction cost:"); jPanel2.add(jTextField11); jTextField12.setEditable(false); jTextField12.setText("Proportional transaction cost:"); jPanel2.add(jTextField12); jTextField13.setEditable(false); jTextField13.setText("Number hedge trades (periodic hedge):"); jPanel2.add(jTextField13); jTextField14.setEditable(false); jTextField14.setText("% price change to trigger hedge trade:"); jPanel2.add(jTextField14); jCheckBox1.setText("Minimum variance deltas"); jCheckBox1.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jCheckBox1MouseClicked(evt); } }); jPanel2.add(jCheckBox1); jCheckBox2.setText("Monte Carlo deltas"); jCheckBox2.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jCheckBox2MouseClicked(evt); } }); jPanel2.add(jCheckBox2); jCheckBox3.setText("Quotient deltas"); jCheckBox3.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jCheckBox3MouseClicked(evt); } }); jPanel2.add(jCheckBox3); jSplitPane2.setLeftComponent(jPanel2); jPanel3.setLayout(new java.awt.GridLayout(21, 1)); jPanel3.add(jLabel5); jSlider1.setMaximum(15000); jSlider1.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { public void mouseDragged(java.awt.event.MouseEvent evt) { jSlider1MouseDragged(evt); } }); jPanel3.add(jSlider1); jSlider2.setMaximum(80); jSlider2.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { public void mouseDragged(java.awt.event.MouseEvent evt) { jSlider2MouseDragged(evt); } }); jPanel3.add(jSlider2); jSlider3.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { public void mouseDragged(java.awt.event.MouseEvent evt) { jSlider3MouseDragged(evt); } }); jPanel3.add(jSlider3); jSlider4.setMaximum(50); jSlider4.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { public void mouseDragged(java.awt.event.MouseEvent evt) { jSlider4MouseDragged(evt); } }); jPanel3.add(jSlider4);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -