python - 使用 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
如果有人能给我一些建议,我会非常感激,因为我尝试的任何方法似乎都无法解决它
解决方案
您在此行发布的回溯指向:
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()
并确保它们(数学)有意义。
推荐阅读
- google-kubernetes-engine - 有没有办法在 GKE 集群上启用 IPVS 代理模式?
- flutter - Flutter- GestureDetector 检测水平和垂直拖动的方向
- c - 为什么这个 fread 段错误
- python - 如何在多个缩略图上粘贴边框图像(常量)?
- bash - 在 bash 中创建的变量的内容包含一些不可见的符号,这些不是换行符
- asp.net-mvc - iis 用奇怪的模式替换 url
- python - 如何仅为 user.is_staff 制作模型属性?
- r - 如何随时间绘制平均每小时值
- r - 使用 geom_density 将高斯拟合到数据集
- amazon-web-services - 使用 PowerShell 在特定 VPC ID 下列出具有时间的快照 ID