2015-01-17 2 views
1

Я запускаю Anaconda 2.1.0 с Python 2.7.8 и Cython 0.2.1. В файле Implied_Vola.pyx я определилCython: TypeError: требуется целое число

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() 

Я получаю "Ошибка типа: требуется целое." Он выбрасывается при

implied_Volatility = calc_implied_volatility(underlyingPrice,strikePrice,interestRate,daysToExpiration, price, optiontype) 

называется Почему? Я не могу найти ошибку.

+0

аналогичный вопрос здесь: http://stackoverflow.com/questions/21985484/typeerror-integer-required-while -defining-a-function – amwinter

+1

Я бы не указал тип переменной для 'optiontype', но вы могли бы использовать' str optiontype' в вашем случае. Указание типов приносит вам больше преимуществ, когда вам приходится перебирать массивы или передавать данные на C-функции, в этом случае он вводит излишнюю сложность для вашего кода. –

ответ

1

Это параметр optiontype. Как ни странно, тип Cython char ожидает целое число. Вы должны либо изменить тип cython на str, либо char*, либо передать ord(string[0]) из python.

Небольшой пример:

# file: cdef.pyx 
cpdef f(char c): 
    print c 

Затем, в оболочке Python:

>>> 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 
Смежные вопросы