2008/1/13 日曜日

PHP、コールオプション価格の算出

Filed under: 技術メモ — dev0000 @ 7:56:52 このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをBuzzurl(バザール)に追加

別にデリバティブをやってみようと考えたわけではないが、オプション価格の考え方が面白いので色々調べてみていた。

現在、100円の大根を1週間後に110円で買うと約束し、買ったら市場価格ですぐに転売する場合、
大根が110円以上に値上がりしたら儲かるが、110円以下だと損してしまう。
これが、先物取引。
ただ、極端な話、大根の市場価格が10円になってしまうと、110円支払って10円で転売するわけで、損失は100円、これだとややリスクが大きい。

で、「110円以下になれば約束をナシにできる」という非常に都合のいい権利がオプション。
これだと先物とは異なり、リスクは限定されるわけで、市場価格が110円以下に下がれば「買うの止めた」と言って損失をゼロにすることができる。

じゃあ、その便利なオプションの価格は幾らか?ってことなのだけど、B&Sとか、二項モデルといったようにそれを算出する為の式がある。

最初に知った時、へぇーと思った。
オプションとかはちらちら聞いたことがあったが、これって金融以外の分野でも応用ききそうじゃない。

ってことで、ここの例をベースにコールオプション価格の算出プログラムを書いてみた。
金融大学 第10回 2項モデル(バイノミナルモデル)
世の中的にはそれを算出する為のExcelツールが結構あるみたいだけど、いつものようにPHPで。
ただ、ネイピア数とかよく分からんし、あってるのかな、これ。

あとここのExcelツールも若干参考にしましたよ。
株価オプションの価格付け

ところで、上昇トレンド、下降トレンドのコール価格を期待値化するのはどことなくベイズ推定の考えに似ているような。
PHPでベイズ推定の習作

PHP:
  1. <?php
  2.  
  3. $S = $C = array();
  4. $S[1] = 100;
  5. $K = 100; /* or $S[1] */
  6.  
  7. $v = .3;
  8. $t = .5;
  9. $n = 4;
  10. $r = .1;
  11. $q = .2;
  12.  
  13. $u = exp($v * sqrt($t / $n));
  14. $d = 1 / $u;
  15. $R = exp($r * $t / $n);
  16. $P = (exp(($r - $q) * $t / $n) - $d) / ($u - $d);
  17.  
  18. function mypos($n) {
  19.  return ($n * ($n - 1) / 2) ;
  20. }
  21.  
  22. for ($i=2;$i<=$n+1;$i++) {
  23.  $pp = mypos($i - 1);
  24.  $p =  mypos($i);
  25.  for ($j=1;$j<=$i-1;$j++) {
  26.    $S[$p+$j]$S[$pp+$j] * $u;
  27.  }
  28.  $S[$p+$j] = $S[$pp+$j-1] * $d;
  29. }
  30.  
  31. function mycalc($k,$l) {
  32.  global $n, $R ,$P, $S, $C, $K;
  33.  
  34.  $p = mypos($k) + $l;
  35.  
  36.  if (isset($C[$p])) {
  37.    return $C[$p];
  38.  }
  39.  if ($k> $n) {
  40.    $C[$p] = max($S[$p] - $K, 0);
  41.    return $C[$p];
  42.  }
  43.  
  44.  $pp = mypos($k+1) + $l;
  45.  if (!isset($C[$pp])) {
  46.      $C[$pp] = mycalc($k+1, $l);
  47.  }
  48.  $Cu = $C[$pp];
  49.  $pp = mypos($k+1) + $l + 1;
  50.  if (!isset($C[$pp])) {
  51.      $C[$pp] = mycalc($k+1, $l+1);
  52.  }
  53.  $Cd = $C[$pp];
  54.  
  55.  $c = ($P * $Cu + (1 - $P) * $Cd) / $R;
  56.  
  57. // AmericanType
  58. // $c = max($c, $S[$p] - $K);
  59.  
  60.  $C[$p] = $c;
  61.  
  62.  return $c;
  63. }
  64.  
  65. echo mycalc(1,1) . "\n";
  66.  
  67. exit();

コメントはまだありません »

コメントはまだありません。

この投稿へのコメントの RSS フィード。 TrackBack URL

コメントする

HTML convert time: 0.498 sec. Powered by WordPress ME