ORIGINAL FEHLER GEFUNDEN ->from CyBlack.CyBlack import CyBlack
dann pass *numpy_value
als Eingänge. Ein neues Problem ist entstanden, indem ein neuer Beitrag dafür erstellt wird. Cython program with numpy arrays does not allow vectorized inputs (only accepts length 1 arrays), how to fix?Cython kompilierte Modul erlaubt keinen Zugriff auf die Funktion definiert "Modul" nicht aufrufbar
Ich bin neu bei Cython und habe versucht, die Black (Black Scholes ohne eine Aktiendividende) von Python nach Cython zu konvertieren. Nachdem ich es kompiliert habe, kann ich die Funktion nicht benutzen. Ich bin mir sicher, dass jemand mit mehr Erfahrung dies leicht sehen und herausfinden kann warum. Der Fehler ich nach dem Kompilieren und dem Import die Funktion from CyBlack import CyBlack
und CyBlack(BlackPnL, Black_S, Black_Texpiry, Black_strike, Black_volatility, Black_IR, Black_callput)
Aufruf ist TypeError: 'module' object is not callable
: So, hier ist der Code:
from numpy cimport ndarray
cimport numpy as np
cimport cython
cdef extern from "math.h":
double exp(double)
double sqrt(double)
double pow(double)
double log(double)
double erf(double)
cdef double std_norm_cdf(double x):
return 0.5*(1+erf(x/sqrt(2.0)))
@cython.boundscheck(False)
cdef CyBlack(ndarray[np.float64_t, ndim=1] BlackPnL, ndarray[np.float64_t, ndim=1] Black_S, ndarray[np.float64_t, ndim=1] Black_Texpiry, ndarray[np.float64_t, ndim=1] Black_strike, ndarray [np.float64_t, ndim=1] Black_volatility, ndarray[np.float64_t, ndim=1] Black_IR, ndarray[np.float64_t, ndim=1] Black_callput):
cdef Py_ssize_t i
cdef Py_ssize_t N = BlackPnL.shape[0]
cdef double d1, d2
for i in range(N):
d1 = ((log(Black_S[i]/Black_strike[i]) + Black_Texpiry[i] * Black_volatility[i] **2/2))/(Black_volatility[i] * sqrt(Black_Texpiry[i]))
d2 = d1 - Black_volatility[i] * sqrt(Black_Texpiry[i])
BlackPnL[i] = exp(-Black_IR[i] * Black_Texpiry[i]) * (Black_callput[i] * Black_S[i] * std_norm_cdf(Black_callput[i] * d1) - Black_callput[i] * Black_strike[i] * std_norm_cdf(Black_callput[i] * d2))
return BlackPnL
Vielen Dank für jede Hilfe hier! Ich kann gefälschte Python-Daten posten, wenn Sie etwas zum Testen benötigen - obwohl das Aufrufen von Daten den Fehler aufdeckt ... Etwas deutet darauf hin, dass die Variablen nicht von C-Code Python ausgesetzt sind.
Hinzufügen meiner setup.py
hier, damit andere diese Typisierung erstellen können: python setup.py build_ext --inplace
mit VS2015 für Python 3.5 64bit Windows gebaut.
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize("CyBlack.pyx"), include_dirs =["C://Program Files (x86)//Microsoft Visual Studio 14.0//VC//include", "C://Program Files (x86)//Windows Kits//10//Include//10.0.1.0240.0//ucrt", "C://Program Files (x86)//Microsoft Visual Studio 14.0//VC//lib//amd64", "C://Anaconda3//Lib//site-packages//numpy//core//include", "C://Program Files (x86)//Microsoft Visual Studio 14.0//VC//lib//amd64"])
Es klingt, als ob dieses 'CyBlack'-Modul tatsächlich in ein' CyBlack'-Paket eingebettet sein könnte. Ihre 'CyBlack'-Funktion wird anstelle von cpdef 'angegeben, so dass sie durch keinen Python-Import zugänglich ist. – user2357112
Ich cpdef es und immer noch das gleiche Problem ... – Matt
Könnten Sie das Ergebnis von 'von CyBlack import CyBlack; Drucken (CyBlack .__ Datei __) '? Dies sollte den Pfad zu dem Modul ausgeben, das den Fehler verursacht. –