Ошибка операндов 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

0 ответов

Другие вопросы по тегам