sympy symbolic упрощает норму CDF PDF?

#python-3.x #statistics #sympy #symbolic-math #normal-distribution

#python-3.x #Статистика #sympy #символический-математика #нормальное распределение

Вопрос:

ищете способ просто выполнить следующее. Вычисление нескольких производных с использованием обычного cdf.

При попытке упростить я хочу, чтобы они были в терминах нормы pdf [0,1] и нормы cdf [0,1]. Как мне получить символический ответ в терминах нормы cdf norm pdf без erf.

Например, вычисление дельты должно быть упрощено до Norm.cdf (d1) см. Изображение ниже;

Delta Simp в терминах CDF

Для другого примера тета-функция должна упрощаться до функции в терминах норм pdf и cdf, см. Изображение ниже.

Theta Simp в терминах CDF и 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)))
 

Набор решений выводит это на консоль:

runfile(‘myfile’)

Дельта -> Беспорядок -0,5 sqrt(2)K exp(-r(T — t)) exp(-0,5(-sigma sqrt(T — t) ((T — t)(r sigma 2/2) log(S_t / K))/(sigma sqrt(T -t)))**2)/(sqrt(pi)S_t сигма sqrt(T — t)) erf(0,5 sqrt(2)((T — t)*(r сигма 2/2) log(S_t / K))/(сигма sqrt(T — t)))/2 1/2 0.5 sqrt(2)exp(-0,5((T — t)(r сигма ** 2/2) log(S_t /K))2/(сигма 2(T — t)))/(sqrt(pi) сигма sqrt(T- t))

Дельта -> неразрешенный беспорядок -0,5 sqrt(2) K exp(-r(T — t)) exp(-0,5(sigma sqrt (T — t) — ((T — t)(r sigma 2/2) log(S_t / K))/(sigma sqrt(T -t)))**2)/(sqrt(pi)S_t сигма sqrt(T — t)) erf(0,5 sqrt(2)((T — t)*(r сигма 2/2) log(S_t / K))/(сигма sqrt(T — t)))/2 1/2 0.5 sqrt(2)exp(-0,5((T — t)(r сигма ** 2/2) log(S_t /K))2/(сигма 2(T — t)))/(sqrt(pi) сигма sqrt(T- t))

Тета -> Еще худший беспорядок K r(erf(0.5 sqrt (2)(-sigma sqrt(T — t) ((T — t)(r sigma 2/2) log(S_t / K))/(sigma sqrt(T — t))))/2 1/2) exp(-r(T — t)) — 0,5 sqrt(2)K(-sigma /(2* sqrt(T — t)) (r сигма 2/2)/(сигма sqrt(T — t)) — ((T — t)(r сигма 2/2) log(S_t /K))/(2 сигмы (T — t)(3/2))) exp(-r(T — t)) exp(-0,5(-сигма sqrt (T — t) ((T — t)(r сигма 2/2) log(S_t /K))/(сигма sqrt(T — t)))2)/sqrt(pi) S_t(0,5 sqrt(2)(r сигма 2/2)/(сигма sqrt(T — t)) — 0,25 sqrt(2)((T- t)(r сигма 2/2) log(S_t / K))/(сигма * (T — t)(3/2))) exp(-0.5((T — t)(r сигма ** 2/2) log(S_t / K))2/(сигма2 (T — t))) /sqrt (pi)

Тета -> Еще хуже неразрешенный (-pi K r сигма (T — t)(9/2)(erf(sqrt (2)(0,5 * сигма 2 *(T — t) — 0,25 *(T — t)(2 r сигма 2) — 0,5 log(S_t / K))/(sigma sqrt(T — t))) — 1) exp((r сигма 2 *(T — t) 2 0,125((T — t)(2 r сигма **2) 2 log(S_t / K))2 0,125(2сигма 2 * (T — t) — (T — t)(2 r сигма 2) — 2 log(S_t / K))2)/(сигма 2 (T — t))) 0,25 sqrt(2) sqrt(pi) K(T — t)3(2 сигма ** 2(T — t) — (T — t)(2 r сигма **2) 2 log(S_t / K))exp((r сигма 2 *(T — t) 2 0,125((T — t)(2 * r сигма 2) 2 log(S_t /K))2)/(сигма 2(T — t))) 2 sqrt(2) sqrt(pi)S_t(T — t)3(0,125 (T — t)(2 r сигма 2) — 0,25 log(S_t / K))exp((2 r сигма 2 *(T — t) 2 0,125(2 сигма 2 *(T — t) — (T — t)(2 r сигма 2) — 2 log(S_t / K))2)/(сигма 2(T — t))))exp(-(2 r сигма ** 2(T — t) 2 0,125((T — t)(2 r сигма **2) 2 log(S_t / K))2 0,125(2 сигма 2 *(T- t) — (T — t)(2 r сигма 2) — 2 log(S_t / K))2)/(сигма 2 (T — t)))/(2 pi сигма * (T — t) **(9/2))

Ответ №1:

Избегайте использования чисел с плавающей запятой, где это возможно, поэтому лучше использовать Normal('N', 0, 1) , как я сделал для вывода ниже.

В sympy нет функции Phi для cdf нормального распределения, потому что вместо этого она выражается в терминах erf. Вы можете определить свою собственную функцию Phi, хотя:

 In [108]: phi = Function('phi')                                                                                                   

In [109]: class Phi(Function): 
     ...:     def _eval_derivative(self, x): 
     ...:         return phi(self.args[0]) * self.args[0].diff(x) 
     ...:                                                                                                                         

In [110]: bs.subs(erf, Lambda(x, 2*Phi(x*sqrt(2))-1))                                                                             
Out[110]: 
     ⎛                        ⎛     2⎞          ⎞                   ⎛        ⎛     2⎞          ⎞
     ⎜                        ⎜    σ ⎟      ⎛Sₜ⎞⎟                   ⎜        ⎜    σ ⎟      ⎛Sₜ⎞⎟
     ⎜                (T - t)⋅⎜r   ──⎟   log⎜──⎟⎟                   ⎜(T - t)⋅⎜r   ──⎟   log⎜──⎟⎟
     ⎜      _______           ⎝    2 ⎠      ⎝K ⎠⎟  -r⋅(T - t)       ⎜        ⎝    2 ⎠      ⎝K ⎠⎟
- K⋅Φ⎜- σ⋅╲╱ T - t    ──────────────────────────⎟⋅ℯ             Sₜ⋅Φ⎜──────────────────────────⎟
     ⎜                           _______        ⎟                   ⎜           _______        ⎟
     ⎝                       σ⋅╲╱ T - t         ⎠                   ⎝       σ⋅╲╱ T - t         ⎠

In [111]: bs.subs(erf, Lambda(x, 2*Phi(x*sqrt(2))-1)).diff(S)                                                                     
Out[111]: 
     ⎛                        ⎛     2⎞          ⎞                                                ⎛        ⎛     2⎞          ⎞
     ⎜                        ⎜    σ ⎟      ⎛Sₜ⎞⎟                                                ⎜        ⎜    σ ⎟      ⎛Sₜ⎞⎟
     ⎜                (T - t)⋅⎜r   ──⎟   log⎜──⎟⎟                                                ⎜(T - t)⋅⎜r   ──⎟   log⎜──⎟⎟
     ⎜      _______           ⎝    2 ⎠      ⎝K ⎠⎟  -r⋅(T - t)    ⎛        ⎛     2⎞          ⎞    ⎜        ⎝    2 ⎠      ⎝K ⎠⎟
  K⋅φ⎜- σ⋅╲╱ T - t    ──────────────────────────⎟⋅ℯ              ⎜        ⎜    σ ⎟      ⎛Sₜ⎞⎟   φ⎜──────────────────────────⎟
     ⎜                           _______        ⎟                ⎜(T - t)⋅⎜r   ──⎟   log⎜──⎟⎟    ⎜           _______        ⎟
     ⎝                       σ⋅╲╱ T - t         ⎠                ⎜        ⎝    2 ⎠      ⎝K ⎠⎟    ⎝       σ⋅╲╱ T - t         ⎠
- ───────────────────────────────────────────────────────────   Φ⎜──────────────────────────⎟   ─────────────────────────────
                                _______                          ⎜           _______        ⎟                _______         
                         Sₜ⋅σ⋅╲╱ T - t                           ⎝       σ⋅╲╱ T - t         ⎠            σ⋅╲╱ T - t