ブラック・ショールズ・マートンオプションプライシング

C言語によるサンプルソースコード : 使用関数名:nag_bsm_price (s30aac)

ホーム > 製品 > nAG数値計算ライブラリ > サンプルソースコード集 > ブラック・ショールズ・マートンオプションプライシング (C言語/C++)

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;
}


関連情報
© 日本ニューメリカルアルゴリズムズグループ株式会社 2024
Privacy Policy  /  Trademarks