あるものだけを保存する
グリッド上でオプションを価格付けするとは、微分方程式を一連の連立一次方程式に置き換えることです。各ノードは両隣としかつながっていないので、系の行列は三重対角で、3本の対角線に数が並び、他はすべてゼロです。密な n×n 配列は n² 個の数を保存し、そのほとんどはゼロですが、疎な形式は意味のある 3n-2 個だけを保存します。scipy.sparse.diags([lower, diag, upper], [-1, 0, 1], format='csc') は対角線からそのような行列を作ります(下対角と上対角はどちらも n-1 個なので、下の対角は2行目から始まるように、上の対角は最後の列の手前で終わるように切ります)。CSC形式は疎行列ソルバーが求める形式です。
陰解法は、各ステップで A V^new=V^old+境界 を解いてオプション価値を時間をさかのぼって進めます。行列 A はステップごとに変わらないので、scipy.sparse.linalg.splu(A) で一度だけ分解し、各ステップは lu.solve(rhs) だけです。三重対角行列ではきわめて安価な操作です。S=0 の境界条件(プットの価値は Ke^(-rτ))は最初の式に入るので、最初の右辺を lower[0] * K * exp(-r * m * dt) で補正します。1年金利 4.47%、σ=25% のとき、アットザマネーのプットの閉じた式は 7.6987、スキームは 200×200 のグリッドで 7.6958、400×400 で 7.6965 と、約 0.003 の差です。2000ノードのグリッドは、疎形式で 5,995 個の数を保存し、密形式ならほぼ 400 万個が必要です。
- ゼロでなく対角線を保存する:
sparse.diagsはn²でなく3n - 2個の数を持つ。 - 一度分解して何度も解く:
spluは最初にコストを払い、以後は各時間ステップが安価なsolve1回。 - 境界は右辺に入る:グリッド端の既知の値は方程式の反対側に移される。
ラボ:採点される内容
- 3本の対角線20点
- 疎行列15点
- 1回の分解での価格付け30点
- 疎と密10点
- 価格付け誤差5点
- 実際の金利での研究20点