自从Yahoo! finance(雅虎财经)部门停止更新了他们的历史数据API,许多依赖它的程序停止工作。yfinance旨在通过提供一种可靠的、线程化的、Python化的方式从下载历史股票交易市场数据来解决这个问题。

yfinance是什么?

yfinance 是一个流行的开源库,由 Ran Aroussi 开发,用于访问雅虎财经上可用的财务数据。

雅虎财经提供了大量关于股票、债券、货币和加密货币的市场数据。 它还提供市场新闻、报告和分析,以及其他选项和基本面数据,使其与一些竞争对手区分开来。

雅虎财经曾经有自己的官方 API,但在 2017 年 5 月 15 日,由于数据被广泛滥用,该 API 已停用。

如今,存在一系列非官方 API 和库来访问相同的数据,其中包括 yfinance。

yfinancefix-yahoo-finance
fix-yahoo-finance

为什么要使用 yfinance 库?

  • 免费
  • 快速轻松地进行设置
  • 简单
  • 数据粒度高(1min/2min/5min数据)
  • 直接在 Pandas dataframes/series 中返回数据

正如我们刚刚提到的 yfinance 是完全开源和免费的。 还有其他方法可以访问雅虎财经数据,有些是免费的,有些是付费的,一些需要付费的选项有一定的好处,比如确保对解决方案进行一定程度的维护,但我们都喜欢免费!

安装更容易。 yfinance 只有 4 个依赖项,所有这些都随 Anaconda 一起提供,并且完全安装在一行代码中。 无需创建帐户,也无需注册和使用 API 密钥!

yfinance 的设计非常 Pythonic,而且非常精简。 就像为特定的股票代码创建股票代码对象一样简单,然后只需调用此对象上的所有方法。 像这样:

我们稍后会进一步分解该代码!

此外,文档简明扼要 - 适合在单个页面上,并且方法名称非常易于解释。

数据粒度高。 yfinance 的一个很酷的功能是您可以获得高度精炼的数据,一直到 5 分钟、3 分钟甚至 1 分钟的数据! 可用的全范围间隔是:

然而,重要的是要注意 1m 数据只能检索最近 7 天的数据,而任何日内(间隔 <1d)数据只能检索最近 60 天。

yfinance 还可以轻松地直接在 padas dataframes 或者 series中返回数据。 这与访问 Yahoo Finance 数据的一些选项形成对比,在这些选项中,您将获得需要解析所需特定信息的冗长 JSON,并且必须自己手动转换为dataframes。

yfinance 库有哪些不足?

  • 缺乏专业功能
  • 非官方/不一定维护
  • 可以让自己限速/列入黑名单

缺乏专门的功能。尽管您可以使用它来获取大量核心数据,包括期权和基本面数据,但 yfinance 没有提供一种方法来抓取雅虎财经上可用的任何新闻报道/分析。

RapidAPI

此外,其他市场数据替代品通常包括一些额外内容。 例如,Alpha Vantage 为您提供了计算各种技术分析指标的模块——如果您想使用其中的任何一个构建算法,显然会节省大量的精力! yfinance 只提供基础知识。

yfinance 主要调用 Yahoo Finance 的 API 来收集它的数据,但它偶尔也会使用 HTML 抓取和 Pandas 表抓取方法来非正式地从 Yahoo Finance 网站上收集一些信息。 因此,它的某些方法的功能受雅虎的支配,不会更改其某些页面的布局或设计。

顺便说一句,数据抓取的工作原理是简单地下载网页的 HTML 代码,然后搜索所有 HTML 标签以找到所需页面的特定元素。

例如,以下是雅虎财经 Apple (‘AAPL’) 的历史数据页面:

divclasstr
“Py(10px) Pstart(10px)”

这是一个非官方的解决方案。同样,因为 yfinance 只是一个人努力工作的结果,与雅虎财经没有任何关联,所以不能保证它是否会被维护。

正如我们已经提到的,它确实在 2019 年 5 月 26 日在重命名的同一天进行了重大更新以修复问题,但这并不能保证将来会修复问题。 yfinance 已经存在一些已知问题,我们将在本文后面重点介绍。

由于 yfinance 会为其中的一些功能抓取数据,因此您有时会因过多的抓取尝试而面临速率受限或被列入黑名单的风险。

总体而言,yfinance 是一个非常适合初学者的选择。 您将能够直接深入并测试想法,而不会浪费时间对复杂的文档感到困惑,同时仍然可以访问大量数据!

yfinance的安装

yfinance 库的入门非常简单。它具有以下依赖项:

  • pandas >= 0.24
  • numpy >= 1.15
  • requests >= 2.21
  • multitasking >= 0.0.7

这些都是 Anaconda 安装的标准配置,手动安装也很容易。之后的安装yfinance的操作就这么简单:

或者

Library

布局本身也很简单,只有三个模块:

  • yf.Tickers
  • yf.download
  • yf.pandas_datareader
Tickers
download
pandas_datareader

用yfinance库下载历史数据

首先,让我们将 yfinance 导入为 yf 并为特定代码(股票)创建一个代码对象:

history()

它采用以下参数作为输入:

periodstartend
interval
startendprepostPrePostauto_adjustactionsTrue
periodstartend

例如,要获取 Apple 在 02/06/2020 和 07/06/2020(英国格式)之间的 1 分钟历史数据,我们只需使用我们创建并运行的股票代码对象:

多个股票代码的demo

download
history()
group_by‘column’/‘ticker’‘column’threadsTrue/False/Integerproxy

例如,要一次性获取 Amazon、Apple 和 Google 的数据,我们可以运行:

请注意,未指定间隔的默认值是每日数据。

然后,如果我们想按股票代码而不是开盘价/最高价/最低价/收盘价进行分组,我们可以这样做:

用 yfinance 库下载基本数据

市盈率

Ticker.info()
Ticker.info()
“forwardPE”
22.799461

股息

info()
3.2800000000000002
Ticker.dividends()

一次操作多个股票代码的基本数据

我们可能还想一次获取一堆股票的基本面数据,可以尝试通过特定属性比较股票代码!

为此,我们可以首先创建一个我们想要获取数据的股票代码列表,以及一个空字典来存储所有数据。

我们需要使用 pandas 库来操作数据框:

info()

然后我们将这个数据帧字典组合成一个数据帧:

然后删除不必要的“level_1”列并清理列名:

所以我们现在知道如何将我们想要的多个股票代码的任何数据一次获取到同一个数据帧中!

但是我们如何轻松地通过特定属性进行比较?

按特定属性进行比较

info()fullTimeEmployees

所以现在我们有一个只有员工计数的数据框——每个代码一个条目——我们现在可以按“最近”列排序:

显然,我们的列表中只有 5 个股票代码,这显然不是必需的,但如果我们拥有整个市场的股票代码列表,则可以通过特定属性快速进行比较,这是一种非常简单和强大的方法!

您可以轻松地使用这种完全相同的方法来比较您想要的任何属性!

用 yfinance 库下载交易数据

info()

市值

要获得市值,请使用:

交易量

要查找当前交易量,请执行以下操作:

如果您想要过去 24 小时的平均交易量,请执行以下操作:

最后,如果您想要过去 10 天的平均交易量:

最高值和最低值

请记住,您可以找到任何时间间隔的高点和低点:

history()

例如,要获取所有存在的历史数据的每周高点和低点,请使用:

我们获得了几乎40年的数据,只需要在dataframe后添加下面属性:

aapl_historical[“High”]aapl_historical[“Low”]
info()
dayHighdayLowfiftyTwoWeekHighfiftyTwoWeekLow

例如:

用 yfinance 库下载期权数据

简而言之,期权是赋予交易者权利但没有义务在特定日期或之前以特定价格购买(看涨)或出售(看跌)他们所代表的标的资产的合约。

option_chain()
date
opt.callsopt.puts

如何获得到期日期

要获得特定股票期权的各种到期日期,就像:

如何获取对话数据

要获取对话数据,我们可以执行以下操作:

如何获得看跌期权数据

要获取看跌期权数据,我们执行以下操作:

opts

总结

yfinance

在编写本指南时发现了以下问题:

  • Tickers,用于同时与多个代码交互的多个代码对象,似乎不起作用。我们在“同时具有多个代码的基本面数据”部分中为此提供了一种更手动的解决方法。
  • 财务、季度财务、资产负债表、季度资产负债表、现金流、季度现金流、收益、季度收入股票代码方法不起作用并返回空数据帧。这是一个大问题,因为在许多情况下,yfinance 中的其他方法无法替代其中某些方法中的数据。
yahoo_fin

作为初学者,yfinance 可以很好地用于构建测试应用程序,因为它的工作部分非常容易上手和使用。

yf.downloadthreadsTrue