如何转换最初使用sympy.统计使用sympy.stats?

2024-10-03 02:44:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我没有跟上形势的变化。我在看下面的Black-Scholes公式:https://aaronschlegel.me/black-scholes-formula-python.html。似乎有一些重构是在SymPy中完成的,所以这不再有效。如何更改以下内容以使其再次工作:

import sympy as sy
import sympy.statistics as systats

def euro_put_sym(S, K, T, r, sigma):        
    #S: spot price
    #K: strike price
    #T: time to maturity
    #r: interest rate
    #sigma: volatility of underlying asset

    N = systats.Normal(0.0, 1.0)

    d1 = (sy.ln(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * sy.sqrt(T))
    d2 = (sy.ln(S / K) + (r - 0.5 * sigma ** 2) * T) / (sigma * sy.sqrt(T))

    put = (K * sy.exp(-r * T) * N.cdf(-d2) - S * N.cdf(-d1))

    return put

The errors I get are:

No name 'statistics' in module 'sympy'

Unable to import 'sympy.statistics'

特别是,Normalcdf现在该怎么做?你知道吗


Tags: toimportputassqrtpricesigmad1
2条回答

我认为这是从旧的统计数据包到新的统计数据包的正确转换。你们怎么看?你知道吗

import sympy as sy
import sympy.stats as systats

def euro_put_sym(S, K, T, r, sigma):        
    #S: spot price
    #K: strike price
    #T: time to maturity
    #r: interest rate
    #sigma: volatility of underlying asset

    N = systats.Normal('x', 0.0, 1.0)

    d1 = (sy.ln(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * sy.sqrt(T))
    d2 = (sy.ln(S / K) + (r - 0.5 * sigma ** 2) * T) / (sigma * sy.sqrt(T))

    put = (K * sy.exp(-r * T) * systats.cdf(N)(-d2) - S * systats.cdf(N)(-d1))

    return put

symphy中的统计模块名为stats。 另外,Normal接受3个参数。下面是一个简单的使用示例:

>>> from sympy import symbols

>>> from sympy.stats import Normal, density, cdf

>>> x, mu, sigma = symbols("x mu sigma")

>>> N = Normal("N", mu, sigma)

>>> density(N)(x)

sqrt(2)*exp(-(-mu + x)**2/(2*sigma**2))/(2*sqrt(pi)*sigma)

>>> cdf(N)(x)

erf(sqrt(2)*(-mu + x)/(2*sigma))/2 + 1/2

如需进一步参考,请参阅Sympy Stats docsNormal Distribution docs。你知道吗

对于你的情况,让我来解释一下你应该做什么。你知道吗

import sympy as sy
import sympy.stats as systats

def euro_put_sym(S, K, T, r, sigma):        
    #S: spot price
    #K: strike price
    #T: time to maturity
    #r: interest rate
    #sigma: volatility of underlying asset

    N = systats.Normal('N', 0.0, 1.0)

    d1 = (sy.ln(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * sy.sqrt(T))
    d2 = (sy.ln(S / K) + (r - 0.5 * sigma ** 2) * T) / (sigma * sy.sqrt(T))

    put = (K * sy.exp(-r * T) * systats.cdf(N)(-d2) - S * systats.cdf(N)(-d1))

    return put

现在

S, K, T, r, sigma = sy.symbols("S K T r sigma")
sy.pprint(euro_put_sym(S, K, T, r, sigma), use_unicode=False)

输出为

  /       /      ___ /  /             2\      /S\\\\           /       /      
  |       |0.5*\/ 2 *|T*\r - 0.5*sigma / + log|-||||           |       |0.5*\/
  |       |          \                        \K//||           |       |      
  |    erf|                   -||           |    erf|   
  |       |                ___                    ||           |       |      
  |1      \              \/ T *sigma              /|  -T*r     |1      \      
K*|- -                       |*e     - S*|- -      
  \2                        2                      /           \2             

___ /  /             2\      /S\\\\
 2 *|T*\r + 0.5*sigma / + log|-||||
    \                        \K//||
                -||
          ___                    ||
        \/ T *sigma              /|
                 |
           2                      /

这是预期产出吗?你知道吗

我通过您提供的链接中的示例进行了测试,结果是匹配的。你知道吗

>>> euro_put_sym(50, 100, 1, 0.05, 0.25)
-25*erf(1.22379436111989*sqrt(2)) + 22.5614712250357 + 47.5614712250357*erf(1.34879436111989*sqrt(2))

相关问题 更多 >