誤差をゼロにする数を探す
債券価格は利回りから簡単に計算できますが、価格から利回りへは簡単ではありません。f(y)=P(y)-市場価格=0 を探索で解きます。ニュートン法は接線をたどります。推定値 y から y-f(y)/f'(y) へ跳び、解の近くでは正しい桁数が1歩ごとにほぼ倍になるので数回の反復で足りますが、導関数が必要で、悪い出発点では迷うことがあります。二分法は f の符号が変わる区間 [lo,hi] だけを必要とし、区間を何度も半分にするので失敗しませんが、1歩で2進1桁しか得られず、幅65の区間を 10⁻¹⁰ 未満にするのに40歩かかります。ブレント法 scipy.optimize.brentq は区間の安全性を保ちつつ補間の歩を加え、関数呼び出しは通常、二分法の数回分で済みます。full_output=True では、関数を何回評価したかを示す function_calls を持つ記録も返します。
同じ道具でブラック・ショールズの式も逆算できます。コールの価格はボラティリティとともに増えるので、気配ごとに brentq に、それを再現する [10⁻⁴,5] の中の σ を求めさせます。価格が本源的価値 max(S-Ke^(-rT),0) と株価 S の間に厳密に収まるときだけ可能で、外側ではボラティリティが存在せず、正しい答えは例外ではなくNaNです。1つの悪い気配でスマイル全体が止まらないようにするためです。2026年10月9日の10年国債利回りは 5.24% なので、年率5%・10年の債券は 97.121 です。ニュートン法は4回の反復、ブレント法は10回の関数呼び出し、二分法は40回で利回りを見つけます。10%、20%、40%、80%のインプライド・ボラティリティは 10⁻⁶ より高い精度で戻ります。各手法のコストと失敗する場面を知っていれば、債券の曲線全体やオプションチェーンに適した手法を選べます。
- ニュートン法は速いが、導関数とまともな出発点が必要:ここでは4歩。
- 二分法は失敗しないが遅い:幅65の区間に40歩。
brentqを使い、不可能な場合を処理する:区間+補間、解がなければNaN。
ラボ:採点される内容
- 債券価格10点
- 手計算のニュートン法20点
- 手計算の二分法15点
- scipyのブレント法15点
- 3つのソルバーを並べる10点
- インプライド・ボラティリティ15点
- 実データでの研究15点