如何解决ValueError:使用序列设置数组元素无法解决
import pandas as pd
import numpy as np
import yfinance as yf
import matplotlib.pyplot as plt
from scipy.optimize import brute
class contrarian_strategy():
def __init__(self,ticker):
self.ticker=ticker
self.get_data()
#self.test_strategy()
def get_data(self):
data=yf.download(self.ticker)["Close"].to_frame()
data["returns"]=np.log(data.Close.div(data.Close.shift(1)))
self.data=data
return data
def test_strategy(self,window):
self.window=window
self.data["positions"]= -np.sign(self.data["returns"].rolling(int(window)).mean())
self.data["strategy"]= self.data["positions"]*self.data["returns"]
self.data["creturns"]=self.data["returns"].cumsum().apply(np.exp)
self.data["cstrategy"]=self.data["strategy"].cumsum().apply(np.exp)
self.results=self.data
#absolute strategy performance
perf_strat=self.data["cstrategy"].iloc[-1]
#buy and hold absolute performance
perf_buy_and_hold=self.data["creturns"].iloc[-1]
return perf_strat,perf_buy_and_hold
def plot_returns(self):
title="{}".format(self.ticker)
return self.results.plot(figsize=(15,15),title=title)
plt.show()
def optimize_results(self,windowrange):#,windowrangehigh,step):
opt=brute(self.test_strategy,[windowrange])#,step))
return opt
我应该使用 scipy 最小化而不是 brute ,因为我只想优化窗口参数???:-如果是的话,你能展示一下吗? 如果你知道,请帮助我 当我通过 tsla.optimize_results((10,50,1))method 运行此代码时,我得到:-
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
TypeError: float() argument must be a string or a number,not 'tuple'
The above exception was the direct cause of the following exception:
ValueError Traceback (most recent call last)
<ipython-input-99-31e36e1901a4> in <module>
----> 1 aapl.optimize_results((10,1))
<ipython-input-97-b3ff81b5303c> in optimize_results(self,windowrange)
34 plt.show()
35 def optimize_results(self,step):
---> 36 opt=brute(self.test_strategy,step))
37 return opt
~\anaconda3\lib\site-packages\scipy\optimize\optimize.py in brute(func,ranges,args,Ns,full_output,finish,disp,workers)
3266
3267 # run minimizer
-> 3268 res = finish(func,xmin,args=args,**finish_kwargs)
3269
3270 if isinstance(res,OptimizeResult):
~\anaconda3\lib\site-packages\scipy\optimize\optimize.py in fmin(func,x0,xtol,ftol,maxiter,maxfun,retall,callback,initial_simplex)
541 'initial_simplex': initial_simplex}
542
--> 543 res = _minimize_neldermead(func,callback=callback,**opts)
544 if full_output:
545 retlist = res['x'],res['fun'],res['nit'],res['nfev'],res['status']
~\anaconda3\lib\site-packages\scipy\optimize\optimize.py in _minimize_neldermead(func,maxfev,return_all,initial_simplex,xatol,fatol,adaptive,**unkNown_options)
687
688 for k in range(N + 1):
--> 689 fsim[k] = func(sim[k])
690
691 ind = np.argsort(fsim)
ValueError: setting an array element with a sequence.
我应该使用 scipy 最小化而不是 brute ,因为我只想优化窗口参数???:-如果是的话,你能展示一下吗? 知道的请帮帮我
解决方法
我没有使用过 brute
甚至没有看过它的文档,但我怀疑问题在于你的 func 的返回
self.test_strategy
...
return perf_strat,perf_buy_and_hold
这是一个元组。 brute
需要什么?看起来它需要一个浮点数。
fsim[k] = func(sim[k])
在随机尝试其他优化功能之前,请确保您了解该功能需要什么。这意味着阅读和必要的重读文档。确保您理解示例(如果有)。您不能作弊 - 优化器将以非常具体的方式调用您的函数,并期望返回特定类型 - 例如标量,或者可能是与输入形状匹配的数组。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。