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


さて、ブラック・ショールズ・モデルを勉強しました。
グリークスがどうなっているのか理解するために、ウェブに簡単な計算機を作りました。
いろいろ遊んで見てください。

ブラック・ショールズ・モデルによるプレミアムの計算
ブラック・ショールズ・モデルによるインプライド・ボラティリティの計算


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

GoogleはApp Engineという無料で使えるクラウド・システムを提供しています。最近までPythonしか使えませんでしたが、Javaもサポートするようになりました。サーブレットやJSPが動くので非常に便利なクラウドです。月間500万ページビュー程度までは無料でいけるようです。さらにリソースが必要だったり、パフォーマンスを上げたい場合は課金設定をしてGoogleに多少お金を払う仕組みです。いずれにしても個人営業のサイトだと、無料の範囲でほぼ問題なさそうです。

しかしこんな夢のようなシステムですが、現在稼動しているJavaのWebアプリケーションをそのまま使えるかというとそうは問屋が卸しません。次のような大きな制約があります。

1. SQLデータベースが使えない。
2. ファイルが書き出せない。
3. SwingやAWTなどのJavaのグラフィック関連のクラスが全滅。

1のSQLデータベースがそのまま使えないというのは、多くの業務用Webアプリケーションにとってそうとう痛いでしょう。これはBigtableというNon-SQLデータベースに置き換わります。これだけのクラウド・リソースを不特定多数のユーザーに無料で提供するには、やはりSQLデータベースは制限せざるを得ないようです。僕はまだあまり詳しくありませんが、BigtableはGoogleの様々なアプリケーションに応用されている高速データベースです。要はSQLデータベースで作ったものはそのままでは動かないということです。

2もセキュリティーの問題から制限せざるを得なかったようです。ファイルはもちろんアップロードできるのですが、App Engine上のプログラムからファイルを作ることはできません。データを動的にストアする必要があればBigtableを使うことになります。

3ですが、これはけっこう痛かったりします。というのも、JavaにはJFreeChartのようにフリーのグラフを作ったりするライブラリがたくさんあって、それらが全く使えなくなるからです。GoogleはSwingやAWTの代わりのクラス・ライブラリを提供していますが、長年使い込まれてきたライブラリが使えないのは痛いでしょう。その他にもグラフィックがなくても実はSwingやAWTのクラスを使っているライブラリはいろいろあって、ほぼ全滅状態です。

しかし、これらの制約を回避できるならば、Google App Engine for Javaは極めてパワフルなクラウド環境を無料、もしくは非常に安価に提供してくれます。個人で面白サイトを作ったりする場合なんかは非常にいいサービスですね。ただJavaの業務用アプリケーションを移植するのは結構大変そうです。

ここでは僕の備忘録も兼ねて、Google App Engineのはじめかたを簡単にまとめておきます。

I. Google App Engineのアカウント登録

とりあえずGmailアカウントが必ず必要なのでひとつ用意してください。それからGoogleサイトにわかりやすい説明があるのでひと通り読みます。

Google App Engine スタート ガイド

読み終わったらいよいよ登録しましょう。しかしここで携帯電話のメルアドがひとつ必要になります。ロボットによる大量アカウント取得を避けるために携帯電話のメルアドにパスワードを送って認証しています。Googleにまたひとつ個人情報を取られるわけですが、しょうがないので登録しましょう。あとは指示に従っていけば簡単にアカウントを作れます。ここでアプリケーションの名前を決めますが、URLは次のようになります。

    http://アプリケーション名.appspot.com

このアプリケーション名は10個までひとつのアカウントで作れますし、それぞれのアプリケーションが複数のバージョンを持つことができます。リリースするときは普通ドメインを取るでしょうから、これだけたくさん使えれば十分でしょう。もちろん独自ドメインを使うこともできます。

II. GoogleプラグインをEclipseにインストール

これもGoogleのサイトにわかりやすく書いてあります。

Google Plugin for Eclipse の使用

ツールバーの[Help]の[Install New Software...]にいって、"http://dl.google.com/eclipse/plugin/3.6"を[Add...]します。最後の数字がEclipseのバージョンに対応しています。僕は最新の3.6を使っているのでこのようになります。[Google App Engine Java SDK]と[Google Web Toolkit SDK]を選択してあとは指示に従っていけばインストールできます。

III. Google App Engineで"Hello World!"

それではいよいよ最初のプログラムをデプロイ(deploy)してみましょう。ちなみにWebプログラミングの世界ではプログラムをサーバーに上げることをデプロイといいます。もともとは英語の戦争用語で部隊を配備するというような意味です。

Eclipseのツールバーの[File]の[New]で[Web Application Project]を選択します。プロジェクト名とパッケージ名を決めましょう。それからUse Google Web Toolkitのチェックを外します。

Google App Engine のプロジェクトを作る


このプロジェクトにアプリケーション名を教えてやる必要があります。Project Explorerのプロジェクトの上で右クリックして[Properties]を選択します。[Google] > [App Engine]のApplication IDのところで最初に登録したアプリケーション名をいれてください。

それではデプロイしてみましょう。デプロイは飛行機ボタンです。ここでGoogle App Engineを登録したGmailアドレスとパスワードが必要になります。どうですか? うまくいきましたか? ブラウザで"http://xxx.appspot.com/"を見てみましょう。"Hello App Engine!"と出てくれば成功です。

これでJavaのサーブレットやJSPが動くようになりましたね。JSPで注意しないといけないのは、Google App EngineはコンパイラにJDKを指定しないとうまく動かないことです。Project ExplorerのJRE System Libraryを右クリックしてAlternate JREで最新のJDKを選択してください。JDKが登録されていなかったら登録してしてください。なぜかJSPはJDKじゃないとうまくコンパイルできませんでした。

以下に使えそうな参考書をリストしておきます。





実は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 数式

ウェブでグラフをお気楽に動的に生成したいときは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;
}



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

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