首页 > 解决方案 > 使用 Python 进行财务分析 - 返回值错误

问题描述

我正在寻找使用 python 分析财务数据。我正在使用以下函数,但我继续遇到值错误,我无法弄清楚如何修复错误

该函数的预期结果是创建 5000 个投资组合,其中选定的代码在每个资产中随机加权以构建投资组合。然后下一个函数('optimal_portfolio')将优化这些结果,然后我将绘制有效边界。

这是功能:

def return_portfolios(expected_returns, cov_matrix):
np.random.seed(1)
port_returns = []
port_volatility = []
stock_weights = []

selected = (expected_returns.axes)[0]
#this specifies the number of random portfolios generated  
num_assets = len(selected) 
num_portfolios = 5000

for single_portfolio in range(num_portfolios):
weights = np.random.random(num_assets)
weights /= np.sum(weights)
returns = np.dot(weights, expected_returns)
volatility = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
port_returns.append(returns)
port_volatility.append(volatility)
stock_weights.append(weights)

portfolio = {'Returns': port_returns,
             'Volatility': port_volatility}

for counter,symbol in enumerate(selected):
portfolio[symbol +' Weight'] = [Weight[counter] for Weight in stock_weights]

df = pd.DataFrame(portfolio)

column_order = ['Returns', 'Volatility'] + [stock+' Weight' for stock in selected]

df = df[column_order]

return df


def optimal_portfolio(returns):
n = returns.shape[1]
returns = np.transpose(returns.values)

N = 10
mus = [10**(5.0 * t/N - 1.0) for t in range(N)]

# Convert to cvxopt matrices
S = opt.matrix(np.cov(returns))
pbar = opt.matrix(np.mean(returns, axis=1))

# Create constraint matrices
G = -opt.matrix(np.eye(n))   # negative n x n identity matrix
h = opt.matrix(0.0, (n ,1))
A = opt.matrix(1.0, (1, n))
b = opt.matrix(1.0)

# Calculate efficient frontier weights using quadratic programming
portfolios = [solvers.qp(mu*S, -pbar, G, h, A, b)['x'] for mu in mus]

## CALCULATE RISKS AND RETURNS FOR FRONTIER
returns = [blas.dot(pbar, x) for x in portfolios]
risks = [np.sqrt(blas.dot(x, S*x)) for x in portfolios]
## CALCULATE THE 2ND DEGREE POLYNOMIAL OF THE FRONTIER CURVE
m1 = np.polyfit(returns, risks, 2)
x1 = np.sqrt(m1[2] / m1[0])
# CALCULATE THE OPTIMAL PORTFOLIO
wt = solvers.qp(opt.matrix(x1 * S), -pbar, G, h, A, b)['x']
return np.asarray(wt), returns, risks 

这是我打电话时遇到的错误weights, returns, risks = optimal_portfolio(stock_data_daily_returns[1:])

  pcost       dcost       gap    pres   dres
   0:      nan      nan  nan    nan    nan
  ---------------------------------------------------------------------------
  ValueError                                Traceback (most recent call last)
  <ipython-input-32-9ec61d3ea2bf> in <module>
  ----> 1 weights, returns, risks = optimal_portfolio(stock_data_daily_returns[1:])

  <ipython-input-29-2a6004abd0c3> in optimal_portfolio(returns)
    17 
    18     # Calculate efficient frontier weights using quadratic programming
  ---> 19     portfolios = [solvers.qp(mu*S, -pbar, G, h, A, b)['x'] for mu in mus]
    20 
    21     ## CALCULATE RISKS AND RETURNS FOR FRONTIER

     <ipython-input-29-2a6004abd0c3> in <listcomp>(.0)
    17 
    18     # Calculate efficient frontier weights using quadratic programming
  ---> 19     portfolios = [solvers.qp(mu*S, -pbar, G, h, A, b)['x'] for mu in mus]
    20 
    21     ## CALCULATE RISKS AND RETURNS FOR FRONTIER

  c:\users\tylev\appdata\local\programs\python\python39\lib\site-packages\cvxopt\coneprog.py in qp(P,    q, G, h, A, b, solver, kktsolver, initvals, **kwargs)
    4483             'residual as dual infeasibility certificate': dinfres}
    4484 
 -> 4485     return coneqp(P, q, G, h, None, A,  b, initvals, kktsolver = kktsolver, options = options)

    c:\users\tylev\appdata\local\programs\python\python39\lib\site-packages\cvxopt\coneprog.py in coneqp(P, q, G, h, dims, A, b, initvals, kktsolver, xnewcopy, xdot, xaxpy, xscal, ynewcopy, ydot, yaxpy, yscal, **kwargs)
    2241         # lmbdasq = lambda o lambda.
    2242 
 -> 2243         if iters == 0:  W = misc.compute_scaling(s, z, lmbda, dims)
    2244         misc.ssqr(lmbdasq, lmbda, dims)
    2245 

    c:\users\tylev\appdata\local\programs\python\python39\lib\site-packages\cvxopt\misc.py in       compute_scaling(s, z, lmbda, dims, mnl)
    283 
    284     m = dims['l']
--> 285     W['d'] = base.sqrt( base.div( s[mnl:mnl+m], z[mnl:mnl+m] ))
    286     W['di'] = W['d']**-1
    287     lmbda[mnl:mnl+m] = base.sqrt( base.mul( s[mnl:mnl+m], z[mnl:mnl+m] ) )

    ValueError: domain error

如果有人能给我一些建议,我会非常感激,因为我尝试的任何方法似乎都无法解决它

标签: pythonfinancevalueerror

解决方案


您在此行发布的回溯指向:

portfolios = [solvers.qp(mu*S, -pbar, G, h, A, b)['x'] for mu in mus]

这显然使用了一些二次规划求解器。

此循环中的一个调用导致库在此行失败:

--> 285     W['d'] = base.sqrt( base.div( s[mnl:mnl+m], z[mnl:mnl+m] ))

最有可能引发的原因是该函数试图取负数domain error的平方根。

我将首先检查所有输入solvers.qp()并确保它们(数学)有意义。


推荐阅读