0

我正在尝试构建一个应用程序,允许用户将股票添加到投资组合中,然后对该投资组合进行分析。必须只添加现有库存,即有数据的库存。如果用户输入了无效的股票代码,则需要进行处理。显而易见的选择是某种 try-except 结构。我已经尝试过了,但无法弄清楚我的方法在哪里失败。注意:我正在使用 yfinance 下载股票数据。

def getData(self, period):
    try:
        stock = yf.Ticker(self.ticker)
        data = stock.history(period = period)
        return data
    except Exception as exception:
        print(exception)
        raise Exception

在 Stock 类中,我正在实现一个 getData() 函数。我使用 yfinance 创建了一个名为 stock 的代码对象,然后尝试下载历史市场数据。这在某些情况下可以正常工作(AAPL、TSLA、...、真实股票代码)。

在主应用程序中,如果库存有效,我将更新一个标签:

def extendPortfolio():
        try:
            stock = st.Stock(stock_entry.get().upper())
            data = stock.getData("1mo")
            self.portfolio.append(stock)
            portfolioString.set(portfolioString.get() + "\n" + stock.__str__())
        except Exception as exception:
            print(exception)

使用 Stock 类功能,创建一个股票对象,下载其数据,并在最好的情况下将其添加到tk.StringVar投资组合字符串中。我的问题是:无论我决定在条目中输入什么废话,它都会被添加到投资组合字符串中,从而出现在标签中。

终端中会显示一条消息,说明:- {some nonsense sequence}: No data found, symbol may be delisted 此消息很可能来自 yfinance 库本身。但这是否意味着错误被处理得太早了?如何使这些错误在程序中进一步传播到需要处理的地方?

我希望问题很清楚,如果没有,请要求澄清。提前感谢您的帮助!

4

1 回答 1

0

如果 yfinance 无法下载数据,它不会引发异常——它会提供一个空数据框。为确保仅添加有效股票,请检查提供的数据框是否为空。

def getData(self, period):
    try:
        stock = yf.Ticker(self.ticker)
        data = stock.history(period = period)
        if data.empty:
            raise Exception
    except:
        print("data is empty")
        raise Exception
    else:
        return data

这解决了这个问题。我希望这对未来的人们有所帮助。

于 2020-10-16T08:57:25.353 回答