使用 NumPy 计算期权合约希腊语的 Python 脚本,没有给我任何输出或错误



我这里有一个Python脚本,它计算股票期权合同的第一阶和第二阶希腊语。在代码中,您将看到Python脚本必须选择七个不同的参数来计算值。您可以在下面的脚本中看到所需的全部七个参数。

在这里,Python脚本应该计算并打印出Delta值、Theta值、Gamma值等的相应数字

尽管每次我都试图执行脚本,如下所示:

python选项.py 1 246.35 270 0.002 0.03 14 0.4615

我收到的只是一个干净的、没有任何错误的响应,无论是在我的屏幕上还是在错误日志中,所以我都不知道出了什么问题。我试着做了一些调整,但还是一无所获。我不知道为什么我没有从中得到任何输出(或者错误(。

import numpy as np
from math import sqrt, pi,log, e
from enum import Enum
import scipy.stats as stat
from scipy.stats import norm
import time
class BSMerton:
def __init__(self, args):
self.Type = int(args[0])                # 1 for a Call, - 1 for a put
self.S = float(args[1])                 # Underlying asset price
self.K = float(args[2])                 # Option strike K
self.r = float(args[3])                 # Continuous risk fee rate
self.q = float(args[4])                 # Dividend continuous rate
self.T = float(args[5]) / 365.0         # Compute time to expiry
self.sigma = float(args[6])             # Underlying volatility
self.sigmaT = self.sigma * self.T ** 0.5# sigma*T for reusability
self.d1 = (log(self.S / self.K) + 
(self.r - self.q + 0.5 * (self.sigma ** 2)) 
* self.T) / self.sigmaT
self.d2 = self.d1 - self.sigmaT
[self.Premium] = self.premium()
[self.Delta] = self.delta()
[self.Theta] = self.theta()
[self.Rho] = self.rho()
[self.Vega] = self.vega()
[self.Gamma] = self.gamma()
[self.Phi] = self.phi()
[self.Charm] = self.dDeltadTime()
[self.Vanna] = self.dDeltadVol()
def premium(self):
tmpprem = self.Type * (self.S * e ** (-self.q * self.T) * norm.cdf(self.Type * self.d1) - 
self.K * e ** (-self.r * self.T) * norm.cdf(self.Type * self.d2))
return [tmpprem]
############################################
############ 1st order greeks ##############
############################################
def delta(self):
dfq = e ** (-self.q * self.T)
if self.Type == 1:
return [dfq * norm.cdf(self.d1)]
else:
return [dfq * (norm.cdf(self.d1) - 1)]
# Vega for 1% change in vol
def vega(self):
return [0.01 * self.S * e ** (-self.q * self.T) * 
norm.pdf(self.d1) * self.T ** 0.5]
# Theta for 1 day change
def theta(self):
df = e ** -(self.r * self.T)
dfq = e ** (-self.q * self.T)
tmptheta = (1.0 / 365.0) 
* (-0.5 * self.S * dfq * norm.pdf(self.d1) * 
self.sigma / (self.T ** 0.5) + 
self.Type * (self.q * self.S * dfq * norm.cdf(self.Type * self.d1) 
- self.r * self.K * df * norm.cdf(self.Type * self.d2)))
return [tmptheta]
def rho(self):
df = e ** -(self.r * self.T)
return [self.Type * self.K * self.T * df * 0.01 * norm.cdf(self.Type * self.d2)]
def phi(self):
return [0.01* -self.Type * self.T * self.S * 
e ** (-self.q * self.T) * norm.cdf(self.Type * self.d1)]
############################################
############ 2nd order greeks ##############
############################################
def gamma(self):
return [e ** (-self.q * self.T) * norm.pdf(self.d1) / (self.S * self.sigmaT)]
# Charm for 1 day change
def dDeltadTime(self):
dfq = e ** (-self.q * self.T)
if self.Type == 1:
return [(1.0 / 365.0) * -dfq * (norm.pdf(self.d1) * ((self.r-self.q) / (self.sigmaT) - self.d2 / (2 * self.T)) 
+ (-self.q) * norm.cdf(self.d1))]
else:
return [(1.0 / 365.0) * -dfq * (norm.pdf(self.d1) * ((self.r-self.q) / (self.sigmaT) - self.d2 / (2 * self.T)) 
+ self.q * norm.cdf(-self.d1))]
# Vanna for 1% change in vol
def dDeltadVol(self):
return [0.01 * -e ** (-self.q * self.T) * self.d2 / self.sigma * norm.pdf(self.d1)]
# Vomma
def dVegadVol(self):
return [0.01 * -e ** (-self.q * self.T) * self.d2 / self.sigma * norm.pdf(self.d1)]

如果有人能帮我,我将不胜感激!非常感谢。

如果您想从命令行将参数传递到python脚本中,我建议使用类似argparse的方法。此外,在我看来,用@classmethod生成类的实例对argparse会很有帮助/更干净。此时,当您运行脚本时,它正在等待您实例化BSMerton类。

我可以在jupyter笔记本上运行你的代码,很好。我按原样粘贴了您的代码,并将以下内容添加到一个新单元格中。

test = BSMerton([1,246.35,270,0.002,0.03,14,0.4615])
print('Premium: {}nDelta:   {}nVega:    {}'.format(test.premium()[0],test.delta()[0], test.vega()[0]))
print('Theta:   {}nRho:     {}nPhi:     {}'.format(test.theta()[0],test.rho()[0], test.phi()[0]))
print('Gamma:   {}nCharm:   {}nVanna:   {}'.format(test.gamma()[0],test.dDeltadTime()[0], test.dDeltadVol()[0]))
print('Vomma:   {}'.format(test.dVegadVol()[0]))

请注意,我在打印时使用了[0]索引值,因为您已经返回了带有所有方法的单个项目列表。如果您不想生成单个项目列表,可以删除方括号。

相关内容

最新更新