我怎么用国旗和纽比?我把函数简化到了最低限度!在
import numpy as np
price = np.array([30, 30, 20, 25, 20])
S = np.repeat(300, len(price))
flag = np.array([1, 1, 0, 1, 1])
def Val(S,price,flag = 0):
p = 4
if flag == 0: p = S + price
elif flag == 1: p = S - price
return p
Val(S,price,flag.all())
#array([270, 270, 280, 275, 280])
Val(S,price, flag.any())
#array([330, 330, 320, 325, 320])
我本以为会这样:
^{pr2}$这是另一个带有标志的等式的函数示例。我该怎么办 对它应用一个新的解决方案?在
来自http://www.espenhaug.com/black_scholes.html
def CND(X):
(a1,a2,a3,a4,a5) = (0.31938153, -0.356563782, 1.781477937, -1.821255978, 1.330274429)
L = abs(X)
K = 1.0 / (1.0 + 0.2316419 * L)
w = 1.0 - 1.0 / sqrt(2*pi)*exp(-L*L/2.) * (a1*K + a2*K*K + a3*pow(K,3) + a4*pow(K,4) + a5*pow(K,5))
if X<0: w = 1.0-w
return w
# Black Scholes Function
def BlackScholes(CallPutFlag,S,X,T,r,v):
d1 = (log(S/X)+(r+v*v/2.)*T)/(v*sqrt(T))
d2 = d1-v*sqrt(T)
if CallPutFlag=='c': return S*CND(d1)-X*exp(-r*T)*CND(d2)
else: return X*exp(-r*T)*CND(-d2)-S*CND(-d1)
我将在这里做一个假设,猜测您决定传递}作为参数,因为传递
flag.any()
和{flag
本身会在if
语句中引发以下问题:要解决此问题,请记住}是相同大小的numpy数组。numpy非常擅长在相同大小的数组上逐个元素地进行数学运算。还请注意,您在
^{pr2}$S
和{if
语句的两个分支中执行的操作完全相同:p = S * flag
,这意味着您不需要if
语句来决定要做什么:在这里,您只需要调用}对应元素的乘积。在
Val(S, flag)
并获得预期的数组。这意味着输出数组的每个元素都是S
和{您当前的代码看起来像是在尝试实现一个对单个数组元素有效的操作,并期望它应用于整个数组。这并不是numpy通常的工作方式(尽管也有写类似内容的方法)。在
当
flag.all()
的值都是真值(即非零)时,flag.all()
返回一个真实值,而当flags
包含任何个真实值时,flag.any()
返回一个真实值。一旦某个元素被证明为零,则返回False
。在在这里,您可能需要
zip
将标志和S
放在一起:总之,
^{pr2}$p
的定义如下:这显示了一种可以做到这一点的算法,尽管数学也有帮助:
这里
*
表示Hadamard乘积(相同大小的矩阵的元素乘积),与np.dot
-矩阵乘法运算相反。在在
CallPutFlag
是一个具有字符/字符串值的Python变量。所以它被用作开关。如果“c”使用一个等式;如果不是“c”(可能是“p”),则使用另一个等式。在在
^{pr2}$Val
中,flag
有两种用法:你测试它的价值,然后用它乘以它。在
if flag==0
上下文中,它必须是标量。在此上下文中使用数组会引发一个公共ValueError
。在Python
if
可以操作也可以不操作,它不能为布尔数组的每个值来回翻转。在但是对于乘法
S*flag
,flag
可以是一个大小与S
匹配的数组。在所以问题是,在},何时{}。正如所写的,目前还不清楚。在
Val
中,何时返回{=============
此列表的理解等价物为:
掩蔽法
另一种掩蔽方法
where
可能更快,除非计算替代方案很昂贵。或者如果其中一个备选方案产生了错误的值(例如S/0)。但你必须定时才能确定。在相关问题 更多 >
编程相关推荐