Ошибка операндов Python
В настоящее время я пытаюсь реализовать код портфеля Mean-Variance, который я нашел в Интернете, используя Python.
Код работает при использовании 5 акций, но при попытке использовать 27 акций я получаю сообщение об ошибке.
Код является:
# import needed modules
import quandl
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# get adjusted closing prices of 26 selected companies with Quandl
quandl.ApiConfig.api_key = 'ocNz3BaWqdCSME-h72s8'
selected = ['ACN', 'ALXN', 'AMP', 'AMZN', 'AWK',
'BA', 'BBT', 'BX', 'COST', 'EPD',
'EQIX', 'GLW', 'HCA', 'JNJ', 'LAZ',
'MA', 'MHK', 'MPC', 'PG', 'PPG',
'RCL', 'ROP', 'SBUX', 'TSN', 'ULTI',
'VOO', 'XYL']
data = quandl.get_table('WIKI/PRICES', ticker = selected,
qopts = { 'columns': ['date', 'ticker',
'adj_close'] },
date = { 'gte': '2017-1-1', 'lte': '2017-12-31' },
paginate=True)
# reorganise data pulled by setting date as index with
# columns of tickers and their corresponding adjusted prices
clean = data.set_index('date')
table = clean.pivot(columns='ticker')
# calculate daily and annual returns of the stocks
returns_daily = table.pct_change()
returns_annual = returns_daily.mean() * 250
# get daily and covariance of returns of the stock
cov_daily = returns_daily.cov()
cov_annual = cov_daily * 250
# empty lists to store returns, volatility and weights of imaginary
portfolios
port_returns = []
port_volatility = []
stock_weights = []
# set the number of combinations for imaginary portfolios
num_assets = len(selected)
num_portfolios = 50000
# populate the empty lists with each portfolios returns,risk and
weights
for single_portfolio in range(num_portfolios):
weights = np.random.random(num_assets)
weights /= np.sum(weights)
returns = np.sum(weights * returns_annual)
volatility = np.sqrt(np.dot(weights.T, np.dot(cov_annual,
weights)))
port_returns.append(returns)
port_volatility.append(volatility)
stock_weights.append(weights)
После этой последней строки ^^^
Я получаю сообщение об ошибке:
ValueError Traceback (most recent call
last)
<ipython-input-9-31fffb7e5489> in <module>()
3 weights = np.random.random(num_assets)
4 weights /= np.sum(weights)
5 returns = np.sum(weights * returns_annual)
6 volatility = np.sqrt(np.dot(weights.T, np.dot(cov_annual,
weights)))
7 port_returns.append(returns)
/anaconda3/lib/python3.6/site-packages/pandas/core/ops.py in
wrapper(left, right, name, na_op)
719 lvalues = lvalues.values
720
721 result = wrap_results(safe_na_op(lvalues, rvalues))
722 return construct_result(
723 left,
/anaconda3/lib/python3.6/site-packages/pandas/core/ops.py in
safe_na_op(lvalues, rvalues)
680 try:
681 with np.errstate(all='ignore'):
682 return na_op(lvalues, rvalues)
683 except Exception:
684 if isinstance(rvalues, ABCSeries):
/anaconda3/lib/python3.6/site-packages/pandas/core/ops.py in na_op(x,
y)
656 try:
657 result = expressions.evaluate(op, str_rep, x, y,
658 raise_on_error=True,
**eval_kwargs)
659 except TypeError:
660 if isinstance(y, (np.ndarray, ABCSeries,
pd.Index)):
/anaconda3/lib/python3.6/site-
packages/pandas/core/computation/expressions.py in evaluate(op, op_str,
a, b, raise_on_error, use_numexpr, **eval_kwargs)
209 if use_numexpr:
210 return _evaluate(op, op_str, a, b,
raise_on_error=raise_on_error,
211 **eval_kwargs)
212 return _evaluate_standard(op, op_str, a, b,
raise_on_error=raise_on_error)
213
/anaconda3/lib/python3.6/site-
packages/pandas/core/computation/expressions.py in
_evaluate_numexpr(op, op_str, a, b, raise_on_error, truediv, reversed,
**eval_kwargs)
120
121 if result is None:
122 result = _evaluate_standard(op, op_str, a, b,
raise_on_error)
123
124 return result
/anaconda3/lib/python3.6/site-
packages/pandas/core/computation/expressions.py in
_evaluate_standard(op, op_str, a, b, raise_on_error, **eval_kwargs)
62 _store_test_result(False)
63 with np.errstate(all='ignore'):
64 return op(a, b)
65
66
ValueError: operands could not be broadcast together with shapes (24,)
(27,)
Если я использую только 5 акций в 6-й строке кода вверху, я не получаю эту ошибку и могу продолжить.
Если кто-нибудь знает, как решить эту проблему, я был бы очень признателен. Спасибо!
Прилагается ссылка на веб-сайт, на котором был найден код: https://medium.com/python-data/efficient-frontier-portfolio-optimization-with-python-part-2-2-2fe23413ad94