Keyword: 有限差分法, ブラック・ショールズ, Black-Scholes
概要
本サンプルは有限差分法を用いてブラック・ショールズ(Black-Scholes)方程式を解くC言語によるサンプルプログラムです。 本サンプルは引数として行使価格やタイムステップ数を与えオプション価格とグリークス(Delta, Gamma, Lambda, Theta, Rho)を算出します。
※本サンプルはnAG Cライブラリに含まれる関数 nag_pde_bs_1d() のExampleコードです。本サンプル及び関数の詳細情報は nag_pde_bs_1d のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで
入力データ
(本関数の詳細はnag_pde_bs_1d のマニュアルページを参照)- 1行目はタイトル行で読み飛ばされます。
- 2行目に行使価格(x)を指定しています。
- 3行目に株価の数(ns)、タイムステップの数(nt)を指定しています。
- 4行目に株価の最小価格(smin)と最大価格(smax)を指定しています。
- 5行目にタイムステップの最小値(tmin)と最大値(tmax)を指定しています。
- 6行目にタイムステップスキーマに使用されるλの値(alpha)を指定しています。
- 7行目に格納される解の数(ntkeep)を指定しています。
出力結果
(本関数の詳細はnag_pde_bs_1d のマニュアルページを参照)この出力例をダウンロード |
nag_pde_bs_1d (d03ncc) Example Program Results Option Values ------------- Stock Price | Time to Maturity (months) | 5.0000e+00 4.5000e+00 4.0000e+00 3.5000e+00 -------------------------------------------------------------------------- 0.0000e+00 | 5.0000e+01 5.0000e+01 5.0000e+01 5.0000e+01 5.0000e+00 | 4.5000e+01 4.5000e+01 4.5000e+01 4.5000e+01 1.0000e+01 | 4.0000e+01 4.0000e+01 4.0000e+01 4.0000e+01 1.5000e+01 | 3.5000e+01 3.5000e+01 3.5000e+01 3.5000e+01 2.0000e+01 | 3.0000e+01 3.0000e+01 3.0000e+01 3.0000e+01 2.5000e+01 | 2.5000e+01 2.5000e+01 2.5000e+01 2.5000e+01 3.0000e+01 | 2.0000e+01 2.0000e+01 2.0000e+01 2.0000e+01 3.5000e+01 | 1.5000e+01 1.5000e+01 1.5000e+01 1.5000e+01 4.0000e+01 | 1.0154e+01 1.0096e+01 1.0046e+01 1.0012e+01 4.5000e+01 | 6.5848e+00 6.4424e+00 6.2916e+00 6.1306e+00 5.0000e+01 | 4.0672e+00 3.8785e+00 3.6729e+00 3.4463e+00 5.5000e+01 | 2.4264e+00 2.2423e+00 2.0454e+00 1.8336e+00 6.0000e+01 | 1.4174e+00 1.2662e+00 1.1096e+00 9.4813e-01 6.5000e+01 | 8.1951e-01 7.0724e-01 5.9532e-01 4.8515e-01 7.0000e+01 | 4.7241e-01 3.9411e-01 3.1904e-01 2.4845e-01 7.5000e+01 | 2.7257e-01 2.2016e-01 1.7174e-01 1.2815e-01 8.0000e+01 | 1.5725e-01 1.2328e-01 9.2935e-02 6.6682e-02 8.5000e+01 | 8.9662e-02 6.8478e-02 5.0100e-02 3.4731e-02 9.0000e+01 | 4.8449e-02 3.6251e-02 2.5901e-02 1.7469e-02 9.5000e+01 | 2.1100e-02 1.5584e-02 1.0968e-02 7.2680e-03 1.0000e+02 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 Theta ----- Stock Price | Time to Maturity (months) | 5.0000e+00 4.5000e+00 4.0000e+00 3.5000e+00 -------------------------------------------------------------------------- 0.0000e+00 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 5.0000e+00 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 1.5000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 2.0000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 2.5000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 3.0000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 3.5000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 4.0000e+01 | -1.4043e+00 -1.1857e+00 -8.3285e-01 -2.8064e-01 4.5000e+01 | -3.4185e+00 -3.6183e+00 -3.8646e+00 -4.1880e+00 5.0000e+01 | -4.5285e+00 -4.9339e+00 -5.4387e+00 -6.0796e+00 5.5000e+01 | -4.4165e+00 -4.7277e+00 -5.0821e+00 -5.4821e+00 6.0000e+01 | -3.6294e+00 -3.7585e+00 -3.8748e+00 -3.9632e+00 6.5000e+01 | -2.6946e+00 -2.6860e+00 -2.6441e+00 -2.5561e+00 7.0000e+01 | -1.8790e+00 -1.8018e+00 -1.6941e+00 -1.5505e+00 7.5000e+01 | -1.2578e+00 -1.1621e+00 -1.0461e+00 -9.0969e-01 8.0000e+01 | -8.1539e-01 -7.2821e-01 -6.3006e-01 -5.2314e-01 8.5000e+01 | -5.0841e-01 -4.4106e-01 -3.6887e-01 -2.9433e-01 9.0000e+01 | -2.9276e-01 -2.4840e-01 -2.0237e-01 -1.5656e-01 9.5000e+01 | -1.3237e-01 -1.1079e-01 -8.8802e-02 -6.7378e-02 1.0000e+02 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 Delta ----- Stock Price | Time to Maturity (months) | 5.0000e+00 4.5000e+00 4.0000e+00 3.5000e+00 -------------------------------------------------------------------------- 0.0000e+00 | -1.0000e+00 -1.0000e+00 -1.0000e+00 -1.0000e+00 5.0000e+00 | -1.0000e+00 -1.0000e+00 -1.0000e+00 -1.0000e+00 1.0000e+01 | -1.0000e+00 -1.0000e+00 -1.0000e+00 -1.0000e+00 1.5000e+01 | -1.0000e+00 -1.0000e+00 -1.0000e+00 -1.0000e+00 2.0000e+01 | -1.0000e+00 -1.0000e+00 -1.0000e+00 -1.0000e+00 2.5000e+01 | -1.0000e+00 -1.0000e+00 -1.0000e+00 -1.0000e+00 3.0000e+01 | -1.0000e+00 -1.0000e+00 -1.0000e+00 -1.0000e+00 3.5000e+01 | -9.8457e-01 -9.9042e-01 -9.9536e-01 -9.9883e-01 4.0000e+01 | -8.4152e-01 -8.5576e-01 -8.7084e-01 -8.8694e-01 4.5000e+01 | -6.0871e-01 -6.2173e-01 -6.3735e-01 -6.5654e-01 5.0000e+01 | -4.1584e-01 -4.2000e-01 -4.2463e-01 -4.2970e-01 5.5000e+01 | -2.6498e-01 -2.6123e-01 -2.5633e-01 -2.4982e-01 6.0000e+01 | -1.6069e-01 -1.5351e-01 -1.4500e-01 -1.3485e-01 6.5000e+01 | -9.4501e-02 -8.7208e-02 -7.9055e-02 -6.9969e-02 7.0000e+01 | -5.4694e-02 -4.8708e-02 -4.2358e-02 -3.5699e-02 7.5000e+01 | -3.1515e-02 -2.7084e-02 -2.2610e-02 -1.8177e-02 8.0000e+01 | -1.8291e-02 -1.5168e-02 -1.2164e-02 -9.3423e-03 8.5000e+01 | -1.0880e-02 -8.7026e-03 -6.7034e-03 -4.9214e-03 9.0000e+01 | -6.8562e-03 -5.2894e-03 -3.9132e-03 -2.7463e-03 9.5000e+01 | -4.8449e-03 -3.6251e-03 -2.5901e-03 -1.7469e-03 1.0000e+02 | -4.2199e-03 -3.1168e-03 -2.1936e-03 -1.4536e-03 Gamma ----- Stock Price | Time to Maturity (months) | 5.0000e+00 4.5000e+00 4.0000e+00 3.5000e+00 -------------------------------------------------------------------------- 0.0000e+00 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 5.0000e+00 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 1.5000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 2.0000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 2.5000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 3.0000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 3.5000e+01 | 6.1726e-03 3.8321e-03 1.8558e-03 4.6773e-04 4.0000e+01 | 5.1047e-02 5.0031e-02 4.7953e-02 4.4288e-02 4.5000e+01 | 4.2075e-02 4.3582e-02 4.5444e-02 4.7873e-02 5.0000e+01 | 3.5072e-02 3.7109e-02 3.9646e-02 4.2863e-02 5.5000e+01 | 2.5275e-02 2.6400e-02 2.7671e-02 2.9089e-02 6.0000e+01 | 1.6442e-02 1.6688e-02 1.6860e-02 1.6900e-02 6.5000e+01 | 1.0032e-02 9.8331e-03 9.5193e-03 9.0515e-03 7.0000e+01 | 5.8907e-03 5.5669e-03 5.1595e-03 4.6562e-03 7.5000e+01 | 3.3809e-03 3.0827e-03 2.7396e-03 2.3529e-03 8.0000e+01 | 1.9091e-03 1.6834e-03 1.4388e-03 1.1808e-03 8.5000e+01 | 1.0551e-03 9.0291e-04 7.4543e-04 5.8760e-04 9.0000e+01 | 5.5449e-04 4.6239e-04 3.7065e-04 2.8244e-04 9.5000e+01 | 2.5001e-04 2.0330e-04 1.5859e-04 1.1731e-04 1.0000e+02 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 Lambda ------ Stock Price | Time to Maturity (months) | 5.0000e+00 4.5000e+00 4.0000e+00 3.5000e+00 -------------------------------------------------------------------------- 0.0000e+00 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 5.0000e+00 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 1.5000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 2.0000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 2.5000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 3.0000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 3.5000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 4.0000e+01 | 6.3243e+00 5.1893e+00 3.8089e+00 2.1118e+00 4.5000e+01 | 1.0721e+01 9.9718e+00 9.2140e+00 8.4953e+00 5.0000e+01 | 1.2381e+01 1.1807e+01 1.1228e+01 1.0636e+01 5.5000e+01 | 1.1483e+01 1.0837e+01 1.0142e+01 9.3795e+00 6.0000e+01 | 9.3227e+00 8.5840e+00 7.7870e+00 6.9211e+00 6.5000e+01 | 6.9621e+00 6.2206e+00 5.4412e+00 4.6264e+00 7.0000e+01 | 4.9268e+00 4.2651e+00 3.5937e+00 2.9227e+00 7.5000e+01 | 3.3602e+00 2.8204e+00 2.2920e+00 1.7866e+00 8.0000e+01 | 2.2221e+00 1.8126e+00 1.4248e+00 1.0683e+00 8.5000e+01 | 1.4122e+00 1.1240e+00 8.5856e-01 6.2248e-01 9.0000e+01 | 8.2686e-01 6.4587e-01 4.8252e-01 3.4083e-01 9.5000e+01 | 3.7891e-01 2.9252e-01 2.1553e-01 1.4976e-01 1.0000e+02 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 Rho --- Stock Price | Time to Maturity (months) | 5.0000e+00 4.5000e+00 4.0000e+00 3.5000e+00 -------------------------------------------------------------------------- 0.0000e+00 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 5.0000e+00 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 1.5000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 2.0000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 2.5000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 3.0000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 3.5000e+01 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 4.0000e+01 | -7.1918e+00 -6.0114e+00 -4.5204e+00 -2.5855e+00 4.5000e+01 | -8.4541e+00 -7.6378e+00 -6.8479e+00 -6.1657e+00 5.0000e+01 | -7.5988e+00 -6.9323e+00 -6.2879e+00 -5.6707e+00 5.5000e+01 | -5.8905e+00 -5.2837e+00 -4.6809e+00 -4.0772e+00 6.0000e+01 | -4.1854e+00 -3.6547e+00 -3.1306e+00 -2.6135e+00 6.5000e+01 | -2.8221e+00 -2.3904e+00 -1.9743e+00 -1.5775e+00 7.0000e+01 | -1.8437e+00 -1.5137e+00 -1.2055e+00 -9.2283e-01 7.5000e+01 | -1.1812e+00 -9.4071e-01 -7.2326e-01 -5.3162e-01 8.0000e+01 | -7.4513e-01 -5.7680e-01 -4.2921e-01 -3.0383e-01 8.5000e+01 | -4.5907e-01 -3.4659e-01 -2.5060e-01 -1.7161e-01 9.0000e+01 | -2.6550e-01 -1.9656e-01 -1.3892e-01 -9.2652e-02 9.5000e+01 | -1.2280e-01 -8.9807e-02 -6.2569e-02 -4.1033e-02 1.0000e+02 | 0.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00
- 6〜29行目には株価と満期までの期間に対応したオプションの値が出力されています。
- 33〜56行目には株価と満期までの期間に対応したThetaの値が出力されています。
- 60〜83行目には株価と満期までの期間に対応したDeltaの値が出力されています。
- 87〜110行目には株価と満期までの期間に対応したGammaの値が出力されています。
- 114〜137行目には株価と満期までの期間に対応したLambdaの値が出力されています。
- 141〜164行目には株価と満期までの期間に対応したRhoの値が出力されています。
ソースコード
(本関数の詳細はnag_pde_bs_1d のマニュアルページを参照)
※本サンプルソースコードはnAG数値計算ライブラリ(Windows, Linux, MAC等に対応)の関数を呼び出します。
サンプルのコンパイル及び実行方法
このソースコードをダウンロード |
/* nag_pde_bs_1d (d03ncc) Example Program. * * CLL6I261D/CLL6I261DL Version. * * Copyright 2017 Numerical Algorithms Group. * * Mark 26.1, 2017. */ #include <stdio.h> #include <string.h> #include <math.h> #include <nag.h> #include <nag_stdlib.h> #include <nagd03.h> #define F(I, J) f[ns*((J) -1)+(I) -1] #define THETA(I, J) theta[ns*((J) -1)+(I) -1] #define DELTA(I, J) delta[ns*((J) -1)+(I) -1] #define GAMMA(I, J) gamma[ns*((J) -1)+(I) -1] #define LAMBDA(I, J) lambda[ns*((J) -1)+(I) -1] #define RHO(I, J) rho[ns*((J) -1)+(I) -1] int main(void) { double alpha, x; Integer i, igreek, j, ns, nt, ntkeep, exit_status; double *delta = 0, *f = 0, *gamma = 0, *lambda = 0, q[3], r[3], *rho = 0, *s = 0; double sigma[3], *t = 0, *theta = 0, smin, smax, tmin, tmax; Nag_Boolean gprnt[5] = { Nag_TRUE, Nag_TRUE, Nag_TRUE, Nag_TRUE, Nag_TRUE }; Nag_Boolean tdpar[3]; const char *gname[5] = { "Theta", "Delta", "Gamma", "Lambda", "Rho" }; NagError fail; INIT_FAIL(fail); printf("nag_pde_bs_1d (d03ncc) Example Program Results\n\n"); /* Skip heading in data file */ scanf("%*[^\n] "); exit_status = 0; /* Read problem parameters */ scanf("%lf", &x); scanf("%ld%ld", &ns, &nt); scanf("%lf%lf", &smin, &smax); scanf("%lf%lf", &tmin, &tmax); scanf("%lf", &alpha); scanf("%ld", &ntkeep); /* Allocate memory */ if (!(s = nAG_ALLOC(ns, double)) || !(t = nAG_ALLOC(nt, double)) || !(f = nAG_ALLOC(ns * ntkeep, double)) || !(theta = nAG_ALLOC(ns * ntkeep, double)) || !(delta = nAG_ALLOC(ns * ntkeep, double)) || !(gamma = nAG_ALLOC(ns * ntkeep, double)) || !(lambda = nAG_ALLOC(ns * ntkeep, double)) || !(rho = nAG_ALLOC(ns * ntkeep, double))) { printf("Allocation failure\n"); exit_status = 1; goto END; } /* Set up input parameters for nag_pde_bs_1d (d03ncc) */ s[0] = smin; s[ns - 1] = smax; t[0] = tmin; t[nt - 1] = tmax; tdpar[0] = Nag_FALSE; tdpar[1] = Nag_FALSE; tdpar[2] = Nag_FALSE; q[0] = 0.0; r[0] = 0.10; sigma[0] = 0.4; /* Call Black-Scholes solver */ /* nag_pde_bs_1d (d03ncc). * Finite difference solution of the Black-Scholes equations */ nag_pde_bs_1d(Nag_AmericanPut, x, Nag_UniformMesh, ns, s, nt, t, tdpar, r, q, sigma, alpha, ntkeep, f, theta, delta, gamma, lambda, rho, &fail); if (fail.code != NE_NOERROR) { printf("Error from nag_pde_bs_1d (d03ncc).\n%s\n", fail.message); exit_status = 1; goto END; } /* Output option values */ printf("\nOption Values\n"); printf("-------------\n"); printf("%14s | %s\n", "Stock Price", "Time to Maturity (months)"); printf("%14s | ", ""); for (i = 0; i < ntkeep; i++) printf(" %13.4e", 12.0 * (t[nt - 1] - t[i])); printf("\n"); for (i = 0; i < 74; i++) printf("-"); printf("\n"); for (i = 1; i <= ns; i++) { printf(" %13.4e | ", s[i - 1]); for (j = 1; j <= ntkeep; j++) printf(" %13.4e", F(i, j)); printf("\n"); } for (igreek = 0; igreek < 5; igreek++) { if (!gprnt[igreek]) continue; printf("\n%s\n", gname[igreek]); for (i = 0; i < (Integer) strlen(gname[igreek]); i++) printf("-"); printf("\n%14s | %s\n", "Stock Price", "Time to Maturity (months)"); printf("%14s | ", ""); for (i = 0; i < ntkeep; i++) printf(" %13.4e", 12.0 * (t[nt - 1] - t[i])); printf("\n"); for (i = 0; i < 74; i++) printf("-"); printf("\n"); for (i = 1; i <= ns; i++) { printf(" %13.4e | ", s[i - 1]); switch (igreek) { case 0: for (j = 1; j <= ntkeep; j++) printf(" %13.4e", THETA(i, j)); break; case 1: for (j = 1; j <= ntkeep; j++) printf(" %13.4e", DELTA(i, j)); break; case 2: for (j = 1; j <= ntkeep; j++) printf(" %13.4e", GAMMA(i, j)); break; case 3: for (j = 1; j <= ntkeep; j++) printf(" %13.4e", LAMBDA(i, j)); break; case 4: for (j = 1; j <= ntkeep; j++) printf(" %13.4e", RHO(i, j)); break; default: break; } printf("\n"); } } END: nAG_FREE(s); nAG_FREE(t); nAG_FREE(f); nAG_FREE(theta); nAG_FREE(delta); nAG_FREE(gamma); nAG_FREE(lambda); nAG_FREE(rho); return exit_status; }