以下の内容はhttp://blog.livedoor.jp/splus_r/archives/2010-12.htmlより取得しました。




渋い本です。まさかJavadocだけで一冊の本があるとは。

Javadocというのは、Javaのソースコードでクラスやメソッドや引数や戻り値について決められた書式でコメントをつけていくと、ポンと自動的にマニュアルをHTMLドキュメントで作ってくれるプログラムです。Javaのコンパイラーに最初からついていますね。

ひとりでプログラムを書いているとJavadocなんて無視しちゃうんですけど、そうすると自分で書いたコードも何をやっているのか思い出すのに非常に時間がかかりますよね。ましてや人に使ってもらうためのコードだったらなおさらです。この本はどのようにコメントをつけていけば、役に立つドキュメントが作れるのかを懇切丁寧に説明しています。

コーディングの生産性を上げるためにはカプセル化(encapsulation)というのが欠かせません。カプセル化というのは、内部のデータ操作や計算処理を外からアクセスできなくして、クラスをブラック・ボックスにすることです。必要な機能を実現するために必要最小限のメソッドだけをパブリックにします。Javaでソースコードを書くとき、プログラムがインスタンス変数に直接アクセスできるようにしては絶対にいけません。どんな場合でもオブジェクトのデータを扱う場合は、そのオブジェクトのメソッドを通して「のみ」にしないといけません。

なぜそんなことが必要なのでしょうか。たとえばあるプロジェクトでは1000個の関数(メソッド)が必要だとしましょう。ある処理の途中でバグが発生して、データがおかしくなってしまったとします。そのデータがどの関数からもアクセス可能だったら、1000個のメソッドを調べていかなければいけません。ところが10個のメソッドを持つ100個のクラスで設計していたら、おかしくなったデータを持つクラスのなかの10個のメソッドだけを調べればいいでしょう。よって、クラスを作るときに、内部のデータには絶対に直接触れるようにしてはいけないのです。またそうすることによって、クラス内部のデータ構造や計算処理を変更しても、外からは最小限のメソッドだけを通してアクセスしていますから、他のクラスには影響しなくなります。

さて、うまくカプセル化されたクラスを作ったとして、そのクラスを他の人(自分も含む)がいつでもすぐに使えるようにするためにいいドキュメントが必要なのです。基本的にクラスを作るとき、そのクラスの使い方が中身を見なければわからなかったら「負け」なのです。カプセル化して自然言語で必要かつ十分な説明を書いて、はじめて完成されたクラスになります。

それではみなさんもこの本を読んで「ちゃんとした」ドキュメントを作れるようになりましょう。僕も心がけます。もう二度とコメントが全くないソースコードなんか書いたりしません。(笑)

実はGoogle Chart APIはTeX形式で数式がどんどん書けるのです。前回のエントリーの数式も実はGoogle Chart APIで作っています。
http://chart.googleapis.com/chart?chf=bg,s,FFFFFF&cht=tx&chl=\frac{\pi}{2}=\left(\int_{0}^{\infty}\frac{\sin{x}}{\sqrt{x}}dx\right)^2=\sum_{k=0}^{\infty}\frac{(2k)!}{2^{2k}(k!)^2}\frac{1}{2k%2B1}=\prod_{k=1}^{\infty}\frac{4k^2}{4k^2-1}

Pi Formula


chf=bg,s,FFFFFF 背景の色をブログに合わせます。
cht=tx txが数式を表します。
chl=\frac{\pi}{2}=\left(\int_{0}^{\infty}\frac{\sin{x}}{\sqrt{x}}dx\right)^2
=\sum_{k=0}^{\infty}\frac{(2k)!}{2^{2k}(k!)^2}\frac{1}{2k%2B1}
=\prod_{k=1}^{\infty}\frac{4k^2}{4k^2-1}


ここで数式はchl=の後にTeX形式で書いていきますが、ひとつ注意しないといけないことがあります。それは"+"のようにURLで特別の意味がある文字はエンコードしてやらないといけないことです。たとえば"+"は%2Bになります。Googleのサイトでエンコードしてくれます。

TeXの数式になじみがない人も、上のサンプルをコードを見ればだいたい理解できるのではないでしょうか。TeXは理系で論文を書いたりするときに必須のプログラムですね。他にも数式のサンプルをいろいろ張っておきます。

Premium=e^{-q\tau}S\Phi(d_1)-e^{-r\tau}K\Phi(d_2)

Premium=e^{-q\tau}S\Phi(d_1)-e^{-r\tau}K\Phi(d_2)


d_1=\frac{\ln(S/K)%2B(r-q%2B\sigma^2/2)\tau}{\sigma\sqrt{\tau}}

d_1=\frac{\ln(S/K)%2B(r-q%2B\sigma^2/2)\tau}{\sigma\sqrt{\tau}}


d_2=\frac{\ln(S/K)%2B(r-q-\sigma^2/2)\tau}{\sigma\sqrt{\tau}}=d_1-\sigma\sqrt{\tau}

d_2=\frac{\ln(S/K)%2B(r-q-\sigma^2/2)\tau}{\sigma\sqrt{\tau}}=d_1-\sigma\sqrt{\tau}


\Phi(x)=\frac{1}{\sqrt{2\pi}}\int_{-\infty}^xe^{-\frac{y^2}{2}}\,dy

T\Phi(x)=\frac{1}{\sqrt{2\pi}}\int_{-\infty}^xe^{-\frac{y^2}{2}}\,dy


これの何がすばらしいかというと、Wikipediaなんかの数式ってイメージを右クリックすると全部TeX形式でも見えるので、それをコピペして自分で簡単に数式が書けちゃうことなんです。URLにするときにちょっとエンコードしてやらないといけませんけど。

参考資料



Google Chart API 入門 その1 ライン・チャート
Google Chart API 入門 その2 その他のチャート
Google Chart API 入門 その3 数式

円グラフも描けます。
http://chart.googleapis.com/chart?cht=p3&chs=300x100&chf=bg,s,FFFFFF&chd=t:10,20,30,40&chl=Nintendo|Sony|Apple|Microsoft|

Pi Chart


cht=p3 3Dの円グラフを指定しています。2Dだとp2になります。
chs=300x100 サイズですね。
chf=bg,s,FFFFFF バックグラウンドの色を変えられます。デフォルトは白です。
chd=t:10,20,30,40 各データの割合です。ちなみに"t"というのはデータをテキストでわたすという意味です。
chl=Nintendo|Sony|Apple|Microsoft| 各データのラベルです。

棒グラフです。
http://chart.googleapis.com/chart?chxt=x,y&cht=bvs&chf=bg,s,FFFFFF&chs=200x125&chd=t:10,30,40,80,100&chxl=0:|Jan|Feb|Mar|Apr|May|

Bar Chart


chxt=x,y 軸の目盛をx軸とy軸につけます。
cht=bvs 棒グラフを指定します。
chf=bg,s,FFFFFF 背景の色をブログに合わせています。
chs=200x125 サイズ。
chd=t:10,30,40,80,100 データ。
chxl=0:|Jan|Feb|Mar|Apr|May| データのラベル。

他にも様々な種類のチャートが作れますから、Googleのサイトのマニュアルを読んでみてください。


Google Chart API 入門 その1 ライン・チャート
Google Chart API 入門 その2 その他のチャート
Google Chart API 入門 その3 数式



以前紹介したRの本の改訂版が出ていました。Rというのは数値計算や統計解析をする人にとっては必須のフリー・ソフトです。めちゃくちゃよく出来ています。

それでこの舟尾さんの本は、初心者がRを使えるようになるための非常にわかりやすい入門書です。Rの初心者はとりあえずこの本を買いましょう。

ウェブでグラフをお気楽に動的に生成したいときはGoogle Chart APIがとても便利です。それではこのGoogle Chart APIの使い方を勉強しましょう。とりあえず下のURLをブラウザにコピペしてみましょう。
http://chart.apis.google.com/chart?cht=lc&chs=300x200&chxt=x,y&chxtc=0,5|1,5&chxr=0,0,1.0E2|1,0,5.35E1&chds=0,5.35E1&chtt=Premium&chco=00FF00&chd=t:0,0,7.05E-6,2.59E-3,6.39E-2,4.54E-1,1.64E0,3.99E0,7.55E0,1.21E1,1.75E1,2.33E1,2.94E1,3.57E1,4.21E1,4.86E1

すると下のようなグラフがでてくるはずです。
(このグラフもGoogle Chart APIで直接生成しています。)
Google Chart API実験

Google Chart APIとはこのようにURLにパラメータをいろいろ貼りつけてポンとチャートを作るサービスです。もちろん無料です。さまざまなことができるのですが、今日は一番良く使いそうなライン・チャートを勉強します。

http://chart.apis.google.com/chart?

この後にどんどんパラメータをわたしてやります。

cht=lc これはこのチャートの種類がライン・チャートですよとGoogleに教えています。
chs=300x200 300ピクセルx200ピクセルのチャートを作ります。
chxt=x,y 目盛りはx軸とy軸に用意します。
chxtc=0,5|1,5 x軸の補助目盛りとy軸の補助メモリをそえぞれ5ピクセルにします。
chxr=0,0,1.0E2|1,0,5.35E1 x軸(0)の範囲は0.0〜100、y軸(1)の範囲は0.0〜53.5です。
chds=0,5.35E1 y軸のスケールを教えてやります。
chtt=Premium チャートのタイトルです。
chco=00FF00 線の色です。

chd=t:0,0,7.05E-6,2.59E-3,6.39E-2,4.54E-1,1.64E0,3.99E0,7.55E0,1.21E1,1.75E1,2.33E1,2.94E1,3.57E1,4.21E1,4.86E1
最後のところでyの値を全部教えます。xの値を指定しなくていいのはこのライン・チャートではyのデータは等間隔にx軸上に並んでいると仮定されるからです。
ここがちょっとわかりにくいところなんですが、y軸の目盛りに何を指定しようとも、デフォルトではy軸は0が一番下で100が一番上になっていることです。chxrによるy軸の範囲の指定はあくまで見た目を変えるだけなのです。

そこで0〜100になるように元のデータを加工するか、y軸のスケールを明示的に変えてやる必要があります。後者のほうが簡単で、chdschxrと同じにしてやればOKです。

最後に参考のために、ライン・チャート用のURLを生成するJavaのクラスをコピペしておくので、必要な方は使ってみてください。バグを見つけたり、改善したりしたら教えてくれたらありがたいです(笑)。

参考資料
Google Chart Tools / Image Charts (aka Chart API)



Google Chart API 入門 その1 ライン・チャート
Google Chart API 入門 その2 その他のチャート
Google Chart API 入門 その3 数式


/**
* A class to generate a URL Get request for a line chart with Google API Chart
*
* @author Kazuki Fujisawa
*
*/
public class googleXYChart
{
 /**
  * @param xyData
  *
  * xyData[0][0,1,...n]: x date set, xyData[1][0,1,...n]: y date set.
  * x data points have to be placed evenly and in ascending order across the x-axis.
  */
 public googleXYChart(
   double[][] xyData
   )
 {
  data = xyData;
  numData = xyData[0].length;
  setXrange();
  setYrange();
 }

 /**
  * @param xSize chart x-size
  * @param ySize chart y-size
  */
 public void setSize(int xSize, int ySize)
 {
  x_size = xSize;
  y_size = ySize;
 }

 /**
  * @param chartTitle chart title
  * Space is +, eg., Kazuki Fujisawa is "Kazuki+Fujisawa"
  */
 public void setTitle(String chartTitle)
 {
  title = chartTitle;
 }

 /**
  * @param lineColor chart color
  * Red: FF0000, Green: 00FF00, Blue: 0000FF
  */
 public void setColor(String lineColor)
 {
  color = lineColor;
 }

 /**
  * @return A URL Get request
  */
 public String getChartURL()
 {
  String url = "http://chart.apis.google.com/chart?cht=lc&";
  url += "chs=" + Integer.toString(x_size) + "x" + Integer.toString(y_size)+ "&";
  url += "chxt=x,y&";
  url += "chxtc=0,5|1,5&";
  url += "chxr=0," + getStrEfficientRound(x_start,4) + "," + getStrEfficientRound(x_end,4) + "|";
  url += "1," + getStrEfficientRound(y_start,4) + "," + getStrEfficientRound(y_end,4) + "&";
  url += "chds=" + getStrEfficientRound(y_start,4) + "," + getStrEfficientRound(y_end,4) + "&";

  if(title!=null)
  {
   url += "chtt=" + title + "&";
  }

  if(color!=null)
  {
   url += "chco=" + color + "&";
  }

  url += "chd=t:";
  for(int i=0;i   {
   url += getStrEfficientRound(y[i],5);
   
   if(i!=numData-1)
   {
    url += ",";
   }
   else
   {
    url += "";    
   }
  }

  return url;
 }
 
 /**
  * @param value double value which will be rounded and converted into a String.
  * @param effectiveDigit effective digit for the rounding
  * @return String in the form of #.###E# like 1.2345E6
  */
 public static String getStrEfficientRound(double value, int effectiveDigit)
 {
  if(value == 0.0)
  {
   return "0";
  }
  
  int valueDigit = 0;
  double absValue = Math.abs(value);
  String sign = null;
  if(value < 0.0)
  {
   sign = "-";
  }
  else
  {
   sign = "";
  }
  
  valueDigit = (int)Math.floor(Math.log10(absValue));
    
  if(valueDigit < -10)
  {
   return "0";
  }

  double effNumber = absValue / Math.pow(10.0, (double)valueDigit);
  effNumber = (int)Math.round(effNumber*Math.pow(10.0, (double)(effectiveDigit-1)));
  effNumber = effNumber/Math.pow(10.0, (double)(effectiveDigit-1));

  String z = Double.toString(effNumber);
  
  if(z.length() <= effectiveDigit+1)
  {
   return sign + z + "E" + Integer.toString(valueDigit);
  }
  else
  {
   return sign + z.substring(0,effectiveDigit+1) + "E" + Integer.toString(valueDigit);
  }
 }

 private void setXrange()
 {
  x_start = data[0][0];
  x_end = data[0][numData-1];
 }

 private void setYrange()
 {
  setYminYmax();
  y = data[1];
  
  if((yMax-yMin)==0.0)
  {
   if(yMax==0.0)
   {
    y_start = -1.0;
    y_end = 1.0;
   }
   else
   {
    y_start = 0.0;
    y_end = yMax * 2.0;
   }
  }
  else
  {
   y_start = yMin;
   y_end = (yMax - yMin) * 0.1 + yMax;
  }
 }
 
 private void setYminYmax()
 {
  yMin = data[1][0];
  yMax = data[1][0];
  
  for(int i=0;i   {
   if(yMin > data[1][i])
   {
    yMin = data[1][i];
   }
   
   if(yMax < data[1][i])
   {
    yMax = data[1][i];
   }
  }
 }
 
 private int numData = 0;
 private double[][] data = null;
 private double[] y = null;
 private double yMin = 0;
 private double yMax = 100;
 private String title = null;
 private String color = null;
 private int x_size = 300;
 private int y_size = 160;
 private double x_start = 0;
 private double x_end = 100;
 private double y_start = 0;
 private double y_end = 1;
}

さてコール・オプション(実はプット・オプションも)をデルタ・ヘッジすると株が上がっても下がっても儲かることがわかりました。それではこの時の儲かりぐわいはどうなのかという、それがガンマなのです。ガンマというのは数学的にはデルタをさらにスポットで微分したものです。デルタがプレミアムの傾きだったのですが、そのデルタの傾きがガンマです。これはつまりプレミアムの曲率を表します。曲率、つまりプレミアムの曲がりぐわいが大きければ大きいほど、デルタ・ヘッジしたときのスポットの動きに対してデルタの乖離が大きくなりますから、大きく儲かることがわかります。ガンマが大きければ大きいほど、リヘッジするときの儲けが大きくなります。

BS_Gamma

ということはガンマの大きいポジションを作って、デルタ・ヘッジするだけで儲かるのかというと、そうは問屋がおろさないんですね。ガンマが大きいとセータが大きい負の値になるのです。セータというのはプレミアムを満期までの期間で微分したものです。つまり時間が経つとオプションの価格はどうやって動くかということを表しています。これがマイナスの値だと、毎日毎日何もしなくてもプレミアムが小さくなっていくので損失が出ます。つまりガンマが大きくてリヘッジで儲かる分はセータでやられてトントンになるようになっているのです。

BS_Theta

逆にオプションの売りのポジションはセータがプラスになりますが、ガンマがマイナスになってリヘッジするたびに損していきます。その分はセータで儲かります。

BS_Vega

最後にベガを見てみましょう。ベガというのはプレミアムをボラティリティで微分したものです。つまりボラティリティが1単位動くとプレミアムはどれだけ動くかを表しています。オプションを買うということはボラティリティを買うということなので、ボラティリティが上がればオプション価格、つまりプレミアムも上がって儲かりますね。逆にオプションを売っていたら、ボラティリティが上がると損します。

ちなみにセータもガンマも教科書的には数学的な整合性のために1単位、つまり1年と100%で見ていてあまり実用的じゃないので、実際のところはセータは1日、ボラティリティは1%の動きに直して使います。つまり上のグラフの縦軸は、セータは365分の1にして、ボラティリティは100分の1にすると、ちょうど1日経つとオプション価格はどうなるのか、ボラティリティが1%動くとオプション価格がどうなるのかがわかって使いやすくなります。

そういうわけでブラック・ショールズ・モデル入門の入門はこのへんでおしまい。もっと勉強したい人は次の本を買いましょう。



John Hullの本です。この分野のバイブルみたいなもんです。
日本語訳はこっちです。



日本人の著者が書いた本で読みやすいのはこの本ですね。



以前の書評


ブラック・ショールズ・モデルって何だ? その1
ブラック・ショールズ・モデルって何だ? その2
ブラック・ショールズ・モデルって何だ? その3
ブラック・ショールズ・モデルって何だ? その4
Black Scholes Calculator



以上の内容はhttp://blog.livedoor.jp/splus_r/archives/2010-12.htmlより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14