Black-Scholes

Python 中的混合希臘語 - 如何繪製以下內容

  • October 1, 2021

我對 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……)

引用自:https://quant.stackexchange.com/questions/68164