隨機波動率

具有基礎 BS 動力學的 Heston 模型總是給出正確值的 1/2,我做錯了什麼?

  • March 1, 2021

作為一個練習,我試圖遵循這篇論文:https ://arxiv.org/ftp/arxiv/papers/1502/1502.02963.pdf

在第 2.2 節中,它使用 Black-Scholes 動力學下標的的特徵函式計算看漲期權的價值。

我正在使用 Python,奇怪的是我的結果似乎正好是看漲期權價值的 1/2,因為我得到的 Pi1 和 Pi2 也是應該的 1/2。

例如,我正在計算帶有參數的看漲期權的價值:

  • S = 100
  • K = 10
  • t = 1
  • 體積 = 0.2
  • r = 0

這應該給我一個等於 1 的 Pi1(增量)(因為它是深 ITM),但我得到一個 Pi1 = 0.49999999 和 44.99999 的呼叫值

你能幫忙指出我在哪裡可能有錯誤嗎?我真的希望這不是一個愚蠢的錯誤,在過去的 2-3 個小時裡我一直在努力解決這個問題,但我看不出有什麼問題。這是我正在使用的程式碼:

import numpy as np
from scipy import stats, special, integrate

def char_func(x,s,vol,t=1,r=0):
   mean = np.log(s) + (r - 0.5*vol*vol) * t
   var = vol*vol*t
   w = np.exp(1j*x*mean - x*x*vol*vol*0.5)
   return w.real

def call_value(s,k,vol,t=1,r=0):
   def integrand(x,s,k,vol,t=1,r=0):
       I = np.exp(-1j*x*np.log(k)) * char_func(x-1j,s,vol,t,r)/(1j*x*char_func(-1j,s,vol,t,r))
       return I.real

   def integrand2(x,s,k,vol,t=1,r=0):
       I = np.exp(-1j*x*np.log(k)) * char_func(x,s,vol,t,r)/(1j*x)
       return I.real

   int1 = integrate.quad(integrand,0,np.inf,args=(s,k,vol,t,r))
   int1 = 0.5 + int1[0]/np.pi

   int2 = integrate.quad(integrand2,0,np.inf,args=(s,k,vol,t,r)))
   int2 = 0.5 + int2[0]/np.pi

   return s*int1 - np.exp(-r*t)*k*int2

print(call_value(100,10,0.2))

謝謝

您正在實施公式 $$ C=S_0e^{-qT}\Pi_1-Ke^{-rT}\Pi_2 $$ 在哪裡 $$ \begin{align*} \Pi_1&=\frac{1}{2}+\frac{1}{\pi}\int_0^\infty \text{Re}\left(\frac{e^{-iu\ln(K)}\varphi_{\ln(S_T)}(u-i)}{iu\varphi_{\ln(S_T)}(-i)}\right)\text{d}u,\ \Pi_2&=\frac{1}{2}+\frac{1}{\pi}\int_0^\infty \text{Re}\left(\frac{e^{-iu\ln(K)}\varphi_{\ln(S_T)}(u)}{iu}\right)\text{d}u. \end{align*} $$

關於您的程式碼的幾句話。您不應該輸出特徵函式的實部,而是輸出複值。也就是說,你需要return w而不是return w.real. 此外,您定義var但不使用它。

如果我執行以下程式碼,我會得到 89.99999999990168 作為選項值。這個有道理,期權這麼深ITM,它的價值本質上是 $ S_0e^{-qT}-Ke^{-rT}\approx90 $

import numpy as np
from scipy import stats, special, integrate

def char_func(x,s,vol,t=1,r=0):
   mean = np.log(s) + (r - 0.5*vol*vol) * t
   var = vol*vol*t
   w = np.exp(1j*x*mean - x*x*var*0.5)
   return w

def call_value(s,k,vol,t=1,r=0):
   def integrand(x,s,k,vol,t=1,r=0):
       I = np.exp(-1j*x*np.log(k)) * char_func(x-1j,s,vol,t,r)/(1j*x*char_func(-1j,s,vol,t,r))
       return I.real

   def integrand2(x,s,k,vol,t=1,r=0):
       I = np.exp(-1j*x*np.log(k)) * char_func(x,s,vol,t,r)/(1j*x)
       return I.real

   int1 = integrate.quad(integrand,0,np.inf,args=(s,k,vol,t,r))
   int1 = 0.5 + int1[0]/np.pi

   int2 = integrate.quad(integrand2,0,np.inf,args=(s,k,vol,t,r))
   int2 = 0.5 + int2[0]/np.pi
   
   return s*int1 - np.exp(-r*t)*k*int2

print(call_value(100,10,0.2))

注意:您使用的期權定價公式非常簡單。它是最早發現的傅里葉方法之一。試試類似的東西 $$ \begin{align} c(S_0;K,T) &= c^\mathrm{BS}(S_0;K,T) +\frac{\sqrt{K}e^{-rT}}{\pi}\int_0^\infty \frac{\text{Re}\left( e^{-iku} \left(\varphi_T^\mathrm{BS}(u-0.5i)-\varphi_T(u-0.5i) \right)\right)}{{u^2+0.25}}\mathrm{d}u, \end{align} $$ 在哪裡 $ c^\mathrm{BS} $ 是布萊克斯科爾斯期權價格和 $ \varphi_T^\text{BS} $ 對應的對數正態特徵函式。該公式使用控制變數並沿不同的輪廓積分。

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