【发布时间】:2021-03-17 08:18:06
【问题描述】:
寻找一种简单的方法。计算涉及正常 cdf 的一些导数。
在尝试简化时,我希望它们以 norm pdf [0,1] 和 norm cdf [0,1] 的形式出现。如何在没有 erf 的情况下获得 norm cdf norm pdf 的符号答案。
例如,增量计算应简化为 Norm.cdf(d1) 见下图;
另一个例子,theta 函数应该简化为规范 pdf 和 cdf 的函数,参见下面的图像。
Theta Simp in Terms of CDF and PDF
以下附上代码,请告知如何获得所需的简化。
import sympy as sp
from sympy.stats import Normal, cdf
#spot, strike, volatility, time, interest rate, time at expiry, d1, and d2
S, K, sigma, t, r, T, d1, d2 = sp.symbols('S_t,K,sigma,t,r,T,d_1,d_2')
#define a symbol to represent the normal CDF
N = sp.Function('N')
#Black and Scholes price
C = S * N(d1) - N(d2) * K * sp.exp(-r * (T-t))
#expanded d1 and d2 for substitution:
d1_sub = (sp.ln(S / K) + (r + sp.Rational(1,2) * sigma ** 2) * (T-t)) / (sigma * sp.sqrt(T-t))
d2_sub = d1 - sigma * sp.sqrt(T-t)
#instance a standard normal distribution:
Norm = Normal('N',0.0, 1.0)
#define the long form b-s equation with all substitutions:
bs = C.subs(N, cdf(Norm)).subs(d2, d2_sub).subs(d1, d1_sub)
#Callable function for black and scholes price:
#example usage: bs_calc(100, 98, 0.15, 0, 0.03, 0.5)
bs_calc = sp.lambdify((S, K, sigma, t, r, T), bs)
print("Delta -> Mess")
print(sp.diff(bs,S))
print('Delta -> mess unresolved')
print(sp.simplify(sp.diff(bs,S)))
print("Theta -> Even worse Mess")
print(sp.diff(bs,T))
print('Theta -> Even Worse unresolved')
print(sp.simplify(sp.diff(bs,T)))
解决方案集将此打印到控制台:
运行文件('我的文件')
Delta -> 混乱 -0.5sqrt(2)Kexp(-r(T - t))exp(-0.5(-sigmasqrt( T - t) + ((T - t)(r + sigma2/2) + log(S_t/K))/(sigmasqrt(T - t)))** 2)/(sqrt(pi)S_tsigmasqrt(T - t)) + erf(0.5sqrt(2)((T - t)* (r + sigma2/2) + log(S_t/K))/(sigmasqrt(T - t)))/2 + 1/2 + 0.5sqrt(2) exp(-0.5((T - t)(r + sigma**2/2) + log(S_t/K))2/(sigma2 (T - t)))/(sqrt(pi)sigmasqrt(T - t))
Delta -> 混乱未解决 -0.5sqrt(2)Kexp(-r(T - t))exp(-0.5(sigmasqrt(T - t) - ((T - t)(r + sigma2/2) + log(S_t/K))/(sigmasqrt(T - t)))**2 )/(sqrt(pi)S_tsigmasqrt(T - t)) + erf(0.5sqrt(2)((T - t)*( r + sigma2/2) + log(S_t/K))/(sigmasqrt(T - t)))/2 + 1/2 + 0.5sqrt(2)exp(-0.5((T - t)(r + sigma**2/2) + log(S_t/K))2/(sigma2(T - t)))/(sqrt(pi)sigmasqrt(T - t))
Theta -> 更糟糕的混乱 Kr(erf(0.5sqrt(2)(-sigmasqrt(T - t) + ((T - t)(r + sigma2/2) + log(S_t/K))/(sigmasqrt(T - t))))/2 + 1/2)exp(-r( T - t)) - 0.5sqrt(2)K(-sigma/(2*sqrt(T - t)) + (r + sigma2/2) /(sigmasqrt(T - t)) - ((T - t)(r + sigma2/2) + log(S_t/K))/(2sigma (T - t)(3/2)))exp(-r(T - t))exp(-0.5(- sigmasqrt(T - t) + ((T - t)(r + sigma2/2) + log(S_t/K))/(sigmasqrt(T - t)))2)/sqrt(pi) + S_t(0.5sqrt(2)(r + sigma2/2)/ (sigmasqrt(T - t)) - 0.25sqrt(2)((T - t)(r + sigma2/2) + log(S_t /K))/(sigma*(T - t)(3/2)))exp(-0.5((T - t)(r + sigma** 2/2) + log(S_t/K))2/(sigma2(T - t)))/sqrt(pi)
Theta -> 更糟糕的未解决 (-piKrsigma(T - t)(9/2)(erf(sqrt(2)(0.5* sigma2*(T - t) - 0.25*(T - t)(2r + sigma2) - 0.5log(S_t/K))/ (sigmasqrt(T - t))) - 1)exp((rsigma2*(T - t)2 + 0.125((T - t)(2r + sigma**2) + 2log(S_t/K))2 + 0.125(2sigma2*(T - t) - (T - t)(2r + sigma2) - 2log(S_t /K))2)/(sigma2(T - t))) + 0.25sqrt(2)sqrt(pi)K em>(T - t)3(2sigma**2(T - t) - (T - t)(2r + sigma**2) + 2log(S_t/K))exp((rsigma2*(T - t) 2 + 0.125((T - t)(2*r + sigma2) + 2log(S_t/K))2)/(sigma2(T - t))) + 2sqrt(2)sqrt(pi)S_t(T - t) 3(0.125(T - t)(2r + sigma2) - 0.25log(S_t/K))exp ((2rsigma2*(T - t)2 + 0.125(2sigma2*( T - t) - (T - t)(2m>r + sigma2) - 2log(S_t/K))2)/(sigma2(T - t)))))exp(-(2rsigma**2(T - t)2 + 0.125((T - t) (2r + sigma**2) + 2log(S_t/K))2 + 0.125(2sigma2* (T - t) - (T - t)(2r + sigma2) - 2log(S_t/K))2)/(sigma2(T - t)))/(2pisigma*(T - t)**(9/2))
【问题讨论】:
标签: python-3.x statistics sympy symbolic-math normal-distribution