public static Node calcEuropeanOption(Node node,int i,int j){ point++; //頂点番号の入力 node.i = i; node.j = j; //System.out.println("("+node.i+","+node.j+")"); //行使価格の計算 node.X = S*Math.pow(u,node.i-node.j)*Math.pow(d,node.j); //葉なら, if(node.i==n){ //Payoffを計算して出力 node.P = Math.max(S-node.X,0); node.O = node.P; return node; } //長男なら, if(node.j==0){ //子供1を作る node.child1 = new Node(); //子供1のOptionを計算 node.child1 = calcEuropeanOption(node.child1,node.i+1,0); } //長男でないなら, else{ //子供1を兄の子供1に設定 node.child1 = node.brother1.child2; } //子供2を作る node.child2 = new Node(); //子供2の兄を子供1に設定 node.child2.brother1 = node.child1; //子供2のOptionを計算 node.child2 = calcEuropeanOption(node.child2,node.i+1,node.j+1); //Optionを計算 node.O = p*node.child1.O+(1-p)*node.child2.O; return node; }
public static Node calcOptionWithBinomialTree(Node node,int i,int j){ //EuropeanOptionを計算するための関数 //2項木構造を用いるのでWithBinaryTreeよりも速い //↑グラフの合流(兄弟)を認識できる point++; node.i = i; node.j = j; //行使価格の計算 node.X = S*Math.pow(u,node.i-node.j)*Math.pow(d,node.j); //葉なら,Payoffを計算して出力 if(node.i==n){ node.P = Math.max(S-node.X,0); node.O = node.P; return node; } //長男なら,その長男と次男のOptionを計算,自らのOptionを計算して出力 if(node.j==0){ node.child1 = new Node(); node.child1 = calcOptionWithBinomialTree(node.child1,node.i+1,0); node.child2 = new Node(); node.child2.brother1 = node.child1; node.child2 = calcOptionWithBinomialTree(node.child2,node.i+1,1); node.O = p*node.child1.O+(1-p)*node.child2.O; return node; } //次男なら,その長男を設定,次男のOptionを計算,自らのOptionを計算して出力 node.child1 = node.brother1.child2; node.child2 = new Node(); node.child2.brother1 = node.child1; node.child2 = calcOptionWithBinomialTree(node.child2,node.i+1,node.j+1); node.O = p*node.child1.O+(1-p)*node.child2.O; return node; }