1
votes

Comment supprimer les exceptions d'Yfinance?

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')

2 commentaires

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.


3 Réponses :


0
votes

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)


0 commentaires

2
votes

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:

  • Trouvez une source plus précise de symboles boursiers à utiliser.
  • Exécuter avec threads = False ou un à la fois, ce qui s'arrêterait lorsqu'il rencontrait une erreur, puis supprimait le mauvais symbole et continuait. Cela ralentirait le processus car il n'est pas multithread.
  • Ignorez les erreurs lors de la première exécution, puis recherchez dans les données ce qui manque, puis supprimez ces symboles pour les exécutions futures.
  • Modifiez votre yfinance locale pour gérer l'exception dans _download_one_threaded et supprimer l'erreur.

1 commentaires

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.



0
votes

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.


0 commentaires