Keyword: ブラック・ショールズ・マートン, オプション, プライシング
概要
本サンプルはブラック・ショールズ・マートンオプションプライシングを求めるC言語によるサンプルプログラムです。 本サンプルは以下に示されるブラック・ショールズ・マートンの公式を用いてオプションプライシングを求めて出力します。
※本サンプルはnAG Cライブラリに含まれる関数 nag_bsm_price() のExampleコードです。本サンプル及び関数の詳細情報は nag_bsm_price のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
入力データ
(本関数の詳細はnag_bsm_price のマニュアルページを参照)1 2 3 4 5 6 7 8 9
このデータをダウンロード |
nag_bsm_price (s30aac) Example Program Data Nag_Call : Nag_Call or Nag_Put 55.0 0.3 0.1 0.0 : s, sigma, r, q 3 2 : m, n 58.0 60.0 62.0 : x(i), i = 1,2,...m 0.7 0.8 : t(i), i = 1,2,...n
- 1行目はタイトル行で読み飛ばされます。
- 2行目にオプションがコール(買い)かプット(売り)かを示すパラメータ(putnum)を指定しています。
- 3行目に原資産価格(s)、原資産のボラティリティ(sigma)、無リスク利子率(r)、配当利回り(q)を指定しています。
- 4行目に行使価格の数(m)、満期までの期間の数(n)を指定しています。
- 5~7行目に行使価格(x)を指定しています。
- 8~9行目に満期までの期間(t)を指定しています。
出力結果
(本関数の詳細はnag_bsm_price のマニュアルページを参照)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
この出力例をダウンロード |
nag_bsm_price (s30aac) Example Program Results Black-Scholes-Merton formula European Call : Spot = 55.0000 Volatility = 0.3000 Rate = 0.1000 Dividend = 0.0000 Strike Expiry Option Price 58.0000 0.7000 5.9198 58.0000 0.8000 6.5506 60.0000 0.7000 5.0809 60.0000 0.8000 5.6992 62.0000 0.7000 4.3389 62.0000 0.8000 4.9379
- 5行目に原資産価格が出力されています。
- 6行目に原資産のボラティリティが出力されています。
- 7行目に無リスク利子率が出力されています。
- 8行目に配当利回りが出力されています。
- 10~16行目に行使価格、満期までの期間、オプション価格が出力されています。
ソースコード
(本関数の詳細はnag_bsm_price のマニュアルページを参照)
※本サンプルソースコードはnAG数値計算ライブラリ(Windows, Linux, MAC等に対応)の関数を呼び出します。
サンプルのコンパイル及び実行方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
このソースコードをダウンロード |
/* nag_bsm_price (s30aac) Example Program. * * CLL6I261D/CLL6I261DL Version. * * Copyright 2017 Numerical Algorithms Group. * * Mark 26.1, 2017. */ #include <stdio.h> #include <math.h> #include <string.h> #include <nag.h> #include <nag_stdlib.h> #include <nags.h> int main(void) { /* Integer scalar and array declarations */ Integer exit_status = 0; Integer i, j, m, n; NagError fail; Nag_CallPut putnum; /* Double scalar and array declarations */ double q, r, s, sigma; double *p = 0, *t = 0, *x = 0; /* Character scalar and array declarations */ char put[8 + 1]; Nag_OrderType order; INIT_FAIL(fail); printf("nag_bsm_price (s30aac) Example Program Results\n"); printf("Black-Scholes-Merton formula\n\n"); /* Skip heading in data file */ scanf("%*[^\n] "); /* Read put */ scanf("%8s%*[^\n] ", put); /* * nag_enum_name_to_value (x04nac). * Converts nAG enum member name to value */ putnum = (Nag_CallPut) nag_enum_name_to_value(put); /* Read sigma, r */ scanf("%lf%lf%lf%lf%*[^\n] ", &s, &sigma, &r, &q); /* Read m, n */ scanf("%ld%ld%*[^\n] ", &m, &n); #ifdef nAG_COLUMN_MAJOR #define P(I, J) p[(J-1)*m + I-1] order = Nag_ColMajor; #else #define P(I, J) p[(I-1)*n + J-1] order = Nag_RowMajor; #endif if (!(p = nAG_ALLOC(m * n, double)) || !(t = nAG_ALLOC(n, double)) || !(x = nAG_ALLOC(m, double))) { printf("Allocation failure\n"); exit_status = -1; goto END; } /* Read array of strike/exercise prices, X */ for (i = 0; i < m; i++) scanf("%lf ", &x[i]); scanf("%*[^\n] "); for (i = 0; i < n; i++) scanf("%lf ", &t[i]); scanf("%*[^\n] "); /* * nag_bsm_price (s30aac) * Black-Scholes-Merton option pricing formula */ nag_bsm_price(order, putnum, m, n, x, s, t, sigma, r, q, p, &fail); if (fail.code != NE_NOERROR) { printf("Error from nag_bsm_price (s30aac).\n%s\n", fail.message); exit_status = 1; goto END; } if (putnum == Nag_Call) printf("%s\n", "European Call :"); else if (putnum == Nag_Put) printf("%s\n", "European Put :"); printf("%s%8.4f\n", " Spot = ", s); printf("%s%8.4f\n", " Volatility = ", sigma); printf("%s%8.4f\n", " Rate = ", r); printf("%s%8.4f\n", " Dividend = ", q); printf("\n"); printf("%s\n", " Strike Expiry Option Price"); for (i = 1; i <= m; i++) for (j = 1; j <= n; j++) printf("%9.4f %9.4f %9.4f\n", x[i - 1], t[j - 1], P(i, j)); END: nAG_FREE(p); nAG_FREE(t); nAG_FREE(x); return exit_status; }