【问题标题】:yfinance as an alternative to pandas_financeyfinance 作为 pandas_finance 的替代品
【发布时间】:2021-09-27 09:35:00
【问题描述】:

在雅虎于 2021 年年中做出改变后,希望使用 yfinance 作为 pandas_finance 的替代品来提取股票信息(行业、部门、概况)。我有一个大约 50-100 个股票代码(unchecked_tickers)的列表,我希望循环通过这些代码来获取行业、部门、简介。这是我当前的代码,对于 pandas_finance 来说相对较快,但对于 yfinance 来说需要几个小时:

sector = []

for i in range(len(unchecked_tickers)):
        try: 
            sec_data = yf.Ticker(unchecked_tickers[i]).info['sector']
            sector.append(sec_data)
        except:
            sector.append('0')

unchecked_earnings_df["Sector"] = sector

industry = []

for i in range(len(unchecked_tickers)):
        try: 
            ind_data = yf.Ticker(unchecked_tickers[i]).info['industry']
            industry.append(ind_data)
        except:
            industry.append('0')

unchecked_earnings_df["Industry"] = industry

desc = []

for i in range(len(unchecked_tickers)):
        try: 
            desc_data = yf.Ticker(unchecked_tickers[i]).info['longBusinessSummary']
            desc.append(desc_data)
        except:
            desc.append('0')

unchecked_earnings_df["Desc"] = desc

unchecked_earnings_df.head()

【问题讨论】:

    标签: python api for-loop stock yfinance


    【解决方案1】:

    每个 yf.Ticker("Stock ticker") 函数调用都会向存储股票数据的服务器发送一个请求。如果您多次执行此请求,可能需要一段时间。在某些时候,获得响应所需的时间会变得更长,这可能是服务器造成的,因为服务器不希望您在这么短的时间内发送很多请求,但我不确定这是否是真正的原因。当您测量每个 yf.Ticker() 函数调用前后的时间并打印差异时,您甚至可以证明这一点。要解决响应时间长的问题,您无能为力。但是您的代码中有很多可以改进的地方。主要问题是您有 3 个不同的 for 循环,它们都执行相同的迭代,并且在开始时都执行相同的 yf.Ticker('stock ticker') 函数调用,这是最耗时的函数。为了提高性能,您可以在一个 for 循环中完成三个 for 循环中所做的所有事情,并且每次迭代只需调用一次 yf.Ticker() 函数。喜欢这个:

    for i in range(len(unchecked_tickers)):
        try: 
            ticker = yf.Ticker(unchecked_tickers[i])
            sector.append(ticker.info['sector'])
            industry.append(ticker.info['industry'])
            #.....
        except:
            sector.append('0')
            industry.append('0')
            #.....
    

    这样你就必须为每个股票只调用一次 yf.Ticker() 函数,而不是三次,这应该使你的程序快三倍。

    【讨论】:

    • 非常感谢您的评论。试一试——它仍在运行。您是否认为最好为每个股票获取整个 .info 字典,然后在返回调用后解析出我需要的字典部分?
    • yf.Ticker() 函数从服务器获取此股票代码的全部股票数据,因此 .info 不会执行任何请求。它只是从股票代码对象返回一个属性。通过在开始时仅获取 .info 属性一次,您不必为要获取的每一列都获取它。这绝对是更好的方法,并且代码看起来更专业。但由于从对象中获取属性并不需要太多时间,因此速度的提高可能甚至无法保证。
    • 好的,谢谢。在您的帮助下,我创建了一种运行超过 2k 行情的方法。这需要一个小时左右,我会不经常跑步,这很好。再次感谢。
    猜你喜欢
    • 2012-09-26
    • 2012-08-19
    • 2010-10-16
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 2019-04-04
    • 2017-11-19
    • 1970-01-01
    相关资源
    最近更新 更多