公式の裏にある関数
scipy.special は、公式に何度も現れる名前付き関数を集めています。金融で最も役立つのは正規分布の累積分布関数 Φ(x) で、special.ndtr として使えます。誤差関数とは Φ(x)=21(1+erf(x/2)) で結ばれています。原資産価格 S、権利行使価格 K、金利 r、ボラティリティ σ、期間 T のコールのブラック・ショールズ価格はこれを2回使います:C=SΦ(d1)−Ke−rTΦ(d2)、ここで d1=σTln(S/K)+(r+σ2/2)T、d2=d1−σT です。価格のボラティリティに対する感応度はベガと呼ばれ、Sφ(d1)T(φ は正規分布の密度)に等しく、インプライド・ボラティリティをニュートン法で求めるときに必要です。
特殊関数のもう1つのグループは、大きすぎる数や小さすぎる数を扱います。階乗は非常に速く増え、171! はコンピュータの通常の小数ではすでにあふれますが、lnn! は簡単です:special.gammaln(n+1)。special.comb(n, k) は n ステップの木で上昇が k 回の経路の数を数えます。special.logsumexp は最大の x をくくり出して ln∑exi を安全に計算し、ln(e1000+e1000)=1000+ln2 をあふれさせません。special.expit(x)=1/(1+e^{-x}) は、ロジスティックモデルのように、任意のスコアを0から1の確率に変えます。規則は、数が巨大にも微小にもなりうるときは対数で計算し、指数をとるのは最後だけ、です。
Φ(x)=21(1+erf(2x)),C=SΦ(d1)−Ke−rTΦ(d2),vega=Sφ(d1)T,ln∑exi=m+ln∑exi−m(1) コール価格とインプライド・ボラティリティの1歩S=K=100、
r=0、
σ=0.2、
T=1 とします。
d1=0.1、
d2=−0.1 で、
Φ(0.1)=0.5398、
Φ(−0.1)=0.4602 なので
C=100⋅(0.5398−0.4602)=7.97 です。
0.1 での正規分布の密度は
0.3970 なので、ベガは
100⋅0.3970⋅1=39.70 です。市場価格が
9.00 なら価格は
1.03 低すぎ、ニュートン法の1歩でボラティリティは
0.2+1.03/39.70=0.2261 に上がります。
Φ(1) は
erf(0.7071)=0.6827 を使って
Φ(1)=21(1+0.6827)=0.8413 です。小さな道具では、
expit(2)=0.8808、
ln4!=3.178、
(310)=120 です。実データでは、SPYの日次リターンの標準偏差は
1.196% です。
5% の下落は標準偏差
z=−4.21 個分で、
Φ(−4.21)=1.26⋅10−5、正規モデルでは約
315 年に1度しか起きないはずですが、
5,403 日のデータでは
20 日起きました。
- 関数に名前を使う:
ndtr、erf、expit、gammaln、comb、logsumexp は手書きの数式何ページ分にも相当する。 - 極端な値は対数で計算する:階乗や巨大な指数の和の代わりに
gammaln と logsumexp を使う。 - ベガがソルバーを動かす:インプライド・ボラティリティのニュートン法の1歩は、価格の差をベガで割ったもの。
ラボ:採点される内容
- erfから求める正規分布関数10点
- ブラック・ショールズのコール20点
- ベガ10点
- インプライド・ボラティリティの1歩15点
- 各関数の用途15点
- 安全な足し方10点
- なぜ階乗を対数で計算するか20点