【发布时间】:2017-10-12 00:13:56
【问题描述】:
我创建了一组相互调用价格选项的函数。其中一个函数运行了一段时间以优化一些参数(使用 Nelder Mead)。在这个函数中,计算了一个值,我想在其他一些函数中使用它,但我不想通过 return 语句将它传递出去。我认为使用 global var 会很完美。
现在,奇怪的部分是:当我通过 import * 加载作为包编写的函数时,我无法访问该函数创建的全局变量。如果我使用带有函数定义的脚本,运行它以在我的 Python 控制台中定义函数,然后调用函数,则全局 var 构造工作正常。可能是什么问题,为什么我将函数加载/定义为包还是“手动”会有所不同?
作为包加载时出错:NameError: name 'h_out' is not defined。
global h_out
h_out=None
import hngoption
prices = timeseries[data.Date[i]:].head(30)
output = hngoption.params(prices)
params() calls function LogLike() as part of its computations which contains:
def LogLike(B, r):
# (...)
for i in range(N - 3, -1, -1):
h[i] = B[0] + B[2] * h[i + 1] + B[1] * pow(Z[i + 1] - B[3] * sqrt(h[i + 1]), 2)
Z[i] = (ret[i] - r - B[4] * h[i]) / (h[i] ** 0.5)
L[i] = -log(h[i]+ 0.000000000000001) - (ret[i] ** 2) / h[i]
LogL = VecSum(L)
global h_out #IMPORTANT PART
h_out = h[0]
if ((B[0] < 0) | (B[1] < 0) | (B[2] < 0) | (B[3] < 0) | (B[4] < 0)): # (B[2]+B[1]*pow(B[3],2)>=1))
return 1e50
else:
return -LogL # Minimize -Log-Like(Beta)
完整的LogLike函数:
def LogLike(B, r):
N = len(timeseries) #timeseries is a global var
# Calculate S&P500 returns
ret = [0.0] * (N - 1)
for i in range(0, N - 1):
ret[i] = (log(timeseries.ix[i] / timeseries.ix[i + 1]))
Variance = VecVar(ret)
h = [0 * i for i in range(N - 1)]
Z = [0 * i for i in range(N - 1)]
L = [0 * i for i in range(N - 1)]
# Construct GARCH(1,1) process by working back in time
h[N - 2] = Variance
Z[N - 2] = (ret[N - 2] - r - B[4] * h[N - 2]) / h[N - 2] ** 0.5
L[N - 2] = -log(h[N - 2]) - (ret[N - 2] ** 2) / h[N - 2]
for i in range(N - 3, -1, -1):
h[i] = B[0] + B[2] * h[i + 1] + B[1] * pow(Z[i + 1] - B[3] * sqrt(h[i + 1]), 2)
Z[i] = (ret[i] - r - B[4] * h[i]) / (h[i] ** 0.5)
L[i] = -log(h[i]+ 0.000000000000001) - (ret[i] ** 2) / h[i]
LogL = VecSum(L)
global h_out #IMPORTANT PART
h_out = h[0]
if ((B[0] < 0) | (B[1] < 0) | (B[2] < 0) | (B[3] < 0) | (B[4] < 0)): # (B[2]+B[1]*pow(B[3],2)>=1))
return 1e50
else:
return -LogL # Minimize -Log-Like(Beta)
【问题讨论】:
-
请不要在截图中给出代码。相反,将代码发布在问题本身中,最好是构成minimal reproducible example的代码。
-
您还应该解释为什么您不想使用 return,因为这是从函数返回数据的明显方式。
-
主要是因为 NelderMead 调用此函数并从返回值中传递另一个参数会使相互调用的函数链变得非常复杂。
-
使用
return不要使用全局状态。
标签: python python-3.x function global-variables