Black-Scholes
Python 中的混合希臘語 - 如何繪製以下內容
我對 Black-Scholes 的希臘人很感興趣。在這種情況下,我有 python 公式來計算名為“Vanna”的希臘語,即: $ \frac{\partial^2 P}{\partial \sigma \partial S} $ 期權價值 P 對標的資產和波動率聯合變動的敏感性。
現在,讓我們考慮以下範例,其中 S =
$$ 100,120 $$50 個等距點的列表和 $ \sigma $ =$$ 0.05,0.7 $$另一個 50 個等間距點的列表,在下面的程式碼中,我能夠生成這個希臘語的圖,關於 S 的每個元素和 $ \sigma $ ,即關於 S 的第一個元素和 $ \sigma $ 列表,之後相對於兩個列表的第二個元素,直到兩個列表的最後一個元素。 我的問題是:如何在這兩個列表之間獲取所有可能的組合?也許可以用 3 維圖來完成?我怎樣才能在 Python 中做到這一點?
import numpy as np import matplotlib.pyplot as plt underlying = np.linspace(100,120,50) K = 100 T = 1 r = 0 sigma = np.linspace(0.05,0.7,50) def Vanna_(S, K, T, r, sigma): lista = [] d1 = (np.log(S / K) + (r + 1/2 * sigma ** 2) * T) / (sigma * np.sqrt(T)) d2 = d1-vol*T**(1/2) return (1 / np.sqrt(2 * np.pi) * S * np.exp(-d1 ** 2 * 1/2) * np.sqrt(T))/S * (1- d1/(sigma*np.sqrt(T))) plt.plot(Vanna_(underlying, K, T, r, sigma))
像這樣的東西?
from mpl_toolkits import mplot3d from itertools import product S = np.linspace(100,120) vols = np.linspace(0.05,0.7) combs = list(product(S, vols)) values = [Vanna_(underlying, K, T, r, sigma) for underlying, sigma in combs] x, y = np.hsplit(np.array(combs), 2) fig = plt.figure() ax = plt.axes(projection="3d") ax.scatter3D(x, y, values, c=values);
這是另一個使用
Plotly
.首先讓我糾正您程式碼中的錯字
def Vanna_(S, K, T, r, sigma): lista = [] d1 = (np.log(S / K) + (r + 1/2 * sigma ** 2) * T) / (sigma * np.sqrt(T)) d2 = d1-sigma*T**(1/2) return (1 / np.sqrt(2 * np.pi) * S * np.exp(-d1 ** 2 * 1/2) * np.sqrt(T))/S * (1- d1/(sigma*np.sqrt(T)))
然後讓我用 pandas 來格式化結果
import numpy as np import pandas K = 100 T = 1 r = 0 underlying_1d = np.linspace(100,120,25) sigma_1d = np.linspace(0.05,0.3,50) underlying, sigma = np.meshgrid(underlying_1d, sigma_1d) Vanna_df = pandas.DataFrame( Vanna_(underlying, K, T, r, sigma), columns=underlying_1d, index=sigma_1d ) Vanna_df.index.name = 'volatility' Vanna_df.columns.name = 'Strike' Vanna_df.iloc[:10,:10]
現在是等高線圖
import plotly.graph_objects as go fig = go.Figure(data = go.Contour( z=Vanna_df.values, x=underlying_1d, y=sigma_1d )) fig.update_layout(title='Vanna', autosize=False, xaxis_title='volatility', yaxis_title='strike', width=700, height=500) fig.show()
和你的表面圖
import plotly.graph_objects as go fig = go.Figure(data = go.Surface( z=Vanna_df.values, x=underlying_1d, y=sigma_1d )) fig.update_traces(contours_z=dict(show=True, usecolormap=True, highlightcolor="limegreen", project_z=True)) fig.update_layout(title='Vanna', autosize=False, width=700, height=500) fig.show()
(注意:發布程式碼不是我的習慣,
quant.stackexchange
但我現在正在訓練自己使用Plotly
……)