Как найти TypeError, если позиция не указана?

Я тестирую некоторые фрагменты кода, которые я нашел, но у меня возникли проблемы с определением ошибки.

Код:

import datetime as dt
from datetime import date
import pandas as pd
import pandas_datareader.data as web
import numpy as np
import time
import math
import scipy.optimize as optimize


start = dt.datetime(2016,12,1)
end = dt.datetime(2020,12,1)


tick = ['GOOG', 'AAPL', 'AMZN']


#pandas dataframe
data = web.DataReader(tick, 'yahoo', start, end)['Adj Close']
data = np.log(data/data.shift(1))


def sharpetest(wts, returns):
  weights = np.array(wts)
  port_return = np.sum(returns.mean() * weights) * 252
  port_vol = np.sqrt(np.dot(weights.T, np.dot(returns.cov() * 252, weights)))
  sharpe = port_return/port_vol
  sharpe = np.array(sharpe)
  return sharpe
  

num_assets = len(tick)

constraints = ({'type' : 'eq', 'fun': lambda x: np.sum(x) -1})
bounds = tuple((0,1) for x in range(num_assets))
args = (num_assets * [1./num_assets,], data)


optimal_sharpe=optimize.minimize(sharpetest,
                               args,
                               method = 'SLSQP',
                               bounds = bounds,
                               constraints = constraints)
print(optimal_sharpe)

Выход:

   /usr/local/lib/python3.9/site-packages/numpy/core/_asarray.py:83:
   VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list- 
   or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If 
   you meant to do this, you must specify 'dtype=object' when creating the ndarray
   return array(a, dtype, copy=False, order=order)
   TypeError: float() argument must be a string or a number, not 'list'

Как видите, строка, где TypeError не указана. Как найти ошибку?

Прошу прощения за такой элементарный вопрос.

Многие проблемы с этими функциями optimize возникают из-за недостаточного внимания к документации. Аргументы minimize должны быть в форме: (fun, x0, args=(), method=None,...).

hpaulj 26.12.2020 17:31

Ошибки предоставляют трассировку, а предупреждения — нет.

hpaulj 26.12.2020 17:32
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка типа исходила от применения функции sharpetest. Это происходит от объединения веса с данными. Вот пример того, как исправить код.

constraints = ({'type' : 'eq', 'fun': lambda x: np.sum(x) -1})
bounds = tuple((0,1) for x in range(num_assets))
x0 = num_assets * [1./num_assets,]
args =  (data)

print(sharpetest(num_assets * [1./num_assets,], data))

optimal_sharpe=optimize.minimize(sharpetest,
                               x0,
                               args,
                               method = 'SLSQP',
                               bounds = bounds,
                               constraints = constraints)
print(optimal_sharpe)

Вы можете видеть, что x0 разбивается на собственный аргумент, а затем дополнительные данные (доходность акций) передаются в качестве аргументов. Очень интересный у вас пример!

Результат, который я получаю,

     fun: array(0.79108107)
     jac: array([-7.45058060e-09,  7.86704488e-01,  7.25132324e-01])
 message: 'Optimization terminated successfully'
    nfev: 12
     nit: 3
    njev: 3
  status: 0
 success: True
       x: array([1.00000000e+00, 1.38777878e-16, 0.00000000e+00])

должно ли это быть args=(data,), кортеж?

hpaulj 26.12.2020 13:47

Да, в вашем случае это должен быть кортеж только одного значения. (данные) — это кортеж, так что это (), так (данные, None), так и (данные, None, None, «a») и т. д. Взгляните на определение кортежа docs. python.org/3.3/library/stdtypes.html?highlight=tuple#tu‌​ple.

Paul Brennan 26.12.2020 13:54
(data) не является кортежем, если только data сам по себе не является кортежем. Для кортежей с одним элементом требуется запятая.
hpaulj 26.12.2020 17:19

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