CODE JAVA CODE BINOMIAL TREES OPTION PRICING JAVA CODE: BINOMIAL TREES OPTION PRICING BINOMIALTREE CLASS /** * * @author Ioannis Svigkos 2008 */ // This class corresponds to binomial tree option pricing. // Methods that calculate equity movement first are provided. // Then, methods that calculate option price in each note are // presented. Note that there is also implementation about // American options, however they need further refinement and testing import java.text.decimalformat; public class BinomialTree { // Private field members private DecimalFormat _decimalformat; private double[][] _equitymovement; // stores values of equity for each period (upper & lower) private double[][] _optionpricemovement; // stores price of call option for each period (upper & lower) private double[][] _americanputoptionpricemovement; // stores price of put option for each period private double _assetprice; private double _strikeprice; private double _riskfreerate; private double _sigma; private double _timetomaturity; private double _iteration; PAGE 1
private double _upperfactor; private double _lowerfactor; private double _probability; private double _deltat; // Constructor public BinomialTree ( double _assetprice, double _strikeprice, double _riskfreerate, double _sigma, double _timetomaturity, double _iteration) { // Set decimal Format _decimalformat = new DecimalFormat("#.##"); // Initialise private fields this._assetprice = _assetprice; this._strikeprice = _strikeprice; this._riskfreerate = _riskfreerate; this._sigma = _sigma; this._timetomaturity = _timetomaturity; this._iteration = _iteration; // Initilialise further parameters this._deltat = calculatedeltat(); this._upperfactor = calculateupperfactor(); this._lowerfactor = calculatelowerfactor(); this._probability = calculateprobability(); // calculate delta time public double calculatedeltat() { return _timetomaturity/_iteration; //calculate upper factor based on parameters given public double calculateupperfactor() { return Math.pow(Math.E, _sigma * Math.sqrt(_deltaT)); //calculate lower factor based on parameters given public double calculatelowerfactor() { return Math.pow(Math.E, (-_sigma) * Math.sqrt(_deltaT)); // calculate probability based on parameters given PAGE 2
public double calculateprobability() { return ( Math.pow(Math.E, _riskfreerate * _deltat) - _lowerfactor) / (_upperfactor - _lowerfactor); // calculate equity prices on each node public void calculateequitymovement() { // Set up matrix dimentions int _columns = ((int)_iteration) + 1; int _rows = (((int)_iteration) * 2) + 1; // Set up Matrix to hold price movements _equitymovement = new double[_rows][_columns]; // Prepare pointers for calculations int _pointer = (int)_iteration; int _pointerupper = 0; int _pointerlower = 0; int _columnpointer = 0; double _value = _assetprice; // Initialise upper pointer with row number _pointerupper = _pointer; while (true) { for (int i= _columnpointer; i < _columns; i++) { _equitymovement[_pointerupper][i] = Double.valueOf(_decimalFormat.format(_value)); i++; _pointerupper--; _columnpointer++; _value = Math.pow(_upperFactor, _columnpointer)*_assetprice; if (_pointerupper < 0) break; _columnpointer = 1; _pointerlower = _pointer + 1; _value = Math.pow(_lowerFactor, _columnpointer)*_assetprice; while (true) { PAGE 3
for (int i= _columnpointer; i < _columns; i++) { _equitymovement[_pointerlower][i] = Double.valueOf(_decimalFormat.format(_value)); i++; if (_pointerlower == _rows) break; _pointerlower++; _columnpointer++; _value = Math.pow(_lowerFactor, _columnpointer)*_assetprice; //priceeuropeanputoption(_equitymovement); // new BinomialTreeFrame(castArray(_equityMovement),(int)_iteration); //new BinomialTreeFrame(castArray(priceEuropeanPutOption(_strikePrice, _equitymovement)),(int) _iteration); // price European put option public double[][] priceeuropeanputoption() { calculateequitymovement(); int _rows = _equitymovement.length; int _columns = _equitymovement[1].length; _optionpricemovement = new double[_rows][_columns]; // At last column values are for (int i=0; i<_rows;i++) { if (_equitymovement[i][_columns-1]!= 0) { _optionpricemovement[i][_columns-1] = Math.max(_strikePrice-_equityMovement[i][_columns-1], 0); int pointer = _columns-2; while(true) { for (int i=0; i< _rows;i++) { if (_equitymovement[i][pointer]!= 0) { // get upper lower of next row double uppernext = _optionpricemovement[i-1][pointer+1]; double lowernext = _optionpricemovement[i+1][pointer+1]; PAGE 4
_optionpricemovement[i][pointer] = Math.pow(Math.E, -(_riskfreerate*_deltat)) *((_probability*uppernext)+((1- _probability)*lowernext)); if (pointer ==0) break; pointer--; //new BinomialTreeFrame(castArray(_optionPriceMovement), (int)_iteration); return _optionpricemovement; // return value located on first node (price of option) public double geteuropeanputoptionrootprice() { for (int i=0; i<_optionpricemovement.length; i++) { if (_optionpricemovement[i][0]!= 0) { return _optionpricemovement[i][0]; return 0; // calculate price of European Call Option public double[][] priceeuropeancalloption() { calculateequitymovement(); int _rows = _equitymovement.length; int _columns = _equitymovement[1].length; _optionpricemovement = new double[_rows][_columns]; // At last column values are for (int i=0; i<_rows;i++) { if (_equitymovement[i][_columns-1]!= 0) { _optionpricemovement[i][_columns-1] = Math.max(_equityMovement[i][_columns-1]-_strikePrice, 0); int pointer = _columns-2; while(true) { PAGE 5
for (int i=0; i< _rows;i++) { if (_equitymovement[i][pointer]!= 0) { // get upper lower of next row double uppernext = _optionpricemovement[i-1][pointer+1]; double lowernext = _optionpricemovement[i+1][pointer+1]; _optionpricemovement[i][pointer] = Math.pow(Math.E, -(_riskfreerate*_deltat)) *((_probability*uppernext)+((1- _probability)*lowernext)); if (pointer ==0) break; pointer--; //new BinomialTreeFrame(castArray(_optionPriceMovement), (int)_iteration); return _optionpricemovement; public BinomialTreeFrame getequitypricemovementpanel() { return new BinomialTreeFrame(castArray(_equityMovement), (int) _iteration); // return price held in first node (price of call option) public double geteuropeancalloptionrootprice() { for (int i=0; i<_optionpricemovement.length; i++) { if (_optionpricemovement[i][0]!= 0) { return _optionpricemovement[i][0]; return 0; // helper method that returns the number of rows // of a two dimentional array. private int getrownumber(double[][] _array) { return _array.length; // helper method that returns the number of columns // of a two dimentional array. private int getcolumnnumber(double[][] _array) { return _array[0].length; PAGE 6
// calculate price of American Option // NEEDS REVISION! public double[][] priceamericanputoption() { // Generate EquityPriceMovement calculateequitymovement(); // Generate EuropeanPutOptionMatrix double[][] _europeanputoptionmovement = priceeuropeanputoption(); int _rows = getrownumber(_europeanputoptionmovement); int _columns = getcolumnnumber(_europeanputoptionmovement); _americanputoptionpricemovement = new double[_rows][_columns]; // Put last two column of europeanoptionprices in new array for (int i=0; i < _rows; i++) { for (int j=0; j < _columns; j++) { _americanputoptionpricemovement[i][j] = _europeanputoptionmovement[i][j]; double _payoff = 0; double _optionprice = 0; boolean flag = false; int pointer =0; double _value = 0; // NEEDS IMPRVEMENT _americanputoptionpricemovement[3][0]=0; for (int j=_columns-2; j > 0; j--) { for (int i=0; i<_rows-1;i++) { if (_equitymovement[i][j]!= 0) { _payoff = Math.max(_strikePrice - _equitymovement[i][j], 0); _optionprice = _americanputoptionpricemovement[i][j]; if (_payoff > _optionprice) { _americanputoptionpricemovement[i][j] = _payoff; flag = true; else { _americanputoptionpricemovement[i][j] = _optionprice; if (flag) { PAGE 7
for (int k=j-1; k < _rows-2; k++) { _value = Math.pow(Math.E, (-_riskfreerate)*_deltat) *( (_probability*_americanputoptionpricemovement[k][j]) +((1-_probability)*_americanPutOptionPriceMovement[k+2][j])); _americanputoptionpricemovement[k+1][j-1]=_value; flag=false; _payoff = Math.max(_strikePrice - _equitymovement[((_rows-1)/2)+1][1], 0); _optionprice = _americanputoptionpricemovement[((_rows-1)/2)+1][1]; _value = Math.pow(Math.E, (-_riskfreerate)*_deltat) *( (_probability*_americanputoptionpricemovement[2][1]) +((1-_probability)*_americanPutOptionPriceMovement[4][1])); _americanputoptionpricemovement[0][0]=_value; // new BinomialTreeFrame(castArray(_optionPriceMovement), (int)_iteration); new BinomialTreeFrame(castArray(_americanPutOptionPriceMovement), (int)_iteration); return _americanputoptionpricemovement; public void recalculate(int _columns, int _rows, double[][] _array) { int pointer = _columns-2; while(true) { for (int i=0; i< _rows;i++) { if (_equitymovement[i][pointer]!= 0) { // get upper lower of next row double uppernext = _optionpricemovement[i-1][pointer+1]; double lowernext = _optionpricemovement[i+1][pointer+1]; _optionpricemovement[i][pointer] = Math.pow(Math.E, -(_riskfreerate*_deltat)) *((_probability*uppernext)+((1- _probability)*lowernext)); if (pointer ==0) break; pointer--; // Return array as an array of String values // that can be used by a JTable public String[][] castarray(double[][] _array) { int _rows = _array.length; int _columns = _array[1].length; PAGE 8
String[][] _sarray = new String[_rows][_columns]; for (int i=0; i < _rows; i++) { for (int j=0; j < _columns; j++) { if (_array[i][j]!= 0) { _sarray[i][j]=_array[i][j]+""; return _sarray; public static void main(string[] args) { //BinomialTree _binomialtree = new BinomialTree(7, 0.52916, 1.12240, 0.89095, 100, 100); //_binomialtree.toprint(); // _binomialtree.toprint(); //_binomialtree.calculateeuropeanputoption(); // _binomialtree.expand(); // BinomialTreeFrame btf = new BinomialTreeFrame(_binomialTree.obtainDataModel(), 5); // _binomialtree.obtaindatamodel(); BinomialTree t = new BinomialTree(100, 100, 0.04, 0.2, 1, 400); //t.calculateequitymovement(); //t.priceeuropeanputoption(); //t.priceeuropeancalloption(); t.priceeuropeanputoption(); BINOMIALTREEFRAME[EXTENDS JFRAME] /** * * @author Ioannis Svigkos 2008 */ // this class allows end-user to see equity price movements // and option price movements on each node in a tree representation // fashion. However, the applet provided does not consider this // option due to security settings. It is advisable that users should // run the application using java AppletViewr. import javax.swing.jframe; import javax.swing.jtable; PAGE 9
import javax.swing.jscrollpane; import java.awt.borderlayout; import java.text.decimalformat; public class BinomialTreeFrame extends JFrame { private JScrollPane jscrollpane1; private JTable jtable1; private double[] _columnnames; private String[] _scolumnnames; BinomialTreeFrame(String[][] _datamodel, int _iteration){ super("option Pricing: Binomial Tree"); this.setdefaultcloseoperation(jframe.exit_on_close); _columnnames = new double[_iteration + 1]; double temp1 = _iteration; DecimalFormat _dformat = new DecimalFormat("##.####"); for (int i=0; i < _iteration; i++) { if (i==0) { _columnnames[i] = 0; else { double temp = Double.valueOf(_dFormat.format(1/temp1)); _columnnames[i] = (temp) + _columnnames[i-1]; _columnnames[_columnnames.length-1] = 1; _scolumnnames = new String[_columnNames.length]; for (int i=0; i < _scolumnnames.length; i++) { _scolumnnames[i] = "" + _columnnames[i]; jtable1 = new JTable(_dataModel, _scolumnnames ); jtable1.setautoresizemode(jtable.auto_resize_off); jscrollpane1 = new JScrollPane(jTable1); jtable1.setfillsviewportheight(true); //jscrollpane1.sethorizontalscrollbar(new JScrollBar(JScrollBar.HORIZONTAL, 0, 1, 0, 255)); // this.getcontentpane(). add(jscrollpane1, BorderLayout.CENTER); // this.pack(); PAGE 10
this.setvisible(true); BINOMIALTREEAPPLET [GUI IMPLEMENTATION] /** * * @author Ioannis Svigkos 2008 */ import javax.swing.jtable; import java.text.decimalformat; import javax.swing.joptionpane; public class BinomialTree_Applet extends javax.swing.japplet { // Private Field Members private double _assetprice; private double _exerciseprice; private double _volatility; private double _riskfreerate; private double _iteration; private double _timetomaturity; private double _p, _u, _d; private BinomialTree _btree; private JTable jtable1; /** Initializes the applet BinomialTree_Applet */ public void init() { try { java.awt.eventqueue.invokeandwait(new Runnable() { public void run() { initcomponents(); ); catch (Exception ex) { ex.printstacktrace(); /** This method is called from within the init() method to PAGE 11
* initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="generated Code"> private void initcomponents() { jpanel5 = new javax.swing.jpanel(); jtextfield5 = new javax.swing.jtextfield(); jlabel5 = new javax.swing.jlabel(); jtextfield6 = new javax.swing.jtextfield(); jtextfield7 = new javax.swing.jtextfield(); jlabel7 = new javax.swing.jlabel(); jlabel8 = new javax.swing.jlabel(); jtextfield9 = new javax.swing.jtextfield(); jlabel6 = new javax.swing.jlabel(); jtextfield8 = new javax.swing.jtextfield(); jlabel9 = new javax.swing.jlabel(); jbutton1 = new javax.swing.jbutton(); jbutton2 = new javax.swing.jbutton(); jpanel1 = new javax.swing.jpanel(); jtextfield1 = new javax.swing.jtextfield(); jlabel1 = new javax.swing.jlabel(); jtextfield2 = new javax.swing.jtextfield(); jlabel2 = new javax.swing.jlabel(); jlabel3 = new javax.swing.jlabel(); jtextfield3 = new javax.swing.jtextfield(); jlabel4 = new javax.swing.jlabel(); jtextfield4 = new javax.swing.jtextfield(); jpanel4 = new javax.swing.jpanel(); jcombobox1 = new javax.swing.jcombobox(); jradiobutton1 = new javax.swing.jradiobutton(); jradiobutton2 = new javax.swing.jradiobutton(); jlabel11 = new javax.swing.jlabel(); jtextfield11 = new javax.swing.jtextfield(); jlabel10 = new javax.swing.jlabel(); jpanel5.setborder(javax.swing.borderfactory.createtitledborder(javax.swing.borderfactory.createetchedborder(), "OUTPUT", javax.swing.border.titledborder.left, javax.swing.border.titledborder.top, new java.awt.font("arial", 1, 12), new java.awt.color(153, 153, 153))); // NOI18N jtextfield5.setfont(new java.awt.font("arial", 1, 12)); // NOI18N jtextfield5.setforeground(new java.awt.color(102, 102, 102)); jtextfield5.sethorizontalalignment(javax.swing.jtextfield.right); jtextfield5.settooltiptext("[i.e. 100]"); jtextfield5.setborder(javax.swing.borderfactory.createetchedborder()); PAGE 12
jlabel5.setbackground(new java.awt.color(153, 153, 153)); jlabel5.setfont(new java.awt.font("arial", 3, 12)); jlabel5.setforeground(new java.awt.color(102, 102, 102)); jlabel5.sethorizontalalignment(javax.swing.swingconstants.center); jlabel5.settext("_ p _"); jtextfield6.seteditable(false); jtextfield6.setfont(new java.awt.font("arial", 1, 12)); // NOI18N jtextfield6.setforeground(new java.awt.color(102, 102, 102)); jtextfield6.sethorizontalalignment(javax.swing.jtextfield.center); jtextfield6.setborder(javax.swing.borderfactory.createetchedborder()); jtextfield7.seteditable(false); jtextfield7.setfont(new java.awt.font("arial", 1, 12)); // NOI18N jtextfield7.setforeground(new java.awt.color(102, 102, 102)); jtextfield7.sethorizontalalignment(javax.swing.jtextfield.center); jtextfield7.setborder(javax.swing.borderfactory.createetchedborder()); jlabel7.setbackground(new java.awt.color(153, 153, 153)); jlabel7.setfont(new java.awt.font("arial", 3, 12)); // NOI18N jlabel7.setforeground(new java.awt.color(102, 102, 102)); jlabel7.sethorizontalalignment(javax.swing.swingconstants.center); jlabel7.settext("_ u _"); jlabel8.setbackground(new java.awt.color(153, 153, 153)); jlabel8.setfont(new java.awt.font("arial", 3, 12)); jlabel8.setforeground(new java.awt.color(102, 102, 102)); jlabel8.sethorizontalalignment(javax.swing.swingconstants.center); jlabel8.settext("_ d _"); jtextfield9.seteditable(false); jtextfield9.setfont(new java.awt.font("arial", 1, 12)); // NOI18N jtextfield9.setforeground(new java.awt.color(102, 102, 102)); jtextfield9.sethorizontalalignment(javax.swing.jtextfield.center); jtextfield9.setborder(javax.swing.borderfactory.createetchedborder()); jlabel6.setbackground(new java.awt.color(153, 153, 153)); jlabel6.setfont(new java.awt.font("arial", 1, 12)); jlabel6.setforeground(new java.awt.color(102, 102, 102)); jlabel6.sethorizontalalignment(javax.swing.swingconstants.center); jlabel6.settext("itteration"); jtextfield8.seteditable(false); jtextfield8.setfont(new java.awt.font("arial", 1, 12)); // NOI18N jtextfield8.setforeground(new java.awt.color(102, 102, 102)); jtextfield8.sethorizontalalignment(javax.swing.jtextfield.right); jtextfield8.setborder(javax.swing.borderfactory.createetchedborder()); PAGE 13
jlabel9.setbackground(new java.awt.color(153, 153, 153)); jlabel9.setfont(new java.awt.font("arial", 1, 12)); // NOI18N jlabel9.setforeground(new java.awt.color(102, 102, 102)); jlabel9.sethorizontalalignment(javax.swing.swingconstants.center); jlabel9.settext("option PRICE"); jbutton1.setfont(new java.awt.font("arial", 1, 12)); // NOI18N jbutton1.setforeground(new java.awt.color(102, 102, 102)); jbutton1.settext("calculate"); jbutton1.addactionlistener(new java.awt.event.actionlistener() { public void actionperformed(java.awt.event.actionevent evt) { jbutton1actionperformed(evt); ); jbutton2.setfont(new java.awt.font("arial", 1, 12)); // NOI18N jbutton2.setforeground(new java.awt.color(102, 102, 102)); jbutton2.settext("display BINOMIAL TREE"); jbutton2.addactionlistener(new java.awt.event.actionlistener() { public void actionperformed(java.awt.event.actionevent evt) { jbutton2actionperformed(evt); ); javax.swing.grouplayout jpanel5layout = new javax.swing.grouplayout(jpanel5); jpanel5.setlayout(jpanel5layout); jpanel5layout.sethorizontalgroup( jpanel5layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addgroup(jpanel5layout.createsequentialgroup().addcontainergap().addgroup(jpanel5layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addgroup(jpanel5layout.createsequentialgroup().addcomponent(jbutton1, javax.swing.grouplayout.preferred_size, 215, javax.swing.grouplayout.preferred_size).addgap(27, 27, 27).addComponent(jButton2, javax.swing.grouplayout.default_size, 217, Short.MAX_VALUE)).addGroup(jPanel5Layout.createSequentialGroup().addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jTextField5, javax.swing.grouplayout.preferred_size, 90, javax.swing.grouplayout.preferred_size).addcomponent(jlabel6, javax.swing.grouplayout.preferred_size, 86, javax.swing.grouplayout.preferred_size)).addgap(6, 6, 6).addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING).addComponent(jLabel5, javax.swing.grouplayout.preferred_size, 84, javax.swing.grouplayout.preferred_size).addcomponent(jtextfield6, javax.swing.grouplayout.preferred_size, 82, javax.swing.grouplayout.preferred_size)) PAGE 14
.addgroup(jpanel5layout.createparallelgroup(javax.swing.grouplayout.alignment.leading, false).addcomponent(jlabel7, javax.swing.grouplayout.default_size, javax.swing.grouplayout.default_size, Short.MAX_VALUE).addComponent(jTextField7, javax.swing.grouplayout.default_size, 77, Short.MAX_VALUE)).addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false).addcomponent(jlabel8, javax.swing.grouplayout.default_size, javax.swing.grouplayout.default_size, Short.MAX_VALUE).addComponent(jTextField9, javax.swing.grouplayout.preferred_size, 74, javax.swing.grouplayout.preferred_size)).addgroup(jpanel5layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addcomponent(jtextfield8, javax.swing.grouplayout.preferred_size, 90, javax.swing.grouplayout.preferred_size).addcomponent(jlabel9)))).addcontainergap()) ); jpanel5layout.setverticalgroup( jpanel5layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addgroup(jpanel5layout.createsequentialgroup().addcontainergap().addgroup(jpanel5layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addgroup(jpanel5layout.createsequentialgroup().addcomponent(jlabel6).addcomponent(jtextfield5, javax.swing.grouplayout.preferred_size, javax.swing.grouplayout.default_size, javax.swing.grouplayout.preferred_size)).addgroup(jpanel5layout.createsequentialgroup().addgroup(jpanel5layout.createparallelgroup(javax.swing.grouplayout.alignment.baseline).addcomponent(jlabel5).addcomponent(jlabel8).addcomponent(jlabel7).addcomponent(jlabel9)).addgroup(jpanel5layout.createparallelgroup(javax.swing.grouplayout.alignment.baseline).addcomponent(jtextfield6, javax.swing.grouplayout.preferred_size, javax.swing.grouplayout.default_size, javax.swing.grouplayout.preferred_size).addcomponent(jtextfield9, javax.swing.grouplayout.preferred_size, javax.swing.grouplayout.default_size, javax.swing.grouplayout.preferred_size).addcomponent(jtextfield7, javax.swing.grouplayout.preferred_size, javax.swing.grouplayout.default_size, javax.swing.grouplayout.preferred_size).addcomponent(jtextfield8, javax.swing.grouplayout.preferred_size, javax.swing.grouplayout.default_size, javax.swing.grouplayout.preferred_size)))).addgap(17, 17, 17).addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(jButton2, javax.swing.grouplayout.default_size, 23, Short.MAX_VALUE).addComponent(jButton1, javax.swing.grouplayout.default_size, 24, Short.MAX_VALUE)) PAGE 15
);.addcontainergap()) jpanel1.setborder(javax.swing.borderfactory.createtitledborder(javax.swing.borderfactory.createetchedborder(), "PARAMETERS", javax.swing.border.titledborder.left, javax.swing.border.titledborder.top, new java.awt.font("arial", 1, 12), new java.awt.color(153, 153, 153))); // NOI18N jtextfield1.setfont(new java.awt.font("arial", 1, 12)); // NOI18N jtextfield1.setforeground(new java.awt.color(102, 102, 102)); jtextfield1.sethorizontalalignment(javax.swing.jtextfield.right); jtextfield1.settooltiptext("[i.e. 100.14]"); jtextfield1.setborder(javax.swing.borderfactory.createetchedborder()); jlabel1.setbackground(new java.awt.color(153, 153, 153)); jlabel1.setfont(new java.awt.font("arial", 1, 12)); jlabel1.setforeground(new java.awt.color(102, 102, 102)); jlabel1.sethorizontalalignment(javax.swing.swingconstants.center); jlabel1.settext("asset PRICE"); jtextfield2.setfont(new java.awt.font("arial", 1, 12)); jtextfield2.setforeground(new java.awt.color(102, 102, 102)); jtextfield2.sethorizontalalignment(javax.swing.jtextfield.right); jtextfield2.settooltiptext("[i.e. 100.16]"); jtextfield2.setborder(javax.swing.borderfactory.createetchedborder()); jlabel2.setbackground(new java.awt.color(153, 153, 153)); jlabel2.setfont(new java.awt.font("arial", 1, 12)); jlabel2.setforeground(new java.awt.color(102, 102, 102)); jlabel2.sethorizontalalignment(javax.swing.swingconstants.center); jlabel2.settext("exercise PRICE"); jlabel3.setbackground(new java.awt.color(153, 153, 153)); jlabel3.setfont(new java.awt.font("arial", 1, 12)); jlabel3.setforeground(new java.awt.color(102, 102, 102)); jlabel3.sethorizontalalignment(javax.swing.swingconstants.center); jlabel3.settext("risk FREE RATE"); jtextfield3.setfont(new java.awt.font("arial", 1, 12)); jtextfield3.setforeground(new java.awt.color(102, 102, 102)); jtextfield3.sethorizontalalignment(javax.swing.jtextfield.right); jtextfield3.setborder(javax.swing.borderfactory.createetchedborder()); jlabel4.setbackground(new java.awt.color(153, 153, 153)); jlabel4.setfont(new java.awt.font("arial", 1, 12)); // NOI18N jlabel4.setforeground(new java.awt.color(102, 102, 102)); jlabel4.sethorizontalalignment(javax.swing.swingconstants.center); jlabel4.settext("volatility"); PAGE 16
jtextfield4.setfont(new java.awt.font("arial", 1, 12)); // NOI18N jtextfield4.setforeground(new java.awt.color(102, 102, 102)); jtextfield4.sethorizontalalignment(javax.swing.jtextfield.right); jtextfield4.setborder(javax.swing.borderfactory.createetchedborder()); javax.swing.grouplayout jpanel1layout = new javax.swing.grouplayout(jpanel1); jpanel1.setlayout(jpanel1layout); jpanel1layout.sethorizontalgroup( jpanel1layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addgroup(jpanel1layout.createsequentialgroup().addcontainergap().addgroup(jpanel1layout.createparallelgroup(javax.swing.grouplayout.alignment.trailing).addgroup(javax.swing.grouplayout.alignment.leading, jpanel1layout.createsequentialgroup().addgroup(jpanel1layout.createparallelgroup(javax.swing.grouplayout.alignment.trailing).addcomponent(jtextfield1, javax.swing.grouplayout.alignment.leading, javax.swing.grouplayout.default_size, 93, Short.MAX_VALUE).addComponent(jLabel1, javax.swing.grouplayout.alignment.leading, javax.swing.grouplayout.default_size, 93, Short.MAX_VALUE)).addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING).addComponent(jTextField2, javax.swing.grouplayout.alignment.leading, javax.swing.grouplayout.default_size, 93, Short.MAX_VALUE).addComponent(jLabel2, javax.swing.grouplayout.alignment.leading, javax.swing.grouplayout.default_size, javax.swing.grouplayout.default_size, Short.MAX_VALUE))).addGroup(javax.swing.GroupLayout.Alignment.LEADING, jpanel1layout.createsequentialgroup().addgroup(jpanel1layout.createparallelgroup(javax.swing.grouplayout.alignment.trailing).addcomponent(jtextfield3, javax.swing.grouplayout.alignment.leading, javax.swing.grouplayout.default_size, 93, Short.MAX_VALUE).addComponent(jLabel3, javax.swing.grouplayout.alignment.leading, javax.swing.grouplayout.default_size, 93, Short.MAX_VALUE)).addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING).addComponent(jTextField4, javax.swing.grouplayout.alignment.leading, javax.swing.grouplayout.default_size, 93, Short.MAX_VALUE).addComponent(jLabel4, javax.swing.grouplayout.alignment.leading, javax.swing.grouplayout.default_size, 93, Short.MAX_VALUE)))).addGap(28, 28, 28)) ); jpanel1layout.setverticalgroup( jpanel1layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addgroup(jpanel1layout.createsequentialgroup().addcontainergap().addgroup(jpanel1layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addgroup(jpanel1layout.createsequentialgroup().addcomponent(jlabel1).addcomponent(jtextfield1, javax.swing.grouplayout.preferred_size, javax.swing.grouplayout.default_size, javax.swing.grouplayout.preferred_size)) PAGE 17
.addgroup(jpanel1layout.createsequentialgroup().addcomponent(jlabel2).addcomponent(jtextfield2, javax.swing.grouplayout.preferred_size, javax.swing.grouplayout.default_size, javax.swing.grouplayout.preferred_size))).addgroup(jpanel1layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addgroup(jpanel1layout.createsequentialgroup().addcomponent(jlabel3).addcomponent(jtextfield3, javax.swing.grouplayout.preferred_size, javax.swing.grouplayout.default_size, javax.swing.grouplayout.preferred_size)).addgroup(jpanel1layout.createsequentialgroup().addcomponent(jlabel4).addcomponent(jtextfield4, javax.swing.grouplayout.preferred_size, javax.swing.grouplayout.default_size, javax.swing.grouplayout.preferred_size))).addcontainergap(22, Short.MAX_VALUE)) ); jpanel4.setborder(javax.swing.borderfactory.createtitledborder(javax.swing.borderfactory.createetchedborder(), "OPTION TYPE", javax.swing.border.titledborder.left, javax.swing.border.titledborder.top, new java.awt.font("arial", 1, 12), new java.awt.color(153, 153, 153))); // NOI18N jcombobox1.setfont(new java.awt.font("arial", 1, 12)); // NOI18N jcombobox1.setforeground(new java.awt.color(153, 153, 153)); jcombobox1.setmodel(new javax.swing.defaultcomboboxmodel(new String[] { "European")); jcombobox1.addactionlistener(new java.awt.event.actionlistener() { public void actionperformed(java.awt.event.actionevent evt) { jcombobox1actionperformed(evt); ); jradiobutton1.setfont(new java.awt.font("arial", 1, 12)); // NOI18N jradiobutton1.setforeground(new java.awt.color(102, 102, 102)); jradiobutton1.setselected(true); jradiobutton1.settext("call OPTION"); jradiobutton1.addactionlistener(new java.awt.event.actionlistener() { public void actionperformed(java.awt.event.actionevent evt) { jradiobutton1actionperformed(evt); ); jradiobutton2.setfont(new java.awt.font("arial", 1, 12)); // NOI18N jradiobutton2.setforeground(new java.awt.color(102, 102, 102)); jradiobutton2.settext("put OPTION"); jradiobutton2.addactionlistener(new java.awt.event.actionlistener() { public void actionperformed(java.awt.event.actionevent evt) { PAGE 18
); jradiobutton2actionperformed(evt); jlabel11.setbackground(new java.awt.color(153, 153, 153)); jlabel11.setfont(new java.awt.font("arial", 1, 12)); // NOI18N jlabel11.setforeground(new java.awt.color(102, 102, 102)); jlabel11.sethorizontalalignment(javax.swing.swingconstants.center); jlabel11.settext("time TO MATURITY"); jtextfield11.setfont(new java.awt.font("arial", 1, 12)); // NOI18N jtextfield11.setforeground(new java.awt.color(102, 102, 102)); jtextfield11.sethorizontalalignment(javax.swing.jtextfield.right); jtextfield11.settooltiptext("[i.e. 0.25 for 3 months]"); jtextfield11.setborder(javax.swing.borderfactory.createetchedborder()); javax.swing.grouplayout jpanel4layout = new javax.swing.grouplayout(jpanel4); jpanel4.setlayout(jpanel4layout); jpanel4layout.sethorizontalgroup( jpanel4layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addgroup(javax.swing.grouplayout.alignment.trailing, jpanel4layout.createsequentialgroup().addcontainergap().addgroup(jpanel4layout.createparallelgroup(javax.swing.grouplayout.alignment.trailing).addgroup(jpanel4layout.createsequentialgroup().addcomponent(jradiobutton1).addpreferredgap(javax.swing.layoutstyle.componentplacement.related, 13, Short.MAX_VALUE).addComponent(jRadioButton2)).addComponent(jComboBox1, javax.swing.grouplayout.alignment.leading, 0, 211, Short.MAX_VALUE).addGroup(javax.swing.GroupLayout.Alignment.LEADING, jpanel4layout.createsequentialgroup().addcomponent(jlabel11).addgap(18, 18, 18).addComponent(jTextField11, javax.swing.grouplayout.default_size, 86, Short.MAX_VALUE))).addContainerGap()) ); jpanel4layout.setverticalgroup( jpanel4layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addgroup(jpanel4layout.createsequentialgroup().addcontainergap().addcomponent(jcombobox1, javax.swing.grouplayout.preferred_size, javax.swing.grouplayout.default_size, javax.swing.grouplayout.preferred_size).addgap(7, 7, 7).addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(jRadioButton1).addComponent(jRadioButton2)).addGap(18, 18, 18).addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(jLabel11) PAGE 19
.addcomponent(jtextfield11, javax.swing.grouplayout.preferred_size, javax.swing.grouplayout.default_size, javax.swing.grouplayout.preferred_size)).addcontainergap(20, Short.MAX_VALUE)) ); jlabel10.setbackground(new java.awt.color(153, 153, 153)); jlabel10.setfont(new java.awt.font("arial", 1, 12)); jlabel10.setforeground(new java.awt.color(102, 102, 102)); jlabel10.sethorizontalalignment(javax.swing.swingconstants.center); jlabel10.settext("developed by Ioannis Svigkos 2008"); javax.swing.grouplayout layout = new javax.swing.grouplayout(getcontentpane()); getcontentpane().setlayout(layout); layout.sethorizontalgroup( layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addgroup(layout.createsequentialgroup().addcontainergap().addgroup(layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addcomponent(jlabel10, javax.swing.grouplayout.default_size, 491, Short.MAX_VALUE).addGroup(layout.createSequentialGroup().addComponent(jPanel1, javax.swing.grouplayout.preferred_size, javax.swing.grouplayout.default_size, javax.swing.grouplayout.preferred_size).addcomponent(jpanel4, javax.swing.grouplayout.default_size, javax.swing.grouplayout.default_size, Short.MAX_VALUE)).addComponent(jPanel5, javax.swing.grouplayout.default_size, javax.swing.grouplayout.default_size, Short.MAX_VALUE)).addContainerGap()) ); layout.setverticalgroup( layout.createparallelgroup(javax.swing.grouplayout.alignment.leading).addgroup(layout.createsequentialgroup().addgroup(layout.createparallelgroup(javax.swing.grouplayout.alignment.leading, false).addcomponent(jpanel4, javax.swing.grouplayout.default_size, javax.swing.grouplayout.default_size, Short.MAX_VALUE).addComponent(jPanel1, javax.swing.grouplayout.default_size, javax.swing.grouplayout.default_size, Short.MAX_VALUE)).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED).addComponent(jPanel5, javax.swing.grouplayout.preferred_size, javax.swing.grouplayout.default_size, javax.swing.grouplayout.preferred_size).addgap(25, 25, 25).addComponent(jLabel10).addContainerGap(13, Short.MAX_VALUE)) ); // </editor-fold> private void jbutton1actionperformed(java.awt.event.actionevent evt) { PAGE 20
try { _assetprice = Double.parseDouble(jTextField1.getText()); _exerciseprice = Double.parseDouble(jTextField2.getText()); _riskfreerate = Double.parseDouble(jTextField3.getText()); _volatility = Double.parseDouble(jTextField4.getText()); _iteration = Double.parseDouble(jTextField5.getText()); _timetomaturity = Double.parseDouble(jTextField11.getText()); catch(numberformatexception e) { JOptionPane.showMessageDialog(this, "Please check values entered!", "Error Message", JOptionPane.ERROR_MESSAGE); _btree = new BinomialTree( _assetprice, _exerciseprice, _riskfreerate, _volatility, _timetomaturity, _iteration); this._u = roundtoeightdecimals(_btree.calculateupperfactor()); // roundtoeightdecimals*/(math.pow(math.e, _volatility * Math.sqrt(1/(_iteration-1)))); this._d = roundtoeightdecimals(_btree.calculatelowerfactor()); //*roundtoeightdecimals*/(math.pow(math.e, - _volatility * Math.sqrt((1/_iteration-1)))); this._p = roundtoeightdecimals(_btree.calculateprobability()); //*roundtoeightdecimals*/((math.pow(math.e, _riskfreerate* ((_iteration-1)))-_d) / (_u - _d)); jtextfield6.settext(string.valueof(_p)); jtextfield7.settext(string.valueof(_u)); jtextfield9.settext(string.valueof(_d)); if (jcombobox1.getselecteditem().equals("european")) { if (jradiobutton1.isselected() ) { _btree.priceeuropeancalloption(); System.out.println(_btree.getEuropeanCallOptionRootPrice()); jtextfield8.settext(string.valueof(roundtoeightdecimals(_btree.geteuropeancalloptionrootprice()))); // _btree.expand(); else if (jradiobutton2.isselected()) { _btree.priceeuropeanputoption(); jtextfield8.settext(string.valueof(roundtoeightdecimals(_btree.geteuropeanputoptionrootprice()))); // _btree.expand(); public double roundtoeightdecimals(double _double) { DecimalFormat toeightdecimalform = new DecimalFormat("#.########"); return Double.valueOf(toEightDecimalForm.format(_double)); PAGE 21
private void jbutton2actionperformed(java.awt.event.actionevent evt) { // TODO add your handling code here: JOptionPane.showMessageDialog(this, "Browser's Security Features Restrict this Action!", "Information Message", JOptionPane.INFORMATION_MESSAGE); private void jcombobox1actionperformed(java.awt.event.actionevent evt) { // TODO add your handling code here: private void jradiobutton1actionperformed(java.awt.event.actionevent evt) { jradiobutton2.setselected(false); if (!jradiobutton1.isselected()) { jradiobutton1.setselected(true); private void jradiobutton2actionperformed(java.awt.event.actionevent evt) { jradiobutton1.setselected(false); if (!jradiobutton2.isselected()) { jradiobutton2.setselected(true); // Variables declaration - do not modify private javax.swing.jbutton jbutton1; private javax.swing.jbutton jbutton2; private javax.swing.jcombobox jcombobox1; private javax.swing.jlabel jlabel1; private javax.swing.jlabel jlabel10; private javax.swing.jlabel jlabel11; private javax.swing.jlabel jlabel2; private javax.swing.jlabel jlabel3; private javax.swing.jlabel jlabel4; private javax.swing.jlabel jlabel5; private javax.swing.jlabel jlabel6; private javax.swing.jlabel jlabel7; private javax.swing.jlabel jlabel8; private javax.swing.jlabel jlabel9; private javax.swing.jpanel jpanel1; private javax.swing.jpanel jpanel4; private javax.swing.jpanel jpanel5; private javax.swing.jradiobutton jradiobutton1; private javax.swing.jradiobutton jradiobutton2; private javax.swing.jtextfield jtextfield1; PAGE 22
private javax.swing.jtextfield jtextfield11; private javax.swing.jtextfield jtextfield2; private javax.swing.jtextfield jtextfield3; private javax.swing.jtextfield jtextfield4; private javax.swing.jtextfield jtextfield5; private javax.swing.jtextfield jtextfield6; private javax.swing.jtextfield jtextfield7; private javax.swing.jtextfield jtextfield8; private javax.swing.jtextfield jtextfield9; // End of variables declaration PAGE 23