Exception in thread Thread-333: Traceback (most recent call last): File "/Users/jason/anaconda3/lib/python3.7/site-packages/yfinance/__init__.py", line 313, in history quotes = self._parse_quotes(data["chart"]["result"][0]) File "/Users/jason/anaconda3/lib/python3.7/site-packages/yfinance/__init__.py", line 162, in _parse_quotes timestamps = data["timestamp"] KeyError: 'timestamp' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/jason/anaconda3/lib/python3.7/threading.py", line 917, in _bootstrap_inner self.run() File "/Users/jason/anaconda3/lib/python3.7/threading.py", line 865, in run self._target(*self._args, **self._kwargs) File "/Users/jason/anaconda3/lib/python3.7/site-packages/multitasking/__init__.py", line 102, in _run_via_pool return callee(*args, **kwargs) File "/Users/jason/anaconda3/lib/python3.7/site-packages/yfinance/__init__.py", line 470, in _download_one_threaded period, interval, prepost, proxy) File "/Users/jason/anaconda3/lib/python3.7/site-packages/yfinance/__init__.py", line 483, in _download_one proxy=proxy) File "/Users/jason/anaconda3/lib/python3.7/site-packages/yfinance/__init__.py", line 316, in history raise ValueError(self.ticker, err_msg) ValueError: ('ACCP', 'No data found for this date range, symbol may be delisted')
3 Réponses :
Et ça? Pouvez-vous travailler avec ça?
# https://towardsdatascience.com/efficient-frontier-portfolio-optimisation-in-python-e7844051e7f import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import quandl import scipy.optimize np.random.seed(777) quandl.ApiConfig.api_key = 'you_resy_goes_here' stocks = ['AAPL', 'AMZN', 'MSFT', 'SBUX'] data = quandl.get_table('WIKI/PRICES', ticker = stocks, qopts = { 'columns': ['date', 'ticker', 'adj_close'] }, date = { 'gte': '2018-1-1', 'lte': '2019-12-31' }, paginate=True) data.head() data.info() df = data.set_index('date') table = df.pivot(columns='ticker') # By specifying col[1] in below list comprehension # You can select the stock names under multi-level column table.columns = [col[1] for col in table.columns] table.head() plt.figure(figsize=(14, 7)) for c in table.columns.values: plt.plot(table.index, table[c], lw=3, alpha=0.8,label=c) plt.legend(loc='upper left', fontsize=12) plt.ylabel('price in $') returns = table.pct_change() plt.figure(figsize=(14, 7)) for c in returns.columns.values: plt.plot(returns.index, returns[c], lw=3, alpha=0.8,label=c) plt.legend(loc='upper right', fontsize=12) plt.ylabel('daily returns') ################################################### def portfolio_annualised_performance(weights, mean_returns, cov_matrix): returns = np.sum(mean_returns*weights ) *252 std = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights))) * np.sqrt(252) return std, returns def random_portfolios(num_portfolios, mean_returns, cov_matrix, risk_free_rate): results = np.zeros((3,num_portfolios)) weights_record = [] for i in range(num_portfolios): weights = np.random.random(4) weights /= np.sum(weights) weights_record.append(weights) portfolio_std_dev, portfolio_return = portfolio_annualised_performance(weights, mean_returns, cov_matrix) results[0,i] = portfolio_std_dev results[1,i] = portfolio_return results[2,i] = (portfolio_return - risk_free_rate) / portfolio_std_dev return results, weights_record returns = table.pct_change() mean_returns = returns.mean() cov_matrix = returns.cov() num_portfolios = 25000 risk_free_rate = 0.0178 ################################################### def display_simulated_ef_with_random(mean_returns, cov_matrix, num_portfolios, risk_free_rate): results, weights = random_portfolios(num_portfolios,mean_returns, cov_matrix, risk_free_rate) max_sharpe_idx = np.argmax(results[2]) sdp, rp = results[0,max_sharpe_idx], results[1,max_sharpe_idx] max_sharpe_allocation = pd.DataFrame(weights[max_sharpe_idx],index=table.columns,columns=['allocation']) max_sharpe_allocation.allocation = [round(i*100,2)for i in max_sharpe_allocation.allocation] max_sharpe_allocation = max_sharpe_allocation.T min_vol_idx = np.argmin(results[0]) sdp_min, rp_min = results[0,min_vol_idx], results[1,min_vol_idx] min_vol_allocation = pd.DataFrame(weights[min_vol_idx],index=table.columns,columns=['allocation']) min_vol_allocation.allocation = [round(i*100,2)for i in min_vol_allocation.allocation] min_vol_allocation = min_vol_allocation.T print("-") print("Maximum Sharpe Ratio Portfolio Allocation\n") print("Annualised Return:", round(rp,2)) print("Annualised Volatility:", round(sdp,2)) print("\n") print(max_sharpe_allocation) print("-") print("Minimum Volatility Portfolio Allocation\n") print("Annualised Return:", round(rp_min,2)) print("Annualised Volatility:", round(sdp_min,2)) print("\n") print(min_vol_allocation) plt.figure(figsize=(10, 7)) plt.scatter(results[0,:],results[1,:],c=results[2,:],cmap='YlGnBu', marker='o', s=10, alpha=0.3) plt.colorbar() plt.scatter(sdp,rp,marker='*',color='r',s=500, label='Maximum Sharpe ratio') plt.scatter(sdp_min,rp_min,marker='*',color='g',s=500, label='Minimum volatility') plt.title('Simulated Portfolio Optimization based on Efficient Frontier') plt.xlabel('annualised volatility') plt.ylabel('annualised returns') plt.legend(labelspacing=0.8) display_simulated_ef_with_random(mean_returns, cov_matrix, num_portfolios, risk_free_rate)
Les exceptions sont dans des threads séparés, c'est pourquoi vous ne les attrapez pas et ne les supprimez pas. C'est aussi pourquoi les résultats restants continuent à être téléchargés correctement.
Votre problème principal est que vous avez des données incorrectes, et la résolution de ces mauvaises données résoudra votre problème. ACCP n'a pas encore eu son introduction en bourse, il se peut qu'elle ne soit jamais en préparation depuis au moins 3 ans.
Vous avez quelques options:
Merci d'avoir identifié le problème multi-thread. Des semaines plus tard, je n'avais toujours pas identifié que c'était le problème que j'avais.
Le problème a été résolu dans la version 0.1.46. Les erreurs sont imprimées une fois tous les téléchargements terminés.
Aucun de ces messages d'exception ne fait référence à la ligne de code que vous avez indiquée en haut. Êtes-vous sûr que c'est ainsi que vous l'appelez?
@JohnGordon C'est la cellule de mon cahier Jupyter. c'est tout ce qu'il y a dans la cellule. Je lance la cellule, elle parcourra les 50 premiers symboles, et si aucun ne peut être trouvé par le package yfinance, j'obtiendrai ces erreurs.