技術メモ

役に立てる技術的な何か、時々自分用の覚書。幅広く色々なことに興味があります。

ブラックショールズモデルを解説してみる(株価モデル編)

Black scholes equation

ブラックショールズモデルを解説してみる

金融工学の金字塔的存在であるブラックショールズ方程式。

これまで自分で勉強する中で概念的な解説というのが今までほとんどなかった。たいていの入門書は確率解析の基礎的な解説、つまり測度論、確率論、マルチンゲール……と解説が終わったころにやっとブラックショールモデルや株価モデルという概念が出てくるといった具合のものが多い。けれども「株の値動きをシミュレーションしたい」「とにかく何を言っているかを知りたい」というだけの人には実はそこまで詳しい話は不要だ。それに株価予想なんかの機械学習が流行っている昨今そういったモチベーションを持っている人は少なくないかもしれない。

そこでここでは株価のモデルについて解説した後、この方程式って何を言ってるの?という概念的な理解を目指す。
確率微分方程式を使って解析解を求めてやろう…という難しい話はしない、勉強する前の自分に向けてイメージを掴んで貰うためのつもりで書く。
思いの外記事が膨大になったので、第一回で基礎となる株価モデルの考え方について説明し、第二回でその先のブラック・ショールズ方程式について解説する。

「株価モデル」って何?

金融工学の世界では「株価モデル」が頻繁に登場する。つまりは株価の値動きを数理的にモデル化したものである。
ここでは最もベーシックなブラックモデルのベースとなる株価モデルを解説する。実務に使う厳密な計算にはSABRモデルなどもう少し複雑なモデルも使われることがある。*1
*2

株価のモデル化は大きく3つの仮定から出発する。

1. 株として資産を保有する場合の利率は期待値で見れば銀行に預金する場合の利率と同じになるはず。
2. これまでの情報をどれだけ使っても次の一瞬に関して株価が上がるか下がるかわからない。
3. 100円の株が1円分動くのと1000円の株が10円動くのは同じ価値。

1つ目の仮定でわかりやすく銀行の預金金利と表現したものは、正確には国債などの安全資産の利率*3のことで、リスクフリーレートと呼ぶ。
株価モデルはこの3つの仮定から出発する。*4

ではこの仮定を使って株価の値動きを数式で表現してみよう。
ある時点tの株価がS_tとする。この時、S_{t+dt}の株価はどうなるだろう。

まず1つ目の仮定を表現する。

株として資産を保有する場合の利率は期待値で見れば銀行に預金する場合の利率と同じになるはず。

「利率」とはつまり単位時間あたりの値上がりの割合であるから、リスクフリーレートをrとすると時間dt進んだ時資産は rS_tdtだけ増えることになる。
S_{t+dt} = S_t + rS_tdt

次に2つ目の仮定を見てみよう。

これまでの情報をどれだけ使っても次の一瞬に関して株価が上がるか下がるかわからない。

値動きは完全にランダムであり過去の値動きの形は関係ない、ということだ。
ここで時間dtの間のランダムさを考える。
値幅(標準偏差)を\sigmaとすると単位時間あたりの動きの分布が正規分布を用いてN(0,\sigma^2)になると考える。
時間dt後の確率分布に従う確率変数を\Delta XN(0,\sigma^2)に従う確率変数を Xとすると
 \Delta X + \Delta X + ... \Delta X = X
 V[\Delta X + \Delta X + ... \Delta X ] = V[X]
 (1/dt)V[\Delta X] = V[X]
 V[\Delta X] = V[X] dt = \sigma^2 dt
となる。
よって時間dtに動くランダムさは\Delta N(\mu, \sigma^2) = N(0,\sigma^2 dt) = \sigma N(0, dt)なので*5
 dW = N(0, dt)とおいて元のモデルに組み込むと
S_{t+dt} = S_t + rS_tdt + \sigma dW

※この方程式が確率微分方程式と言われ、単純な微分方程式と違うところはこのランダム項" dW"が出てくるところだ。単純和であれば正規分布の和の性質を使えばいいだけだが、実際の世界では e^{dW}などの表現が出てくるので複雑になってくる。

最後に3つ目の仮定を考慮する。

100円の株が1円分動くのと1000円の株が10円動くのは同じ価値。

ランダムな動きの値幅はその時の価格に比例する。
S_{t+dt} = S_t + rS_tdt + \sigma S_t dW

これで3つの仮定をモデルに落とし込む事ができた。
これが株価の動きを数式にしたものとなる。

式の整理

最後に式を整理する。
S_{t+dt} - S_t = S_t (rdt + \sigma dW)
ここで
dS = S_{t+dt} - S_t
とすると

 \displaystyle \frac{dS}{S} = rdt + \sigma dW
となる。
特に右辺の第一項をドリフト項、第二項をランダム項と呼ぶ

それではこの株価モデルをプログラムでシミュレーションしてみる。

実装

少しだけ解説

金融工学の世界では「単位時間」は通常1年間を指す。
そのため金利は年利が使われるし、ボラティリティも1年の値幅を N(0, \sigma^2)としたときの割合で考える。

ドリフト項

リスクフリーレートは通常年利の形で書かれている。
実務では1年以内の期間計算は単利として計算するため、1日あたりの金利はリスクフリーレートを365日で割ったものとなる。*6

ランダム項

ランダム項に関しては正規分布の性質から
 \displaystyle N(0, 1/365) = \frac{N(0,1)}{\sqrt{365}}
となる点に注意

以上に注意すると、1ステップあたりの増分は
 \displaystyle S_t(r/365 + \sigma \frac{N(0,1)} {\sqrt{365}})
となる。

import numpy as np
import matplotlib.pyplot as plt

size_t = 1200 #1200日
dw = np.random.randn(size_t)
price = np.zeros(size_t)
rf_rate = 0.01 #リスクフリーレート(年利1%)
sigma = 0.12 #ボラティリティ(12%)
price[0] = 100 #初期値
for i in range(1, size_t):
    price[i] = price[i-1] * (1 + rf_rate / 365 + sigma * dw[i] / np.sqrt(365)) 

plt.plot(price)
plt.show()

50パスまとめて可視化してみる

def generate_path(days):
    size_t = days
    dw = np.random.randn(size_t)
    price = np.zeros(size_t)
    rf_rate = 0.01
    sigma = 0.12
    price[0] = 100
    for i in range(1, size_t):
        price[i] = price[i-1] * (1 + rf_rate / 365 + sigma * dw[i] / np.sqrt(365)) 
    return price

for i in range(50):
    path = generate_path(1200)
    plt.plot(path, alpha=0.5)
plt.show()

次回はいよいよブラック・ショールズ方程式について解説しようと思う。


suzuri.jp

*1:SABR volatility model - Wikipedia

*2:実務においては株(Equity)だけでなく金利(Interest Rate)を原資産にした商品もあり、特に金利に関してはマイナス金利をモデルに入れるために改良されたHullWhiteモデルなどがある。

*3:もっと正確に言えばリスクフリーレートの指標はOIS(オーバーナイトインデックススワップ)の市中金利などが用いられるhttps://www.mof.go.jp/public_relations/finance/202112/202112e.html

*4:これらの仮定が成り立たないとすれば一方的に儲かる取引が存在することになる。これを裁定取引というが、金融の世界では一方的に儲けられる取引は存在しないと言う大前提が置かれている

*5:正規分布の再生性

*6:うるう年も関係なく365日で割る。金利の種類によっては360日で計算するものもある。そういった金融商品ごとの計算の取り決めはデイカウントコンベンションと呼ぶ。ACT/365, ACT/ACT, ACT/360など。国ごとに慣習がちがう。そのためクロスカレンシーなどでは扱いがややこしい。

情報処理安全確保支援士に合格しました

セキュリティに関する体系的な知識が不足していると感じ、勉強の目標として情報処理安全確保支援士の勉強をしていました。
今回(令和五年春期)合格することができたので、大まかにやったことと感想を記しておこうかと思います。

対策したこと・押さえておくべきこと

対策したこと

対策したし実際必要だと感じたところ
  • ネットワーク・DNS関係
    • TCP/IPとかネットワーク構成とかメールのセキュリティ(DKIM, SPF)とか
  • 認証系の知識
  • 各種攻撃の種類とその対策法
  • その他
    • 上記以外の内容は短答問題や午後問題を解く中で補強していけば良い。CWEやポートの一覧なんかは覚えなきゃと不安に感じた都度覚えれば良いと思う。APを受験した人ならば開発手法や法規関係は思い出すだけで良いけれど、SC一発受験ならそのあたりも都度覚える必要はある。
対策したけど押さえる必要がなかったところ
  • 詳しい暗号の仕組み
    • 個人的な趣味もあってIKEやらDH法の鍵交換の数理的な仕組みやら深掘りしたが、絶対にそこまで知る必要はない。RSA暗号の仕組みすら知る必要はない。
  • nmap, burp suiteなどのCLIツールの使い方
    • 詳しいツールの使い方など知っている必要はない。が、本来必要なのってこういう知識なんじゃないかと思う。

ポイント

午後対策は早めに

テキストはサッと一読。(上記の最低限必要だったところを理解するレベルまで読み込めば良い。最初から覚える必要はない。)短答式の対策を完璧に仕上げる前に午後対策は早めにした方がいい。
あらゆる資格試験に共通して言えることだが、頭から真面目に知識を積み上げていくより、どういう知識が必要になるかだけ抑えながら森を見てから木を補強するような勉強をした方がいい。
短答では聞かれないようなことが午後で必要になったり、逆に短答でしか聞かれないようなこともあるので、そういうバランス感覚も早めに感じておくのがベスト。

午後Ⅱ試験の分量に圧倒される必要はない

午後試験(特に午後Ⅱ)はとにかく問題文の量が多いと言われている。
たしかに読む量が多く状況把握するまでが大変だが、頭から素直に設問がされているので問題文を行ったり来たりする必要はなく、見た目ほど大変ではない。
記述量もたかだか30字とかで大したことはない。
問題文の分量に圧倒されて対策を後回しにするよりも、とにかく手をつけてみることが大事だ。
ただ次回から午後Ⅰと午後Ⅱの区分が撤廃されるみたいなので1と2の違いはなくなるみたい。

時間配分はそこまで気にしなくて良い

午後Ⅰについて時間配分が大変だとか常に時間を意識しろと言うブログ記事を目にするけれど、個人的にはそこまで焦るほどでは無いという印象だった。
ただ、選択していない問題も解いてみた上で解答する問題を選ぼうとすると時間が足りない。
なぜこんなことを言うかと言うと私がそうしたから。
試験中は最初に選んだ問題が実は難易度の高い問題だったんじゃないかと感じ目移りしてしまう。そうなると他の問題を解いてみて得点が取れそうな方を解答しようという思考になる。
安心したい人は超スピードで全問解いて後から選択して解答するようにすればいいけれど、そうなるとかなり時間勝負になってくる。

使った教材

テキスト

内容的にオーバースペック気味ではあるが、勉強のために受験していたので個人的には満足。
解説も丁寧で読みやすいと感じた。
ただ資格合格だけを目標にするのであればもう少し薄い本でも問題ないかと思う。
とはいえ他の参考書を使っていないので他のものと優劣はつけられないです。

問題集

分野ごとに過去問が載っている午後向け問題集が欲しかったので、これを選んだ。
解説も読みやすいと感じた。
こちらも他の参考書を使っていないので優劣はつけられないです。

サイト

情報処理安全確保支援士過去問道場|情報処理安全確保支援士.com
IPA受験者界隈では紹介するまでもなく有名。
短答対策はここを使った。というかこれしか使っていない。
過去問演習が安定して8割5分超えれば試験当日6割を下回ることはないだろう。

(おまけ)使わなかった教材

こちらの参考書は買ったものの使わなかった。内容が悪いというわけではないけれど、先述の午後対策の問題集があればカバーできるもので、どちらかというと内容は不足気味といった感じ。
”問題文の読み方”について事細かに解説してくれているが、正直そういう解説は不要と感じた。問題文の特性は過去問を3回解けばわかるようなものだし、あえて解説するほどのものでもない。
前述の通り時間勝負の解き方をするならまだしも、普通に選択した問題だけを解くのであれば時間を意識する必要はないので高速で解答を導くような小手先の時間稼ぎは不要と思う。

感想

基礎的な実務経験が求められる

今年は午後Ⅱでgitの基本的な知識が必要な問題が出たり、スレッドセーフにおけるstatic変数の危険性などについて聞かれたり、OAuthの詳細な仕組みについて聞かれたりした。
いずれもテキストや過去問だけではカバーしきれない範囲で、ある程度のプログラミング経験がないと対応できないというIPAからのメッセージを感じた。
(もちろん、問題選びは選択式であるためそれらを回避することはできるが、回避する必要があるような人がこの資格を取って情報処理安全確保支援士を名乗る意味はあるのかとは思う。)

難易度について

合格基準は6割に設定されている。
正直6割では合格基準が低すぎるというのが個人的な意見。
「情報処理安全確保支援士」の士業としての登用試験として利用されているけれど、この試験を合格したというだけでセキュリティ専門家としてコンサルティングやチームリーダーを任せようとは思えない。
あと、士業に登録する登録料と更新にかかる費用がバカ高い。年平均5万円くらい取られるそう。そのくせ士業とは名ばかりで弁護士や会計士と違い独占業務はないため、この肩書きって意味あるのかなとは思う。
たまに2週間だけ勉強したような人が合格報告しているが、たしかに合格だけならある程度インフラ開発経験があれば2週間でも可能かなと思う。私は2~3ヶ月ほど勉強したが、それでもオーバーキル気味だったかとは思う。(前から暗号系やセキュリティ系の知識があったのもある)
とはいえ非IT系の業種の方がこの試験に挑むのはなかなかにハードルが高いのではないかとは感じる。
非IT系でこの試験に合格する方はすごいと思います。

【Flutter】 sqliteのDBの内容を確認する方法 for iOS

Flutter開発している中でsqliteのデータの中身を確認したいという場面が出てきた。
Android StudioのDatabase Inspectorの機能を使う方法やadbコマンドを使う方法はあるようだが、Anrdoidのエミュレータでしかこの方法は使えない。
基本的にiOSシミュレータで開発していたため、データの中身を確認したいだけで新しくAndroidの環境を立ち上げるのも面倒だった。

そこでたどり着いたのがここで紹介するsqlite_viewerだ。
普段iOSのシミュレータで開発している人にとって単純にsqliteのデータを覗きたいだけであれば、こちらのパッケージを使うほうが手っ取り早いかもしれない。

flutter pub add sqlite_viewer 

としてパッケージを追加した後
適当な場所にボタンを設置し`DatabaseList()`へのナビゲーションを書くだけでDBの中身をテーブル表示してくれる。

Navigator.push(context, MaterialPageRoute(builder: (_) => DatabaseList()))