#python
Вопрос:
при использовании bt-библиотеки я получил следующее сообщение об ошибке:
Traceback (most recent call last): File "C:/Users/Tim/Documents/Algo Trading/Python/App/finance.py", line 534, in lt;modulegt; erc = update_card(data, 'ERC', 'daily') File "C:/Users/Tim/Documents/Algo Trading/Python/App/finance.py", line 527, in update_card res = bt.run(test) File "C:UsersTimAnaconda3libsite-packagesbtbacktest.py", line 28, in run bkt.run() File "C:UsersTimAnaconda3libsite-packagesbtbacktest.py", line 240, in run self.strategy.run() File "btcore.py", line 2101, in bt.core.Strategy.run File "btcore.py", line 2040, in bt.core.AlgoStack.__call__ File "C:UsersTimAnaconda3libsite-packagesbtalgos.py", line 1239, in __call__ tw = bt.ffn.calc_erc_weights( File "C:UsersTimAnaconda3libsite-packagesffncore.py", line 1791, in calc_erc_weights covar = sklearn.covariance.ledoit_wolf(returns)[0] File "C:UsersTimAnaconda3libsite-packagessklearncovariance_shrunk_covariance.py", line 320, in ledoit_wolf X = check_array(X) File "C:UsersTimAnaconda3libsite-packagessklearnutilsvalidation.py", line 797, in check_array raise ValueError( ValueError: Found array with 0 sample(s) (shape=(0, 2)) while a minimum of 1 is required.
Я использовал следующий код:
import yfinance as yf import bt def get_returns(ticker, start_date='2010-01-01'): # create final df df_prices = pd.DataFrame() # get price data for every stock for stock in ticker: tick = yf.Ticker(stock) # get historical market data hist = tick.history(start=start_date) df_prices[stock] = hist['Close'] df_prices[df_prices.loc[:, stock] == ""] = np.nan df_prices[stock] = df_prices[stock].fillna(method='ffill') return df_prices def update_card(data, type_portfolio, rebalance_period): if type_portfolio == "EW": weight = bt.algos.WeighEqually() elif type_portfolio == "INV": weight = bt.algos.WeighInvVol() elif type_portfolio == "MEAN": weight = bt.algos.WeighMeanVar() elif type_portfolio == "ERC": weight = bt.algos.WeighERC() else: weight = bt.algos.WeighRandomly() if rebalance_period == "daily": period = bt.algos.RunDaily() elif rebalance_period == "weekly": period = bt.algos.RunWeekly() elif rebalance_period == "monthly": period = bt.algos.RunMonthly() elif rebalance_period == "quarterly": period = bt.algos.RunQuarterly() elif rebalance_period == "yearly": period = bt.algos.RunYearly() else: period = bt.algos.RunOnce() s = bt.Strategy('s1', [period, bt.algos.SelectAll(), weight, bt.algos.Rebalance()]) test = bt.Backtest(s, data) res = bt.run(test) #print(res.stats.index) return res data = get_returns(['FB', 'AAPL']) erc = update_card(data, 'ERC', 'daily') ew = update_card(data, 'EW', 'daily')
Как я могу это исправить? Ошибка появляется только тогда, когда я вытаскиваю две или более акций, только одна акция работает нормально. Кажется, что-то происходит в библиотеке sklearn, но я не знаю, что изменить. То же самое происходит при вызове взвешивания MeanVar. Спасибо!