Cython: TypeError: an integer is required
Cython: TypeError: an integer is required
I 运行 Anaconda 2.1.0 与 Python 2.7.8 和 Cython 0.2.1。
在文件 Implied_Vola.pyx 中我定义了
def Implied_Vola(underlyingPrice,strikePrice,interestRate,daysToExpiration,price,optiontype):
underlyingPrice = float(underlyingPrice)
strikePrice = float(strikePrice)
interestRate = float(interestRate) / 100
daysToExpiration = float(daysToExpiration) / 365
price = round(float(price), 6)
implied_Volatility = calc_implied_volatility(underlyingPrice,strikePrice,interestRate,daysToExpiration, price, optiontype)
return implied_Volatility
和
cdef float calc_implied_volatility(float underlyingPrice, float strikePrice, float interestRate, float daysToExpiration, float price, char optiontype):
'''Returns the estimated implied volatility'''
cdef float target, high, low, mid, volatility, estimate
cdef int decimals
target = price
high=500.0
low=0.0
decimals = len(str(target).split('.')[1]) # Count decimals
for i in range(10000): # To avoid infinite loops
mid = (high + low) / 2
if mid < 0.00001:
mid = 0.00001
if optiontype=='Call':
volatility=mid
estimate = callPrice(underlyingPrice,strikePrice,interestRate,daysToExpiration, volatility)
if optiontype=='Put':
volatility=mid
estimate = putPrice(underlyingPrice,strikePrice,interestRate,daysToExpiration, volatility)
if round(estimate, decimals) == target:
break
elif estimate > target:
high = mid
elif estimate < target:
low = mid
return mid
当我通过
编译并运行它时
import Implied_Vola
underlyingPrice=5047
strikePrice=4600
interestRate=3
daysToExpiration=218
price=724.5
optiontype='Call'
start=time.time()
vola= Implied_Vola.Implied_Vola(underlyingPrice,strikePrice,interestRate,daysToExpiration,price,optiontype)
end=time.time()
我得到 "TypeError: an integer is required." 它在
时被抛出
implied_Volatility = calc_implied_volatility(underlyingPrice,strikePrice,interestRate,daysToExpiration, price, optiontype)
被称为
这是为什么?我找不到任何错误。
这是 optiontype
参数。奇怪的是,Cython char
类型需要一个整数。您应该将 cython 类型更改为 str
或 char*
,或者从 python.
传递 ord(string[0])
小例子:
# file: cdef.pyx
cpdef f(char c):
print c
然后,在 python shell:
>>> import pyximport; pyximport.install(); import cdef
>>> cdef.f('hello')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "cdef.pyx", line 1, in cdef.f (.../cdef.c:598)
cpdef f(char c):
TypeError: an integer is required
>>> cdef.f('h')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "cdef.pyx", line 1, in cdef.f (.../cdef.c:598)
cpdef f(char c):
TypeError: an integer is required
>>> cdef.f(5)
5
I 运行 Anaconda 2.1.0 与 Python 2.7.8 和 Cython 0.2.1。 在文件 Implied_Vola.pyx 中我定义了
def Implied_Vola(underlyingPrice,strikePrice,interestRate,daysToExpiration,price,optiontype):
underlyingPrice = float(underlyingPrice)
strikePrice = float(strikePrice)
interestRate = float(interestRate) / 100
daysToExpiration = float(daysToExpiration) / 365
price = round(float(price), 6)
implied_Volatility = calc_implied_volatility(underlyingPrice,strikePrice,interestRate,daysToExpiration, price, optiontype)
return implied_Volatility
和
cdef float calc_implied_volatility(float underlyingPrice, float strikePrice, float interestRate, float daysToExpiration, float price, char optiontype):
'''Returns the estimated implied volatility'''
cdef float target, high, low, mid, volatility, estimate
cdef int decimals
target = price
high=500.0
low=0.0
decimals = len(str(target).split('.')[1]) # Count decimals
for i in range(10000): # To avoid infinite loops
mid = (high + low) / 2
if mid < 0.00001:
mid = 0.00001
if optiontype=='Call':
volatility=mid
estimate = callPrice(underlyingPrice,strikePrice,interestRate,daysToExpiration, volatility)
if optiontype=='Put':
volatility=mid
estimate = putPrice(underlyingPrice,strikePrice,interestRate,daysToExpiration, volatility)
if round(estimate, decimals) == target:
break
elif estimate > target:
high = mid
elif estimate < target:
low = mid
return mid
当我通过
编译并运行它时import Implied_Vola
underlyingPrice=5047
strikePrice=4600
interestRate=3
daysToExpiration=218
price=724.5
optiontype='Call'
start=time.time()
vola= Implied_Vola.Implied_Vola(underlyingPrice,strikePrice,interestRate,daysToExpiration,price,optiontype)
end=time.time()
我得到 "TypeError: an integer is required." 它在
时被抛出implied_Volatility = calc_implied_volatility(underlyingPrice,strikePrice,interestRate,daysToExpiration, price, optiontype)
被称为 这是为什么?我找不到任何错误。
这是 optiontype
参数。奇怪的是,Cython char
类型需要一个整数。您应该将 cython 类型更改为 str
或 char*
,或者从 python.
ord(string[0])
小例子:
# file: cdef.pyx
cpdef f(char c):
print c
然后,在 python shell:
>>> import pyximport; pyximport.install(); import cdef
>>> cdef.f('hello')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "cdef.pyx", line 1, in cdef.f (.../cdef.c:598)
cpdef f(char c):
TypeError: an integer is required
>>> cdef.f('h')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "cdef.pyx", line 1, in cdef.f (.../cdef.c:598)
cpdef f(char c):
TypeError: an integer is required
>>> cdef.f(5)
5